From 2902648188d21451d3c2bf2e9938f359eab0943d Mon Sep 17 00:00:00 2001 From: JiPai Date: Fri, 7 Mar 2025 23:30:57 +0800 Subject: [PATCH 01/43] chore(package.json): auto format package.json --- packages/server/package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index 304392c2..4a5f80cb 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -36,11 +36,11 @@ "@ai-sdk/mistral": "^1.0.6", "@ai-sdk/openai": "^1.0.12", "@ai-sdk/openai-compatible": "^0.0.13", - "@better-auth/utils":"0.2.3", - "@oslojs/encoding":"1.1.0", - "@oslojs/crypto":"1.0.1", - "drizzle-dbml-generator":"0.10.0", - "better-auth":"1.2.0", + "@better-auth/utils": "0.2.3", + "@oslojs/encoding": "1.1.0", + "@oslojs/crypto": "1.0.1", + "drizzle-dbml-generator": "0.10.0", + "better-auth": "1.2.0", "@faker-js/faker": "^8.4.1", "@lucia-auth/adapter-drizzle": "1.0.7", "@octokit/auth-app": "^6.0.4", @@ -54,7 +54,7 @@ "date-fns": "3.6.0", "dockerode": "4.0.2", "dotenv": "16.4.5", - "drizzle-orm": "^0.39.1", + "drizzle-orm": "^0.39.1", "drizzle-zod": "0.5.1", "hi-base32": "^0.5.1", "js-yaml": "4.1.0", From 911a7730f948202bb9c44579a55b49b44a002827 Mon Sep 17 00:00:00 2001 From: JiPai Date: Fri, 7 Mar 2025 23:31:41 +0800 Subject: [PATCH 02/43] feat(i18n): enable reload on prerender in development mode --- apps/dokploy/utils/i18n.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/dokploy/utils/i18n.ts b/apps/dokploy/utils/i18n.ts index e5b88da3..a9838cb7 100644 --- a/apps/dokploy/utils/i18n.ts +++ b/apps/dokploy/utils/i18n.ts @@ -20,4 +20,5 @@ export const serverSideTranslations = ( locales: Object.values(Languages).map((language) => language.code), localeDetection: false, }, + reloadOnPrerender: process.env.NODE_ENV === "development", }); From 2bced3e9b608990fc4cd3106f43dd1f2ca027742 Mon Sep 17 00:00:00 2001 From: JiPai Date: Fri, 7 Mar 2025 23:32:07 +0800 Subject: [PATCH 03/43] feat(i18n): update password labels in profile form for better clarity --- .../components/dashboard/settings/profile/profile-form.tsx | 6 ++++-- apps/dokploy/public/locales/en/settings.json | 2 ++ apps/dokploy/public/locales/zh-Hans/settings.json | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx index 32179378..2a5bed95 100644 --- a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx @@ -170,7 +170,9 @@ export const ProfileForm = () => { name="currentPassword" render={({ field }) => ( - Current Password + + {t("settings.profile.oldPassword")} + { render={({ field }) => ( - {t("settings.profile.password")} + {t("settings.profile.newPassword")} Date: Fri, 7 Mar 2025 23:32:15 +0800 Subject: [PATCH 04/43] feat(i18n): add internationalization support for 2FA setup and error messages --- .../dashboard/settings/profile/enable-2fa.tsx | 62 +++++++++++-------- apps/dokploy/public/locales/en/settings.json | 24 +++++++ .../public/locales/zh-Hans/settings.json | 24 +++++++ 3 files changed, 83 insertions(+), 27 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx index f47c8d9c..0945ab79 100644 --- a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx @@ -26,6 +26,7 @@ import { authClient } from "@/lib/auth-client"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { Fingerprint, QrCode } from "lucide-react"; +import { useTranslation } from "next-i18next"; import QRCode from "qrcode"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; @@ -55,6 +56,7 @@ type PinForm = z.infer; export const Enable2FA = () => { const utils = api.useUtils(); + const { t } = useTranslation("settings"); const [data, setData] = useState(null); const [backupCodes, setBackupCodes] = useState([]); const [isDialogOpen, setIsDialogOpen] = useState(false); @@ -86,16 +88,18 @@ export const Enable2FA = () => { }); setStep("verify"); - toast.success("Scan the QR code with your authenticator app"); + toast.success(t("settings.2fa.scanQrCode")); } else { throw new Error("No TOTP URI received from server"); } } catch (error) { toast.error( - error instanceof Error ? error.message : "Error setting up 2FA", + error instanceof Error + ? error.message + : t("settings.2fa.errorSettingUp") ); passwordForm.setError("password", { - message: "Error verifying password", + message: t("settings.2fa.errorVerifyingPassword"), }); } finally { setIsPasswordLoading(false); @@ -111,9 +115,9 @@ export const Enable2FA = () => { if (result.error) { if (result.error.code === "INVALID_TWO_FACTOR_AUTHENTICATION") { pinForm.setError("pin", { - message: "Invalid code. Please try again.", + message: t("settings.2fa.invalidCode"), }); - toast.error("Invalid verification code"); + toast.error(t("settings.2fa.invalidVerificationCode")); return; } @@ -124,14 +128,14 @@ export const Enable2FA = () => { throw new Error("No response received from server"); } - toast.success("2FA configured successfully"); + toast.success(t("settings.2fa.success")); utils.user.get.invalidate(); setIsDialogOpen(false); } catch (error) { if (error instanceof Error) { const errorMessage = error.message === "Failed to fetch" - ? "Connection error. Please check your internet connection." + ? t("settings.2fa.connectionError") : error.message; pinForm.setError("pin", { @@ -140,9 +144,9 @@ export const Enable2FA = () => { toast.error(errorMessage); } else { pinForm.setError("pin", { - message: "Error verifying code", + message: t("settings.2fa.errorVerifyingCode"), }); - toast.error("Error verifying 2FA code"); + toast.error(t("settings.2fa.errorVerifying2faCode")); } } }; @@ -176,16 +180,16 @@ export const Enable2FA = () => { - 2FA Setup + {t("settings.2fa.title")} {step === "password" - ? "Enter your password to begin 2FA setup" - : "Scan the QR code and verify with your authenticator app"} + ? t("settings.2fa.enterPassword") + : t("settings.2fa.scanQrCodeAndVerify")} @@ -201,16 +205,18 @@ export const Enable2FA = () => { name="password" render={({ field }) => ( - Password + + {t("settings.2fa.password")} + - Enter your password to enable 2FA + {t("settings.2fa.enterPasswordDescription")} @@ -221,7 +227,7 @@ export const Enable2FA = () => { className="w-full" isLoading={isPasswordLoading} > - Continue + {t("settings.2fa.continue")} @@ -238,16 +244,16 @@ export const Enable2FA = () => {
- Scan this QR code with your authenticator app + {t("settings.2fa.scanQrCode")} 2FA QR Code
- Can't scan the QR code? + {t("settings.2fa.cantScanQrCode")} {data.secret} @@ -257,7 +263,9 @@ export const Enable2FA = () => { {backupCodes && backupCodes.length > 0 && (
-

Backup Codes

+

+ {t("settings.2fa.backupCodes")} +

{backupCodes.map((code, index) => ( { ))}

- Save these backup codes in a secure place. You can use - them to access your account if you lose access to your - authenticator device. + {t("settings.2fa.saveBackupCodes")}

)} @@ -288,7 +294,9 @@ export const Enable2FA = () => { name="pin" render={({ field }) => ( - Verification Code + + {t("settings.2fa.verificationCode")} + @@ -302,7 +310,7 @@ export const Enable2FA = () => { - Enter the 6-digit code from your authenticator app + {t("settings.2fa.enterVerificationCode")} @@ -314,7 +322,7 @@ export const Enable2FA = () => { className="w-full" isLoading={isPasswordLoading} > - Enable 2FA + {t("settings.2fa.enable2fa")} diff --git a/apps/dokploy/public/locales/en/settings.json b/apps/dokploy/public/locales/en/settings.json index 1f16b64c..ee7961ee 100644 --- a/apps/dokploy/public/locales/en/settings.json +++ b/apps/dokploy/public/locales/en/settings.json @@ -43,6 +43,30 @@ "settings.profile.password": "Password", "settings.profile.avatar": "Avatar", + "settings.2fa.enable2fa": "Enable 2FA", + "settings.2fa.title": "2FA Setup", + "settings.2fa.enterPassword": "Enter your password to begin 2FA setup", + "settings.2fa.scanQrCodeAndVerify": "Scan the QR code and verify with your authenticator app", + "settings.2fa.password": "Password", + "settings.2fa.enterPasswordPlaceholder": "Enter your password", + "settings.2fa.enterPasswordDescription": "Enter your password to enable 2FA", + "settings.2fa.continue": "Continue", + "settings.2fa.scanQrCode": "Scan this QR code with your authenticator app", + "settings.2fa.qrCodeAlt": "2FA QR Code", + "settings.2fa.cantScanQrCode": "Can't scan the QR code?", + "settings.2fa.backupCodes": "Backup Codes", + "settings.2fa.saveBackupCodes": "Save these backup codes in a secure place. You can use them to access your account if you lose access to your authenticator device.", + "settings.2fa.verificationCode": "Verification Code", + "settings.2fa.enterVerificationCode": "Enter the 6-digit code from your authenticator app", + "settings.2fa.errorSettingUp": "Error setting up 2FA", + "settings.2fa.errorVerifyingPassword": "Error verifying password", + "settings.2fa.invalidCode": "Invalid code. Please try again.", + "settings.2fa.invalidVerificationCode": "Invalid verification code", + "settings.2fa.success": "2FA configured successfully", + "settings.2fa.connectionError": "Connection error. Please check your internet connection.", + "settings.2fa.errorVerifyingCode": "Error verifying code", + "settings.2fa.errorVerifying2faCode": "Error verifying 2FA code", + "settings.appearance.title": "Appearance", "settings.appearance.description": "Customize the theme of your dashboard.", "settings.appearance.theme": "Theme", diff --git a/apps/dokploy/public/locales/zh-Hans/settings.json b/apps/dokploy/public/locales/zh-Hans/settings.json index f950a468..c16365e4 100644 --- a/apps/dokploy/public/locales/zh-Hans/settings.json +++ b/apps/dokploy/public/locales/zh-Hans/settings.json @@ -43,6 +43,30 @@ "settings.profile.password": "密码", "settings.profile.avatar": "头像", + "settings.2fa.enable2fa": "启用 2FA", + "settings.2fa.title": "2FA 设置", + "settings.2fa.enterPassword": "输入您的密码以开始 2FA 设置", + "settings.2fa.scanQrCodeAndVerify": "扫描二维码并使用您的身份验证器应用程序进行验证", + "settings.2fa.password": "密码", + "settings.2fa.enterPasswordPlaceholder": "输入您的密码", + "settings.2fa.enterPasswordDescription": "输入您的密码以启用 2FA", + "settings.2fa.continue": "继续", + "settings.2fa.scanQrCode": "使用您的身份验证器应用程序扫描此二维码", + "settings.2fa.qrCodeAlt": "2FA 二维码", + "settings.2fa.cantScanQrCode": "无法扫描二维码?", + "settings.2fa.backupCodes": "备份代码", + "settings.2fa.saveBackupCodes": "将这些备份代码保存在安全的地方。如果您丢失了身份验证设备,可以使用它们访问您的帐户。", + "settings.2fa.verificationCode": "验证码", + "settings.2fa.enterVerificationCode": "输入您的身份验证器应用程序中的 6 位数代码", + "settings.2fa.errorSettingUp": "设置 2FA 时出错", + "settings.2fa.errorVerifyingPassword": "验证密码时出错", + "settings.2fa.invalidCode": "无效的代码。请再试一次。", + "settings.2fa.invalidVerificationCode": "无效的验证码", + "settings.2fa.success": "2FA 配置成功", + "settings.2fa.connectionError": "连接错误。请检查您的互联网连接。", + "settings.2fa.errorVerifyingCode": "验证代码时出错", + "settings.2fa.errorVerifying2faCode": "验证 2FA 代码时出错", + "settings.appearance.title": "外观", "settings.appearance.description": "自定义面板主题", "settings.appearance.theme": "主题", From 3a0dbc26d1462332d5f80714533ecf7d38e4b46f Mon Sep 17 00:00:00 2001 From: JiPai Date: Sat, 8 Mar 2025 16:14:13 +0800 Subject: [PATCH 05/43] feat(i18n): add date-fns locale support --- .../dashboard/settings/api/add-api-key.tsx | 87 +++++++++---------- .../dashboard/settings/api/show-api-keys.tsx | 39 +++++---- apps/dokploy/lib/languages.ts | 71 ++++++++++----- apps/dokploy/public/locales/en/settings.json | 71 ++++++++++++++- .../public/locales/zh-Hans/settings.json | 71 ++++++++++++++- 5 files changed, 257 insertions(+), 82 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx b/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx index 131d7ddf..7f8a1750 100644 --- a/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx +++ b/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx @@ -33,6 +33,7 @@ import { import { Switch } from "@/components/ui/switch"; import copy from "copy-to-clipboard"; import { CodeEditor } from "@/components/shared/code-editor"; +import { useTranslation } from "next-i18next"; const formSchema = z.object({ name: z.string().min(1, "Name is required"), @@ -79,6 +80,7 @@ const REFILL_INTERVAL_OPTIONS = [ ]; export const AddApiKey = () => { + const { t } = useTranslation('settings'); const [open, setOpen] = useState(false); const [showSuccessModal, setShowSuccessModal] = useState(false); const [newApiKey, setNewApiKey] = useState(""); @@ -95,7 +97,7 @@ export const AddApiKey = () => { void refetch(); }, onError: () => { - toast.error("Failed to generate API key"); + toast.error(t("settings.api.errorGeneratingApiKey")); }, }); @@ -140,14 +142,13 @@ export const AddApiKey = () => { <> - + - Generate API Key + {t("settings.api.generateApiKey")} - Create a new API key for accessing the API. You can set an - expiration date and a custom prefix for better organization. + {t("settings.api.createNewApiKeyDescription")}
@@ -157,9 +158,9 @@ export const AddApiKey = () => { name="name" render={({ field }) => ( - Name + {t("settings.api.name")} - + @@ -170,9 +171,9 @@ export const AddApiKey = () => { name="prefix" render={({ field }) => ( - Prefix + {t("settings.api.prefix")} - + @@ -183,7 +184,7 @@ export const AddApiKey = () => { name="expiresIn" render={({ field }) => ( - Expiration + {t("settings.api.expiration")} - + @@ -234,16 +235,16 @@ export const AddApiKey = () => { {/* Rate Limiting Section */}
-

Rate Limiting

+

{t("settings.api.rateLimiting")}

(
- Enable Rate Limiting + {t("settings.api.enableRateLimiting")} - Limit the number of requests within a time window + {t("settings.api.limitRequestsDescription")}
@@ -263,7 +264,7 @@ export const AddApiKey = () => { name="rateLimitTimeWindow" render={({ field }) => ( - Time Window + {t("settings.api.timeWindow")} - The duration in which requests are counted + {t("settings.api.timeWindowDescription")} @@ -298,11 +299,11 @@ export const AddApiKey = () => { name="rateLimitMax" render={({ field }) => ( - Maximum Requests + {t("settings.api.maxRequests")} field.onChange( @@ -314,8 +315,7 @@ export const AddApiKey = () => { /> - Maximum number of requests allowed within the time - window + {t("settings.api.maxRequestsDescription")} @@ -327,17 +327,17 @@ export const AddApiKey = () => { {/* Request Limiting Section */}
-

Request Limiting

+

{t("settings.api.requestLimiting")}

( - Total Request Limit + {t("settings.api.totalRequestLimit")} field.onChange( @@ -349,8 +349,7 @@ export const AddApiKey = () => { /> - Total number of requests allowed (leave empty for - unlimited) + {t("settings.api.totalRequestLimitDescription")} @@ -362,11 +361,11 @@ export const AddApiKey = () => { name="refillAmount" render={({ field }) => ( - Refill Amount + {t("settings.api.refillAmount")} field.onChange( @@ -378,7 +377,7 @@ export const AddApiKey = () => { /> - Number of requests to add on each refill + {t("settings.api.refillAmountDescription")} @@ -390,7 +389,7 @@ export const AddApiKey = () => { name="refillInterval" render={({ field }) => ( - Refill Interval + {t("settings.api.refillInterval")} - How often to refill the request limit + {t("settings.api.refillIntervalDescription")} @@ -425,9 +424,9 @@ export const AddApiKey = () => { variant="outline" onClick={() => setOpen(false)} > - Cancel + {t("settings.api.cancel")} - +
@@ -437,9 +436,9 @@ export const AddApiKey = () => { - API Key Generated Successfully + {t("settings.api.apiKeyGeneratedSuccessfully")} - Please copy your API key now. You won't be able to see it again! + {t("settings.api.copyApiKeyNow")}
@@ -453,16 +452,16 @@ export const AddApiKey = () => {
diff --git a/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx b/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx index 6744f1de..bb8e57ea 100644 --- a/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx +++ b/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx @@ -14,8 +14,11 @@ import { formatDistanceToNow } from "date-fns"; import { DialogAction } from "@/components/shared/dialog-action"; import { AddApiKey } from "./add-api-key"; import { Badge } from "@/components/ui/badge"; +import { useTranslation } from "next-i18next"; +import { getDateFnsLocaleByCode } from "@/lib/languages"; export const ShowApiKeys = () => { + const { t, i18n } = useTranslation("settings"); const { data, refetch } = api.user.get.useQuery(); const { mutateAsync: deleteApiKey, isLoading: isLoadingDelete } = api.user.deleteApiKey.useMutation(); @@ -28,22 +31,24 @@ export const ShowApiKeys = () => {
- API/CLI Keys + {t("settings.api.apiCliKeys")} - Generate and manage API keys to access the API/CLI + {t("settings.api.generateAndManageKeys")}
- Swagger API: + {t("settings.api.swaggerApi")} - View + + {t("settings.api.view")} +
@@ -62,9 +67,11 @@ export const ShowApiKeys = () => {
- Created{" "} - {formatDistanceToNow(new Date(apiKey.createdAt))}{" "} - ago + {t("settings.api.created")}{" "} + {formatDistanceToNow(new Date(apiKey.createdAt), { + locale: getDateFnsLocaleByCode(i18n.language), + })}{" "} + {t("settings.api.ago")} {apiKey.prefix && ( { className="flex items-center gap-1" > - Expires in{" "} - {formatDistanceToNow( - new Date(apiKey.expiresAt), - )}{" "} + {t("settings.api.expiresIn")}{" "} + {formatDistanceToNow(new Date(apiKey.expiresAt), { + locale: getDateFnsLocaleByCode(i18n.language), + })}{" "} )}
{ try { @@ -99,12 +106,12 @@ export const ShowApiKeys = () => { apiKeyId: apiKey.id, }); await refetch(); - toast.success("API key deleted successfully"); + toast.success(t("settings.api.apiKeyDeleted")); } catch (error) { toast.error( error instanceof Error ? error.message - : "Error deleting API key", + : t("settings.api.errorDeletingApiKey"), ); } }} @@ -124,7 +131,7 @@ export const ShowApiKeys = () => {
- No API keys found + {t("settings.api.noApiKeysFound")}
)} diff --git a/apps/dokploy/lib/languages.ts b/apps/dokploy/lib/languages.ts index a19c9589..571eb103 100644 --- a/apps/dokploy/lib/languages.ts +++ b/apps/dokploy/lib/languages.ts @@ -1,25 +1,56 @@ +import { + enUS, + zhCN, + zhHK, + pl, + uk, + ru, + fr, + de, + tr, + ko, + ptBR, + it, + ja, + es, + az, + id, + kk, + faIR, + nb, +} from "date-fns/locale"; + export const Languages = { - english: { code: "en", name: "English" }, - polish: { code: "pl", name: "Polski" }, - ukrainian: { code: "uk", name: "Українська" }, - russian: { code: "ru", name: "Русский" }, - french: { code: "fr", name: "Français" }, - german: { code: "de", name: "Deutsch" }, - chineseTraditional: { code: "zh-Hant", name: "繁體中文" }, - chineseSimplified: { code: "zh-Hans", name: "简体中文" }, - turkish: { code: "tr", name: "Türkçe" }, - kazakh: { code: "kz", name: "Қазақ" }, - persian: { code: "fa", name: "فارسی" }, - korean: { code: "ko", name: "한국어" }, - portuguese: { code: "pt-br", name: "Português" }, - italian: { code: "it", name: "Italiano" }, - japanese: { code: "ja", name: "日本語" }, - spanish: { code: "es", name: "Español" }, - norwegian: { code: "no", name: "Norsk" }, - azerbaijani: { code: "az", name: "Azərbaycan" }, - indonesian: { code: "id", name: "Bahasa Indonesia" }, - malayalam: { code: "ml", name: "മലയാളം" }, + english: { code: "en", name: "English", dateFnsLocale: enUS }, + polish: { code: "pl", name: "Polski", dateFnsLocale: pl }, + ukrainian: { code: "uk", name: "Українська", dateFnsLocale: uk }, + russian: { code: "ru", name: "Русский", dateFnsLocale: ru }, + french: { code: "fr", name: "Français", dateFnsLocale: fr }, + german: { code: "de", name: "Deutsch", dateFnsLocale: de }, + chineseTraditional: { + code: "zh-Hant", + name: "繁體中文", + dateFnsLocale: zhHK, + }, + chineseSimplified: { code: "zh-Hans", name: "简体中文", dateFnsLocale: zhCN }, + turkish: { code: "tr", name: "Türkçe", dateFnsLocale: tr }, + kazakh: { code: "kz", name: "Қазақ", dateFnsLocale: kk }, + persian: { code: "fa", name: "فارسی", dateFnsLocale: faIR }, + korean: { code: "ko", name: "한국어", dateFnsLocale: ko }, + portuguese: { code: "pt-br", name: "Português", dateFnsLocale: ptBR }, + italian: { code: "it", name: "Italiano", dateFnsLocale: it }, + japanese: { code: "ja", name: "日本語", dateFnsLocale: ja }, + spanish: { code: "es", name: "Español", dateFnsLocale: es }, + norwegian: { code: "no", name: "Norsk", dateFnsLocale: nb }, + azerbaijani: { code: "az", name: "Azərbaycan", dateFnsLocale: az }, + indonesian: { code: "id", name: "Bahasa Indonesia", dateFnsLocale: id }, + malayalam: { code: "ml", name: "മലയാളം", dateFnsLocale: enUS }, }; +export function getDateFnsLocaleByCode(code: LanguageCode) { + const language = Object.values(Languages).find((lang) => lang.code === code); + return language ? language.dateFnsLocale : enUS; +} + export type Language = keyof typeof Languages; export type LanguageCode = (typeof Languages)[keyof typeof Languages]["code"]; diff --git a/apps/dokploy/public/locales/en/settings.json b/apps/dokploy/public/locales/en/settings.json index ee7961ee..28ef1a51 100644 --- a/apps/dokploy/public/locales/en/settings.json +++ b/apps/dokploy/public/locales/en/settings.json @@ -80,5 +80,74 @@ "settings.terminal.connectionSettings": "Connection settings", "settings.terminal.ipAddress": "IP Address", "settings.terminal.port": "Port", - "settings.terminal.username": "Username" + "settings.terminal.username": "Username", + + "settings.api.apiCliKeys": "API/CLI Keys", + "settings.api.generateAndManageKeys": "Generate and manage API keys to access the API/CLI", + "settings.api.swaggerApi": "Swagger API:", + "settings.api.view": "View", + "settings.api.created": "Created", + "settings.api.ago": "ago", + "settings.api.expiresIn": "Expires in", + "settings.api.deleteApiKey": "Delete API Key", + "settings.api.deleteApiKeyDescription": "Are you sure you want to delete this API key? This action cannot be undone.", + "settings.api.apiKeyDeleted": "API key deleted successfully", + "settings.api.errorDeletingApiKey": "Error deleting API key", + "settings.api.noApiKeysFound": "No API keys found", + "settings.api.errorGeneratingApiKey": "Failed to generate API key", + "settings.api.generateNewKey": "Generate New Key", + "settings.api.generateApiKey": "Generate API Key", + "settings.api.createNewApiKeyDescription": "Create a new API key for accessing the API. You can set an expiration date and a custom prefix for better organization.", + "settings.api.name": "Name", + "settings.api.namePlaceholder": "My API Key", + "settings.api.prefix": "Prefix", + "settings.api.prefixPlaceholder": "my_app", + "settings.api.expiration": "Expiration", + "settings.api.selectExpirationTime": "Select expiration time", + "settings.api.expirationOptions.Never": "Never", + "settings.api.expirationOptions.1 day": "1 day", + "settings.api.expirationOptions.7 days": "7 days", + "settings.api.expirationOptions.30 days": "30 days", + "settings.api.expirationOptions.90 days": "90 days", + "settings.api.expirationOptions.1 year": "1 year", + "settings.api.organization": "Organization", + "settings.api.selectOrganization": "Select organization", + "settings.api.rateLimiting": "Rate Limiting", + "settings.api.enableRateLimiting": "Enable Rate Limiting", + "settings.api.limitRequestsDescription": "Limit the number of requests within a time window", + "settings.api.timeWindow": "Time Window", + "settings.api.selectTimeWindow": "Select time window", + "settings.api.timeWindowOptions.1 minute": "1 minute", + "settings.api.timeWindowOptions.5 minutes": "5 minutes", + "settings.api.timeWindowOptions.15 minutes": "15 minutes", + "settings.api.timeWindowOptions.30 minutes": "30 minutes", + "settings.api.timeWindowOptions.1 hour": "1 hour", + "settings.api.timeWindowOptions.1 day": "1 day", + "settings.api.timeWindowDescription": "The duration in which requests are counted", + "settings.api.maxRequests": "Maximum Requests", + "settings.api.maxRequestsPlaceholder": "100", + "settings.api.maxRequestsDescription": "Maximum number of requests allowed within the time window", + "settings.api.requestLimiting": "Request Limiting", + "settings.api.totalRequestLimit": "Total Request Limit", + "settings.api.totalRequestLimitPlaceholder": "Leave empty for unlimited", + "settings.api.totalRequestLimitDescription": "Total number of requests allowed (leave empty for unlimited)", + "settings.api.refillAmount": "Refill Amount", + "settings.api.refillAmountPlaceholder": "Amount to refill", + "settings.api.refillAmountDescription": "Number of requests to add on each refill", + "settings.api.refillInterval": "Refill Interval", + "settings.api.selectRefillInterval": "Select refill interval", + "settings.api.refillIntervalOptions.1 hour": "1 hour", + "settings.api.refillIntervalOptions.6 hours": "6 hours", + "settings.api.refillIntervalOptions.12 hours": "12 hours", + "settings.api.refillIntervalOptions.1 day": "1 day", + "settings.api.refillIntervalOptions.7 days": "7 days", + "settings.api.refillIntervalOptions.30 days": "30 days", + "settings.api.refillIntervalDescription": "How often to refill the request limit", + "settings.api.cancel": "Cancel", + "settings.api.generate": "Generate", + "settings.api.apiKeyGeneratedSuccessfully": "API Key Generated Successfully", + "settings.api.copyApiKeyNow": "Please copy your API key now. You won't be able to see it again!", + "settings.api.apiKeyCopied": "API key copied to clipboard", + "settings.api.copyToClipboard": "Copy to Clipboard", + "settings.api.close": "Close" } diff --git a/apps/dokploy/public/locales/zh-Hans/settings.json b/apps/dokploy/public/locales/zh-Hans/settings.json index c16365e4..964e97e6 100644 --- a/apps/dokploy/public/locales/zh-Hans/settings.json +++ b/apps/dokploy/public/locales/zh-Hans/settings.json @@ -80,5 +80,74 @@ "settings.terminal.connectionSettings": "终端设置", "settings.terminal.ipAddress": "IP", "settings.terminal.port": "端口", - "settings.terminal.username": "用户名" + "settings.terminal.username": "用户名", + + "settings.api.apiCliKeys": "API/CLI 密钥", + "settings.api.generateAndManageKeys": "生成和管理 API 密钥以访问 API/CLI", + "settings.api.swaggerApi": "Swagger API:", + "settings.api.view": "查看", + "settings.api.created": "创建于", + "settings.api.ago": "前", + "settings.api.expiresIn": "过期于", + "settings.api.deleteApiKey": "删除 API 密钥", + "settings.api.deleteApiKeyDescription": "您确定要删除此 API 密钥吗?此操作无法撤销。", + "settings.api.apiKeyDeleted": "API 密钥删除成功", + "settings.api.errorDeletingApiKey": "删除 API 密钥时出错", + "settings.api.noApiKeysFound": "未找到 API 密钥", + "settings.api.errorGeneratingApiKey": "生成 API 密钥失败", + "settings.api.generateNewKey": "生成新密钥", + "settings.api.generateApiKey": "生成 API 密钥", + "settings.api.createNewApiKeyDescription": "创建一个新的 API 密钥以访问 API。您可以设置过期日期和自定义前缀以便更好地组织。", + "settings.api.name": "名称", + "settings.api.namePlaceholder": "我的 API 密钥", + "settings.api.prefix": "前缀", + "settings.api.prefixPlaceholder": "我的应用", + "settings.api.expiration": "过期时间", + "settings.api.selectExpirationTime": "选择过期时间", + "settings.api.expirationOptions.Never": "从不过期", + "settings.api.expirationOptions.1 day": "1 天", + "settings.api.expirationOptions.7 days": "7 天", + "settings.api.expirationOptions.30 days": "30 天", + "settings.api.expirationOptions.90 days": "90 天", + "settings.api.expirationOptions.1 year": "1 年", + "settings.api.organization": "组织", + "settings.api.selectOrganization": "选择组织", + "settings.api.rateLimiting": "速率限制", + "settings.api.enableRateLimiting": "启用速率限制", + "settings.api.limitRequestsDescription": "限制在时间窗口内的请求数量", + "settings.api.timeWindow": "时间窗口", + "settings.api.selectTimeWindow": "选择时间窗口", + "settings.api.timeWindowOptions.1 minute": "1 分钟", + "settings.api.timeWindowOptions.5 minutes": "5 分钟", + "settings.api.timeWindowOptions.15 minutes": "15 分钟", + "settings.api.timeWindowOptions.30 minutes": "30 分钟", + "settings.api.timeWindowOptions.1 hour": "1 小时", + "settings.api.timeWindowOptions.1 day": "1 天", + "settings.api.timeWindowDescription": "请求计数的持续时间", + "settings.api.maxRequests": "最大请求数", + "settings.api.maxRequestsPlaceholder": "100", + "settings.api.maxRequestsDescription": "时间窗口内允许的最大请求数", + "settings.api.requestLimiting": "请求限制", + "settings.api.totalRequestLimit": "总请求限制", + "settings.api.totalRequestLimitPlaceholder": "留空表示无限制", + "settings.api.totalRequestLimitDescription": "允许的总请求数(留空表示无限制)", + "settings.api.refillAmount": "补充数量", + "settings.api.refillAmountPlaceholder": "补充数量", + "settings.api.refillAmountDescription": "每次补充时添加的请求数量", + "settings.api.refillInterval": "补充间隔", + "settings.api.selectRefillInterval": "选择补充间隔", + "settings.api.refillIntervalOptions.1 hour": "1 小时", + "settings.api.refillIntervalOptions.6 hours": "6 小时", + "settings.api.refillIntervalOptions.12 hours": "12 小时", + "settings.api.refillIntervalOptions.1 day": "1 天", + "settings.api.refillIntervalOptions.7 days": "7 天", + "settings.api.refillIntervalOptions.30 days": "30 天", + "settings.api.refillIntervalDescription": "请求限制的补充频率", + "settings.api.cancel": "取消", + "settings.api.generate": "生成", + "settings.api.apiKeyGeneratedSuccessfully": "API 密钥生成成功", + "settings.api.copyApiKeyNow": "请立即复制您的 API 密钥。您将无法再次查看它!", + "settings.api.apiKeyCopied": "API 密钥已复制到剪贴板", + "settings.api.copyToClipboard": "复制到剪贴板", + "settings.api.close": "关闭" } From 7903ddba89e6235ada42fd5c91775deec34aff13 Mon Sep 17 00:00:00 2001 From: JiPai Date: Sun, 9 Mar 2025 16:53:19 +0800 Subject: [PATCH 06/43] feat(i18n): add i18n support for sidebar --- apps/dokploy/components/layouts/side.tsx | 77 +++++++++--- apps/dokploy/pages/dashboard/settings/ai.tsx | 2 +- .../pages/dashboard/settings/billing.tsx | 3 + .../pages/dashboard/settings/certificates.tsx | 3 + .../pages/dashboard/settings/cluster.tsx | 3 + .../pages/dashboard/settings/destinations.tsx | 3 + .../dashboard/settings/git-providers.tsx | 115 +++++++++--------- .../pages/dashboard/settings/index.tsx | 3 + .../dashboard/settings/notifications.tsx | 3 + .../pages/dashboard/settings/profile.tsx | 2 +- .../pages/dashboard/settings/registry.tsx | 3 + .../pages/dashboard/settings/server.tsx | 2 +- .../pages/dashboard/settings/servers.tsx | 2 +- .../pages/dashboard/settings/ssh-keys.tsx | 7 +- .../pages/dashboard/settings/users.tsx | 3 + apps/dokploy/public/locales/en/common.json | 38 +++++- .../public/locales/zh-Hans/common.json | 38 +++++- 17 files changed, 229 insertions(+), 78 deletions(-) diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx index 0b29112a..f7d0a097 100644 --- a/apps/dokploy/components/layouts/side.tsx +++ b/apps/dokploy/components/layouts/side.tsx @@ -86,6 +86,7 @@ import { Logo } from "../shared/logo"; import { Button } from "../ui/button"; import { UpdateServerButton } from "./update-server"; import { UserNav } from "./user-nav"; +import { useTranslation } from "next-i18next"; // The types of the queries we are going to use type AuthQueryOutput = inferRouterOutputs["user"]["get"]; @@ -93,6 +94,7 @@ type AuthQueryOutput = inferRouterOutputs["user"]["get"]; type SingleNavItem = { isSingle?: true; title: string; + titleKey: string; url: string; icon?: LucideIcon; isEnabled?: (opts: { @@ -110,6 +112,7 @@ type NavItem = | { isSingle: false; title: string; + titleKey: string; icon: LucideIcon; items: SingleNavItem[]; isEnabled?: (opts: { @@ -122,6 +125,7 @@ type NavItem = // Represents an external link item (used for the help section) type ExternalLink = { name: string; + nameKey: string; url: string; icon: React.ComponentType<{ className?: string }>; isEnabled?: (opts: { @@ -147,12 +151,14 @@ const MENU: Menu = { { isSingle: true, title: "Projects", + titleKey: "common.side.projects", url: "/dashboard/projects", icon: Folder, }, { isSingle: true, title: "Monitoring", + titleKey: "common.side.monitoring", url: "/dashboard/monitoring", icon: BarChartHorizontalBigIcon, // Only enabled in non-cloud environments @@ -161,6 +167,7 @@ const MENU: Menu = { { isSingle: true, title: "Traefik File System", + titleKey: "common.side.traefik", url: "/dashboard/traefik", icon: GalleryVerticalEnd, // Only enabled for admins and users with access to Traefik files in non-cloud environments @@ -173,6 +180,7 @@ const MENU: Menu = { { isSingle: true, title: "Docker", + titleKey: "common.side.docker", url: "/dashboard/docker", icon: BlocksIcon, // Only enabled for admins and users with access to Docker in non-cloud environments @@ -182,6 +190,7 @@ const MENU: Menu = { { isSingle: true, title: "Swarm", + titleKey: "common.side.swarm", url: "/dashboard/swarm", icon: PieChart, // Only enabled for admins and users with access to Docker in non-cloud environments @@ -191,6 +200,7 @@ const MENU: Menu = { { isSingle: true, title: "Requests", + titleKey: "common.side.requests", url: "/dashboard/requests", icon: Forward, // Only enabled for admins and users with access to Docker in non-cloud environments @@ -259,6 +269,7 @@ const MENU: Menu = { { isSingle: true, title: "Web Server", + titleKey: "common.side.web-server", url: "/dashboard/settings/server", icon: Activity, // Only enabled for admins in non-cloud environments @@ -267,12 +278,14 @@ const MENU: Menu = { { isSingle: true, title: "Profile", + titleKey: "common.side.profile", url: "/dashboard/settings/profile", icon: User, }, { isSingle: true, title: "Remote Servers", + titleKey: "common.side.remote-servers", url: "/dashboard/settings/servers", icon: Server, // Only enabled for admins @@ -281,6 +294,7 @@ const MENU: Menu = { { isSingle: true, title: "Users", + titleKey: "common.side.users", icon: Users, url: "/dashboard/settings/users", // Only enabled for admins @@ -289,6 +303,7 @@ const MENU: Menu = { { isSingle: true, title: "SSH Keys", + titleKey: "common.side.ssh-keys", icon: KeyRound, url: "/dashboard/settings/ssh-keys", // Only enabled for admins and users with access to SSH keys @@ -297,6 +312,7 @@ const MENU: Menu = { }, { title: "AI", + titleKey: "common.side.ai", icon: BotIcon, url: "/dashboard/settings/ai", isSingle: true, @@ -305,6 +321,7 @@ const MENU: Menu = { { isSingle: true, title: "Git", + titleKey: "common.side.git", url: "/dashboard/settings/git-providers", icon: GitBranch, // Only enabled for admins and users with access to Git providers @@ -314,6 +331,7 @@ const MENU: Menu = { { isSingle: true, title: "Registry", + titleKey: "common.side.registry", url: "/dashboard/settings/registry", icon: Package, // Only enabled for admins @@ -322,6 +340,7 @@ const MENU: Menu = { { isSingle: true, title: "S3 Destinations", + titleKey: "common.side.s3-destinations", url: "/dashboard/settings/destinations", icon: Database, // Only enabled for admins @@ -331,6 +350,7 @@ const MENU: Menu = { { isSingle: true, title: "Certificates", + titleKey: "common.side.certificates", url: "/dashboard/settings/certificates", icon: ShieldCheck, // Only enabled for admins @@ -339,6 +359,7 @@ const MENU: Menu = { { isSingle: true, title: "Cluster", + titleKey: "common.side.cluster", url: "/dashboard/settings/cluster", icon: Boxes, // Only enabled for admins in non-cloud environments @@ -347,6 +368,7 @@ const MENU: Menu = { { isSingle: true, title: "Notifications", + titleKey: "common.side.notifications", url: "/dashboard/settings/notifications", icon: Bell, // Only enabled for admins @@ -355,6 +377,7 @@ const MENU: Menu = { { isSingle: true, title: "Billing", + titleKey: "common.side.billing", url: "/dashboard/settings/billing", icon: CreditCard, // Only enabled for admins in cloud environments @@ -365,16 +388,19 @@ const MENU: Menu = { help: [ { name: "Documentation", + nameKey: "common.side.documentation", url: "https://docs.dokploy.com/docs/core", icon: BookIcon, }, { name: "Support", + nameKey: "common.side.support", url: "https://discord.gg/2tBnJ3jDJc", icon: CircleHelp, }, { name: "Sponsor", + nameKey: "common.side.sponsor", url: "https://opencollective.com/dokploy", icon: ({ className }) => ( - Pending Invitations + + {t("common.side.invitations.pending-invitations")} +
{invitations && invitations.length > 0 ? ( invitations.map((invitation) => ( @@ -702,16 +731,23 @@ function SidebarLogo() { {invitation?.organization?.name}
- Expires:{" "} - {new Date(invitation.expiresAt).toLocaleString()} + {t("common.side.invitations.expires", { + expireDate: new Date( + invitation.expiresAt, + ).toLocaleString(), + })}
- Role: {invitation.role} + {t("common.side.invitations.role", { + role: invitation.role, + })}
{ const { error } = @@ -721,24 +757,31 @@ function SidebarLogo() { if (error) { toast.error( - error.message || "Error accepting invitation", + error.message || + t( + "common.side.invitations.error-accepting-invitation", + ), ); } else { - toast.success("Invitation accepted successfully"); + toast.success( + t( + "common.side.invitations.invitation-accepted", + ), + ); await refetchInvitations(); await refetch(); } }} >
)) ) : ( - No pending invitations + {t("common.side.invitations.no-pending-invitations")} )} @@ -752,6 +795,8 @@ function SidebarLogo() { } export default function Page({ children }: Props) { + const { t } = useTranslation("common"); + const [defaultOpen, setDefaultOpen] = useState( undefined, ); @@ -818,7 +863,7 @@ export default function Page({ children }: Props) { - Home + {t("common.side.home")} {filteredHome.map((item) => { const isSingle = item.isSingle !== false; @@ -851,7 +896,7 @@ export default function Page({ children }: Props) { className={cn(isActive && "text-primary")} /> )} - {item.title} + {t(item.titleKey)} ) : ( @@ -907,7 +952,7 @@ export default function Page({ children }: Props) { - Settings + {t("common.side.settings")} {filteredSettings.map((item) => { const isSingle = item.isSingle !== false; @@ -940,7 +985,7 @@ export default function Page({ children }: Props) { className={cn(isActive && "text-primary")} /> )} - {item.title} + {t(item.titleKey)} ) : ( @@ -996,7 +1041,7 @@ export default function Page({ children }: Props) { - Extra + {t("common.side.extra")} {help.map((item: ExternalLink) => ( @@ -1010,7 +1055,7 @@ export default function Page({ children }: Props) { - {item.name} + {t(item.nameKey)} diff --git a/apps/dokploy/pages/dashboard/settings/ai.tsx b/apps/dokploy/pages/dashboard/settings/ai.tsx index 92ca2fab..985df7dc 100644 --- a/apps/dokploy/pages/dashboard/settings/ai.tsx +++ b/apps/dokploy/pages/dashboard/settings/ai.tsx @@ -55,7 +55,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["settings"])), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/billing.tsx b/apps/dokploy/pages/dashboard/settings/billing.tsx index 7ba5717e..2c176e23 100644 --- a/apps/dokploy/pages/dashboard/settings/billing.tsx +++ b/apps/dokploy/pages/dashboard/settings/billing.tsx @@ -2,6 +2,7 @@ import { ShowBilling } from "@/components/dashboard/settings/billing/show-billin import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { IS_CLOUD } from "@dokploy/server/constants"; import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; @@ -30,6 +31,7 @@ export async function getServerSideProps( }; } const { req, res } = ctx; + const locale = getLocale(req.cookies); const { user, session } = await validateRequest(req); if (!user || user.role === "member") { return { @@ -59,6 +61,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/certificates.tsx b/apps/dokploy/pages/dashboard/settings/certificates.tsx index 0c82ed4f..2b2ca22d 100644 --- a/apps/dokploy/pages/dashboard/settings/certificates.tsx +++ b/apps/dokploy/pages/dashboard/settings/certificates.tsx @@ -2,6 +2,7 @@ import { ShowCertificates } from "@/components/dashboard/settings/certificates/s import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; @@ -24,6 +25,7 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; + const locale = await getLocale(req.cookies); const { user, session } = await validateRequest(req); if (!user || user.role === "member") { return { @@ -51,6 +53,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/cluster.tsx b/apps/dokploy/pages/dashboard/settings/cluster.tsx index a1a46bb6..8ebc8b8f 100644 --- a/apps/dokploy/pages/dashboard/settings/cluster.tsx +++ b/apps/dokploy/pages/dashboard/settings/cluster.tsx @@ -2,6 +2,7 @@ import { ShowNodes } from "@/components/dashboard/settings/cluster/nodes/show-no import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +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"; @@ -25,6 +26,7 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; + const locale = await getLocale(req.cookies); if (IS_CLOUD) { return { redirect: { @@ -58,6 +60,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/destinations.tsx b/apps/dokploy/pages/dashboard/settings/destinations.tsx index 3c906b55..72cced44 100644 --- a/apps/dokploy/pages/dashboard/settings/destinations.tsx +++ b/apps/dokploy/pages/dashboard/settings/destinations.tsx @@ -2,6 +2,7 @@ import { ShowDestinations } from "@/components/dashboard/settings/destination/sh import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; @@ -25,6 +26,7 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; + const locale = await getLocale(req.cookies); const { user, session } = await validateRequest(req); if (!user || user.role === "member") { return { @@ -52,6 +54,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/git-providers.tsx b/apps/dokploy/pages/dashboard/settings/git-providers.tsx index 7a9b08df..82293180 100644 --- a/apps/dokploy/pages/dashboard/settings/git-providers.tsx +++ b/apps/dokploy/pages/dashboard/settings/git-providers.tsx @@ -2,6 +2,7 @@ import { ShowGitProviders } from "@/components/dashboard/settings/git/show-git-p import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; @@ -9,68 +10,72 @@ import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { - return ( -
- -
- ); + return ( +
+ +
+ ); }; export default Page; Page.getLayout = (page: ReactElement) => { - return {page}; + return {page}; }; export async function getServerSideProps( - ctx: GetServerSidePropsContext<{ serviceId: string }>, + ctx: GetServerSidePropsContext<{ serviceId: string }> ) { - const { user, session } = await validateRequest(ctx.req); - if (!user) { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - const { req, res } = ctx; - const helpers = createServerSideHelpers({ - router: appRouter, - ctx: { - req: req as any, - res: res as any, - db: null as any, - session: session as any, - user: user as any, - }, - transformer: superjson, - }); - await helpers.user.get.prefetch(); - try { - await helpers.project.all.prefetch(); - await helpers.settings.isCloud.prefetch(); - if (user.role === "member") { - const userR = await helpers.user.one.fetch({ - userId: user.id, - }); + const { user, session } = await validateRequest(ctx.req); + if (!user) { + return { + redirect: { + permanent: true, + destination: "/", + }, + }; + } + const { req, res } = ctx; + const locale = await getLocale(req.cookies); + const helpers = createServerSideHelpers({ + router: appRouter, + ctx: { + req: req as any, + res: res as any, + db: null as any, + session: session as any, + user: user as any, + }, + transformer: superjson, + }); + await helpers.user.get.prefetch(); + try { + await helpers.project.all.prefetch(); + await helpers.settings.isCloud.prefetch(); + if (user.role === "member") { + const userR = await helpers.user.one.fetch({ + userId: user.id, + }); - if (!userR?.canAccessToGitProviders) { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - } - return { - props: { - trpcState: helpers.dehydrate(), - }, - }; - } catch (_error) { - return { - props: {}, - }; - } + if (!userR?.canAccessToGitProviders) { + return { + redirect: { + permanent: true, + destination: "/", + }, + }; + } + } + return { + props: { + trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), + }, + }; + } catch (_error) { + return { + props: { + ...(await serverSideTranslations(locale, ["common", "settings"])), + }, + }; + } } diff --git a/apps/dokploy/pages/dashboard/settings/index.tsx b/apps/dokploy/pages/dashboard/settings/index.tsx index 4c060cbb..5f9bf3df 100644 --- a/apps/dokploy/pages/dashboard/settings/index.tsx +++ b/apps/dokploy/pages/dashboard/settings/index.tsx @@ -21,6 +21,7 @@ import { import { Switch } from "@/components/ui/switch"; import { appRouter } from "@/server/api/root"; import { api } from "@/utils/api"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { zodResolver } from "@hookform/resolvers/zod"; import { createServerSideHelpers } from "@trpc/react-query/server"; @@ -180,6 +181,7 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; + const locale = await getLocale(req.cookies); const { user, session } = await validateRequest(ctx.req); if (!user) { return { @@ -214,6 +216,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/notifications.tsx b/apps/dokploy/pages/dashboard/settings/notifications.tsx index fbdc2e20..e595279c 100644 --- a/apps/dokploy/pages/dashboard/settings/notifications.tsx +++ b/apps/dokploy/pages/dashboard/settings/notifications.tsx @@ -2,6 +2,7 @@ import { ShowNotifications } from "@/components/dashboard/settings/notifications import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; @@ -25,6 +26,7 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; + const locale = await getLocale(req.cookies); const { user, session } = await validateRequest(req); if (!user || user.role === "member") { return { @@ -52,6 +54,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/profile.tsx b/apps/dokploy/pages/dashboard/settings/profile.tsx index 83ff5624..db2e2782 100644 --- a/apps/dokploy/pages/dashboard/settings/profile.tsx +++ b/apps/dokploy/pages/dashboard/settings/profile.tsx @@ -66,7 +66,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["settings"])), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/registry.tsx b/apps/dokploy/pages/dashboard/settings/registry.tsx index 42f0627f..17010a0c 100644 --- a/apps/dokploy/pages/dashboard/settings/registry.tsx +++ b/apps/dokploy/pages/dashboard/settings/registry.tsx @@ -2,6 +2,7 @@ import { ShowRegistry } from "@/components/dashboard/settings/cluster/registry/s import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { serverSideTranslations, getLocale } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; @@ -25,6 +26,7 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; + const locale = await getLocale(req.cookies); const { user, session } = await validateRequest(req); if (!user || user.role === "member") { return { @@ -51,6 +53,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/server.tsx b/apps/dokploy/pages/dashboard/settings/server.tsx index 0c5e36dc..62430eec 100644 --- a/apps/dokploy/pages/dashboard/settings/server.tsx +++ b/apps/dokploy/pages/dashboard/settings/server.tsx @@ -115,7 +115,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["settings"])), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/servers.tsx b/apps/dokploy/pages/dashboard/settings/servers.tsx index 5cc30b83..2192749a 100644 --- a/apps/dokploy/pages/dashboard/settings/servers.tsx +++ b/apps/dokploy/pages/dashboard/settings/servers.tsx @@ -62,7 +62,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["settings"])), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx b/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx index 2472feab..9d746eb3 100644 --- a/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx +++ b/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx @@ -2,6 +2,7 @@ import { ShowDestinations } from "@/components/dashboard/settings/ssh-keys/show- import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; @@ -34,6 +35,7 @@ export async function getServerSideProps( }; } const { req, res } = ctx; + const locale = await getLocale(req.cookies); const helpers = createServerSideHelpers({ router: appRouter, ctx: { @@ -67,11 +69,14 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } catch (_error) { return { - props: {}, + props: { + ...(await serverSideTranslations(locale, ["common", "settings"])), + }, }; } } diff --git a/apps/dokploy/pages/dashboard/settings/users.tsx b/apps/dokploy/pages/dashboard/settings/users.tsx index 16f90abb..3c32a029 100644 --- a/apps/dokploy/pages/dashboard/settings/users.tsx +++ b/apps/dokploy/pages/dashboard/settings/users.tsx @@ -3,6 +3,7 @@ import { ShowUsers } from "@/components/dashboard/settings/users/show-users"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; @@ -27,6 +28,7 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; + const locale = await getLocale(req.cookies); const { user, session } = await validateRequest(req); if (!user || user.role === "member") { @@ -55,6 +57,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "settings"])), }, }; } diff --git a/apps/dokploy/public/locales/en/common.json b/apps/dokploy/public/locales/en/common.json index 0967ef42..ab7f2718 100644 --- a/apps/dokploy/public/locales/en/common.json +++ b/apps/dokploy/public/locales/en/common.json @@ -1 +1,37 @@ -{} +{ + "common.side.home": "Home", + "common.side.settings": "Settings", + "common.side.extra": "Extra", + + "common.side.projects": "Projects", + "common.side.monitoring": "Monitoring", + "common.side.traefik": "Traefik File System", + "common.side.docker": "Docker", + "common.side.swarm": "Swarm", + "common.side.requests": "Requests", + "common.side.web-server": "Web Server", + "common.side.profile": "Profile", + "common.side.remote-servers": "Remote Servers", + "common.side.users": "Users", + "common.side.ssh-keys": "SSH Keys", + "common.side.ai": "AI", + "common.side.git": "Git", + "common.side.registry": "Registry", + "common.side.s3-destinations": "S3 Destinations", + "common.side.certificates": "Certificates", + "common.side.cluster": "Cluster", + "common.side.notifications": "Notifications", + "common.side.billing": "Billing", + "common.side.documentation": "Documentation", + "common.side.support": "Support", + "common.side.sponsor": "Sponsor", + + "common.side.invitations.pending-invitations": "Pending Invitations", + "common.side.invitations.no-pending-invitations": "No pending invitations", + "common.side.invitations.accept-invitation": "Accept Invitation", + "common.side.invitations.confirm-accept-invitation": "Are you sure you want to accept this invitation?", + "common.side.invitations.error-accepting-invitation": "Error accepting invitation", + "common.side.invitations.invitation-accepted": "Invitation accepted successfully", + "common.side.invitations.expires": "Expires: {{expireDate}}", + "common.side.invitations.role": "Role: {{role}}" +} diff --git a/apps/dokploy/public/locales/zh-Hans/common.json b/apps/dokploy/public/locales/zh-Hans/common.json index 0967ef42..bc0605d7 100644 --- a/apps/dokploy/public/locales/zh-Hans/common.json +++ b/apps/dokploy/public/locales/zh-Hans/common.json @@ -1 +1,37 @@ -{} +{ + "common.side.home": "主页", + "common.side.settings": "设置", + "common.side.extra": "其他", + + "common.side.projects": "项目", + "common.side.monitoring": "监控", + "common.side.traefik": "Traefik", + "common.side.docker": "Docker", + "common.side.swarm": "Swarm", + "common.side.requests": "请求", + "common.side.web-server": "本地配置", + "common.side.profile": "个人资料", + "common.side.remote-servers": "远程服务器", + "common.side.users": "用户", + "common.side.ssh-keys": "SSH 密钥", + "common.side.ai": "AI", + "common.side.git": "Git 集成", + "common.side.registry": "注册表", + "common.side.s3-destinations": "S3 存储", + "common.side.certificates": "证书", + "common.side.cluster": "集群", + "common.side.notifications": "通知", + "common.side.billing": "账单", + "common.side.documentation": "文档", + "common.side.support": "支持", + "common.side.sponsor": "赞助", + + "common.side.invitations.pending-invitations": "待处理邀请", + "common.side.invitations.no-pending-invitations": "没有待处理的邀请", + "common.side.invitations.accept-invitation": "接受邀请", + "common.side.invitations.confirm-accept-invitation": "您确定要接受此邀请吗?", + "common.side.invitations.error-accepting-invitation": "接受邀请时出错", + "common.side.invitations.invitation-accepted": "邀请已成功接受", + "common.side.invitations.expires": "有效期:{{expireDate}}", + "common.side.invitations.role": "角色:{{role}}" +} From 3e522b9cae7da576bf99373f7c540e4ea7c65477 Mon Sep 17 00:00:00 2001 From: JiPai Date: Sun, 9 Mar 2025 21:31:46 +0800 Subject: [PATCH 07/43] feat(i18n): update sidebar tooltips for internationalization --- apps/dokploy/components/layouts/side.tsx | 10 +++++----- apps/dokploy/public/locales/zh-Hans/common.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx index f7d0a097..1d4952b0 100644 --- a/apps/dokploy/components/layouts/side.tsx +++ b/apps/dokploy/components/layouts/side.tsx @@ -884,7 +884,7 @@ export default function Page({ children }: Props) { {isSingle ? ( {item.icon && } @@ -973,7 +973,7 @@ export default function Page({ children }: Props) { {isSingle ? ( {item.icon && } - {item.title} + {t(item.titleKey)} {item.items?.length && ( )} diff --git a/apps/dokploy/public/locales/zh-Hans/common.json b/apps/dokploy/public/locales/zh-Hans/common.json index bc0605d7..5eb3df65 100644 --- a/apps/dokploy/public/locales/zh-Hans/common.json +++ b/apps/dokploy/public/locales/zh-Hans/common.json @@ -9,7 +9,7 @@ "common.side.docker": "Docker", "common.side.swarm": "Swarm", "common.side.requests": "请求", - "common.side.web-server": "本地配置", + "common.side.web-server": "本地服务器", "common.side.profile": "个人资料", "common.side.remote-servers": "远程服务器", "common.side.users": "用户", From 888e904d75615548065a1a0fd44e20409881a2ec Mon Sep 17 00:00:00 2001 From: JiPai Date: Sun, 9 Mar 2025 22:09:27 +0800 Subject: [PATCH 08/43] feat(i18n): add i18n for organization management --- .../organization/handle-organization.tsx | 36 +++++++++++++------ apps/dokploy/components/layouts/side.tsx | 21 +++++++---- apps/dokploy/public/locales/en/common.json | 20 ++++++++++- .../public/locales/zh-Hans/common.json | 20 ++++++++++- 4 files changed, 79 insertions(+), 18 deletions(-) diff --git a/apps/dokploy/components/dashboard/organization/handle-organization.tsx b/apps/dokploy/components/dashboard/organization/handle-organization.tsx index 014c37df..4ccb03cf 100644 --- a/apps/dokploy/components/dashboard/organization/handle-organization.tsx +++ b/apps/dokploy/components/dashboard/organization/handle-organization.tsx @@ -21,6 +21,7 @@ import { Input } from "@/components/ui/input"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { PenBoxIcon, Plus } from "lucide-react"; +import { useTranslation } from "next-i18next"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; @@ -41,6 +42,7 @@ interface Props { } export function AddOrganization({ organizationId }: Props) { + const { t } = useTranslation("common"); const [open, setOpen] = useState(false); const utils = api.useUtils(); const { data: organization } = api.organization.one.useQuery( @@ -81,7 +83,9 @@ export function AddOrganization({ organizationId }: Props) { .then(() => { form.reset(); toast.success( - `Organization ${organizationId ? "updated" : "created"} successfully`, + organizationId + ? t("common.side.organizations.updateSuccess") + : t("common.side.organizations.createSuccess"), ); utils.organization.all.invalidate(); setOpen(false); @@ -89,7 +93,9 @@ export function AddOrganization({ organizationId }: Props) { .catch((error) => { console.error(error); toast.error( - `Failed to ${organizationId ? "update" : "create"} organization`, + organizationId + ? t("common.side.organizations.updateFailed") + : t("common.side.organizations.createFailed"), ); }); }; @@ -113,7 +119,7 @@ export function AddOrganization({ organizationId }: Props) {
- Add organization + {t("common.side.organizations.createOrganization")}
)} @@ -121,12 +127,14 @@ export function AddOrganization({ organizationId }: Props) { - {organizationId ? "Update organization" : "Add organization"} + {organizationId + ? t("common.side.organizations.updateOrganization") + : t("common.side.organizations.createOrganization")} {organizationId - ? "Update the organization name and logo" - : "Create a new organization to manage your projects."} + ? t("common.side.organizations.updateOrganizationDescription") + : t("common.side.organizations.createOrganizationDescription")}
@@ -139,10 +147,14 @@ export function AddOrganization({ organizationId }: Props) { name="name" render={({ field }) => ( - Name + + {t("common.side.organizations.name")} + @@ -156,7 +168,9 @@ export function AddOrganization({ organizationId }: Props) { name="logo" render={({ field }) => ( - Logo URL + + {t("common.side.organizations.logoURL")} + diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx index 1d4952b0..36590f9d 100644 --- a/apps/dokploy/components/layouts/side.tsx +++ b/apps/dokploy/components/layouts/side.tsx @@ -603,7 +603,8 @@ function SidebarLogo() { )} >

- {activeOrganization?.name ?? "Select Organization"} + {activeOrganization?.name ?? + t("common.side.organizations.select-organization")}

@@ -619,7 +620,7 @@ function SidebarLogo() { sideOffset={4} > - Organizations + {t("common.side.organizations")} {organizations?.map((org) => (
@@ -647,8 +648,12 @@ function SidebarLogo() {
{ await deleteOrganization({ @@ -657,13 +662,17 @@ function SidebarLogo() { .then(() => { refetch(); toast.success( - "Organization deleted successfully", + t( + "common.side.organizations.organization-deleted", + ), ); }) .catch((error) => { toast.error( error?.message || - "Error deleting organization", + t( + "common.side.organizations.error-deleting-organization", + ), ); }); }} diff --git a/apps/dokploy/public/locales/en/common.json b/apps/dokploy/public/locales/en/common.json index ab7f2718..11727ba7 100644 --- a/apps/dokploy/public/locales/en/common.json +++ b/apps/dokploy/public/locales/en/common.json @@ -33,5 +33,23 @@ "common.side.invitations.error-accepting-invitation": "Error accepting invitation", "common.side.invitations.invitation-accepted": "Invitation accepted successfully", "common.side.invitations.expires": "Expires: {{expireDate}}", - "common.side.invitations.role": "Role: {{role}}" + "common.side.invitations.role": "Role: {{role}}", + + "common.side.organizations": "Organizations", + "common.side.organizations.select-organization": "Select Organization", + "common.side.organizations.delete-organization": "Delete Organization", + "common.side.organizations.confirm-delete-organization": "Are you sure you want to delete this organization?", + "common.side.organizations.organization-deleted": "Organization deleted successfully", + "common.side.organizations.error-deleting-organization": "Error deleting organization", + "common.side.organizations.createOrganization": "Create organization", + "common.side.organizations.updateOrganization": "Update organization", + "common.side.organizations.createOrganizationDescription": "Create a new organization to manage your projects.", + "common.side.organizations.updateOrganizationDescription": "Update the organization name and logo", + "common.side.organizations.name": "Name", + "common.side.organizations.name.placeHolder": "Organization name", + "common.side.organizations.logoURL": "Logo URL", + "common.side.organizations.createSuccess": "Organization created successfully", + "common.side.organizations.updateSuccess": "Organization updated successfully", + "common.side.organizations.createFailed": "Failed to create organization", + "common.side.organizations.updateFailed": "Failed to update organization" } diff --git a/apps/dokploy/public/locales/zh-Hans/common.json b/apps/dokploy/public/locales/zh-Hans/common.json index 5eb3df65..174fb86d 100644 --- a/apps/dokploy/public/locales/zh-Hans/common.json +++ b/apps/dokploy/public/locales/zh-Hans/common.json @@ -33,5 +33,23 @@ "common.side.invitations.error-accepting-invitation": "接受邀请时出错", "common.side.invitations.invitation-accepted": "邀请已成功接受", "common.side.invitations.expires": "有效期:{{expireDate}}", - "common.side.invitations.role": "角色:{{role}}" + "common.side.invitations.role": "角色:{{role}}", + + "common.side.organizations": "组织", + "common.side.organizations.select-organization": "选择组织", + "common.side.organizations.delete-organization": "删除组织", + "common.side.organizations.confirm-delete-organization": "您确定要删除此组织吗?", + "common.side.organizations.organization-deleted": "组织已成功删除", + "common.side.organizations.error-deleting-organization": "删除组织时出错", + "common.side.organizations.createOrganization": "创建组织", + "common.side.organizations.updateOrganization": "更新组织", + "common.side.organizations.createOrganizationDescription": "创建一个新组织来管理您的项目。", + "common.side.organizations.updateOrganizationDescription": "更新组织名称和标志", + "common.side.organizations.name": "名称", + "common.side.organizations.name.placeHolder": "请输入组织名称", + "common.side.organizations.logoURL": "Logo 图片地址", + "common.side.organizations.createSuccess": "组织创建成功", + "common.side.organizations.updateSuccess": "组织更新成功", + "common.side.organizations.createFailed": "创建组织失败", + "common.side.organizations.updateFailed": "更新组织失败" } From ed89f5aa8acace47b961d17469ab85815a45060b Mon Sep 17 00:00:00 2001 From: JiPai Date: Sun, 9 Mar 2025 22:24:04 +0800 Subject: [PATCH 09/43] chore(i18n): add home.json demo file --- apps/dokploy/components/dashboard/projects/show.tsx | 6 ++++-- apps/dokploy/public/locales/en/home.json | 4 ++++ apps/dokploy/public/locales/zh-Hans/home.json | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 apps/dokploy/public/locales/en/home.json create mode 100644 apps/dokploy/public/locales/zh-Hans/home.json diff --git a/apps/dokploy/components/dashboard/projects/show.tsx b/apps/dokploy/components/dashboard/projects/show.tsx index 188ee60d..042db84e 100644 --- a/apps/dokploy/components/dashboard/projects/show.tsx +++ b/apps/dokploy/components/dashboard/projects/show.tsx @@ -47,9 +47,11 @@ import { useMemo, useState } from "react"; import { toast } from "sonner"; import { HandleProject } from "./handle-project"; import { ProjectEnvironment } from "./project-environment"; +import { useTranslation } from "next-i18next"; export const ShowProjects = () => { const utils = api.useUtils(); + const { t } = useTranslation("home"); const { data, isLoading } = api.project.all.useQuery(); const { data: auth } = api.user.get.useQuery(); const { mutateAsync } = api.project.remove.useMutation(); @@ -76,10 +78,10 @@ export const ShowProjects = () => { - Projects + {t("home.projects.title")} - Create and manage your projects + {t("home.projects.description")} diff --git a/apps/dokploy/public/locales/en/home.json b/apps/dokploy/public/locales/en/home.json new file mode 100644 index 00000000..708466b6 --- /dev/null +++ b/apps/dokploy/public/locales/en/home.json @@ -0,0 +1,4 @@ +{ + "home.projects.title": "Projects", + "home.projects.description": "Create and manage your projects" +} diff --git a/apps/dokploy/public/locales/zh-Hans/home.json b/apps/dokploy/public/locales/zh-Hans/home.json new file mode 100644 index 00000000..253c3d77 --- /dev/null +++ b/apps/dokploy/public/locales/zh-Hans/home.json @@ -0,0 +1,4 @@ +{ + "home.projects.title": "项目", + "home.projects.description": "创建和管理您的项目" +} From a1bbfaebf4c4c7253eefe583caf0e9020df8af99 Mon Sep 17 00:00:00 2001 From: JiPai Date: Sun, 9 Mar 2025 22:24:46 +0800 Subject: [PATCH 10/43] feat(i18n): add translations to dashboard pages --- apps/dokploy/pages/dashboard/docker.tsx | 7 ++++++- apps/dokploy/pages/dashboard/monitoring.tsx | 7 ++++++- apps/dokploy/pages/dashboard/projects.tsx | 3 +++ apps/dokploy/pages/dashboard/requests.tsx | 7 ++++++- apps/dokploy/pages/dashboard/swarm.tsx | 7 ++++++- apps/dokploy/pages/dashboard/traefik.tsx | 7 ++++++- 6 files changed, 33 insertions(+), 5 deletions(-) diff --git a/apps/dokploy/pages/dashboard/docker.tsx b/apps/dokploy/pages/dashboard/docker.tsx index e01a763b..41dae277 100644 --- a/apps/dokploy/pages/dashboard/docker.tsx +++ b/apps/dokploy/pages/dashboard/docker.tsx @@ -1,6 +1,7 @@ import { ShowContainers } from "@/components/dashboard/docker/show/show-containers"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { IS_CLOUD } from "@dokploy/server/constants"; import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; @@ -38,6 +39,7 @@ export async function getServerSideProps( }; } const { req, res } = ctx; + const locale = getLocale(req.cookies); const helpers = createServerSideHelpers({ router: appRouter, @@ -70,11 +72,14 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "home"])), }, }; } catch (_error) { return { - props: {}, + props: { + ...(await serverSideTranslations(locale, ["common", "home"])), + }, }; } } diff --git a/apps/dokploy/pages/dashboard/monitoring.tsx b/apps/dokploy/pages/dashboard/monitoring.tsx index 4272c453..75ed5910 100644 --- a/apps/dokploy/pages/dashboard/monitoring.tsx +++ b/apps/dokploy/pages/dashboard/monitoring.tsx @@ -4,6 +4,7 @@ import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { Card } from "@/components/ui/card"; import { useLocalStorage } from "@/hooks/useLocalStorage"; import { api } from "@/utils/api"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { IS_CLOUD } from "@dokploy/server/constants"; import { validateRequest } from "@dokploy/server/lib/auth"; import { Loader2 } from "lucide-react"; @@ -91,6 +92,8 @@ Dashboard.getLayout = (page: ReactElement) => { export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { + const { req } = ctx; + const locale = getLocale(req.cookies); if (IS_CLOUD) { return { redirect: { @@ -110,6 +113,8 @@ export async function getServerSideProps( } return { - props: {}, + props: { + ...(await serverSideTranslations(locale, ["common", "home"])), + }, }; } diff --git a/apps/dokploy/pages/dashboard/projects.tsx b/apps/dokploy/pages/dashboard/projects.tsx index 5434163a..9134b130 100644 --- a/apps/dokploy/pages/dashboard/projects.tsx +++ b/apps/dokploy/pages/dashboard/projects.tsx @@ -2,6 +2,7 @@ import { ShowProjects } from "@/components/dashboard/projects/show"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; import { api } from "@/utils/api"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; import type { GetServerSidePropsContext } from "next"; @@ -37,6 +38,7 @@ export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { const { req, res } = ctx; + const locale = getLocale(req.cookies); const { user, session } = await validateRequest(req); const helpers = createServerSideHelpers({ @@ -64,6 +66,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "home"])), }, }; } diff --git a/apps/dokploy/pages/dashboard/requests.tsx b/apps/dokploy/pages/dashboard/requests.tsx index cb454587..14246c34 100644 --- a/apps/dokploy/pages/dashboard/requests.tsx +++ b/apps/dokploy/pages/dashboard/requests.tsx @@ -1,5 +1,6 @@ import { ShowRequests } from "@/components/dashboard/requests/show-requests"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { IS_CLOUD } from "@dokploy/server/constants"; import { validateRequest } from "@dokploy/server/lib/auth"; import type { GetServerSidePropsContext } from "next"; @@ -14,6 +15,8 @@ Requests.getLayout = (page: ReactElement) => { export async function getServerSideProps( ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { + const { req } = ctx; + const locale = getLocale(req.cookies); if (IS_CLOUD) { return { redirect: { @@ -33,6 +36,8 @@ export async function getServerSideProps( } return { - props: {}, + props: { + ...(await serverSideTranslations(locale, ["common", "home"])), + }, }; } diff --git a/apps/dokploy/pages/dashboard/swarm.tsx b/apps/dokploy/pages/dashboard/swarm.tsx index 15553116..1a202fb3 100644 --- a/apps/dokploy/pages/dashboard/swarm.tsx +++ b/apps/dokploy/pages/dashboard/swarm.tsx @@ -1,6 +1,7 @@ import SwarmMonitorCard from "@/components/dashboard/swarm/monitoring-card"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { IS_CLOUD } from "@dokploy/server/constants"; import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; @@ -38,6 +39,7 @@ export async function getServerSideProps( }; } const { req, res } = ctx; + const locale = getLocale(req.cookies); const helpers = createServerSideHelpers({ router: appRouter, @@ -70,11 +72,14 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "home"])), }, }; } catch (_error) { return { - props: {}, + props: { + ...(await serverSideTranslations(locale, ["common", "home"])), + }, }; } } diff --git a/apps/dokploy/pages/dashboard/traefik.tsx b/apps/dokploy/pages/dashboard/traefik.tsx index ce8208be..df2e9fa3 100644 --- a/apps/dokploy/pages/dashboard/traefik.tsx +++ b/apps/dokploy/pages/dashboard/traefik.tsx @@ -1,6 +1,7 @@ import { ShowTraefikSystem } from "@/components/dashboard/file-system/show-traefik-system"; import { DashboardLayout } from "@/components/layouts/dashboard-layout"; import { appRouter } from "@/server/api/root"; +import { getLocale, serverSideTranslations } from "@/utils/i18n"; import { IS_CLOUD } from "@dokploy/server/constants"; import { validateRequest } from "@dokploy/server/lib/auth"; import { createServerSideHelpers } from "@trpc/react-query/server"; @@ -38,6 +39,7 @@ export async function getServerSideProps( }; } const { req, res } = ctx; + const locale = getLocale(req.cookies); const helpers = createServerSideHelpers({ router: appRouter, @@ -70,11 +72,14 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale, ["common", "home"])), }, }; } catch (_error) { return { - props: {}, + props: { + ...(await serverSideTranslations(locale, ["common", "home"])), + }, }; } } From 6df0878ed4070dae6598da3b06dc98a43cc33a6d Mon Sep 17 00:00:00 2001 From: JiPai Date: Sun, 9 Mar 2025 23:00:33 +0800 Subject: [PATCH 11/43] feat(i18n):add i18n for auth page --- .../organization/handle-organization.tsx | 2 +- apps/dokploy/components/layouts/side.tsx | 2 +- apps/dokploy/components/layouts/user-nav.tsx | 30 ++++---- .../pages/dashboard/settings/billing.tsx | 1 + apps/dokploy/pages/index.tsx | 75 ++++++++++--------- apps/dokploy/public/locales/en/auth.json | 30 ++++++++ apps/dokploy/public/locales/en/common.json | 9 ++- apps/dokploy/public/locales/zh-Hans/auth.json | 30 ++++++++ .../public/locales/zh-Hans/common.json | 9 ++- 9 files changed, 135 insertions(+), 53 deletions(-) create mode 100644 apps/dokploy/public/locales/en/auth.json create mode 100644 apps/dokploy/public/locales/zh-Hans/auth.json diff --git a/apps/dokploy/components/dashboard/organization/handle-organization.tsx b/apps/dokploy/components/dashboard/organization/handle-organization.tsx index 4ccb03cf..1bf0cd99 100644 --- a/apps/dokploy/components/dashboard/organization/handle-organization.tsx +++ b/apps/dokploy/components/dashboard/organization/handle-organization.tsx @@ -153,7 +153,7 @@ export function AddOrganization({ organizationId }: Props) { - {activeItem?.title} + {activeItem?.titleKey ? t(activeItem.titleKey) : ""} diff --git a/apps/dokploy/components/layouts/user-nav.tsx b/apps/dokploy/components/layouts/user-nav.tsx index 85cb96f3..ecb9e25b 100644 --- a/apps/dokploy/components/layouts/user-nav.tsx +++ b/apps/dokploy/components/layouts/user-nav.tsx @@ -23,11 +23,13 @@ import { ChevronsUpDown } from "lucide-react"; import { useRouter } from "next/router"; import { ModeToggle } from "../ui/modeToggle"; import { SidebarMenuButton } from "../ui/sidebar"; +import { useTranslation } from "next-i18next"; const _AUTO_CHECK_UPDATES_INTERVAL_MINUTES = 7; export const UserNav = () => { const router = useRouter(); + const { t } = useTranslation("common"); const { data } = api.user.get.useQuery(); const { data: isCloud } = api.settings.isCloud.useQuery(); @@ -49,7 +51,9 @@ export const UserNav = () => { CN
- Account + + {t("common.account")} + {data?.user?.email}
@@ -63,7 +67,7 @@ export const UserNav = () => { >
- My Account + {t("common.account.mine")} {data?.user?.email} @@ -78,7 +82,7 @@ export const UserNav = () => { router.push("/dashboard/settings/profile"); }} > - Profile + {t("common.side.profile")} { router.push("/dashboard/projects"); }} > - Projects + {t("common.side.projects")} {!isCloud ? ( <> @@ -96,7 +100,7 @@ export const UserNav = () => { router.push("/dashboard/monitoring"); }} > - Monitoring + {t("common.side.monitoring")} {(data?.role === "owner" || data?.canAccessToTraefikFiles) && ( { router.push("/dashboard/traefik"); }} > - Traefik + {t("common.side.traefik")} )} {(data?.role === "owner" || data?.canAccessToDocker) && ( @@ -117,7 +121,7 @@ export const UserNav = () => { }); }} > - Docker + {t("common.side.docker")} )} @@ -128,7 +132,7 @@ export const UserNav = () => { router.push("/dashboard/settings"); }} > - Settings + {t("common.side.settings")} )} @@ -141,7 +145,7 @@ export const UserNav = () => { router.push("/dashboard/settings/servers"); }} > - Servers + {t("common.side.remote-servers")} )} @@ -152,7 +156,7 @@ export const UserNav = () => { router.push("/dashboard/settings"); }} > - Settings + {t("common.side.settings")} )} @@ -165,7 +169,7 @@ export const UserNav = () => { router.push("/dashboard/settings/billing"); }} > - Billing + {t("common.side.billing")} )} @@ -181,7 +185,7 @@ export const UserNav = () => { // }); }} > - Log out + {t("common.account.logout")}
@@ -291,11 +295,11 @@ export default function Home({ IS_CLOUD }: Props) { name="password" render={({ field }) => ( - Password + {t("auth.password")} @@ -308,7 +312,7 @@ export default function Home({ IS_CLOUD }: Props) { type="submit" isLoading={isLoginLoading} > - Login + {t("auth.login")} @@ -322,7 +326,7 @@ export default function Home({ IS_CLOUD }: Props) { autoComplete="off" >
- + - Enter the 6-digit code from your authenticator app + {t("auth.twoFactorCodeDescription")}
@@ -361,14 +365,14 @@ export default function Home({ IS_CLOUD }: Props) { setTwoFactorCode(""); }} > - Back + {t("auth.back")}
@@ -379,24 +383,23 @@ export default function Home({ IS_CLOUD }: Props) { > - Enter Backup Code + {t("auth.enterBackupCode")} - Enter one of your backup codes to access your account + {t("auth.enterBackupCodeDescription")}
- + setBackupCode(e.target.value)} - placeholder="Enter your backup code" + placeholder={t("auth.backupCode.placeholder")} className="font-mono" /> - Enter one of the backup codes you received when setting up - 2FA + {t("auth.backupCodeDescription")}
@@ -410,14 +413,14 @@ export default function Home({ IS_CLOUD }: Props) { setBackupCode(""); }} > - Cancel + {t("auth.cancel")}
@@ -433,7 +436,7 @@ export default function Home({ IS_CLOUD }: Props) { className="hover:underline text-muted-foreground" href="/register" > - Create an account + {t("auth.createAccount")} )}
@@ -444,7 +447,7 @@ export default function Home({ IS_CLOUD }: Props) { className="hover:underline text-muted-foreground" href="/send-reset-password" > - Lost your password? + {t("auth.forgetPassword")} ) : ( - Lost your password? + {t("auth.forgetPassword")} )}
@@ -467,6 +470,9 @@ Home.getLayout = (page: ReactElement) => { return {page}; }; export async function getServerSideProps(context: GetServerSidePropsContext) { + const { req } = context; + const locale = getLocale(req.cookies); + if (IS_CLOUD) { try { const { user } = await validateRequest(context.req); @@ -511,6 +517,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { return { props: { hasAdmin, + ...(await serverSideTranslations(locale, ["auth"])), }, }; } diff --git a/apps/dokploy/public/locales/en/auth.json b/apps/dokploy/public/locales/en/auth.json new file mode 100644 index 00000000..89335257 --- /dev/null +++ b/apps/dokploy/public/locales/en/auth.json @@ -0,0 +1,30 @@ +{ + "auth.signIn": "Sign In", + "auth.signInDescription": "Enter your email and password to sign in", + "auth.signInWithGoogle": "Sign in with Google", + "auth.signInWithGithub": "Sign in with GitHub", + "auth.email": "Email", + "auth.password": "Password", + "auth.password.placeholder": "Enter your password", + "auth.login": "Login", + "auth.forgetPassword": "Lost your password?", + "auth.createAccount": "Create an account", + "auth.twoFactorCode": "2FA Code", + "auth.twoFactorCodeDescription": "Enter the 6-digit code from your authenticator app", + "auth.lostAuthenticator": "Lost access to your authenticator app?", + "auth.back": "Back", + "auth.verify": "Verify", + "auth.enterBackupCode": "Enter Backup Code", + "auth.enterBackupCodeDescription": "Enter one of your backup codes to access your account", + "auth.backupCode": "Backup Code", + "auth.backupCode.placeholder": "Enter your backup code", + "auth.backupCodeDescription": "Enter one of the backup codes you received when setting up 2FA", + "auth.cancel": "Cancel", + "auth.invalidTwoFactorCode": "Please enter a valid 6-digit code", + "auth.twoFactorVerificationError": "An error occurred while verifying 2FA code", + "auth.invalidBackupCode": "Please enter a valid backup code", + "auth.backupCodeVerificationError": "An error occurred while verifying backup code", + "auth.githubSignInError": "An error occurred while signing in with GitHub", + "auth.googleSignInError": "An error occurred while signing in with Google", + "auth.unknownError": "Unknown error" +} diff --git a/apps/dokploy/public/locales/en/common.json b/apps/dokploy/public/locales/en/common.json index 11727ba7..4982b29f 100644 --- a/apps/dokploy/public/locales/en/common.json +++ b/apps/dokploy/public/locales/en/common.json @@ -46,10 +46,15 @@ "common.side.organizations.createOrganizationDescription": "Create a new organization to manage your projects.", "common.side.organizations.updateOrganizationDescription": "Update the organization name and logo", "common.side.organizations.name": "Name", - "common.side.organizations.name.placeHolder": "Organization name", + "common.side.organizations.name.placeholder": "Organization name", "common.side.organizations.logoURL": "Logo URL", "common.side.organizations.createSuccess": "Organization created successfully", "common.side.organizations.updateSuccess": "Organization updated successfully", "common.side.organizations.createFailed": "Failed to create organization", - "common.side.organizations.updateFailed": "Failed to update organization" + "common.side.organizations.updateFailed": "Failed to update organization", + + "common.account": "Account", + "common.account.mine": "My Account", + "common.account.logout": "Logout", + "common.account.selectLanguage": "Select Language" } diff --git a/apps/dokploy/public/locales/zh-Hans/auth.json b/apps/dokploy/public/locales/zh-Hans/auth.json new file mode 100644 index 00000000..b3a498d5 --- /dev/null +++ b/apps/dokploy/public/locales/zh-Hans/auth.json @@ -0,0 +1,30 @@ +{ + "auth.signIn": "登录", + "auth.signInDescription": "请输入您的邮箱和密码登录", + "auth.signInWithGoogle": "使用 Google 登录", + "auth.signInWithGithub": "使用 GitHub 登录", + "auth.email": "邮箱", + "auth.password": "密码", + "auth.password.placeholder": "请输入密码", + "auth.login": "登录", + "auth.forgetPassword": "忘记密码?", + "auth.createAccount": "创建账号", + "auth.twoFactorCode": "两步认证", + "auth.twoFactorCodeDescription": "请输入您的认证器应用中的6位数字验证码", + "auth.lostAuthenticator": "无法访问认证器应用?", + "auth.back": "返回", + "auth.verify": "验证", + "auth.enterBackupCode": "输入备用码", + "auth.enterBackupCodeDescription": "输入备用码以访问您的账户", + "auth.backupCode": "备用码", + "auth.backupCode.placeholder": "请输入您的备用码", + "auth.backupCodeDescription": "输入您在设置两步认证时收到的备用码", + "auth.cancel": "取消", + "auth.invalidTwoFactorCode": "请输入有效的6位数字验证码", + "auth.twoFactorVerificationError": "验证两步认证码时发生错误", + "auth.invalidBackupCode": "请输入有效的备用码", + "auth.backupCodeVerificationError": "验证备用码时发生错误", + "auth.githubSignInError": "使用 GitHub 登录时发生错误", + "auth.googleSignInError": "使用 Google 登录时发生错误", + "auth.unknownError": "未知错误" +} diff --git a/apps/dokploy/public/locales/zh-Hans/common.json b/apps/dokploy/public/locales/zh-Hans/common.json index 174fb86d..4a1f21b4 100644 --- a/apps/dokploy/public/locales/zh-Hans/common.json +++ b/apps/dokploy/public/locales/zh-Hans/common.json @@ -46,10 +46,15 @@ "common.side.organizations.createOrganizationDescription": "创建一个新组织来管理您的项目。", "common.side.organizations.updateOrganizationDescription": "更新组织名称和标志", "common.side.organizations.name": "名称", - "common.side.organizations.name.placeHolder": "请输入组织名称", + "common.side.organizations.name.placeholder": "请输入组织名称", "common.side.organizations.logoURL": "Logo 图片地址", "common.side.organizations.createSuccess": "组织创建成功", "common.side.organizations.updateSuccess": "组织更新成功", "common.side.organizations.createFailed": "创建组织失败", - "common.side.organizations.updateFailed": "更新组织失败" + "common.side.organizations.updateFailed": "更新组织失败", + + "common.account": "账户", + "common.account.mine": "我的账户", + "common.account.logout": "注销", + "common.account.selectLanguage": "选择语言" } From d66a5d55a3e05f004b90eb74ab47d23a0f996781 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Tue, 11 Mar 2025 01:36:20 -0600 Subject: [PATCH 12/43] docs: update template contribution guidelines to reference external repository --- CONTRIBUTING.md | 80 +----------- apps/dokploy/CONTRIBUTING.md | 242 ----------------------------------- 2 files changed, 1 insertion(+), 321 deletions(-) delete mode 100644 apps/dokploy/CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8584fdf6..c64d0672 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -165,86 +165,8 @@ Thank you for your contribution! ## Templates -To add a new template, go to `templates` folder and create a new folder with the name of the template. +To add a new template, go to `https://github.com/Dokploy/templates` repository and read the README.md file. -Let's take the example of `plausible` template. - -1. create a folder in `templates/plausible` -2. create a `docker-compose.yml` file inside the folder with the content of compose. -3. create a `index.ts` file inside the folder with the following code as base: -4. When creating a pull request, please provide a video of the template working in action. - -```typescript -// EXAMPLE -import { - generateBase64, - generateHash, - generateRandomDomain, - type Template, - type Schema, - type DomainSchema, -} from "../utils"; - -export function generate(schema: Schema): Template { - // do your stuff here, like create a new domain, generate random passwords, mounts. - const mainServiceHash = generateHash(schema.projectName); - const mainDomain = generateRandomDomain(schema); - const secretBase = generateBase64(64); - const toptKeyBase = generateBase64(32); - - const domains: DomainSchema[] = [ - { - host: mainDomain, - port: 8000, - serviceName: "plausible", - }, - ]; - - const envs = [ - `BASE_URL=http://${mainDomain}`, - `SECRET_KEY_BASE=${secretBase}`, - `TOTP_VAULT_KEY=${toptKeyBase}`, - `HASH=${mainServiceHash}`, - ]; - - const mounts: Template["mounts"] = [ - { - filePath: "./clickhouse/clickhouse-config.xml", - content: "some content......", - }, - ]; - - return { - envs, - mounts, - domains, - }; -} -``` - -4. Now you need to add the information about the template to the `templates/templates.ts` is a object with the following properties: - -**Make sure the id of the template is the same as the folder name and don't have any spaces, only slugified names and lowercase.** - -```typescript -{ - id: "plausible", - name: "Plausible", - version: "v2.1.0", - description: - "Plausible is a open source, self-hosted web analytics platform that lets you track website traffic and user behavior.", - logo: "plausible.svg", // we defined the name and the extension of the logo - links: { - github: "https://github.com/plausible/plausible", - website: "https://plausible.io/", - docs: "https://plausible.io/docs", - }, - tags: ["analytics"], - load: () => import("./plausible/index").then((m) => m.generate), -}, -``` - -5. Add the logo or image of the template to `public/templates/plausible.svg` ### Recommendations diff --git a/apps/dokploy/CONTRIBUTING.md b/apps/dokploy/CONTRIBUTING.md deleted file mode 100644 index 8686b98a..00000000 --- a/apps/dokploy/CONTRIBUTING.md +++ /dev/null @@ -1,242 +0,0 @@ - - -# Contributing - -Hey, thanks for your interest in contributing to Dokploy! We appreciate your help and taking your time to contribute. - - -Before you start, please first discuss the feature/bug you want to add with the owners and comunity via github issues. - -We have a few guidelines to follow when contributing to this project: - -- [Commit Convention](#commit-convention) -- [Setup](#setup) -- [Development](#development) -- [Build](#build) -- [Pull Request](#pull-request) - -## Commit Convention - -Before you craete a Pull Request, please make sure your commit message follows the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification. - -### Commit Message Format -``` -[optional scope]: - -[optional body] - -[optional footer(s)] -``` - -#### Type -Must be one of the following: - -* **feat**: A new feature -* **fix**: A bug fix -* **docs**: Documentation only changes -* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) -* **refactor**: A code change that neither fixes a bug nor adds a feature -* **perf**: A code change that improves performance -* **test**: Adding missing tests or correcting existing tests -* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm) -* **ci**: Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs) -* **chore**: Other changes that don't modify `src` or `test` files -* **revert**: Reverts a previous commit - -Example: -``` -feat: add new feature -``` - - - - -## Setup - -Before you start, please make the clone based on the `canary` branch, since the `main` branch is the source of truth and should always reflect the latest stable release, also the PRs will be merged to the `canary` branch. - -```bash -git clone https://github.com/dokploy/dokploy.git -cd dokploy -pnpm install -cp .env.example .env -``` - -## Development - -Is required to have **Docker** installed on your machine. - - -### Setup - -Run the command that will spin up all the required services and files. - -```bash -pnpm run setup -``` - -Now run the development server. - -```bash -pnpm run dev -``` - - -Go to http://localhost:3000 to see the development server - -## Build - -```bash -pnpm run build -``` - -## Docker - -To build the docker image -```bash -pnpm run docker:build -``` - -To push the docker image -```bash -pnpm run docker:push -``` - -## Password Reset - -In the case you lost your password, you can reset it using the following command - -```bash -pnpm run reset-password -``` - -If you want to test the webhooks on development mode using localtunnel, make sure to install `localtunnel` - -```bash -bunx lt --port 3000 -``` - -If you run into permission issues of docker run the following command - -```bash -sudo chown -R USERNAME dokploy or sudo chown -R $(whoami) ~/.docker -``` - -## Application deploy - -In case you want to deploy the application on your machine and you selected nixpacks or buildpacks, you need to install first. - -```bash -# Install Nixpacks -curl -sSL https://nixpacks.com/install.sh -o install.sh \ - && chmod +x install.sh \ - && ./install.sh -``` - -```bash -# Install Buildpacks -curl -sSL "https://github.com/buildpacks/pack/releases/download/v0.32.1/pack-v0.32.1-linux.tgz" | tar -C /usr/local/bin/ --no-same-owner -xzv pack -``` - - -## Pull Request - -- The `main` branch is the source of truth and should always reflect the latest stable release. -- Create a new branch for each feature or bug fix. -- Make sure to add tests for your changes. -- Make sure to update the documentation for any changes Go to the [docs.dokploy.com](https://docs.dokploy.com) website to see the changes. -- When creating a pull request, please provide a clear and concise description of the changes made. -- If you include a video or screenshot, would be awesome so we can see the changes in action. -- If your pull request fixes an open issue, please reference the issue in the pull request description. -- Once your pull request is merged, you will be automatically added as a contributor to the project. - -Thank you for your contribution! - - - - - -## Templates - -To add a new template, go to `templates` folder and create a new folder with the name of the template. - -Let's take the example of `plausible` template. - -1. create a folder in `templates/plausible` -2. create a `docker-compose.yml` file inside the folder with the content of compose. -3. create a `index.ts` file inside the folder with the following code as base: -4. When creating a pull request, please provide a video of the template working in action. - -```typescript -// EXAMPLE -import { - generateHash, - generateRandomDomain, - type Template, - type Schema, -} from "../utils"; - - -export function generate(schema: Schema): Template { - - // do your stuff here, like create a new domain, generate random passwords, mounts. - const mainServiceHash = generateHash(schema.projectName); - const randomDomain = generateRandomDomain(schema); - const secretBase = generateBase64(64); - const toptKeyBase = generateBase64(32); - - const envs = [ -// If you want to show a domain in the UI, please add the prefix _HOST at the end of the variable name. - `PLAUSIBLE_HOST=${randomDomain}`, - "PLAUSIBLE_PORT=8000", - `BASE_URL=http://${randomDomain}`, - `SECRET_KEY_BASE=${secretBase}`, - `TOTP_VAULT_KEY=${toptKeyBase}`, - `HASH=${mainServiceHash}`, - ]; - - const mounts: Template["mounts"] = [ - { - mountPath: "./clickhouse/clickhouse-config.xml", - content: `some content......`, - }, - ]; - - return { - envs, - mounts, - }; -} -``` - -4. Now you need to add the information about the template to the `templates/templates.ts` is a object with the following properties: - -**Make sure the id of the template is the same as the folder name and don't have any spaces, only slugified names and lowercase.** - -```typescript -{ - id: "plausible", - name: "Plausible", - version: "v2.1.0", - description: - "Plausible is a open source, self-hosted web analytics platform that lets you track website traffic and user behavior.", - logo: "plausible.svg", // we defined the name and the extension of the logo - links: { - github: "https://github.com/plausible/plausible", - website: "https://plausible.io/", - docs: "https://plausible.io/docs", - }, - tags: ["analytics"], - load: () => import("./plausible/index").then((m) => m.generate), -}, -``` - -5. Add the logo or image of the template to `public/templates/plausible.svg` - - -### Recomendations -- Use the same name of the folder as the id of the template. -- The logo should be in the public folder. -- If you want to show a domain in the UI, please add the prefix _HOST at the end of the variable name. -- Test first on a vps or a server to make sure the template works. - From 581e590f6574670b811f8665857e228d05699561 Mon Sep 17 00:00:00 2001 From: Chris <31969757+ChrisvanChip@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:18:17 +0000 Subject: [PATCH 13/43] style: remove inconsistent gap between header and content --- apps/dokploy/components/layouts/side.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx index 0b29112a..1640a1db 100644 --- a/apps/dokploy/components/layouts/side.tsx +++ b/apps/dokploy/components/layouts/side.tsx @@ -1068,7 +1068,7 @@ export default function Page({ children }: Props) { )} -
{children}
+
{children}
); From b7196a34949cafe332a34279e485696393634387 Mon Sep 17 00:00:00 2001 From: Vyacheslav Shcherbinin Date: Wed, 12 Mar 2025 19:15:10 +0700 Subject: [PATCH 14/43] fix(config): large screens support --- apps/dokploy/tailwind.config.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/dokploy/tailwind.config.ts b/apps/dokploy/tailwind.config.ts index a128b87f..be1f8986 100644 --- a/apps/dokploy/tailwind.config.ts +++ b/apps/dokploy/tailwind.config.ts @@ -22,6 +22,9 @@ const config = { fontFamily: { sans: ["var(--font-inter)", ...defaultTheme.fontFamily.sans], }, + screens: { + "3xl": "120rem", + }, maxWidth: { "2xl": "40rem", "8xl": "85rem", From 2ace36f035458b5ebaac4c9cf009e7ffbe12a9bd Mon Sep 17 00:00:00 2001 From: Vyacheslav Shcherbinin Date: Wed, 12 Mar 2025 19:15:56 +0700 Subject: [PATCH 15/43] fix(ui): projects layout for large screen --- apps/dokploy/components/dashboard/projects/show.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/components/dashboard/projects/show.tsx b/apps/dokploy/components/dashboard/projects/show.tsx index b3caef7d..f5566143 100644 --- a/apps/dokploy/components/dashboard/projects/show.tsx +++ b/apps/dokploy/components/dashboard/projects/show.tsx @@ -115,7 +115,7 @@ export const ShowProjects = () => { )} -
+
{filteredProjects?.map((project) => { const emptyServices = project?.mariadb.length === 0 && From 07769e69d69205dcfad5f199648295da7384011a Mon Sep 17 00:00:00 2001 From: Mauro Insacco Date: Thu, 13 Mar 2025 01:44:04 +0100 Subject: [PATCH 16/43] Allow traefik labels customization in docker-composes --- packages/server/src/utils/docker/domain.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/utils/docker/domain.ts b/packages/server/src/utils/docker/domain.ts index bb2f5ca1..1c3c2289 100644 --- a/packages/server/src/utils/docker/domain.ts +++ b/packages/server/src/utils/docker/domain.ts @@ -238,9 +238,9 @@ export const addDomainToCompose = async ( if (Array.isArray(labels)) { if (!labels.includes("traefik.enable=true")) { - labels.push("traefik.enable=true"); + labels.unshift("traefik.enable=true"); } - labels.push(...httpLabels); + labels.unshift(...httpLabels); } if (!compose.isolatedDeployment) { From 8c05214e78c45784b716f0adf7e47edd05d6e454 Mon Sep 17 00:00:00 2001 From: Nicholas Penree Date: Wed, 12 Mar 2025 09:06:25 -0400 Subject: [PATCH 17/43] fix(monitoring): remove extra percent from cpu usage --- .../free/container/show-free-container-monitoring.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx b/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx index 968cf9c2..117fae38 100644 --- a/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx +++ b/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx @@ -218,7 +218,7 @@ export const ContainerFreeMonitoring = ({
- Used: {currentData.cpu.value}% + Used: {currentData.cpu.value} From 7afbe8b20812279b575ba190b5692a4430f8a325 Mon Sep 17 00:00:00 2001 From: Nicholas Penree Date: Wed, 12 Mar 2025 09:07:31 -0400 Subject: [PATCH 18/43] chore(ui): standardize status badge for containers --- .../settings/web-server/docker-terminal-modal.tsx | 7 ++++++- .../dashboard/settings/web-server/show-modal-logs.tsx | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx b/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx index fa9f1a41..44dda0d3 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/docker-terminal-modal.tsx @@ -1,3 +1,4 @@ +import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Dialog, @@ -23,6 +24,7 @@ import { Loader2 } from "lucide-react"; import dynamic from "next/dynamic"; import type React from "react"; import { useEffect, useState } from "react"; +import { badgeStateColor } from "../../application/logs/show"; const Terminal = dynamic( () => @@ -109,7 +111,10 @@ export const DockerTerminalModal = ({ children, appName, serverId }: Props) => { key={container.containerId} value={container.containerId} > - {container.name} ({container.containerId}) {container.state} + {container.name} ({container.containerId}){" "} + + {container.state} + ))} Containers ({data?.length}) diff --git a/apps/dokploy/components/dashboard/settings/web-server/show-modal-logs.tsx b/apps/dokploy/components/dashboard/settings/web-server/show-modal-logs.tsx index 43b1838d..a19d4fb7 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/show-modal-logs.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/show-modal-logs.tsx @@ -21,6 +21,8 @@ import { Loader2 } from "lucide-react"; import dynamic from "next/dynamic"; import type React from "react"; import { useEffect, useState } from "react"; +import { badgeStateColor } from "../../application/logs/show"; +import { Badge } from "@/components/ui/badge"; export const DockerLogsId = dynamic( () => @@ -90,7 +92,10 @@ export const ShowModalLogs = ({ key={container.containerId} value={container.containerId} > - {container.name} ({container.containerId}) {container.state} + {container.name} ({container.containerId}){" "} + + {container.state} + ))} Containers ({data?.length}) From 8f671d1691c56d6f946d863426af71bc32450c5a Mon Sep 17 00:00:00 2001 From: Nicholas Penree Date: Wed, 12 Mar 2025 09:07:54 -0400 Subject: [PATCH 19/43] chore(ui): standardize view logs / terminal menu items --- apps/dokploy/public/locales/en/settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dokploy/public/locales/en/settings.json b/apps/dokploy/public/locales/en/settings.json index ebc5ea62..699a456e 100644 --- a/apps/dokploy/public/locales/en/settings.json +++ b/apps/dokploy/public/locales/en/settings.json @@ -1,6 +1,6 @@ { "settings.common.save": "Save", - "settings.common.enterTerminal": "Enter the terminal", + "settings.common.enterTerminal": "Terminal", "settings.server.domain.title": "Server Domain", "settings.server.domain.description": "Add a domain to your server application.", "settings.server.domain.form.domain": "Domain", @@ -14,7 +14,7 @@ "settings.server.webServer.description": "Reload or clean the web server.", "settings.server.webServer.actions": "Actions", "settings.server.webServer.reload": "Reload", - "settings.server.webServer.watchLogs": "Watch logs", + "settings.server.webServer.watchLogs": "View Logs", "settings.server.webServer.updateServerIp": "Update Server IP", "settings.server.webServer.server.label": "Server", "settings.server.webServer.traefik.label": "Traefik", From 68f608bdc9946b40456f59a6db0061b25d9d0dad Mon Sep 17 00:00:00 2001 From: Nicholas Penree Date: Wed, 12 Mar 2025 09:10:04 -0400 Subject: [PATCH 20/43] chore(ui): replace placeholder company name --- .../components/dashboard/application/update-application.tsx | 2 +- apps/dokploy/components/dashboard/compose/update-compose.tsx | 2 +- apps/dokploy/components/dashboard/mariadb/update-mariadb.tsx | 2 +- apps/dokploy/components/dashboard/mongo/update-mongo.tsx | 2 +- apps/dokploy/components/dashboard/mysql/update-mysql.tsx | 2 +- apps/dokploy/components/dashboard/postgres/update-postgres.tsx | 2 +- apps/dokploy/components/dashboard/projects/handle-project.tsx | 2 +- apps/dokploy/components/dashboard/redis/update-redis.tsx | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/dokploy/components/dashboard/application/update-application.tsx b/apps/dokploy/components/dashboard/application/update-application.tsx index 90b63f08..934a596d 100644 --- a/apps/dokploy/components/dashboard/application/update-application.tsx +++ b/apps/dokploy/components/dashboard/application/update-application.tsx @@ -121,7 +121,7 @@ export const UpdateApplication = ({ applicationId }: Props) => { Name - + diff --git a/apps/dokploy/components/dashboard/compose/update-compose.tsx b/apps/dokploy/components/dashboard/compose/update-compose.tsx index 3120f2d4..c8961860 100644 --- a/apps/dokploy/components/dashboard/compose/update-compose.tsx +++ b/apps/dokploy/components/dashboard/compose/update-compose.tsx @@ -121,7 +121,7 @@ export const UpdateCompose = ({ composeId }: Props) => { Name - + diff --git a/apps/dokploy/components/dashboard/mariadb/update-mariadb.tsx b/apps/dokploy/components/dashboard/mariadb/update-mariadb.tsx index 48d94489..64705b69 100644 --- a/apps/dokploy/components/dashboard/mariadb/update-mariadb.tsx +++ b/apps/dokploy/components/dashboard/mariadb/update-mariadb.tsx @@ -119,7 +119,7 @@ export const UpdateMariadb = ({ mariadbId }: Props) => { Name - + diff --git a/apps/dokploy/components/dashboard/mongo/update-mongo.tsx b/apps/dokploy/components/dashboard/mongo/update-mongo.tsx index c2e3616c..d42f406f 100644 --- a/apps/dokploy/components/dashboard/mongo/update-mongo.tsx +++ b/apps/dokploy/components/dashboard/mongo/update-mongo.tsx @@ -121,7 +121,7 @@ export const UpdateMongo = ({ mongoId }: Props) => { Name - + diff --git a/apps/dokploy/components/dashboard/mysql/update-mysql.tsx b/apps/dokploy/components/dashboard/mysql/update-mysql.tsx index efe1eb11..ec3c1b45 100644 --- a/apps/dokploy/components/dashboard/mysql/update-mysql.tsx +++ b/apps/dokploy/components/dashboard/mysql/update-mysql.tsx @@ -119,7 +119,7 @@ export const UpdateMysql = ({ mysqlId }: Props) => { Name - + diff --git a/apps/dokploy/components/dashboard/postgres/update-postgres.tsx b/apps/dokploy/components/dashboard/postgres/update-postgres.tsx index 7be6908f..2b8804a5 100644 --- a/apps/dokploy/components/dashboard/postgres/update-postgres.tsx +++ b/apps/dokploy/components/dashboard/postgres/update-postgres.tsx @@ -121,7 +121,7 @@ export const UpdatePostgres = ({ postgresId }: Props) => { Name - + diff --git a/apps/dokploy/components/dashboard/projects/handle-project.tsx b/apps/dokploy/components/dashboard/projects/handle-project.tsx index f5d62dfc..85b8aea9 100644 --- a/apps/dokploy/components/dashboard/projects/handle-project.tsx +++ b/apps/dokploy/components/dashboard/projects/handle-project.tsx @@ -148,7 +148,7 @@ export const HandleProject = ({ projectId }: Props) => { Name - + diff --git a/apps/dokploy/components/dashboard/redis/update-redis.tsx b/apps/dokploy/components/dashboard/redis/update-redis.tsx index 193aec3b..8d720703 100644 --- a/apps/dokploy/components/dashboard/redis/update-redis.tsx +++ b/apps/dokploy/components/dashboard/redis/update-redis.tsx @@ -119,7 +119,7 @@ export const UpdateRedis = ({ redisId }: Props) => { Name - + From 9f9492af796ab1224f6fcdb7376cf627ae886cba Mon Sep 17 00:00:00 2001 From: Nicholas Penree Date: Wed, 12 Mar 2025 09:46:59 -0400 Subject: [PATCH 21/43] fix: generate domains from templates using slugified project name --- apps/dokploy/server/api/routers/compose.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts index acb8e172..cab9bc41 100644 --- a/apps/dokploy/server/api/routers/compose.ts +++ b/apps/dokploy/server/api/routers/compose.ts @@ -437,13 +437,12 @@ export const composeRouter = createTRPCRouter({ serverIp = "127.0.0.1"; } + const projectName = slugify(`${project.name} ${input.id}`); const generate = processTemplate(template.config, { serverIp: serverIp, - projectName: project.name, + projectName: projectName, }); - const projectName = slugify(`${project.name} ${input.id}`); - const compose = await createComposeByTemplate({ ...input, composeFile: template.dockerCompose, From e61c216ea0a5fd637b4b114931c74f8ea5cc74a1 Mon Sep 17 00:00:00 2001 From: Tobias Wymer Date: Fri, 14 Mar 2025 19:34:15 +0100 Subject: [PATCH 22/43] fix: removed duplicate percentage label --- .../free/container/show-free-container-monitoring.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx b/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx index 968cf9c2..117fae38 100644 --- a/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx +++ b/apps/dokploy/components/dashboard/monitoring/free/container/show-free-container-monitoring.tsx @@ -218,7 +218,7 @@ export const ContainerFreeMonitoring = ({
- Used: {currentData.cpu.value}% + Used: {currentData.cpu.value} From 27f6c945e03863b8419534f1fbb6f5cc480993bd Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 13:22:47 -0600 Subject: [PATCH 23/43] fix: update template logo URL to use the new domain for consistency --- apps/dokploy/components/dashboard/project/add-template.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/components/dashboard/project/add-template.tsx b/apps/dokploy/components/dashboard/project/add-template.tsx index e2e64e4d..8abc8b40 100644 --- a/apps/dokploy/components/dashboard/project/add-template.tsx +++ b/apps/dokploy/components/dashboard/project/add-template.tsx @@ -324,7 +324,7 @@ export const AddTemplate = ({ projectId, baseUrl }: Props) => { )} > Date: Sat, 15 Mar 2025 14:29:16 -0600 Subject: [PATCH 24/43] feat: add alert block for IP address requirement in database credential components --- .../general/show-external-mariadb-credentials.tsx | 13 +++++++++++++ .../general/show-external-mongo-credentials.tsx | 13 +++++++++++++ .../general/show-external-mysql-credentials.tsx | 13 +++++++++++++ .../general/show-external-postgres-credentials.tsx | 13 +++++++++++++ .../general/show-external-redis-credentials.tsx | 13 +++++++++++++ 5 files changed, 65 insertions(+) diff --git a/apps/dokploy/components/dashboard/mariadb/general/show-external-mariadb-credentials.tsx b/apps/dokploy/components/dashboard/mariadb/general/show-external-mariadb-credentials.tsx index 4a5c43a2..a281f125 100644 --- a/apps/dokploy/components/dashboard/mariadb/general/show-external-mariadb-credentials.tsx +++ b/apps/dokploy/components/dashboard/mariadb/general/show-external-mariadb-credentials.tsx @@ -1,5 +1,6 @@ import { ToggleVisibilityInput } from "@/components/shared/toggle-visibility-input"; import { Button } from "@/components/ui/button"; +import { AlertBlock } from "@/components/shared/alert-block"; import { Card, CardContent, @@ -23,6 +24,7 @@ import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; +import Link from "next/link"; const DockerProviderSchema = z.object({ externalPort: z.preprocess((a) => { @@ -106,6 +108,17 @@ export const ShowExternalMariadbCredentials = ({ mariadbId }: Props) => { + {!getIp && ( + + You need to set an IP address in your{" "} + + {data?.serverId + ? "Remote Servers -> Server -> Edit Server -> Update IP Address" + : "Web Server -> Server -> Update Server IP"} + {" "} + to fix the database url connection. + + )}
{ @@ -106,6 +108,17 @@ export const ShowExternalMongoCredentials = ({ mongoId }: Props) => { + {!getIp && ( + + You need to set an IP address in your{" "} + + {data?.serverId + ? "Remote Servers -> Server -> Edit Server -> Update IP Address" + : "Web Server -> Server -> Update Server IP"} + {" "} + to fix the database url connection. + + )} { @@ -106,6 +108,17 @@ export const ShowExternalMysqlCredentials = ({ mysqlId }: Props) => { + {!getIp && ( + + You need to set an IP address in your{" "} + + {data?.serverId + ? "Remote Servers -> Server -> Edit Server -> Update IP Address" + : "Web Server -> Server -> Update Server IP"} + {" "} + to fix the database url connection. + + )} { @@ -108,6 +110,17 @@ export const ShowExternalPostgresCredentials = ({ postgresId }: Props) => { + {!getIp && ( + + You need to set an IP address in your{" "} + + {data?.serverId + ? "Remote Servers -> Server -> Edit Server -> Update IP Address" + : "Web Server -> Server -> Update Server IP"} + {" "} + to fix the database url connection. + + )} { @@ -100,6 +102,17 @@ export const ShowExternalRedisCredentials = ({ redisId }: Props) => { + {!getIp && ( + + You need to set an IP address in your{" "} + + {data?.serverId + ? "Remote Servers -> Server -> Edit Server -> Update IP Address" + : "Web Server -> Server -> Update Server IP"} + {" "} + to fix the database url connection. + + )} Date: Sat, 15 Mar 2025 14:45:21 -0600 Subject: [PATCH 25/43] chore: update better-auth package to version 1.2.4 and kysely to version 0.27.6; enhance error handling in 2FA feature --- .../dashboard/settings/profile/enable-2fa.tsx | 7 +-- apps/dokploy/package.json | 2 +- packages/server/package.json | 2 +- packages/server/src/lib/auth.ts | 20 ++++++++ pnpm-lock.yaml | 46 +++++++++---------- 5 files changed, 49 insertions(+), 28 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx index f47c8d9c..6cf2c6a5 100644 --- a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx @@ -64,12 +64,12 @@ export const Enable2FA = () => { const handlePasswordSubmit = async (formData: PasswordForm) => { setIsPasswordLoading(true); try { - const { data: enableData } = await authClient.twoFactor.enable({ + const { data: enableData, error } = await authClient.twoFactor.enable({ password: formData.password, }); if (!enableData) { - throw new Error("No data received from server"); + throw new Error(error?.message || "Error enabling 2FA"); } if (enableData.backupCodes) { @@ -95,7 +95,8 @@ export const Enable2FA = () => { error instanceof Error ? error.message : "Error setting up 2FA", ); passwordForm.setError("password", { - message: "Error verifying password", + message: + error instanceof Error ? error.message : "Error setting up 2FA", }); } finally { setIsPasswordLoading(false); diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json index 22fe71be..257d86c0 100644 --- a/apps/dokploy/package.json +++ b/apps/dokploy/package.json @@ -93,7 +93,7 @@ "adm-zip": "^0.5.14", "ai": "^4.0.23", "bcrypt": "5.1.1", - "better-auth": "1.2.0", + "better-auth": "1.2.4", "bl": "6.0.11", "boxen": "^7.1.1", "bullmq": "5.4.2", diff --git a/packages/server/package.json b/packages/server/package.json index 8c153e34..6a81b808 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -40,7 +40,7 @@ "@oslojs/encoding":"1.1.0", "@oslojs/crypto":"1.0.1", "drizzle-dbml-generator":"0.10.0", - "better-auth":"1.2.0", + "better-auth":"1.2.4", "@faker-js/faker": "^8.4.1", "@lucia-auth/adapter-drizzle": "1.0.7", "@octokit/auth-app": "^6.0.4", diff --git a/packages/server/src/lib/auth.ts b/packages/server/src/lib/auth.ts index 1efa1730..dae72207 100644 --- a/packages/server/src/lib/auth.ts +++ b/packages/server/src/lib/auth.ts @@ -28,6 +28,26 @@ const { handler, api } = betterAuth({ clientSecret: process.env.GOOGLE_CLIENT_SECRET as string, }, }, + ...(!IS_CLOUD && { + async trustedOrigins() { + const admin = await db.query.member.findFirst({ + where: eq(schema.member.role, "owner"), + with: { + user: true, + }, + }); + + if (admin) { + return [ + ...(admin.user.serverIp + ? [`http://${admin.user.serverIp}:3000`] + : []), + ...(admin.user.host ? [`https://${admin.user.host}`] : []), + ]; + } + return []; + }, + }), emailVerification: { sendOnSignUp: true, autoSignInAfterVerification: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa137511..9ddbc702 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -269,8 +269,8 @@ importers: specifier: 5.1.1 version: 5.1.1(encoding@0.1.13) better-auth: - specifier: 1.2.0 - version: 1.2.0(typescript@5.5.3) + specifier: 1.2.4 + version: 1.2.4(typescript@5.5.3) bl: specifier: 6.0.11 version: 6.0.11 @@ -303,10 +303,10 @@ importers: version: 16.4.5 drizzle-orm: specifier: ^0.39.1 - version: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) + version: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) drizzle-zod: specifier: 0.5.1 - version: 0.5.1(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7))(zod@3.23.8) + version: 0.5.1(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7))(zod@3.23.8) fancy-ansi: specifier: ^0.1.3 version: 0.1.3 @@ -547,7 +547,7 @@ importers: version: 16.4.5 drizzle-orm: specifier: ^0.39.1 - version: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) + version: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) hono: specifier: ^4.5.8 version: 4.5.8 @@ -646,8 +646,8 @@ importers: specifier: 5.1.1 version: 5.1.1(encoding@0.1.13) better-auth: - specifier: 1.2.0 - version: 1.2.0(typescript@5.5.3) + specifier: 1.2.4 + version: 1.2.4(typescript@5.5.3) bl: specifier: 6.0.11 version: 6.0.11 @@ -665,13 +665,13 @@ importers: version: 16.4.5 drizzle-dbml-generator: specifier: 0.10.0 - version: 0.10.0(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7)) + version: 0.10.0(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7)) drizzle-orm: specifier: ^0.39.1 - version: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) + version: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) drizzle-zod: specifier: 0.5.1 - version: 0.5.1(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7))(zod@3.23.8) + version: 0.5.1(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7))(zod@3.23.8) hi-base32: specifier: ^0.5.1 version: 0.5.1 @@ -4030,8 +4030,8 @@ packages: before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - better-auth@1.2.0: - resolution: {integrity: sha512-eIRGOXfix25bh4fgs8jslZAZssufpIkxfEeEokQu5G4wICoDee1wPctkFb8v80PvhtI4dPm28SuAoZaAdRc6Wg==} + better-auth@1.2.4: + resolution: {integrity: sha512-/ZK2jbUjm8JwdeCLFrUWUBmexPyI9PkaLVXWLWtN60sMDHTY8B5G72wcHglo1QMFBaw4G0qFkP5ayl9k6XfDaA==} better-call@1.0.3: resolution: {integrity: sha512-DUKImKoDIy5UtCvQbHTg0wuBRse6gu1Yvznn7+1B3I5TeY8sclRPFce0HI+4WF2bcb+9PqmkET8nXZubrHQh9A==} @@ -5486,8 +5486,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kysely@0.27.5: - resolution: {integrity: sha512-s7hZHcQeSNKpzCkHRm8yA+0JPLjncSWnjb+2TIElwS2JAqYr+Kv3Ess+9KFfJS0C1xcQ1i9NkNHpWwCYpHMWsA==} + kysely@0.27.6: + resolution: {integrity: sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==} engines: {node: '>=14.0.0'} leac@0.6.0: @@ -10902,7 +10902,7 @@ snapshots: before-after-hook@2.2.3: {} - better-auth@1.2.0(typescript@5.5.3): + better-auth@1.2.4(typescript@5.5.3): dependencies: '@better-auth/utils': 0.2.3 '@better-fetch/fetch': 1.1.15 @@ -10913,7 +10913,7 @@ snapshots: better-call: 1.0.3 defu: 6.1.4 jose: 5.9.6 - kysely: 0.27.5 + kysely: 0.27.6 nanostores: 0.11.3 valibot: 1.0.0-beta.15(typescript@5.5.3) zod: 3.24.1 @@ -11534,9 +11534,9 @@ snapshots: drange@1.1.1: {} - drizzle-dbml-generator@0.10.0(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7)): + drizzle-dbml-generator@0.10.0(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7)): dependencies: - drizzle-orm: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) + drizzle-orm: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) drizzle-kit@0.30.4: dependencies: @@ -11547,18 +11547,18 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7): + drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7): optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/react': 18.3.5 - kysely: 0.27.5 + kysely: 0.27.6 postgres: 3.4.4 react: 18.2.0 sqlite3: 5.1.7 - drizzle-zod@0.5.1(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7))(zod@3.23.8): + drizzle-zod@0.5.1(drizzle-orm@0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7))(zod@3.23.8): dependencies: - drizzle-orm: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.5)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) + drizzle-orm: 0.39.1(@opentelemetry/api@1.9.0)(@types/react@18.3.5)(kysely@0.27.6)(postgres@3.4.4)(react@18.2.0)(sqlite3@5.1.7) zod: 3.23.8 eastasianwidth@0.2.0: {} @@ -12450,7 +12450,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - kysely@0.27.5: {} + kysely@0.27.6: {} leac@0.6.0: {} From 005f73d6658f3e0a0c922d793784571649f60ed4 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 17:11:20 -0600 Subject: [PATCH 26/43] refactor: enhance Railpack build process by introducing preparation step and environment variable handling --- .../server/src/utils/builders/railpack.ts | 126 +++++++++++++----- 1 file changed, 96 insertions(+), 30 deletions(-) diff --git a/packages/server/src/utils/builders/railpack.ts b/packages/server/src/utils/builders/railpack.ts index ae55a638..e9991886 100644 --- a/packages/server/src/utils/builders/railpack.ts +++ b/packages/server/src/utils/builders/railpack.ts @@ -3,7 +3,6 @@ import type { ApplicationNested } from "."; import { prepareEnvironmentVariables } from "../docker/utils"; import { getBuildAppDirectory } from "../filesystem/directory"; import { spawnAsync } from "../process/spawnAsync"; -import { execAsync } from "../process/execAsync"; export const buildRailpack = async ( application: ApplicationNested, @@ -17,32 +16,62 @@ export const buildRailpack = async ( ); try { - // Ensure buildkit container is running, create if it doesn't exist - await execAsync( - "docker container inspect buildkit >/dev/null 2>&1 || docker run --rm --privileged -d --name buildkit moby/buildkit", - ); + // First prepare the build plan and info + const prepareArgs = [ + "prepare", + buildAppDirectory, + "--plan-out", + `${buildAppDirectory}/railpack-plan.json`, + "--info-out", + `${buildAppDirectory}/railpack-info.json`, + ]; - // Build the application using railpack - const args = ["build", buildAppDirectory, "--name", appName]; - - // Add environment variables + // Add environment variables to prepare command for (const env of envVariables) { - args.push("--env", env); + prepareArgs.push("--env", env); } + // Run prepare command + await spawnAsync("railpack", prepareArgs, (data) => { + if (writeStream.writable) { + writeStream.write(data); + } + }); + + // Build with BuildKit using the Railpack frontend + const buildArgs = [ + "buildx", + "build", + "--build-arg", + "BUILDKIT_SYNTAX=ghcr.io/railwayapp/railpack-frontend:v0.0.55", + "-f", + `${buildAppDirectory}/railpack-plan.json`, + "--output", + `type=docker,name=${appName}`, + ]; + + // Add secrets properly formatted + const env: { [key: string]: string } = {}; + for (const envVar of envVariables) { + const [key, value] = envVar.split("="); + if (key && value) { + buildArgs.push("--secret", `id=${key},env=${key}`); + env[key] = value; + } + } + + buildArgs.push(buildAppDirectory); + await spawnAsync( - "railpack", - args, + "docker", + buildArgs, (data) => { if (writeStream.writable) { writeStream.write(data); } }, { - env: { - ...process.env, - BUILDKIT_HOST: "docker-container://buildkit", - }, + env: { ...process.env, ...env }, }, ); @@ -63,25 +92,62 @@ export const getRailpackCommand = ( application.project.env, ); - // Build the application using railpack - const args = ["build", buildAppDirectory, "--name", appName]; + // Prepare command + const prepareArgs = [ + "prepare", + buildAppDirectory, + "--plan-out", + `${buildAppDirectory}/railpack-plan.json`, + "--info-out", + `${buildAppDirectory}/railpack-info.json`, + ]; - // Add environment variables for (const env of envVariables) { - args.push("--env", env); + prepareArgs.push("--env", env); } - const command = `railpack ${args.join(" ")}`; + // Build command + const buildArgs = [ + "buildx", + "build", + "--build-arg", + "BUILDKIT_SYNTAX=ghcr.io/railwayapp/railpack-frontend:v0.0.55", + "-f", + `${buildAppDirectory}/railpack-plan.json`, + "--output", + `type=docker,name=${appName}`, + ]; + + // Add secrets properly formatted + const exportEnvs = []; + for (const envVar of envVariables) { + const [key, value] = envVar.split("="); + if (key && value) { + buildArgs.push("--secret", `id=${key},env=${key}`); + exportEnvs.push(`export ${key}=${value}`); + } + } + + buildArgs.push(buildAppDirectory); + const bashCommand = ` - echo "Building with Railpack..." >> "${logPath}"; - docker container inspect buildkit >/dev/null 2>&1 || docker run --rm --privileged -d --name buildkit moby/buildkit; - export BUILDKIT_HOST=docker-container://buildkit; - ${command} >> ${logPath} 2>> ${logPath} || { - echo "❌ Railpack build failed" >> ${logPath}; - exit 1; - } - echo "✅ Railpack build completed." >> ${logPath}; - `; +echo "Preparing Railpack build plan..." >> "${logPath}"; +railpack ${prepareArgs.join(" ")} >> ${logPath} 2>> ${logPath} || { + echo "❌ Railpack prepare failed" >> ${logPath}; + exit 1; +} +echo "✅ Railpack prepare completed." >> ${logPath}; + +echo "Building with Railpack frontend..." >> "${logPath}"; +# Export environment variables for secrets +${exportEnvs.join("\n")} +docker ${buildArgs.join(" ")} >> ${logPath} 2>> ${logPath} || { + echo "❌ Railpack build failed" >> ${logPath}; + exit 1; +} +echo "✅ Railpack build completed." >> ${logPath}; +`; return bashCommand; }; +// docker buildx build --build-arg BUILDKIT_SYNTAX=ghcr.io/railwayapp/railpack-frontend:v0.0.55 -f /Users/mauricio/Documents/Github/Personal/dokploy/apps/dokploy/.docker/applications/dsfgsdfg-sdfgdsfg-fyk3r9/code/astro/railpack-plan.json /Users/mauricio/Documents/Github/Personal/dokploy/apps/dokploy/.docker/applications/dsfgsdfg-sdfgdsfg-fyk3r9/code/astro From fa954c3bbd9001ec19b602a77547d40ab50f67bc Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 18:36:40 -0600 Subject: [PATCH 27/43] refactor: remove console log statements on WebSocket connection close and adjust compose file handling based on source type --- apps/dokploy/server/wss/listen-deployment.ts | 2 -- packages/server/src/services/compose.ts | 12 ++++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/dokploy/server/wss/listen-deployment.ts b/apps/dokploy/server/wss/listen-deployment.ts index 4a25c6f0..581c04d7 100644 --- a/apps/dokploy/server/wss/listen-deployment.ts +++ b/apps/dokploy/server/wss/listen-deployment.ts @@ -61,7 +61,6 @@ export const setupDeploymentLogsWebSocketServer = ( } stream .on("close", () => { - console.log("Connection closed ✅"); client.end(); ws.close(); }) @@ -86,7 +85,6 @@ export const setupDeploymentLogsWebSocketServer = ( }); ws.on("close", () => { - console.log("Connection closed ✅, From WS"); client.end(); }); } else { diff --git a/packages/server/src/services/compose.ts b/packages/server/src/services/compose.ts index a3ebc26c..54aa5f1e 100644 --- a/packages/server/src/services/compose.ts +++ b/packages/server/src/services/compose.ts @@ -289,11 +289,11 @@ export const rebuildCompose = async ({ // if (admin.cleanupCacheOnCompose) { // await cleanupFullDocker(compose?.serverId); // } - if (compose.serverId) { - await getBuildComposeCommand(compose, deployment.logPath); - } else { - await buildCompose(compose, deployment.logPath); + + if (compose.sourceType === "raw") { + await createComposeFile(compose, deployment.logPath); } + await buildCompose(compose, deployment.logPath); await updateDeploymentStatus(deployment.deploymentId, "done"); await updateCompose(composeId, { @@ -433,6 +433,10 @@ export const rebuildRemoteCompose = async ({ // if (admin.cleanupCacheOnCompose) { // await cleanupFullDocker(compose?.serverId); // } + if (compose.sourceType === "raw") { + const command = getCreateComposeFileCommand(compose, deployment.logPath); + await execAsyncRemote(compose.serverId, command); + } if (compose.serverId) { await getBuildComposeCommand(compose, deployment.logPath); } From 31164c979804d7125c0fa303de3cdc515688a4b7 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 20:42:53 -0600 Subject: [PATCH 28/43] chore: remove console log statements from WebSocket connection handling and ensure builder container for Railpack is created --- apps/dokploy/server/wss/listen-deployment.ts | 2 -- packages/server/src/utils/builders/railpack.ts | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/dokploy/server/wss/listen-deployment.ts b/apps/dokploy/server/wss/listen-deployment.ts index 4a25c6f0..581c04d7 100644 --- a/apps/dokploy/server/wss/listen-deployment.ts +++ b/apps/dokploy/server/wss/listen-deployment.ts @@ -61,7 +61,6 @@ export const setupDeploymentLogsWebSocketServer = ( } stream .on("close", () => { - console.log("Connection closed ✅"); client.end(); ws.close(); }) @@ -86,7 +85,6 @@ export const setupDeploymentLogsWebSocketServer = ( }); ws.on("close", () => { - console.log("Connection closed ✅, From WS"); client.end(); }); } else { diff --git a/packages/server/src/utils/builders/railpack.ts b/packages/server/src/utils/builders/railpack.ts index e9991886..bc23338d 100644 --- a/packages/server/src/utils/builders/railpack.ts +++ b/packages/server/src/utils/builders/railpack.ts @@ -131,6 +131,10 @@ export const getRailpackCommand = ( buildArgs.push(buildAppDirectory); const bashCommand = ` +# Ensure we have a builder with containerd +docker buildx create --use --name builder-containerd --driver docker-container || true +docker buildx use builder-containerd + echo "Preparing Railpack build plan..." >> "${logPath}"; railpack ${prepareArgs.join(" ")} >> ${logPath} 2>> ${logPath} || { echo "❌ Railpack prepare failed" >> ${logPath}; From 8d9d00d0c6f65a11f7599ec9423f94b62211e8d4 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 20:43:22 -0600 Subject: [PATCH 29/43] refactor: streamline container parsing logic in Docker service functions --- packages/server/src/services/docker.ts | 160 ++++++++++++------------- 1 file changed, 76 insertions(+), 84 deletions(-) diff --git a/packages/server/src/services/docker.ts b/packages/server/src/services/docker.ts index 69ae446a..bb70d28f 100644 --- a/packages/server/src/services/docker.ts +++ b/packages/server/src/services/docker.ts @@ -136,26 +136,24 @@ export const getContainersByAppNameMatch = async ( result = stdout.trim().split("\n"); } - const containers = result - .map((line) => { - const parts = line.split(" | "); - const containerId = parts[0] - ? parts[0].replace("CONTAINER ID : ", "").trim() - : "No container id"; - const name = parts[1] - ? parts[1].replace("Name: ", "").trim() - : "No container name"; + const containers = result.map((line) => { + const parts = line.split(" | "); + const containerId = parts[0] + ? parts[0].replace("CONTAINER ID : ", "").trim() + : "No container id"; + const name = parts[1] + ? parts[1].replace("Name: ", "").trim() + : "No container name"; - const state = parts[2] - ? parts[2].replace("State: ", "").trim() - : "No state"; - return { - containerId, - name, - state, - }; - }) - .sort((a, b) => a.name.localeCompare(b.name)); + const state = parts[2] + ? parts[2].replace("State: ", "").trim() + : "No state"; + return { + containerId, + name, + state, + }; + }); return containers || []; } catch (_error) {} @@ -192,30 +190,28 @@ export const getStackContainersByAppName = async ( result = stdout.trim().split("\n"); } - const containers = result - .map((line) => { - const parts = line.split(" | "); - const containerId = parts[0] - ? parts[0].replace("CONTAINER ID : ", "").trim() - : "No container id"; - const name = parts[1] - ? parts[1].replace("Name: ", "").trim() - : "No container name"; + const containers = result.map((line) => { + const parts = line.split(" | "); + const containerId = parts[0] + ? parts[0].replace("CONTAINER ID : ", "").trim() + : "No container id"; + const name = parts[1] + ? parts[1].replace("Name: ", "").trim() + : "No container name"; - const state = parts[2] - ? parts[2].replace("State: ", "").trim().toLowerCase() - : "No state"; - const node = parts[3] - ? parts[3].replace("Node: ", "").trim() - : "No specific node"; - return { - containerId, - name, - state, - node, - }; - }) - .sort((a, b) => a.name.localeCompare(b.name)); + const state = parts[2] + ? parts[2].replace("State: ", "").trim().toLowerCase() + : "No state"; + const node = parts[3] + ? parts[3].replace("Node: ", "").trim() + : "No specific node"; + return { + containerId, + name, + state, + node, + }; + }); return containers || []; } catch (_error) {} @@ -253,31 +249,29 @@ export const getServiceContainersByAppName = async ( result = stdout.trim().split("\n"); } - const containers = result - .map((line) => { - const parts = line.split(" | "); - const containerId = parts[0] - ? parts[0].replace("CONTAINER ID : ", "").trim() - : "No container id"; - const name = parts[1] - ? parts[1].replace("Name: ", "").trim() - : "No container name"; + const containers = result.map((line) => { + const parts = line.split(" | "); + const containerId = parts[0] + ? parts[0].replace("CONTAINER ID : ", "").trim() + : "No container id"; + const name = parts[1] + ? parts[1].replace("Name: ", "").trim() + : "No container name"; - const state = parts[2] - ? parts[2].replace("State: ", "").trim().toLowerCase() - : "No state"; + const state = parts[2] + ? parts[2].replace("State: ", "").trim().toLowerCase() + : "No state"; - const node = parts[3] - ? parts[3].replace("Node: ", "").trim() - : "No specific node"; - return { - containerId, - name, - state, - node, - }; - }) - .sort((a, b) => a.name.localeCompare(b.name)); + const node = parts[3] + ? parts[3].replace("Node: ", "").trim() + : "No specific node"; + return { + containerId, + name, + state, + node, + }; + }); return containers || []; } catch (_error) {} @@ -318,25 +312,23 @@ export const getContainersByAppLabel = async ( const lines = stdout.trim().split("\n"); - const containers = lines - .map((line) => { - const parts = line.split(" | "); - const containerId = parts[0] - ? parts[0].replace("CONTAINER ID : ", "").trim() - : "No container id"; - const name = parts[1] - ? parts[1].replace("Name: ", "").trim() - : "No container name"; - const state = parts[2] - ? parts[2].replace("State: ", "").trim() - : "No state"; - return { - containerId, - name, - state, - }; - }) - .sort((a, b) => a.name.localeCompare(b.name)); + const containers = lines.map((line) => { + const parts = line.split(" | "); + const containerId = parts[0] + ? parts[0].replace("CONTAINER ID : ", "").trim() + : "No container id"; + const name = parts[1] + ? parts[1].replace("Name: ", "").trim() + : "No container name"; + const state = parts[2] + ? parts[2].replace("State: ", "").trim() + : "No state"; + return { + containerId, + name, + state, + }; + }); return containers || []; } catch (_error) {} From be64a1554d08ad7630d7c387245cd366c3f9f492 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 20:45:38 -0600 Subject: [PATCH 30/43] chore: remove commented-out Docker build command from Railpack builder utility --- packages/server/src/utils/builders/railpack.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/utils/builders/railpack.ts b/packages/server/src/utils/builders/railpack.ts index bc23338d..bd2241c6 100644 --- a/packages/server/src/utils/builders/railpack.ts +++ b/packages/server/src/utils/builders/railpack.ts @@ -154,4 +154,3 @@ echo "✅ Railpack build completed." >> ${logPath}; return bashCommand; }; -// docker buildx build --build-arg BUILDKIT_SYNTAX=ghcr.io/railwayapp/railpack-frontend:v0.0.55 -f /Users/mauricio/Documents/Github/Personal/dokploy/apps/dokploy/.docker/applications/dsfgsdfg-sdfgdsfg-fyk3r9/code/astro/railpack-plan.json /Users/mauricio/Documents/Github/Personal/dokploy/apps/dokploy/.docker/applications/dsfgsdfg-sdfgdsfg-fyk3r9/code/astro From 7f2ebab66ce2ad043783f49745182fa831c77100 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 21:38:49 -0600 Subject: [PATCH 31/43] refactor: standardize translation usage across components and pages by removing specific namespace references --- .../organization/handle-organization.tsx | 2 +- .../components/dashboard/projects/show.tsx | 10 +- .../dashboard/settings/api/add-api-key.tsx | 78 +++-- .../dashboard/settings/api/show-api-keys.tsx | 2 +- .../dashboard/settings/profile/enable-2fa.tsx | 2 +- .../settings/profile/profile-form.tsx | 2 +- .../servers/actions/show-dokploy-actions.tsx | 2 +- .../servers/actions/show-storage-actions.tsx | 2 +- .../servers/actions/show-traefik-actions.tsx | 2 +- .../settings/servers/handle-servers.tsx | 2 +- .../settings/servers/show-servers.tsx | 6 +- .../dashboard/settings/web-domain.tsx | 2 +- .../dashboard/settings/web-server.tsx | 2 +- .../web-server/local-server-config.tsx | 2 +- .../web-server/manage-traefik-ports.tsx | 2 +- apps/dokploy/components/layouts/side.tsx | 4 +- apps/dokploy/components/layouts/user-nav.tsx | 2 +- apps/dokploy/pages/dashboard/docker.tsx | 4 +- apps/dokploy/pages/dashboard/monitoring.tsx | 2 +- apps/dokploy/pages/dashboard/projects.tsx | 2 +- apps/dokploy/pages/dashboard/requests.tsx | 2 +- apps/dokploy/pages/dashboard/settings/ai.tsx | 2 +- .../pages/dashboard/settings/billing.tsx | 2 +- .../pages/dashboard/settings/certificates.tsx | 2 +- .../pages/dashboard/settings/cluster.tsx | 2 +- .../pages/dashboard/settings/destinations.tsx | 2 +- .../dashboard/settings/git-providers.tsx | 118 +++---- .../pages/dashboard/settings/index.tsx | 2 +- .../dashboard/settings/notifications.tsx | 2 +- .../pages/dashboard/settings/profile.tsx | 2 +- .../pages/dashboard/settings/registry.tsx | 2 +- .../pages/dashboard/settings/server.tsx | 2 +- .../pages/dashboard/settings/servers.tsx | 2 +- .../pages/dashboard/settings/ssh-keys.tsx | 4 +- .../pages/dashboard/settings/users.tsx | 2 +- apps/dokploy/pages/dashboard/swarm.tsx | 4 +- apps/dokploy/pages/dashboard/traefik.tsx | 4 +- apps/dokploy/pages/index.tsx | 14 +- apps/dokploy/public/locales/az/common.json | 55 +++- apps/dokploy/public/locales/az/settings.json | 58 ---- apps/dokploy/public/locales/de/common.json | 42 ++- apps/dokploy/public/locales/de/settings.json | 44 --- apps/dokploy/public/locales/en/auth.json | 30 -- apps/dokploy/public/locales/en/common.json | 289 ++++++++++++++---- apps/dokploy/public/locales/en/home.json | 4 - apps/dokploy/public/locales/en/settings.json | 153 ---------- apps/dokploy/public/locales/es/common.json | 50 ++- apps/dokploy/public/locales/es/settings.json | 52 ---- apps/dokploy/public/locales/fa/common.json | 42 ++- apps/dokploy/public/locales/fa/settings.json | 44 --- apps/dokploy/public/locales/fr/common.json | 42 ++- apps/dokploy/public/locales/fr/settings.json | 44 --- apps/dokploy/public/locales/id/common.json | 55 +++- apps/dokploy/public/locales/id/settings.json | 58 ---- apps/dokploy/public/locales/it/common.json | 42 ++- apps/dokploy/public/locales/it/settings.json | 44 --- apps/dokploy/public/locales/ja/common.json | 42 ++- apps/dokploy/public/locales/ja/settings.json | 44 --- apps/dokploy/public/locales/ko/common.json | 42 ++- apps/dokploy/public/locales/ko/settings.json | 44 --- apps/dokploy/public/locales/kz/common.json | 42 ++- apps/dokploy/public/locales/kz/settings.json | 41 --- apps/dokploy/public/locales/ml/common.json | 55 +++- apps/dokploy/public/locales/ml/settings.json | 58 ---- apps/dokploy/public/locales/no/common.json | 50 ++- apps/dokploy/public/locales/no/settings.json | 52 ---- apps/dokploy/public/locales/pl/common.json | 55 +++- apps/dokploy/public/locales/pl/settings.json | 58 ---- apps/dokploy/public/locales/pt-br/common.json | 42 ++- .../public/locales/pt-br/settings.json | 44 --- apps/dokploy/public/locales/ru/common.json | 55 +++- apps/dokploy/public/locales/ru/settings.json | 58 ---- apps/dokploy/public/locales/tr/common.json | 42 ++- apps/dokploy/public/locales/tr/settings.json | 44 --- apps/dokploy/public/locales/uk/common.json | 55 +++- apps/dokploy/public/locales/uk/settings.json | 58 ---- apps/dokploy/public/locales/zh-Hans/auth.json | 30 -- .../public/locales/zh-Hans/common.json | 289 ++++++++++++++---- apps/dokploy/public/locales/zh-Hans/home.json | 4 - .../public/locales/zh-Hans/settings.json | 153 ---------- .../public/locales/zh-Hant/common.json | 55 +++- .../public/locales/zh-Hant/settings.json | 58 ---- apps/dokploy/scripts/combine-translations.mjs | 54 ++++ apps/dokploy/utils/i18n.ts | 7 +- 84 files changed, 1533 insertions(+), 1548 deletions(-) delete mode 100644 apps/dokploy/public/locales/az/settings.json delete mode 100644 apps/dokploy/public/locales/de/settings.json delete mode 100644 apps/dokploy/public/locales/en/auth.json delete mode 100644 apps/dokploy/public/locales/en/home.json delete mode 100644 apps/dokploy/public/locales/en/settings.json delete mode 100644 apps/dokploy/public/locales/es/settings.json delete mode 100644 apps/dokploy/public/locales/fa/settings.json delete mode 100644 apps/dokploy/public/locales/fr/settings.json delete mode 100644 apps/dokploy/public/locales/id/settings.json delete mode 100644 apps/dokploy/public/locales/it/settings.json delete mode 100644 apps/dokploy/public/locales/ja/settings.json delete mode 100644 apps/dokploy/public/locales/ko/settings.json delete mode 100644 apps/dokploy/public/locales/kz/settings.json delete mode 100644 apps/dokploy/public/locales/ml/settings.json delete mode 100644 apps/dokploy/public/locales/no/settings.json delete mode 100644 apps/dokploy/public/locales/pl/settings.json delete mode 100644 apps/dokploy/public/locales/pt-br/settings.json delete mode 100644 apps/dokploy/public/locales/ru/settings.json delete mode 100644 apps/dokploy/public/locales/tr/settings.json delete mode 100644 apps/dokploy/public/locales/uk/settings.json delete mode 100644 apps/dokploy/public/locales/zh-Hans/auth.json delete mode 100644 apps/dokploy/public/locales/zh-Hans/home.json delete mode 100644 apps/dokploy/public/locales/zh-Hans/settings.json delete mode 100644 apps/dokploy/public/locales/zh-Hant/settings.json create mode 100644 apps/dokploy/scripts/combine-translations.mjs diff --git a/apps/dokploy/components/dashboard/organization/handle-organization.tsx b/apps/dokploy/components/dashboard/organization/handle-organization.tsx index 1bf0cd99..2d30bc82 100644 --- a/apps/dokploy/components/dashboard/organization/handle-organization.tsx +++ b/apps/dokploy/components/dashboard/organization/handle-organization.tsx @@ -42,7 +42,7 @@ interface Props { } export function AddOrganization({ organizationId }: Props) { - const { t } = useTranslation("common"); + const { t } = useTranslation(); const [open, setOpen] = useState(false); const utils = api.useUtils(); const { data: organization } = api.organization.one.useQuery( diff --git a/apps/dokploy/components/dashboard/projects/show.tsx b/apps/dokploy/components/dashboard/projects/show.tsx index 374a01a7..61c73dc7 100644 --- a/apps/dokploy/components/dashboard/projects/show.tsx +++ b/apps/dokploy/components/dashboard/projects/show.tsx @@ -51,7 +51,7 @@ import { useTranslation } from "next-i18next"; export const ShowProjects = () => { const utils = api.useUtils(); - const { t } = useTranslation("home"); + const { t } = useTranslation(); const { data, isLoading } = api.project.all.useQuery(); const { data: auth } = api.user.get.useQuery(); const { mutateAsync } = api.project.remove.useMutation(); @@ -188,7 +188,9 @@ export const ShowProjects = () => { target="_blank" href={`${domain.https ? "https" : "http"}://${domain.host}${domain.path}`} > - {domain.host} + + {domain.host} + @@ -224,7 +226,9 @@ export const ShowProjects = () => { target="_blank" href={`${domain.https ? "https" : "http"}://${domain.host}${domain.path}`} > - {domain.host} + + {domain.host} + diff --git a/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx b/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx index 7f8a1750..a26f885c 100644 --- a/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx +++ b/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx @@ -80,7 +80,7 @@ const REFILL_INTERVAL_OPTIONS = [ ]; export const AddApiKey = () => { - const { t } = useTranslation('settings'); + const { t } = useTranslation(); const [open, setOpen] = useState(false); const [showSuccessModal, setShowSuccessModal] = useState(false); const [newApiKey, setNewApiKey] = useState(""); @@ -142,7 +142,7 @@ export const AddApiKey = () => { <> - + @@ -160,7 +160,10 @@ export const AddApiKey = () => { {t("settings.api.name")} - + @@ -173,7 +176,10 @@ export const AddApiKey = () => { {t("settings.api.prefix")} - + @@ -193,13 +199,17 @@ export const AddApiKey = () => { > - + {EXPIRATION_OPTIONS.map((option) => ( - {t(`settings.api.expirationOptions.${option.label}`)} + {t( + `settings.api.expirationOptions.${option.label}`, + )} ))} @@ -217,7 +227,9 @@ export const AddApiKey = () => { field.onChange( @@ -327,17 +351,23 @@ export const AddApiKey = () => { {/* Request Limiting Section */}
-

{t("settings.api.requestLimiting")}

+

+ {t("settings.api.requestLimiting")} +

( - {t("settings.api.totalRequestLimit")} + + {t("settings.api.totalRequestLimit")} + field.onChange( @@ -365,7 +395,9 @@ export const AddApiKey = () => { field.onChange( @@ -398,13 +430,19 @@ export const AddApiKey = () => { > - + {REFILL_INTERVAL_OPTIONS.map((option) => ( - {t(`settings.api.refillIntervalOptions.${option.label}`)} + {t( + `settings.api.refillIntervalOptions.${option.label}`, + )} ))} @@ -436,7 +474,9 @@ export const AddApiKey = () => { - {t("settings.api.apiKeyGeneratedSuccessfully")} + + {t("settings.api.apiKeyGeneratedSuccessfully")} + {t("settings.api.copyApiKeyNow")} diff --git a/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx b/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx index bb8e57ea..23ac355f 100644 --- a/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx +++ b/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx @@ -18,7 +18,7 @@ import { useTranslation } from "next-i18next"; import { getDateFnsLocaleByCode } from "@/lib/languages"; export const ShowApiKeys = () => { - const { t, i18n } = useTranslation("settings"); + const { t, i18n } = useTranslation(); const { data, refetch } = api.user.get.useQuery(); const { mutateAsync: deleteApiKey, isLoading: isLoadingDelete } = api.user.deleteApiKey.useMutation(); diff --git a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx index e7b200fe..8bad0c9b 100644 --- a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx @@ -56,7 +56,7 @@ type PinForm = z.infer; export const Enable2FA = () => { const utils = api.useUtils(); - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const [data, setData] = useState(null); const [backupCodes, setBackupCodes] = useState([]); const [isDialogOpen, setIsDialogOpen] = useState(false); diff --git a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx index 2a5bed95..6a5508cf 100644 --- a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx @@ -62,7 +62,7 @@ export const ProfileForm = () => { isError, error, } = api.user.update.useMutation(); - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const [gravatarHash, setGravatarHash] = useState(null); const availableAvatars = useMemo(() => { diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx index f57dad3c..181010b4 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-dokploy-actions.tsx @@ -18,7 +18,7 @@ import { TerminalModal } from "../../web-server/terminal-modal"; import { GPUSupportModal } from "../gpu-support-modal"; export const ShowDokployActions = () => { - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const { mutateAsync: reloadServer, isLoading } = api.settings.reloadServer.useMutation(); diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx index 3492ba7c..2a8d0f1b 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx @@ -17,7 +17,7 @@ interface Props { serverId?: string; } export const ShowStorageActions = ({ serverId }: Props) => { - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const { mutateAsync: cleanAll, isLoading: cleanAllIsLoading } = api.settings.cleanAll.useMutation(); diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx index b43686bd..a348d6f0 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx @@ -20,7 +20,7 @@ interface Props { serverId?: string; } export const ShowTraefikActions = ({ serverId }: Props) => { - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const { mutateAsync: reloadTraefik, isLoading: reloadTraefikIsLoading } = api.settings.reloadTraefik.useMutation(); diff --git a/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx b/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx index 97994145..629eb724 100644 --- a/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx @@ -61,7 +61,7 @@ interface Props { } export const HandleServers = ({ serverId }: Props) => { - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const utils = api.useUtils(); const [isOpen, setIsOpen] = useState(false); diff --git a/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx b/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx index 3f3ff4e9..5b7016c9 100644 --- a/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx @@ -44,7 +44,7 @@ import { ShowTraefikFileSystemModal } from "./show-traefik-file-system-modal"; import { WelcomeSuscription } from "./welcome-stripe/welcome-suscription"; export const ShowServers = () => { - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const router = useRouter(); const query = router.query; const { data, refetch, isLoading } = api.server.all.useQuery(); @@ -235,9 +235,7 @@ export const ShowServers = () => { serverId={server.serverId} > - {t( - "settings.common.enterTerminal", - )} + {t("common.enterTerminal")} )} diff --git a/apps/dokploy/components/dashboard/settings/web-domain.tsx b/apps/dokploy/components/dashboard/settings/web-domain.tsx index a579df39..ac228a4d 100644 --- a/apps/dokploy/components/dashboard/settings/web-domain.tsx +++ b/apps/dokploy/components/dashboard/settings/web-domain.tsx @@ -51,7 +51,7 @@ const addServerDomain = z type AddServerDomain = z.infer; export const WebDomain = () => { - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const { data, refetch } = api.user.get.useQuery(); const { mutateAsync, isLoading } = api.settings.assignDomainServer.useMutation(); diff --git a/apps/dokploy/components/dashboard/settings/web-server.tsx b/apps/dokploy/components/dashboard/settings/web-server.tsx index 64b6d634..09d7a9b2 100644 --- a/apps/dokploy/components/dashboard/settings/web-server.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server.tsx @@ -15,7 +15,7 @@ import { ToggleDockerCleanup } from "./servers/actions/toggle-docker-cleanup"; import { UpdateServer } from "./web-server/update-server"; export const WebServer = () => { - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const { data } = api.user.get.useQuery(); const { data: dokployVersion } = api.settings.getDokployVersion.useQuery(); diff --git a/apps/dokploy/components/dashboard/settings/web-server/local-server-config.tsx b/apps/dokploy/components/dashboard/settings/web-server/local-server-config.tsx index e30408e6..6a1f02fa 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/local-server-config.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/local-server-config.tsx @@ -52,7 +52,7 @@ interface Props { } const LocalServerConfig = ({ onSave }: Props) => { - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const form = useForm({ defaultValues: getLocalServerData(), diff --git a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx index a6958b16..b4d75113 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx @@ -54,7 +54,7 @@ const TraefikPortsSchema = z.object({ type TraefikPortsForm = z.infer; export const ManageTraefikPorts = ({ children, serverId }: Props) => { - const { t } = useTranslation("settings"); + const { t } = useTranslation(); const [open, setOpen] = useState(false); const form = useForm({ diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx index cd21110c..f5125b22 100644 --- a/apps/dokploy/components/layouts/side.tsx +++ b/apps/dokploy/components/layouts/side.tsx @@ -519,7 +519,7 @@ function LogoWrapper() { } function SidebarLogo() { - const { t } = useTranslation("common"); + const { t } = useTranslation(); const { state } = useSidebar(); const { data: isCloud } = api.settings.isCloud.useQuery(); const { data: user } = api.user.get.useQuery(); @@ -804,7 +804,7 @@ function SidebarLogo() { } export default function Page({ children }: Props) { - const { t } = useTranslation("common"); + const { t } = useTranslation(); const [defaultOpen, setDefaultOpen] = useState( undefined, diff --git a/apps/dokploy/components/layouts/user-nav.tsx b/apps/dokploy/components/layouts/user-nav.tsx index ecb9e25b..c54e53cb 100644 --- a/apps/dokploy/components/layouts/user-nav.tsx +++ b/apps/dokploy/components/layouts/user-nav.tsx @@ -29,7 +29,7 @@ const _AUTO_CHECK_UPDATES_INTERVAL_MINUTES = 7; export const UserNav = () => { const router = useRouter(); - const { t } = useTranslation("common"); + const { t } = useTranslation(); const { data } = api.user.get.useQuery(); const { data: isCloud } = api.settings.isCloud.useQuery(); diff --git a/apps/dokploy/pages/dashboard/docker.tsx b/apps/dokploy/pages/dashboard/docker.tsx index 41dae277..7dceafe9 100644 --- a/apps/dokploy/pages/dashboard/docker.tsx +++ b/apps/dokploy/pages/dashboard/docker.tsx @@ -72,13 +72,13 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "home"])), + ...(await serverSideTranslations(locale)), }, }; } catch (_error) { return { props: { - ...(await serverSideTranslations(locale, ["common", "home"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/monitoring.tsx b/apps/dokploy/pages/dashboard/monitoring.tsx index 75ed5910..b6ca66f3 100644 --- a/apps/dokploy/pages/dashboard/monitoring.tsx +++ b/apps/dokploy/pages/dashboard/monitoring.tsx @@ -114,7 +114,7 @@ export async function getServerSideProps( return { props: { - ...(await serverSideTranslations(locale, ["common", "home"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/projects.tsx b/apps/dokploy/pages/dashboard/projects.tsx index 9134b130..f659aaa0 100644 --- a/apps/dokploy/pages/dashboard/projects.tsx +++ b/apps/dokploy/pages/dashboard/projects.tsx @@ -66,7 +66,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "home"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/requests.tsx b/apps/dokploy/pages/dashboard/requests.tsx index 14246c34..06a4d550 100644 --- a/apps/dokploy/pages/dashboard/requests.tsx +++ b/apps/dokploy/pages/dashboard/requests.tsx @@ -37,7 +37,7 @@ export async function getServerSideProps( return { props: { - ...(await serverSideTranslations(locale, ["common", "home"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/ai.tsx b/apps/dokploy/pages/dashboard/settings/ai.tsx index 985df7dc..263c3f16 100644 --- a/apps/dokploy/pages/dashboard/settings/ai.tsx +++ b/apps/dokploy/pages/dashboard/settings/ai.tsx @@ -55,7 +55,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/billing.tsx b/apps/dokploy/pages/dashboard/settings/billing.tsx index 8dc3c813..f7a555ad 100644 --- a/apps/dokploy/pages/dashboard/settings/billing.tsx +++ b/apps/dokploy/pages/dashboard/settings/billing.tsx @@ -62,7 +62,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/certificates.tsx b/apps/dokploy/pages/dashboard/settings/certificates.tsx index 2b2ca22d..bd8f6ceb 100644 --- a/apps/dokploy/pages/dashboard/settings/certificates.tsx +++ b/apps/dokploy/pages/dashboard/settings/certificates.tsx @@ -53,7 +53,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/cluster.tsx b/apps/dokploy/pages/dashboard/settings/cluster.tsx index 8ebc8b8f..4e35a6bb 100644 --- a/apps/dokploy/pages/dashboard/settings/cluster.tsx +++ b/apps/dokploy/pages/dashboard/settings/cluster.tsx @@ -60,7 +60,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/destinations.tsx b/apps/dokploy/pages/dashboard/settings/destinations.tsx index 72cced44..0a4eba29 100644 --- a/apps/dokploy/pages/dashboard/settings/destinations.tsx +++ b/apps/dokploy/pages/dashboard/settings/destinations.tsx @@ -54,7 +54,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/git-providers.tsx b/apps/dokploy/pages/dashboard/settings/git-providers.tsx index 82293180..70cb6956 100644 --- a/apps/dokploy/pages/dashboard/settings/git-providers.tsx +++ b/apps/dokploy/pages/dashboard/settings/git-providers.tsx @@ -10,72 +10,72 @@ import type { ReactElement } from "react"; import superjson from "superjson"; const Page = () => { - return ( -
- -
- ); + return ( +
+ +
+ ); }; export default Page; Page.getLayout = (page: ReactElement) => { - return {page}; + return {page}; }; export async function getServerSideProps( - ctx: GetServerSidePropsContext<{ serviceId: string }> + ctx: GetServerSidePropsContext<{ serviceId: string }>, ) { - const { user, session } = await validateRequest(ctx.req); - if (!user) { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - const { req, res } = ctx; - const locale = await getLocale(req.cookies); - const helpers = createServerSideHelpers({ - router: appRouter, - ctx: { - req: req as any, - res: res as any, - db: null as any, - session: session as any, - user: user as any, - }, - transformer: superjson, - }); - await helpers.user.get.prefetch(); - try { - await helpers.project.all.prefetch(); - await helpers.settings.isCloud.prefetch(); - if (user.role === "member") { - const userR = await helpers.user.one.fetch({ - userId: user.id, - }); + const { user, session } = await validateRequest(ctx.req); + if (!user) { + return { + redirect: { + permanent: true, + destination: "/", + }, + }; + } + const { req, res } = ctx; + const locale = await getLocale(req.cookies); + const helpers = createServerSideHelpers({ + router: appRouter, + ctx: { + req: req as any, + res: res as any, + db: null as any, + session: session as any, + user: user as any, + }, + transformer: superjson, + }); + await helpers.user.get.prefetch(); + try { + await helpers.project.all.prefetch(); + await helpers.settings.isCloud.prefetch(); + if (user.role === "member") { + const userR = await helpers.user.one.fetch({ + userId: user.id, + }); - if (!userR?.canAccessToGitProviders) { - return { - redirect: { - permanent: true, - destination: "/", - }, - }; - } - } - return { - props: { - trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), - }, - }; - } catch (_error) { - return { - props: { - ...(await serverSideTranslations(locale, ["common", "settings"])), - }, - }; - } + if (!userR?.canAccessToGitProviders) { + return { + redirect: { + permanent: true, + destination: "/", + }, + }; + } + } + return { + props: { + trpcState: helpers.dehydrate(), + ...(await serverSideTranslations(locale)), + }, + }; + } catch (_error) { + return { + props: { + ...(await serverSideTranslations(locale)), + }, + }; + } } diff --git a/apps/dokploy/pages/dashboard/settings/index.tsx b/apps/dokploy/pages/dashboard/settings/index.tsx index 5f9bf3df..b72ea6d2 100644 --- a/apps/dokploy/pages/dashboard/settings/index.tsx +++ b/apps/dokploy/pages/dashboard/settings/index.tsx @@ -216,7 +216,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/notifications.tsx b/apps/dokploy/pages/dashboard/settings/notifications.tsx index e595279c..0061f569 100644 --- a/apps/dokploy/pages/dashboard/settings/notifications.tsx +++ b/apps/dokploy/pages/dashboard/settings/notifications.tsx @@ -54,7 +54,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/profile.tsx b/apps/dokploy/pages/dashboard/settings/profile.tsx index db2e2782..7e284c19 100644 --- a/apps/dokploy/pages/dashboard/settings/profile.tsx +++ b/apps/dokploy/pages/dashboard/settings/profile.tsx @@ -66,7 +66,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/registry.tsx b/apps/dokploy/pages/dashboard/settings/registry.tsx index 17010a0c..8a1639d8 100644 --- a/apps/dokploy/pages/dashboard/settings/registry.tsx +++ b/apps/dokploy/pages/dashboard/settings/registry.tsx @@ -53,7 +53,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/server.tsx b/apps/dokploy/pages/dashboard/settings/server.tsx index 62430eec..769ed19a 100644 --- a/apps/dokploy/pages/dashboard/settings/server.tsx +++ b/apps/dokploy/pages/dashboard/settings/server.tsx @@ -115,7 +115,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/servers.tsx b/apps/dokploy/pages/dashboard/settings/servers.tsx index 2192749a..31913e1d 100644 --- a/apps/dokploy/pages/dashboard/settings/servers.tsx +++ b/apps/dokploy/pages/dashboard/settings/servers.tsx @@ -62,7 +62,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx b/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx index 9d746eb3..29592878 100644 --- a/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx +++ b/apps/dokploy/pages/dashboard/settings/ssh-keys.tsx @@ -69,13 +69,13 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } catch (_error) { return { props: { - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/settings/users.tsx b/apps/dokploy/pages/dashboard/settings/users.tsx index 3c32a029..b81cde52 100644 --- a/apps/dokploy/pages/dashboard/settings/users.tsx +++ b/apps/dokploy/pages/dashboard/settings/users.tsx @@ -57,7 +57,7 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "settings"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/swarm.tsx b/apps/dokploy/pages/dashboard/swarm.tsx index 1a202fb3..829e5eb1 100644 --- a/apps/dokploy/pages/dashboard/swarm.tsx +++ b/apps/dokploy/pages/dashboard/swarm.tsx @@ -72,13 +72,13 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "home"])), + ...(await serverSideTranslations(locale)), }, }; } catch (_error) { return { props: { - ...(await serverSideTranslations(locale, ["common", "home"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/dashboard/traefik.tsx b/apps/dokploy/pages/dashboard/traefik.tsx index df2e9fa3..bc69d641 100644 --- a/apps/dokploy/pages/dashboard/traefik.tsx +++ b/apps/dokploy/pages/dashboard/traefik.tsx @@ -72,13 +72,13 @@ export async function getServerSideProps( return { props: { trpcState: helpers.dehydrate(), - ...(await serverSideTranslations(locale, ["common", "home"])), + ...(await serverSideTranslations(locale)), }, }; } catch (_error) { return { props: { - ...(await serverSideTranslations(locale, ["common", "home"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/pages/index.tsx b/apps/dokploy/pages/index.tsx index 50cdd274..d42d31d4 100644 --- a/apps/dokploy/pages/index.tsx +++ b/apps/dokploy/pages/index.tsx @@ -56,7 +56,7 @@ interface Props { } export default function Home({ IS_CLOUD }: Props) { const router = useRouter(); - const { t } = useTranslation("auth"); + const { t } = useTranslation(); const [isLoginLoading, setIsLoginLoading] = useState(false); const [isTwoFactorLoading, setIsTwoFactorLoading] = useState(false); @@ -150,9 +150,7 @@ export default function Home({ IS_CLOUD }: Props) { if (error) { toast.error(error.message); - setError( - error.message || t("auth.backupCodeVerificationError"), - ); + setError(error.message || t("auth.backupCodeVerificationError")); return; } @@ -178,7 +176,8 @@ export default function Home({ IS_CLOUD }: Props) { } } catch (error) { toast.error(t("auth.githubSignInError"), { - description: error instanceof Error ? error.message : t("auth.unknownError"), + description: + error instanceof Error ? error.message : t("auth.unknownError"), }); } finally { setIsGithubLoading(false); @@ -198,7 +197,8 @@ export default function Home({ IS_CLOUD }: Props) { } } catch (error) { toast.error(t("auth.googleSignInError"), { - description: error instanceof Error ? error.message : t("auth.unknownError"), + description: + error instanceof Error ? error.message : t("auth.unknownError"), }); } finally { setIsGoogleLoading(false); @@ -517,7 +517,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { return { props: { hasAdmin, - ...(await serverSideTranslations(locale, ["auth"])), + ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/public/locales/az/common.json b/apps/dokploy/public/locales/az/common.json index 0967ef42..c552ee84 100644 --- a/apps/dokploy/public/locales/az/common.json +++ b/apps/dokploy/public/locales/az/common.json @@ -1 +1,54 @@ -{} +{ + "settings.common.save": "Yadda saxla", + "settings.common.enterTerminal": "Terminala daxil ol", + "settings.server.domain.title": "Server Domeni", + "settings.server.domain.description": "Server tətbiqinizə domen əlavə edin.", + "settings.server.domain.form.domain": "Domen", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-poçtu", + "settings.server.domain.form.certificate.label": "Sertifikat Təminatçısı", + "settings.server.domain.form.certificate.placeholder": "Sertifikat seçin", + "settings.server.domain.form.certificateOptions.none": "Heç biri", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + "settings.server.webServer.title": "Veb Server", + "settings.server.webServer.description": "Veb serveri yenidən yüklə və ya təmizlə.", + "settings.server.webServer.actions": "Əməliyyatlar", + "settings.server.webServer.reload": "Yenidən yüklə", + "settings.server.webServer.watchLogs": "Logları izlə", + "settings.server.webServer.updateServerIp": "Server IP-ni Yenilə", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Mühiti Dəyişdir", + "settings.server.webServer.traefik.managePorts": "Əlavə Port Təyinatları", + "settings.server.webServer.traefik.managePortsDescription": "Traefik üçün əlavə portlar əlavə edin və ya silin", + "settings.server.webServer.traefik.targetPort": "Hədəf Port", + "settings.server.webServer.traefik.publishedPort": "Dərc Edilmiş Port", + "settings.server.webServer.traefik.addPort": "Port Əlavə Et", + "settings.server.webServer.traefik.portsUpdated": "Portlar uğurla yeniləndi", + "settings.server.webServer.traefik.portsUpdateError": "Portların yenilənməsi uğursuz oldu", + "settings.server.webServer.traefik.publishMode": "Dərc Rejimi", + "settings.server.webServer.storage.label": "Yer", + "settings.server.webServer.storage.cleanUnusedImages": "İstifadə edilməyən şəkilləri təmizlə", + "settings.server.webServer.storage.cleanUnusedVolumes": "İstifadə edilməyən həcmləri təmizlə", + "settings.server.webServer.storage.cleanStoppedContainers": "Dayandırılmış konteynerləri təmizlə", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder və Sistemi təmizlə", + "settings.server.webServer.storage.cleanMonitoring": "Monitorinqi təmizlə", + "settings.server.webServer.storage.cleanAll": "Hamısını təmizlə", + "settings.profile.title": "Hesab", + "settings.profile.description": "Profilinizin məlumatlarını buradan dəyişin.", + "settings.profile.email": "E-poçt", + "settings.profile.password": "Şifrə", + "settings.profile.avatar": "Avatar", + "settings.appearance.title": "Görünüş", + "settings.appearance.description": "İdarəetmə panelinizin görünüşünü fərdiləşdirin.", + "settings.appearance.theme": "Mövzu", + "settings.appearance.themeDescription": "İdarəetmə paneliniz üçün mövzu seçin", + "settings.appearance.themes.light": "İşıqlı", + "settings.appearance.themes.dark": "Qaranlıq", + "settings.appearance.themes.system": "Sistem", + "settings.appearance.language": "Dil", + "settings.appearance.languageDescription": "İdarəetmə paneliniz üçün dil seçin", + "settings.terminal.connectionSettings": "Bağlantı parametrləri", + "settings.terminal.ipAddress": "IP Ünvanı", + "settings.terminal.port": "Port", + "settings.terminal.username": "İstifadəçi adı" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/az/settings.json b/apps/dokploy/public/locales/az/settings.json deleted file mode 100644 index fb286bf0..00000000 --- a/apps/dokploy/public/locales/az/settings.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "settings.common.save": "Yadda saxla", - "settings.common.enterTerminal": "Terminala daxil ol", - "settings.server.domain.title": "Server Domeni", - "settings.server.domain.description": "Server tətbiqinizə domen əlavə edin.", - "settings.server.domain.form.domain": "Domen", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-poçtu", - "settings.server.domain.form.certificate.label": "Sertifikat Təminatçısı", - "settings.server.domain.form.certificate.placeholder": "Sertifikat seçin", - "settings.server.domain.form.certificateOptions.none": "Heç biri", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - - "settings.server.webServer.title": "Veb Server", - "settings.server.webServer.description": "Veb serveri yenidən yüklə və ya təmizlə.", - "settings.server.webServer.actions": "Əməliyyatlar", - "settings.server.webServer.reload": "Yenidən yüklə", - "settings.server.webServer.watchLogs": "Logları izlə", - "settings.server.webServer.updateServerIp": "Server IP-ni Yenilə", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Mühiti Dəyişdir", - "settings.server.webServer.traefik.managePorts": "Əlavə Port Təyinatları", - "settings.server.webServer.traefik.managePortsDescription": "Traefik üçün əlavə portlar əlavə edin və ya silin", - "settings.server.webServer.traefik.targetPort": "Hədəf Port", - "settings.server.webServer.traefik.publishedPort": "Dərc Edilmiş Port", - "settings.server.webServer.traefik.addPort": "Port Əlavə Et", - "settings.server.webServer.traefik.portsUpdated": "Portlar uğurla yeniləndi", - "settings.server.webServer.traefik.portsUpdateError": "Portların yenilənməsi uğursuz oldu", - "settings.server.webServer.traefik.publishMode": "Dərc Rejimi", - "settings.server.webServer.storage.label": "Yer", - "settings.server.webServer.storage.cleanUnusedImages": "İstifadə edilməyən şəkilləri təmizlə", - "settings.server.webServer.storage.cleanUnusedVolumes": "İstifadə edilməyən həcmləri təmizlə", - "settings.server.webServer.storage.cleanStoppedContainers": "Dayandırılmış konteynerləri təmizlə", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder və Sistemi təmizlə", - "settings.server.webServer.storage.cleanMonitoring": "Monitorinqi təmizlə", - "settings.server.webServer.storage.cleanAll": "Hamısını təmizlə", - - "settings.profile.title": "Hesab", - "settings.profile.description": "Profilinizin məlumatlarını buradan dəyişin.", - "settings.profile.email": "E-poçt", - "settings.profile.password": "Şifrə", - "settings.profile.avatar": "Avatar", - - "settings.appearance.title": "Görünüş", - "settings.appearance.description": "İdarəetmə panelinizin görünüşünü fərdiləşdirin.", - "settings.appearance.theme": "Mövzu", - "settings.appearance.themeDescription": "İdarəetmə paneliniz üçün mövzu seçin", - "settings.appearance.themes.light": "İşıqlı", - "settings.appearance.themes.dark": "Qaranlıq", - "settings.appearance.themes.system": "Sistem", - "settings.appearance.language": "Dil", - "settings.appearance.languageDescription": "İdarəetmə paneliniz üçün dil seçin", - - "settings.terminal.connectionSettings": "Bağlantı parametrləri", - "settings.terminal.ipAddress": "IP Ünvanı", - "settings.terminal.port": "Port", - "settings.terminal.username": "İstifadəçi adı" -} diff --git a/apps/dokploy/public/locales/de/common.json b/apps/dokploy/public/locales/de/common.json index 0967ef42..d4014d31 100644 --- a/apps/dokploy/public/locales/de/common.json +++ b/apps/dokploy/public/locales/de/common.json @@ -1 +1,41 @@ -{} +{ + "settings.common.save": "Speichern", + "settings.server.domain.title": "Server-Domain", + "settings.server.domain.description": "Füg eine Domain zu deiner Server-Anwendung hinzu.", + "settings.server.domain.form.domain": "Domain", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-Mail", + "settings.server.domain.form.certificate.label": "Zertifikat", + "settings.server.domain.form.certificate.placeholder": "Wähl ein Zertifikat aus", + "settings.server.domain.form.certificateOptions.none": "Keins", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Standard)", + "settings.server.webServer.title": "Web-Server", + "settings.server.webServer.description": "Lade den Web-Server neu oder reinige ihn.", + "settings.server.webServer.actions": "Aktionen", + "settings.server.webServer.reload": "Neu laden", + "settings.server.webServer.watchLogs": "Logs anschauen", + "settings.server.webServer.updateServerIp": "Server-IP Aktualisieren", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Umgebungsvariablen ändern", + "settings.server.webServer.storage.label": "Speicherplatz", + "settings.server.webServer.storage.cleanUnusedImages": "Nicht genutzte Bilder löschen", + "settings.server.webServer.storage.cleanUnusedVolumes": "Nicht genutzte Volumes löschen", + "settings.server.webServer.storage.cleanStoppedContainers": "Gestoppte Container löschen", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & System bereinigen", + "settings.server.webServer.storage.cleanMonitoring": "Monitoring bereinigen", + "settings.server.webServer.storage.cleanAll": "Alles bereinigen", + "settings.profile.title": "Konto", + "settings.profile.description": "Ändere die Details deines Profiles hier.", + "settings.profile.email": "E-Mail", + "settings.profile.password": "Passwort", + "settings.profile.avatar": "Avatar", + "settings.appearance.title": "Aussehen", + "settings.appearance.description": "Pass das Design deines Dashboards an.", + "settings.appearance.theme": "Theme", + "settings.appearance.themeDescription": "Wähl ein Theme für dein Dashboard aus", + "settings.appearance.themes.light": "Hell", + "settings.appearance.themes.dark": "Dunkel", + "settings.appearance.themes.system": "System", + "settings.appearance.language": "Sprache", + "settings.appearance.languageDescription": "Wähl eine Sprache für dein Dashboard aus" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/de/settings.json b/apps/dokploy/public/locales/de/settings.json deleted file mode 100644 index e2ba0623..00000000 --- a/apps/dokploy/public/locales/de/settings.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "settings.common.save": "Speichern", - "settings.server.domain.title": "Server-Domain", - "settings.server.domain.description": "Füg eine Domain zu deiner Server-Anwendung hinzu.", - "settings.server.domain.form.domain": "Domain", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-Mail", - "settings.server.domain.form.certificate.label": "Zertifikat", - "settings.server.domain.form.certificate.placeholder": "Wähl ein Zertifikat aus", - "settings.server.domain.form.certificateOptions.none": "Keins", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Standard)", - - "settings.server.webServer.title": "Web-Server", - "settings.server.webServer.description": "Lade den Web-Server neu oder reinige ihn.", - "settings.server.webServer.actions": "Aktionen", - "settings.server.webServer.reload": "Neu laden", - "settings.server.webServer.watchLogs": "Logs anschauen", - "settings.server.webServer.updateServerIp": "Server-IP Aktualisieren", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Umgebungsvariablen ändern", - "settings.server.webServer.storage.label": "Speicherplatz", - "settings.server.webServer.storage.cleanUnusedImages": "Nicht genutzte Bilder löschen", - "settings.server.webServer.storage.cleanUnusedVolumes": "Nicht genutzte Volumes löschen", - "settings.server.webServer.storage.cleanStoppedContainers": "Gestoppte Container löschen", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & System bereinigen", - "settings.server.webServer.storage.cleanMonitoring": "Monitoring bereinigen", - "settings.server.webServer.storage.cleanAll": "Alles bereinigen", - - "settings.profile.title": "Konto", - "settings.profile.description": "Ändere die Details deines Profiles hier.", - "settings.profile.email": "E-Mail", - "settings.profile.password": "Passwort", - "settings.profile.avatar": "Avatar", - - "settings.appearance.title": "Aussehen", - "settings.appearance.description": "Pass das Design deines Dashboards an.", - "settings.appearance.theme": "Theme", - "settings.appearance.themeDescription": "Wähl ein Theme für dein Dashboard aus", - "settings.appearance.themes.light": "Hell", - "settings.appearance.themes.dark": "Dunkel", - "settings.appearance.themes.system": "System", - "settings.appearance.language": "Sprache", - "settings.appearance.languageDescription": "Wähl eine Sprache für dein Dashboard aus" -} diff --git a/apps/dokploy/public/locales/en/auth.json b/apps/dokploy/public/locales/en/auth.json deleted file mode 100644 index 89335257..00000000 --- a/apps/dokploy/public/locales/en/auth.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "auth.signIn": "Sign In", - "auth.signInDescription": "Enter your email and password to sign in", - "auth.signInWithGoogle": "Sign in with Google", - "auth.signInWithGithub": "Sign in with GitHub", - "auth.email": "Email", - "auth.password": "Password", - "auth.password.placeholder": "Enter your password", - "auth.login": "Login", - "auth.forgetPassword": "Lost your password?", - "auth.createAccount": "Create an account", - "auth.twoFactorCode": "2FA Code", - "auth.twoFactorCodeDescription": "Enter the 6-digit code from your authenticator app", - "auth.lostAuthenticator": "Lost access to your authenticator app?", - "auth.back": "Back", - "auth.verify": "Verify", - "auth.enterBackupCode": "Enter Backup Code", - "auth.enterBackupCodeDescription": "Enter one of your backup codes to access your account", - "auth.backupCode": "Backup Code", - "auth.backupCode.placeholder": "Enter your backup code", - "auth.backupCodeDescription": "Enter one of the backup codes you received when setting up 2FA", - "auth.cancel": "Cancel", - "auth.invalidTwoFactorCode": "Please enter a valid 6-digit code", - "auth.twoFactorVerificationError": "An error occurred while verifying 2FA code", - "auth.invalidBackupCode": "Please enter a valid backup code", - "auth.backupCodeVerificationError": "An error occurred while verifying backup code", - "auth.githubSignInError": "An error occurred while signing in with GitHub", - "auth.googleSignInError": "An error occurred while signing in with Google", - "auth.unknownError": "Unknown error" -} diff --git a/apps/dokploy/public/locales/en/common.json b/apps/dokploy/public/locales/en/common.json index 4982b29f..fd595802 100644 --- a/apps/dokploy/public/locales/en/common.json +++ b/apps/dokploy/public/locales/en/common.json @@ -1,60 +1,231 @@ { - "common.side.home": "Home", - "common.side.settings": "Settings", - "common.side.extra": "Extra", - - "common.side.projects": "Projects", - "common.side.monitoring": "Monitoring", - "common.side.traefik": "Traefik File System", - "common.side.docker": "Docker", - "common.side.swarm": "Swarm", - "common.side.requests": "Requests", - "common.side.web-server": "Web Server", - "common.side.profile": "Profile", - "common.side.remote-servers": "Remote Servers", - "common.side.users": "Users", - "common.side.ssh-keys": "SSH Keys", - "common.side.ai": "AI", - "common.side.git": "Git", - "common.side.registry": "Registry", - "common.side.s3-destinations": "S3 Destinations", - "common.side.certificates": "Certificates", - "common.side.cluster": "Cluster", - "common.side.notifications": "Notifications", - "common.side.billing": "Billing", - "common.side.documentation": "Documentation", - "common.side.support": "Support", - "common.side.sponsor": "Sponsor", - - "common.side.invitations.pending-invitations": "Pending Invitations", - "common.side.invitations.no-pending-invitations": "No pending invitations", - "common.side.invitations.accept-invitation": "Accept Invitation", - "common.side.invitations.confirm-accept-invitation": "Are you sure you want to accept this invitation?", - "common.side.invitations.error-accepting-invitation": "Error accepting invitation", - "common.side.invitations.invitation-accepted": "Invitation accepted successfully", - "common.side.invitations.expires": "Expires: {{expireDate}}", - "common.side.invitations.role": "Role: {{role}}", - - "common.side.organizations": "Organizations", - "common.side.organizations.select-organization": "Select Organization", - "common.side.organizations.delete-organization": "Delete Organization", - "common.side.organizations.confirm-delete-organization": "Are you sure you want to delete this organization?", - "common.side.organizations.organization-deleted": "Organization deleted successfully", - "common.side.organizations.error-deleting-organization": "Error deleting organization", - "common.side.organizations.createOrganization": "Create organization", - "common.side.organizations.updateOrganization": "Update organization", - "common.side.organizations.createOrganizationDescription": "Create a new organization to manage your projects.", - "common.side.organizations.updateOrganizationDescription": "Update the organization name and logo", - "common.side.organizations.name": "Name", - "common.side.organizations.name.placeholder": "Organization name", - "common.side.organizations.logoURL": "Logo URL", - "common.side.organizations.createSuccess": "Organization created successfully", - "common.side.organizations.updateSuccess": "Organization updated successfully", - "common.side.organizations.createFailed": "Failed to create organization", - "common.side.organizations.updateFailed": "Failed to update organization", - - "common.account": "Account", - "common.account.mine": "My Account", - "common.account.logout": "Logout", - "common.account.selectLanguage": "Select Language" -} + "auth.signIn": "Sign In", + "auth.signInDescription": "Enter your email and password to sign in", + "auth.signInWithGoogle": "Sign in with Google", + "auth.signInWithGithub": "Sign in with GitHub", + "auth.email": "Email", + "auth.password": "Password", + "auth.password.placeholder": "Enter your password", + "auth.login": "Login", + "auth.forgetPassword": "Lost your password?", + "auth.createAccount": "Create an account", + "auth.twoFactorCode": "2FA Code", + "auth.twoFactorCodeDescription": "Enter the 6-digit code from your authenticator app", + "auth.lostAuthenticator": "Lost access to your authenticator app?", + "auth.back": "Back", + "auth.verify": "Verify", + "auth.enterBackupCode": "Enter Backup Code", + "auth.enterBackupCodeDescription": "Enter one of your backup codes to access your account", + "auth.backupCode": "Backup Code", + "auth.backupCode.placeholder": "Enter your backup code", + "auth.backupCodeDescription": "Enter one of the backup codes you received when setting up 2FA", + "auth.cancel": "Cancel", + "auth.invalidTwoFactorCode": "Please enter a valid 6-digit code", + "auth.twoFactorVerificationError": "An error occurred while verifying 2FA code", + "auth.invalidBackupCode": "Please enter a valid backup code", + "auth.backupCodeVerificationError": "An error occurred while verifying backup code", + "auth.githubSignInError": "An error occurred while signing in with GitHub", + "auth.googleSignInError": "An error occurred while signing in with Google", + "auth.unknownError": "Unknown error", + "common.side.home": "Home", + "common.side.settings": "Settings", + "common.side.extra": "Extra", + "common.side.projects": "Projects", + "common.side.monitoring": "Monitoring", + "common.side.traefik": "Traefik File System", + "common.side.docker": "Docker", + "common.side.swarm": "Swarm", + "common.side.requests": "Requests", + "common.side.web-server": "Web Server", + "common.side.profile": "Profile", + "common.side.remote-servers": "Remote Servers", + "common.side.users": "Users", + "common.side.ssh-keys": "SSH Keys", + "common.side.ai": "AI", + "common.side.git": "Git", + "common.side.registry": "Registry", + "common.side.s3-destinations": "S3 Destinations", + "common.side.certificates": "Certificates", + "common.side.cluster": "Cluster", + "common.side.notifications": "Notifications", + "common.side.billing": "Billing", + "common.side.documentation": "Documentation", + "common.side.support": "Support", + "common.side.sponsor": "Sponsor", + "common.side.invitations.pending-invitations": "Pending Invitations", + "common.side.invitations.no-pending-invitations": "No pending invitations", + "common.side.invitations.accept-invitation": "Accept Invitation", + "common.side.invitations.confirm-accept-invitation": "Are you sure you want to accept this invitation?", + "common.side.invitations.error-accepting-invitation": "Error accepting invitation", + "common.side.invitations.invitation-accepted": "Invitation accepted successfully", + "common.side.invitations.expires": "Expires: {{expireDate}}", + "common.side.invitations.role": "Role: {{role}}", + "common.side.organizations": "Organizations", + "common.side.organizations.select-organization": "Select Organization", + "common.side.organizations.delete-organization": "Delete Organization", + "common.side.organizations.confirm-delete-organization": "Are you sure you want to delete this organization?", + "common.side.organizations.organization-deleted": "Organization deleted successfully", + "common.side.organizations.error-deleting-organization": "Error deleting organization", + "common.side.organizations.createOrganization": "Create organization", + "common.side.organizations.updateOrganization": "Update organization", + "common.side.organizations.createOrganizationDescription": "Create a new organization to manage your projects.", + "common.side.organizations.updateOrganizationDescription": "Update the organization name and logo", + "common.side.organizations.name": "Name", + "common.side.organizations.name.placeholder": "Organization name", + "common.side.organizations.logoURL": "Logo URL", + "common.side.organizations.createSuccess": "Organization created successfully", + "common.side.organizations.updateSuccess": "Organization updated successfully", + "common.side.organizations.createFailed": "Failed to create organization", + "common.side.organizations.updateFailed": "Failed to update organization", + "common.account": "Account", + "common.account.mine": "My Account", + "common.account.logout": "Logout", + "common.account.selectLanguage": "Select Language", + "home.projects.title": "Projects", + "home.projects.description": "Create and manage your projects", + "settings.common.save": "Save", + "settings.common.enterTerminal": "Terminal", + "settings.server.domain.title": "Server Domain", + "settings.server.domain.description": "Add a domain to your server application.", + "settings.server.domain.form.domain": "Domain", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Email", + "settings.server.domain.form.certificate.label": "Certificate Provider", + "settings.server.domain.form.certificate.placeholder": "Select a certificate", + "settings.server.domain.form.certificateOptions.none": "None", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + "settings.server.webServer.title": "Web Server", + "settings.server.webServer.description": "Reload or clean the web server.", + "settings.server.webServer.actions": "Actions", + "settings.server.webServer.reload": "Reload", + "settings.server.webServer.watchLogs": "View Logs", + "settings.server.webServer.updateServerIp": "Update Server IP", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Modify Environment", + "settings.server.webServer.traefik.managePorts": "Additional Port Mappings", + "settings.server.webServer.traefik.managePortsDescription": "Add or remove additional ports for Traefik", + "settings.server.webServer.traefik.targetPort": "Target Port", + "settings.server.webServer.traefik.publishedPort": "Published Port", + "settings.server.webServer.traefik.addPort": "Add Port", + "settings.server.webServer.traefik.portsUpdated": "Ports updated successfully", + "settings.server.webServer.traefik.portsUpdateError": "Failed to update ports", + "settings.server.webServer.traefik.publishMode": "Publish Mode", + "settings.server.webServer.storage.label": "Space", + "settings.server.webServer.storage.cleanUnusedImages": "Clean unused images", + "settings.server.webServer.storage.cleanUnusedVolumes": "Clean unused volumes", + "settings.server.webServer.storage.cleanStoppedContainers": "Clean stopped containers", + "settings.server.webServer.storage.cleanDockerBuilder": "Clean Docker Builder & System", + "settings.server.webServer.storage.cleanMonitoring": "Clean Monitoring", + "settings.server.webServer.storage.cleanAll": "Clean all", + "settings.profile.title": "Account", + "settings.profile.description": "Change the details of your profile here.", + "settings.profile.email": "Email", + "settings.profile.oldPassword": "Current Password", + "settings.profile.newPassword": "New Password", + "settings.profile.password": "Password", + "settings.profile.avatar": "Avatar", + "settings.2fa.enable2fa": "Enable 2FA", + "settings.2fa.title": "2FA Setup", + "settings.2fa.enterPassword": "Enter your password to begin 2FA setup", + "settings.2fa.scanQrCodeAndVerify": "Scan the QR code and verify with your authenticator app", + "settings.2fa.password": "Password", + "settings.2fa.enterPasswordPlaceholder": "Enter your password", + "settings.2fa.enterPasswordDescription": "Enter your password to enable 2FA", + "settings.2fa.continue": "Continue", + "settings.2fa.scanQrCode": "Scan this QR code with your authenticator app", + "settings.2fa.qrCodeAlt": "2FA QR Code", + "settings.2fa.cantScanQrCode": "Can't scan the QR code?", + "settings.2fa.backupCodes": "Backup Codes", + "settings.2fa.saveBackupCodes": "Save these backup codes in a secure place. You can use them to access your account if you lose access to your authenticator device.", + "settings.2fa.verificationCode": "Verification Code", + "settings.2fa.enterVerificationCode": "Enter the 6-digit code from your authenticator app", + "settings.2fa.errorSettingUp": "Error setting up 2FA", + "settings.2fa.errorVerifyingPassword": "Error verifying password", + "settings.2fa.invalidCode": "Invalid code. Please try again.", + "settings.2fa.invalidVerificationCode": "Invalid verification code", + "settings.2fa.success": "2FA configured successfully", + "settings.2fa.connectionError": "Connection error. Please check your internet connection.", + "settings.2fa.errorVerifyingCode": "Error verifying code", + "settings.2fa.errorVerifying2faCode": "Error verifying 2FA code", + "settings.appearance.title": "Appearance", + "settings.appearance.description": "Customize the theme of your dashboard.", + "settings.appearance.theme": "Theme", + "settings.appearance.themeDescription": "Select a theme for your dashboard", + "settings.appearance.themes.light": "Light", + "settings.appearance.themes.dark": "Dark", + "settings.appearance.themes.system": "System", + "settings.appearance.language": "Language", + "settings.appearance.languageDescription": "Select a language for your dashboard", + "settings.terminal.connectionSettings": "Connection settings", + "settings.terminal.ipAddress": "IP Address", + "settings.terminal.port": "Port", + "settings.terminal.username": "Username", + "settings.api.apiCliKeys": "API/CLI Keys", + "settings.api.generateAndManageKeys": "Generate and manage API keys to access the API/CLI", + "settings.api.swaggerApi": "Swagger API:", + "settings.api.view": "View", + "settings.api.created": "Created", + "settings.api.ago": "ago", + "settings.api.expiresIn": "Expires in", + "settings.api.deleteApiKey": "Delete API Key", + "settings.api.deleteApiKeyDescription": "Are you sure you want to delete this API key? This action cannot be undone.", + "settings.api.apiKeyDeleted": "API key deleted successfully", + "settings.api.errorDeletingApiKey": "Error deleting API key", + "settings.api.noApiKeysFound": "No API keys found", + "settings.api.errorGeneratingApiKey": "Failed to generate API key", + "settings.api.generateNewKey": "Generate New Key", + "settings.api.generateApiKey": "Generate API Key", + "settings.api.createNewApiKeyDescription": "Create a new API key for accessing the API. You can set an expiration date and a custom prefix for better organization.", + "settings.api.name": "Name", + "settings.api.namePlaceholder": "My API Key", + "settings.api.prefix": "Prefix", + "settings.api.prefixPlaceholder": "my_app", + "settings.api.expiration": "Expiration", + "settings.api.selectExpirationTime": "Select expiration time", + "settings.api.expirationOptions.Never": "Never", + "settings.api.expirationOptions.1 day": "1 day", + "settings.api.expirationOptions.7 days": "7 days", + "settings.api.expirationOptions.30 days": "30 days", + "settings.api.expirationOptions.90 days": "90 days", + "settings.api.expirationOptions.1 year": "1 year", + "settings.api.organization": "Organization", + "settings.api.selectOrganization": "Select organization", + "settings.api.rateLimiting": "Rate Limiting", + "settings.api.enableRateLimiting": "Enable Rate Limiting", + "settings.api.limitRequestsDescription": "Limit the number of requests within a time window", + "settings.api.timeWindow": "Time Window", + "settings.api.selectTimeWindow": "Select time window", + "settings.api.timeWindowOptions.1 minute": "1 minute", + "settings.api.timeWindowOptions.5 minutes": "5 minutes", + "settings.api.timeWindowOptions.15 minutes": "15 minutes", + "settings.api.timeWindowOptions.30 minutes": "30 minutes", + "settings.api.timeWindowOptions.1 hour": "1 hour", + "settings.api.timeWindowOptions.1 day": "1 day", + "settings.api.timeWindowDescription": "The duration in which requests are counted", + "settings.api.maxRequests": "Maximum Requests", + "settings.api.maxRequestsPlaceholder": "100", + "settings.api.maxRequestsDescription": "Maximum number of requests allowed within the time window", + "settings.api.requestLimiting": "Request Limiting", + "settings.api.totalRequestLimit": "Total Request Limit", + "settings.api.totalRequestLimitPlaceholder": "Leave empty for unlimited", + "settings.api.totalRequestLimitDescription": "Total number of requests allowed (leave empty for unlimited)", + "settings.api.refillAmount": "Refill Amount", + "settings.api.refillAmountPlaceholder": "Amount to refill", + "settings.api.refillAmountDescription": "Number of requests to add on each refill", + "settings.api.refillInterval": "Refill Interval", + "settings.api.selectRefillInterval": "Select refill interval", + "settings.api.refillIntervalOptions.1 hour": "1 hour", + "settings.api.refillIntervalOptions.6 hours": "6 hours", + "settings.api.refillIntervalOptions.12 hours": "12 hours", + "settings.api.refillIntervalOptions.1 day": "1 day", + "settings.api.refillIntervalOptions.7 days": "7 days", + "settings.api.refillIntervalOptions.30 days": "30 days", + "settings.api.refillIntervalDescription": "How often to refill the request limit", + "settings.api.cancel": "Cancel", + "settings.api.generate": "Generate", + "settings.api.apiKeyGeneratedSuccessfully": "API Key Generated Successfully", + "settings.api.copyApiKeyNow": "Please copy your API key now. You won't be able to see it again!", + "settings.api.apiKeyCopied": "API key copied to clipboard", + "settings.api.copyToClipboard": "Copy to Clipboard", + "settings.api.close": "Close" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/en/home.json b/apps/dokploy/public/locales/en/home.json deleted file mode 100644 index 708466b6..00000000 --- a/apps/dokploy/public/locales/en/home.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "home.projects.title": "Projects", - "home.projects.description": "Create and manage your projects" -} diff --git a/apps/dokploy/public/locales/en/settings.json b/apps/dokploy/public/locales/en/settings.json deleted file mode 100644 index 8d3738c2..00000000 --- a/apps/dokploy/public/locales/en/settings.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "settings.common.save": "Save", - "settings.common.enterTerminal": "Terminal", - "settings.server.domain.title": "Server Domain", - "settings.server.domain.description": "Add a domain to your server application.", - "settings.server.domain.form.domain": "Domain", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Email", - "settings.server.domain.form.certificate.label": "Certificate Provider", - "settings.server.domain.form.certificate.placeholder": "Select a certificate", - "settings.server.domain.form.certificateOptions.none": "None", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - - "settings.server.webServer.title": "Web Server", - "settings.server.webServer.description": "Reload or clean the web server.", - "settings.server.webServer.actions": "Actions", - "settings.server.webServer.reload": "Reload", - "settings.server.webServer.watchLogs": "View Logs", - "settings.server.webServer.updateServerIp": "Update Server IP", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Modify Environment", - "settings.server.webServer.traefik.managePorts": "Additional Port Mappings", - "settings.server.webServer.traefik.managePortsDescription": "Add or remove additional ports for Traefik", - "settings.server.webServer.traefik.targetPort": "Target Port", - "settings.server.webServer.traefik.publishedPort": "Published Port", - "settings.server.webServer.traefik.addPort": "Add Port", - "settings.server.webServer.traefik.portsUpdated": "Ports updated successfully", - "settings.server.webServer.traefik.portsUpdateError": "Failed to update ports", - "settings.server.webServer.traefik.publishMode": "Publish Mode", - "settings.server.webServer.storage.label": "Space", - "settings.server.webServer.storage.cleanUnusedImages": "Clean unused images", - "settings.server.webServer.storage.cleanUnusedVolumes": "Clean unused volumes", - "settings.server.webServer.storage.cleanStoppedContainers": "Clean stopped containers", - "settings.server.webServer.storage.cleanDockerBuilder": "Clean Docker Builder & System", - "settings.server.webServer.storage.cleanMonitoring": "Clean Monitoring", - "settings.server.webServer.storage.cleanAll": "Clean all", - - "settings.profile.title": "Account", - "settings.profile.description": "Change the details of your profile here.", - "settings.profile.email": "Email", - "settings.profile.oldPassword": "Current Password", - "settings.profile.newPassword": "New Password", - "settings.profile.password": "Password", - "settings.profile.avatar": "Avatar", - - "settings.2fa.enable2fa": "Enable 2FA", - "settings.2fa.title": "2FA Setup", - "settings.2fa.enterPassword": "Enter your password to begin 2FA setup", - "settings.2fa.scanQrCodeAndVerify": "Scan the QR code and verify with your authenticator app", - "settings.2fa.password": "Password", - "settings.2fa.enterPasswordPlaceholder": "Enter your password", - "settings.2fa.enterPasswordDescription": "Enter your password to enable 2FA", - "settings.2fa.continue": "Continue", - "settings.2fa.scanQrCode": "Scan this QR code with your authenticator app", - "settings.2fa.qrCodeAlt": "2FA QR Code", - "settings.2fa.cantScanQrCode": "Can't scan the QR code?", - "settings.2fa.backupCodes": "Backup Codes", - "settings.2fa.saveBackupCodes": "Save these backup codes in a secure place. You can use them to access your account if you lose access to your authenticator device.", - "settings.2fa.verificationCode": "Verification Code", - "settings.2fa.enterVerificationCode": "Enter the 6-digit code from your authenticator app", - "settings.2fa.errorSettingUp": "Error setting up 2FA", - "settings.2fa.errorVerifyingPassword": "Error verifying password", - "settings.2fa.invalidCode": "Invalid code. Please try again.", - "settings.2fa.invalidVerificationCode": "Invalid verification code", - "settings.2fa.success": "2FA configured successfully", - "settings.2fa.connectionError": "Connection error. Please check your internet connection.", - "settings.2fa.errorVerifyingCode": "Error verifying code", - "settings.2fa.errorVerifying2faCode": "Error verifying 2FA code", - - "settings.appearance.title": "Appearance", - "settings.appearance.description": "Customize the theme of your dashboard.", - "settings.appearance.theme": "Theme", - "settings.appearance.themeDescription": "Select a theme for your dashboard", - "settings.appearance.themes.light": "Light", - "settings.appearance.themes.dark": "Dark", - "settings.appearance.themes.system": "System", - "settings.appearance.language": "Language", - "settings.appearance.languageDescription": "Select a language for your dashboard", - - "settings.terminal.connectionSettings": "Connection settings", - "settings.terminal.ipAddress": "IP Address", - "settings.terminal.port": "Port", - "settings.terminal.username": "Username", - - "settings.api.apiCliKeys": "API/CLI Keys", - "settings.api.generateAndManageKeys": "Generate and manage API keys to access the API/CLI", - "settings.api.swaggerApi": "Swagger API:", - "settings.api.view": "View", - "settings.api.created": "Created", - "settings.api.ago": "ago", - "settings.api.expiresIn": "Expires in", - "settings.api.deleteApiKey": "Delete API Key", - "settings.api.deleteApiKeyDescription": "Are you sure you want to delete this API key? This action cannot be undone.", - "settings.api.apiKeyDeleted": "API key deleted successfully", - "settings.api.errorDeletingApiKey": "Error deleting API key", - "settings.api.noApiKeysFound": "No API keys found", - "settings.api.errorGeneratingApiKey": "Failed to generate API key", - "settings.api.generateNewKey": "Generate New Key", - "settings.api.generateApiKey": "Generate API Key", - "settings.api.createNewApiKeyDescription": "Create a new API key for accessing the API. You can set an expiration date and a custom prefix for better organization.", - "settings.api.name": "Name", - "settings.api.namePlaceholder": "My API Key", - "settings.api.prefix": "Prefix", - "settings.api.prefixPlaceholder": "my_app", - "settings.api.expiration": "Expiration", - "settings.api.selectExpirationTime": "Select expiration time", - "settings.api.expirationOptions.Never": "Never", - "settings.api.expirationOptions.1 day": "1 day", - "settings.api.expirationOptions.7 days": "7 days", - "settings.api.expirationOptions.30 days": "30 days", - "settings.api.expirationOptions.90 days": "90 days", - "settings.api.expirationOptions.1 year": "1 year", - "settings.api.organization": "Organization", - "settings.api.selectOrganization": "Select organization", - "settings.api.rateLimiting": "Rate Limiting", - "settings.api.enableRateLimiting": "Enable Rate Limiting", - "settings.api.limitRequestsDescription": "Limit the number of requests within a time window", - "settings.api.timeWindow": "Time Window", - "settings.api.selectTimeWindow": "Select time window", - "settings.api.timeWindowOptions.1 minute": "1 minute", - "settings.api.timeWindowOptions.5 minutes": "5 minutes", - "settings.api.timeWindowOptions.15 minutes": "15 minutes", - "settings.api.timeWindowOptions.30 minutes": "30 minutes", - "settings.api.timeWindowOptions.1 hour": "1 hour", - "settings.api.timeWindowOptions.1 day": "1 day", - "settings.api.timeWindowDescription": "The duration in which requests are counted", - "settings.api.maxRequests": "Maximum Requests", - "settings.api.maxRequestsPlaceholder": "100", - "settings.api.maxRequestsDescription": "Maximum number of requests allowed within the time window", - "settings.api.requestLimiting": "Request Limiting", - "settings.api.totalRequestLimit": "Total Request Limit", - "settings.api.totalRequestLimitPlaceholder": "Leave empty for unlimited", - "settings.api.totalRequestLimitDescription": "Total number of requests allowed (leave empty for unlimited)", - "settings.api.refillAmount": "Refill Amount", - "settings.api.refillAmountPlaceholder": "Amount to refill", - "settings.api.refillAmountDescription": "Number of requests to add on each refill", - "settings.api.refillInterval": "Refill Interval", - "settings.api.selectRefillInterval": "Select refill interval", - "settings.api.refillIntervalOptions.1 hour": "1 hour", - "settings.api.refillIntervalOptions.6 hours": "6 hours", - "settings.api.refillIntervalOptions.12 hours": "12 hours", - "settings.api.refillIntervalOptions.1 day": "1 day", - "settings.api.refillIntervalOptions.7 days": "7 days", - "settings.api.refillIntervalOptions.30 days": "30 days", - "settings.api.refillIntervalDescription": "How often to refill the request limit", - "settings.api.cancel": "Cancel", - "settings.api.generate": "Generate", - "settings.api.apiKeyGeneratedSuccessfully": "API Key Generated Successfully", - "settings.api.copyApiKeyNow": "Please copy your API key now. You won't be able to see it again!", - "settings.api.apiKeyCopied": "API key copied to clipboard", - "settings.api.copyToClipboard": "Copy to Clipboard", - "settings.api.close": "Close" -} diff --git a/apps/dokploy/public/locales/es/common.json b/apps/dokploy/public/locales/es/common.json index 0967ef42..38e3466c 100644 --- a/apps/dokploy/public/locales/es/common.json +++ b/apps/dokploy/public/locales/es/common.json @@ -1 +1,49 @@ -{} +{ + "settings.common.save": "Guardar", + "settings.server.domain.title": "Dominio del Servidor", + "settings.server.domain.description": "Añade un dominio a tu aplicación de servidor.", + "settings.server.domain.form.domain": "Dominio", + "settings.server.domain.form.letsEncryptEmail": "Correo de Let's Encrypt", + "settings.server.domain.form.certificate.label": "Proveedor de Certificado", + "settings.server.domain.form.certificate.placeholder": "Selecciona un certificado", + "settings.server.domain.form.certificateOptions.none": "Ninguno", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + "settings.server.webServer.title": "Servidor Web", + "settings.server.webServer.description": "Recarga o limpia el servidor web.", + "settings.server.webServer.actions": "Acciones", + "settings.server.webServer.reload": "Recargar", + "settings.server.webServer.watchLogs": "Ver registros", + "settings.server.webServer.updateServerIp": "Actualizar IP del Servidor", + "settings.server.webServer.server.label": "Servidor", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Modificar Entorno", + "settings.server.webServer.traefik.managePorts": "Asignación Adicional de Puertos", + "settings.server.webServer.traefik.managePortsDescription": "Añadir o eliminar puertos adicionales para Traefik", + "settings.server.webServer.traefik.targetPort": "Puerto de Destino", + "settings.server.webServer.traefik.publishedPort": "Puerto Publicado", + "settings.server.webServer.traefik.addPort": "Añadir Puerto", + "settings.server.webServer.traefik.portsUpdated": "Puertos actualizados correctamente", + "settings.server.webServer.traefik.portsUpdateError": "Error al actualizar los puertos", + "settings.server.webServer.traefik.publishMode": "Modo de Publicación", + "settings.server.webServer.storage.label": "Espacio", + "settings.server.webServer.storage.cleanUnusedImages": "Limpiar imágenes no utilizadas", + "settings.server.webServer.storage.cleanUnusedVolumes": "Limpiar volúmenes no utilizados", + "settings.server.webServer.storage.cleanStoppedContainers": "Limpiar contenedores detenidos", + "settings.server.webServer.storage.cleanDockerBuilder": "Limpiar Constructor de Docker y Sistema", + "settings.server.webServer.storage.cleanMonitoring": "Limpiar Monitoreo", + "settings.server.webServer.storage.cleanAll": "Limpiar todo", + "settings.profile.title": "Cuenta", + "settings.profile.description": "Cambia los detalles de tu perfil aquí.", + "settings.profile.email": "Correo electrónico", + "settings.profile.password": "Contraseña", + "settings.profile.avatar": "Avatar", + "settings.appearance.title": "Apariencia", + "settings.appearance.description": "Personaliza el tema de tu panel.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Selecciona un tema para tu panel", + "settings.appearance.themes.light": "Claro", + "settings.appearance.themes.dark": "Oscuro", + "settings.appearance.themes.system": "Sistema", + "settings.appearance.language": "Idioma", + "settings.appearance.languageDescription": "Selecciona un idioma para tu panel" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/es/settings.json b/apps/dokploy/public/locales/es/settings.json deleted file mode 100644 index 90a41cd0..00000000 --- a/apps/dokploy/public/locales/es/settings.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "settings.common.save": "Guardar", - "settings.server.domain.title": "Dominio del Servidor", - "settings.server.domain.description": "Añade un dominio a tu aplicación de servidor.", - "settings.server.domain.form.domain": "Dominio", - "settings.server.domain.form.letsEncryptEmail": "Correo de Let's Encrypt", - "settings.server.domain.form.certificate.label": "Proveedor de Certificado", - "settings.server.domain.form.certificate.placeholder": "Selecciona un certificado", - "settings.server.domain.form.certificateOptions.none": "Ninguno", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - - "settings.server.webServer.title": "Servidor Web", - "settings.server.webServer.description": "Recarga o limpia el servidor web.", - "settings.server.webServer.actions": "Acciones", - "settings.server.webServer.reload": "Recargar", - "settings.server.webServer.watchLogs": "Ver registros", - "settings.server.webServer.updateServerIp": "Actualizar IP del Servidor", - "settings.server.webServer.server.label": "Servidor", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Modificar Entorno", - "settings.server.webServer.traefik.managePorts": "Asignación Adicional de Puertos", - "settings.server.webServer.traefik.managePortsDescription": "Añadir o eliminar puertos adicionales para Traefik", - "settings.server.webServer.traefik.targetPort": "Puerto de Destino", - "settings.server.webServer.traefik.publishedPort": "Puerto Publicado", - "settings.server.webServer.traefik.addPort": "Añadir Puerto", - "settings.server.webServer.traefik.portsUpdated": "Puertos actualizados correctamente", - "settings.server.webServer.traefik.portsUpdateError": "Error al actualizar los puertos", - "settings.server.webServer.traefik.publishMode": "Modo de Publicación", - "settings.server.webServer.storage.label": "Espacio", - "settings.server.webServer.storage.cleanUnusedImages": "Limpiar imágenes no utilizadas", - "settings.server.webServer.storage.cleanUnusedVolumes": "Limpiar volúmenes no utilizados", - "settings.server.webServer.storage.cleanStoppedContainers": "Limpiar contenedores detenidos", - "settings.server.webServer.storage.cleanDockerBuilder": "Limpiar Constructor de Docker y Sistema", - "settings.server.webServer.storage.cleanMonitoring": "Limpiar Monitoreo", - "settings.server.webServer.storage.cleanAll": "Limpiar todo", - - "settings.profile.title": "Cuenta", - "settings.profile.description": "Cambia los detalles de tu perfil aquí.", - "settings.profile.email": "Correo electrónico", - "settings.profile.password": "Contraseña", - "settings.profile.avatar": "Avatar", - - "settings.appearance.title": "Apariencia", - "settings.appearance.description": "Personaliza el tema de tu panel.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Selecciona un tema para tu panel", - "settings.appearance.themes.light": "Claro", - "settings.appearance.themes.dark": "Oscuro", - "settings.appearance.themes.system": "Sistema", - "settings.appearance.language": "Idioma", - "settings.appearance.languageDescription": "Selecciona un idioma para tu panel" -} diff --git a/apps/dokploy/public/locales/fa/common.json b/apps/dokploy/public/locales/fa/common.json index 0967ef42..8d4c1485 100644 --- a/apps/dokploy/public/locales/fa/common.json +++ b/apps/dokploy/public/locales/fa/common.json @@ -1 +1,41 @@ -{} +{ + "settings.common.save": "ذخیره", + "settings.server.domain.title": "دامنه سرور", + "settings.server.domain.description": "یک دامنه به برنامه سرور خود اضافه کنید.", + "settings.server.domain.form.domain": "دامنه", + "settings.server.domain.form.letsEncryptEmail": "ایمیل Let's Encrypt", + "settings.server.domain.form.certificate.label": "گواهینامه", + "settings.server.domain.form.certificate.placeholder": "یک گواهینامه انتخاب کنید", + "settings.server.domain.form.certificateOptions.none": "هیچکدام", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (پیش‌فرض)", + "settings.server.webServer.title": "وب سرور", + "settings.server.webServer.description": "وب سرور را بازنشانی یا پاک کنید.", + "settings.server.webServer.actions": "اقدامات", + "settings.server.webServer.reload": "بارگذاری مجدد", + "settings.server.webServer.watchLogs": "مشاهده گزارش‌ها", + "settings.server.webServer.updateServerIp": "به‌روزرسانی آی‌پی سرور", + "settings.server.webServer.server.label": "سرور", + "settings.server.webServer.traefik.label": "ترافیک", + "settings.server.webServer.traefik.modifyEnv": "ویرایش محیط", + "settings.server.webServer.storage.label": "فضا", + "settings.server.webServer.storage.cleanUnusedImages": "پاکسازی Image های بدون استفاده", + "settings.server.webServer.storage.cleanUnusedVolumes": "پاک‌سازی ولوم‌های بدون استفاده", + "settings.server.webServer.storage.cleanStoppedContainers": "پاک‌سازی کانتینرهای متوقف‌شده", + "settings.server.webServer.storage.cleanDockerBuilder": "پاک‌سازی بیلدر و سیستم داکر", + "settings.server.webServer.storage.cleanMonitoring": "پاک‌سازی پایش", + "settings.server.webServer.storage.cleanAll": "پاک‌سازی همه", + "settings.profile.title": "حساب کاربری", + "settings.profile.description": "جزئیات پروفایل خود را در اینجا تغییر دهید.", + "settings.profile.email": "ایمیل", + "settings.profile.password": "رمز عبور", + "settings.profile.avatar": "تصویر پروفایل", + "settings.appearance.title": "ظاهر", + "settings.appearance.description": "تم داشبورد خود را سفارشی کنید.", + "settings.appearance.theme": "تم", + "settings.appearance.themeDescription": "یک تم برای داشبورد خود انتخاب کنید", + "settings.appearance.themes.light": "روشن", + "settings.appearance.themes.dark": "تاریک", + "settings.appearance.themes.system": "سیستم", + "settings.appearance.language": "زبان", + "settings.appearance.languageDescription": "یک زبان برای داشبورد خود انتخاب کنید" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/fa/settings.json b/apps/dokploy/public/locales/fa/settings.json deleted file mode 100644 index f28aaa27..00000000 --- a/apps/dokploy/public/locales/fa/settings.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "settings.common.save": "ذخیره", - "settings.server.domain.title": "دامنه سرور", - "settings.server.domain.description": "یک دامنه به برنامه سرور خود اضافه کنید.", - "settings.server.domain.form.domain": "دامنه", - "settings.server.domain.form.letsEncryptEmail": "ایمیل Let's Encrypt", - "settings.server.domain.form.certificate.label": "گواهینامه", - "settings.server.domain.form.certificate.placeholder": "یک گواهینامه انتخاب کنید", - "settings.server.domain.form.certificateOptions.none": "هیچکدام", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (پیش‌فرض)", - - "settings.server.webServer.title": "وب سرور", - "settings.server.webServer.description": "وب سرور را بازنشانی یا پاک کنید.", - "settings.server.webServer.actions": "اقدامات", - "settings.server.webServer.reload": "بارگذاری مجدد", - "settings.server.webServer.watchLogs": "مشاهده گزارش‌ها", - "settings.server.webServer.updateServerIp": "به‌روزرسانی آی‌پی سرور", - "settings.server.webServer.server.label": "سرور", - "settings.server.webServer.traefik.label": "ترافیک", - "settings.server.webServer.traefik.modifyEnv": "ویرایش محیط", - "settings.server.webServer.storage.label": "فضا", - "settings.server.webServer.storage.cleanUnusedImages": "پاکسازی Image های بدون استفاده", - "settings.server.webServer.storage.cleanUnusedVolumes": "پاک‌سازی ولوم‌های بدون استفاده", - "settings.server.webServer.storage.cleanStoppedContainers": "پاک‌سازی کانتینرهای متوقف‌شده", - "settings.server.webServer.storage.cleanDockerBuilder": "پاک‌سازی بیلدر و سیستم داکر", - "settings.server.webServer.storage.cleanMonitoring": "پاک‌سازی پایش", - "settings.server.webServer.storage.cleanAll": "پاک‌سازی همه", - - "settings.profile.title": "حساب کاربری", - "settings.profile.description": "جزئیات پروفایل خود را در اینجا تغییر دهید.", - "settings.profile.email": "ایمیل", - "settings.profile.password": "رمز عبور", - "settings.profile.avatar": "تصویر پروفایل", - - "settings.appearance.title": "ظاهر", - "settings.appearance.description": "تم داشبورد خود را سفارشی کنید.", - "settings.appearance.theme": "تم", - "settings.appearance.themeDescription": "یک تم برای داشبورد خود انتخاب کنید", - "settings.appearance.themes.light": "روشن", - "settings.appearance.themes.dark": "تاریک", - "settings.appearance.themes.system": "سیستم", - "settings.appearance.language": "زبان", - "settings.appearance.languageDescription": "یک زبان برای داشبورد خود انتخاب کنید" -} diff --git a/apps/dokploy/public/locales/fr/common.json b/apps/dokploy/public/locales/fr/common.json index 0967ef42..4e35087a 100644 --- a/apps/dokploy/public/locales/fr/common.json +++ b/apps/dokploy/public/locales/fr/common.json @@ -1 +1,41 @@ -{} +{ + "settings.common.save": "Sauvegarder", + "settings.server.domain.title": "Nom de domaine du serveur", + "settings.server.domain.description": "Ajouter un nom de domaine au serveur de votre application.", + "settings.server.domain.form.domain": "Domaine", + "settings.server.domain.form.letsEncryptEmail": "Adresse email Let's Encrypt", + "settings.server.domain.form.certificate.label": "Certificat", + "settings.server.domain.form.certificate.placeholder": "Choisir un certificat", + "settings.server.domain.form.certificateOptions.none": "Aucun", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Par défaut)", + "settings.server.webServer.title": "Serveur web", + "settings.server.webServer.description": "Recharger ou nettoyer le serveur web.", + "settings.server.webServer.actions": "Actions", + "settings.server.webServer.reload": "Recharger", + "settings.server.webServer.watchLogs": "Consulter les logs", + "settings.server.webServer.updateServerIp": "Mettre à jour l'IP du serveur", + "settings.server.webServer.server.label": "Serveur", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Modifier les variables d'environnement", + "settings.server.webServer.storage.label": "Stockage", + "settings.server.webServer.storage.cleanUnusedImages": "Supprimer les images inutilisées", + "settings.server.webServer.storage.cleanUnusedVolumes": "Supprimer les volumes inutilisés", + "settings.server.webServer.storage.cleanStoppedContainers": "Supprimer les conteneurs arrêtés", + "settings.server.webServer.storage.cleanDockerBuilder": "Nettoyer le Docker Builder & System", + "settings.server.webServer.storage.cleanMonitoring": "Nettoyer le monitoring", + "settings.server.webServer.storage.cleanAll": "Tout nettoyer", + "settings.profile.title": "Compte", + "settings.profile.description": "Modifier les informations de votre compte ici.", + "settings.profile.email": "Adresse Email", + "settings.profile.password": "Mot de passe", + "settings.profile.avatar": "Photo de profil", + "settings.appearance.title": "Apparence", + "settings.appearance.description": "Customiser le thème de votre dashboard.", + "settings.appearance.theme": "Thème", + "settings.appearance.themeDescription": "Choisir un thème pour votre dashboard", + "settings.appearance.themes.light": "Clair", + "settings.appearance.themes.dark": "Sombre", + "settings.appearance.themes.system": "Système", + "settings.appearance.language": "Langue", + "settings.appearance.languageDescription": "Sélectionner une langue pour votre dashboard" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/fr/settings.json b/apps/dokploy/public/locales/fr/settings.json deleted file mode 100644 index 8901cf1f..00000000 --- a/apps/dokploy/public/locales/fr/settings.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "settings.common.save": "Sauvegarder", - "settings.server.domain.title": "Nom de domaine du serveur", - "settings.server.domain.description": "Ajouter un nom de domaine au serveur de votre application.", - "settings.server.domain.form.domain": "Domaine", - "settings.server.domain.form.letsEncryptEmail": "Adresse email Let's Encrypt", - "settings.server.domain.form.certificate.label": "Certificat", - "settings.server.domain.form.certificate.placeholder": "Choisir un certificat", - "settings.server.domain.form.certificateOptions.none": "Aucun", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Par défaut)", - - "settings.server.webServer.title": "Serveur web", - "settings.server.webServer.description": "Recharger ou nettoyer le serveur web.", - "settings.server.webServer.actions": "Actions", - "settings.server.webServer.reload": "Recharger", - "settings.server.webServer.watchLogs": "Consulter les logs", - "settings.server.webServer.updateServerIp": "Mettre à jour l'IP du serveur", - "settings.server.webServer.server.label": "Serveur", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Modifier les variables d'environnement", - "settings.server.webServer.storage.label": "Stockage", - "settings.server.webServer.storage.cleanUnusedImages": "Supprimer les images inutilisées", - "settings.server.webServer.storage.cleanUnusedVolumes": "Supprimer les volumes inutilisés", - "settings.server.webServer.storage.cleanStoppedContainers": "Supprimer les conteneurs arrêtés", - "settings.server.webServer.storage.cleanDockerBuilder": "Nettoyer le Docker Builder & System", - "settings.server.webServer.storage.cleanMonitoring": "Nettoyer le monitoring", - "settings.server.webServer.storage.cleanAll": "Tout nettoyer", - - "settings.profile.title": "Compte", - "settings.profile.description": "Modifier les informations de votre compte ici.", - "settings.profile.email": "Adresse Email", - "settings.profile.password": "Mot de passe", - "settings.profile.avatar": "Photo de profil", - - "settings.appearance.title": "Apparence", - "settings.appearance.description": "Customiser le thème de votre dashboard.", - "settings.appearance.theme": "Thème", - "settings.appearance.themeDescription": "Choisir un thème pour votre dashboard", - "settings.appearance.themes.light": "Clair", - "settings.appearance.themes.dark": "Sombre", - "settings.appearance.themes.system": "Système", - "settings.appearance.language": "Langue", - "settings.appearance.languageDescription": "Sélectionner une langue pour votre dashboard" -} diff --git a/apps/dokploy/public/locales/id/common.json b/apps/dokploy/public/locales/id/common.json index 0967ef42..2ebfb1d8 100644 --- a/apps/dokploy/public/locales/id/common.json +++ b/apps/dokploy/public/locales/id/common.json @@ -1 +1,54 @@ -{} +{ + "settings.common.save": "Simpan", + "settings.common.enterTerminal": "Buka Terminal", + "settings.server.domain.title": "Domain Server", + "settings.server.domain.description": "Tambahkan domain ke aplikasi server anda.", + "settings.server.domain.form.domain": "Domain", + "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt", + "settings.server.domain.form.certificate.label": "Penyedia Sertifikat", + "settings.server.domain.form.certificate.placeholder": "Pilih sertifikat", + "settings.server.domain.form.certificateOptions.none": "Tidak ada", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + "settings.server.webServer.title": "Server Web", + "settings.server.webServer.description": "Muat ulang atau bersihkan server web.", + "settings.server.webServer.actions": "Opsi", + "settings.server.webServer.reload": "Muat ulang", + "settings.server.webServer.watchLogs": "Lihat log", + "settings.server.webServer.updateServerIp": "Perbarui IP Server", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Ubah Environment", + "settings.server.webServer.traefik.managePorts": "Pengaturan Port Tambahan", + "settings.server.webServer.traefik.managePortsDescription": "Tambahkan atau hapus port tambahan untuk Traefik", + "settings.server.webServer.traefik.targetPort": "Port Tujuan", + "settings.server.webServer.traefik.publishedPort": "Port saai ini", + "settings.server.webServer.traefik.addPort": "Tambah Port", + "settings.server.webServer.traefik.portsUpdated": "Port berhasil diperbarui", + "settings.server.webServer.traefik.portsUpdateError": "Gagal memperbarui Port", + "settings.server.webServer.traefik.publishMode": "Pilihan mode Port", + "settings.server.webServer.storage.label": "Penyimpanan", + "settings.server.webServer.storage.cleanUnusedImages": "Hapus Image tidak terpakai", + "settings.server.webServer.storage.cleanUnusedVolumes": "Hapus Volume tidak terpakai", + "settings.server.webServer.storage.cleanStoppedContainers": "Hapus Container tidak aktif", + "settings.server.webServer.storage.cleanDockerBuilder": "Bersihkan Docker Builder & System", + "settings.server.webServer.storage.cleanMonitoring": "Bersihkan Monitoring", + "settings.server.webServer.storage.cleanAll": "Bersihkan", + "settings.profile.title": "Akun", + "settings.profile.description": "Ubah detail profil Anda di sini.", + "settings.profile.email": "Email", + "settings.profile.password": "Kata Sandi", + "settings.profile.avatar": "Avatar", + "settings.appearance.title": "Tampilan", + "settings.appearance.description": "Sesuaikan tema dasbor Anda.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Pilih tema untuk dasbor Anda", + "settings.appearance.themes.light": "Terang", + "settings.appearance.themes.dark": "Gelap", + "settings.appearance.themes.system": "Sistem", + "settings.appearance.language": "Bahasa", + "settings.appearance.languageDescription": "Pilih bahasa untuk dasbor Anda", + "settings.terminal.connectionSettings": "Pengaturan koneksi", + "settings.terminal.ipAddress": "Alamat IP", + "settings.terminal.port": "Port", + "settings.terminal.username": "Username" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/id/settings.json b/apps/dokploy/public/locales/id/settings.json deleted file mode 100644 index 489ddc01..00000000 --- a/apps/dokploy/public/locales/id/settings.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "settings.common.save": "Simpan", - "settings.common.enterTerminal": "Buka Terminal", - "settings.server.domain.title": "Domain Server", - "settings.server.domain.description": "Tambahkan domain ke aplikasi server anda.", - "settings.server.domain.form.domain": "Domain", - "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt", - "settings.server.domain.form.certificate.label": "Penyedia Sertifikat", - "settings.server.domain.form.certificate.placeholder": "Pilih sertifikat", - "settings.server.domain.form.certificateOptions.none": "Tidak ada", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - - "settings.server.webServer.title": "Server Web", - "settings.server.webServer.description": "Muat ulang atau bersihkan server web.", - "settings.server.webServer.actions": "Opsi", - "settings.server.webServer.reload": "Muat ulang", - "settings.server.webServer.watchLogs": "Lihat log", - "settings.server.webServer.updateServerIp": "Perbarui IP Server", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Ubah Environment", - "settings.server.webServer.traefik.managePorts": "Pengaturan Port Tambahan", - "settings.server.webServer.traefik.managePortsDescription": "Tambahkan atau hapus port tambahan untuk Traefik", - "settings.server.webServer.traefik.targetPort": "Port Tujuan", - "settings.server.webServer.traefik.publishedPort": "Port saai ini", - "settings.server.webServer.traefik.addPort": "Tambah Port", - "settings.server.webServer.traefik.portsUpdated": "Port berhasil diperbarui", - "settings.server.webServer.traefik.portsUpdateError": "Gagal memperbarui Port", - "settings.server.webServer.traefik.publishMode": "Pilihan mode Port", - "settings.server.webServer.storage.label": "Penyimpanan", - "settings.server.webServer.storage.cleanUnusedImages": "Hapus Image tidak terpakai", - "settings.server.webServer.storage.cleanUnusedVolumes": "Hapus Volume tidak terpakai", - "settings.server.webServer.storage.cleanStoppedContainers": "Hapus Container tidak aktif", - "settings.server.webServer.storage.cleanDockerBuilder": "Bersihkan Docker Builder & System", - "settings.server.webServer.storage.cleanMonitoring": "Bersihkan Monitoring", - "settings.server.webServer.storage.cleanAll": "Bersihkan", - - "settings.profile.title": "Akun", - "settings.profile.description": "Ubah detail profil Anda di sini.", - "settings.profile.email": "Email", - "settings.profile.password": "Kata Sandi", - "settings.profile.avatar": "Avatar", - - "settings.appearance.title": "Tampilan", - "settings.appearance.description": "Sesuaikan tema dasbor Anda.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Pilih tema untuk dasbor Anda", - "settings.appearance.themes.light": "Terang", - "settings.appearance.themes.dark": "Gelap", - "settings.appearance.themes.system": "Sistem", - "settings.appearance.language": "Bahasa", - "settings.appearance.languageDescription": "Pilih bahasa untuk dasbor Anda", - - "settings.terminal.connectionSettings": "Pengaturan koneksi", - "settings.terminal.ipAddress": "Alamat IP", - "settings.terminal.port": "Port", - "settings.terminal.username": "Username" -} diff --git a/apps/dokploy/public/locales/it/common.json b/apps/dokploy/public/locales/it/common.json index 0967ef42..28e71cd3 100644 --- a/apps/dokploy/public/locales/it/common.json +++ b/apps/dokploy/public/locales/it/common.json @@ -1 +1,41 @@ -{} +{ + "settings.common.save": "Salva", + "settings.server.domain.title": "Dominio del server", + "settings.server.domain.description": "Aggiungi un dominio alla tua applicazione server.", + "settings.server.domain.form.domain": "Dominio", + "settings.server.domain.form.letsEncryptEmail": "Email di Let's Encrypt", + "settings.server.domain.form.certificate.label": "Certificato", + "settings.server.domain.form.certificate.placeholder": "Seleziona un certificato", + "settings.server.domain.form.certificateOptions.none": "Nessuno", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Predefinito)", + "settings.server.webServer.title": "Server Web", + "settings.server.webServer.description": "Ricarica o pulisci il server web.", + "settings.server.webServer.actions": "Azioni", + "settings.server.webServer.reload": "Ricarica", + "settings.server.webServer.watchLogs": "Guarda i log", + "settings.server.webServer.updateServerIp": "Aggiorna IP del server", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Modifica Env", + "settings.server.webServer.storage.label": "Spazio", + "settings.server.webServer.storage.cleanUnusedImages": "Pulisci immagini inutilizzate", + "settings.server.webServer.storage.cleanUnusedVolumes": "Pulisci volumi inutilizzati", + "settings.server.webServer.storage.cleanStoppedContainers": "Pulisci container fermati", + "settings.server.webServer.storage.cleanDockerBuilder": "Pulisci Docker Builder e sistema", + "settings.server.webServer.storage.cleanMonitoring": "Pulisci monitoraggio", + "settings.server.webServer.storage.cleanAll": "Pulisci tutto", + "settings.profile.title": "Account", + "settings.profile.description": "Modifica i dettagli del tuo profilo qui.", + "settings.profile.email": "Email", + "settings.profile.password": "Password", + "settings.profile.avatar": "Avatar", + "settings.appearance.title": "Aspetto", + "settings.appearance.description": "Personalizza il tema della tua dashboard.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Seleziona un tema per la tua dashboard", + "settings.appearance.themes.light": "Chiaro", + "settings.appearance.themes.dark": "Scuro", + "settings.appearance.themes.system": "Sistema", + "settings.appearance.language": "Lingua", + "settings.appearance.languageDescription": "Seleziona una lingua per la tua dashboard" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/it/settings.json b/apps/dokploy/public/locales/it/settings.json deleted file mode 100644 index 6280e44e..00000000 --- a/apps/dokploy/public/locales/it/settings.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "settings.common.save": "Salva", - "settings.server.domain.title": "Dominio del server", - "settings.server.domain.description": "Aggiungi un dominio alla tua applicazione server.", - "settings.server.domain.form.domain": "Dominio", - "settings.server.domain.form.letsEncryptEmail": "Email di Let's Encrypt", - "settings.server.domain.form.certificate.label": "Certificato", - "settings.server.domain.form.certificate.placeholder": "Seleziona un certificato", - "settings.server.domain.form.certificateOptions.none": "Nessuno", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Predefinito)", - - "settings.server.webServer.title": "Server Web", - "settings.server.webServer.description": "Ricarica o pulisci il server web.", - "settings.server.webServer.actions": "Azioni", - "settings.server.webServer.reload": "Ricarica", - "settings.server.webServer.watchLogs": "Guarda i log", - "settings.server.webServer.updateServerIp": "Aggiorna IP del server", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Modifica Env", - "settings.server.webServer.storage.label": "Spazio", - "settings.server.webServer.storage.cleanUnusedImages": "Pulisci immagini inutilizzate", - "settings.server.webServer.storage.cleanUnusedVolumes": "Pulisci volumi inutilizzati", - "settings.server.webServer.storage.cleanStoppedContainers": "Pulisci container fermati", - "settings.server.webServer.storage.cleanDockerBuilder": "Pulisci Docker Builder e sistema", - "settings.server.webServer.storage.cleanMonitoring": "Pulisci monitoraggio", - "settings.server.webServer.storage.cleanAll": "Pulisci tutto", - - "settings.profile.title": "Account", - "settings.profile.description": "Modifica i dettagli del tuo profilo qui.", - "settings.profile.email": "Email", - "settings.profile.password": "Password", - "settings.profile.avatar": "Avatar", - - "settings.appearance.title": "Aspetto", - "settings.appearance.description": "Personalizza il tema della tua dashboard.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Seleziona un tema per la tua dashboard", - "settings.appearance.themes.light": "Chiaro", - "settings.appearance.themes.dark": "Scuro", - "settings.appearance.themes.system": "Sistema", - "settings.appearance.language": "Lingua", - "settings.appearance.languageDescription": "Seleziona una lingua per la tua dashboard" -} diff --git a/apps/dokploy/public/locales/ja/common.json b/apps/dokploy/public/locales/ja/common.json index 0967ef42..9403e247 100644 --- a/apps/dokploy/public/locales/ja/common.json +++ b/apps/dokploy/public/locales/ja/common.json @@ -1 +1,41 @@ -{} +{ + "settings.common.save": "保存", + "settings.server.domain.title": "サーバードメイン", + "settings.server.domain.description": "サーバーアプリケーションにドメインを追加", + "settings.server.domain.form.domain": "ドメイン", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt メールアドレス", + "settings.server.domain.form.certificate.label": "証明書", + "settings.server.domain.form.certificate.placeholder": "証明書を選択", + "settings.server.domain.form.certificateOptions.none": "なし", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (デフォルト)", + "settings.server.webServer.title": "ウェブサーバー", + "settings.server.webServer.description": "ウェブサーバーをリロードまたはクリーンアップします", + "settings.server.webServer.actions": "アクション", + "settings.server.webServer.reload": "リロード", + "settings.server.webServer.watchLogs": "ログを監視", + "settings.server.webServer.updateServerIp": "サーバーIPを更新", + "settings.server.webServer.server.label": "サーバー", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "環境設定を変更", + "settings.server.webServer.storage.label": "ストレージ", + "settings.server.webServer.storage.cleanUnusedImages": "未使用のイメージを削除", + "settings.server.webServer.storage.cleanUnusedVolumes": "未使用のボリュームを削除", + "settings.server.webServer.storage.cleanStoppedContainers": "停止中のコンテナを削除", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker ビルダー&システムをクリーンアップ", + "settings.server.webServer.storage.cleanMonitoring": "モニタリングをクリーンアップ", + "settings.server.webServer.storage.cleanAll": "すべてをクリーンアップ", + "settings.profile.title": "アカウント", + "settings.profile.description": "ここでプロフィールの詳細を変更できます", + "settings.profile.email": "メールアドレス", + "settings.profile.password": "パスワード", + "settings.profile.avatar": "アバター", + "settings.appearance.title": "外観", + "settings.appearance.description": "ダッシュボードのテーマをカスタマイズ", + "settings.appearance.theme": "テーマ", + "settings.appearance.themeDescription": "ダッシュボードのテーマを選択してください", + "settings.appearance.themes.light": "ライト", + "settings.appearance.themes.dark": "ダーク", + "settings.appearance.themes.system": "システム", + "settings.appearance.language": "言語", + "settings.appearance.languageDescription": "ダッシュボードの言語を選択してください" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/ja/settings.json b/apps/dokploy/public/locales/ja/settings.json deleted file mode 100644 index 757586b7..00000000 --- a/apps/dokploy/public/locales/ja/settings.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "settings.common.save": "保存", - "settings.server.domain.title": "サーバードメイン", - "settings.server.domain.description": "サーバーアプリケーションにドメインを追加", - "settings.server.domain.form.domain": "ドメイン", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt メールアドレス", - "settings.server.domain.form.certificate.label": "証明書", - "settings.server.domain.form.certificate.placeholder": "証明書を選択", - "settings.server.domain.form.certificateOptions.none": "なし", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (デフォルト)", - - "settings.server.webServer.title": "ウェブサーバー", - "settings.server.webServer.description": "ウェブサーバーをリロードまたはクリーンアップします", - "settings.server.webServer.actions": "アクション", - "settings.server.webServer.reload": "リロード", - "settings.server.webServer.watchLogs": "ログを監視", - "settings.server.webServer.updateServerIp": "サーバーIPを更新", - "settings.server.webServer.server.label": "サーバー", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "環境設定を変更", - "settings.server.webServer.storage.label": "ストレージ", - "settings.server.webServer.storage.cleanUnusedImages": "未使用のイメージを削除", - "settings.server.webServer.storage.cleanUnusedVolumes": "未使用のボリュームを削除", - "settings.server.webServer.storage.cleanStoppedContainers": "停止中のコンテナを削除", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker ビルダー&システムをクリーンアップ", - "settings.server.webServer.storage.cleanMonitoring": "モニタリングをクリーンアップ", - "settings.server.webServer.storage.cleanAll": "すべてをクリーンアップ", - - "settings.profile.title": "アカウント", - "settings.profile.description": "ここでプロフィールの詳細を変更できます", - "settings.profile.email": "メールアドレス", - "settings.profile.password": "パスワード", - "settings.profile.avatar": "アバター", - - "settings.appearance.title": "外観", - "settings.appearance.description": "ダッシュボードのテーマをカスタマイズ", - "settings.appearance.theme": "テーマ", - "settings.appearance.themeDescription": "ダッシュボードのテーマを選択してください", - "settings.appearance.themes.light": "ライト", - "settings.appearance.themes.dark": "ダーク", - "settings.appearance.themes.system": "システム", - "settings.appearance.language": "言語", - "settings.appearance.languageDescription": "ダッシュボードの言語を選択してください" -} diff --git a/apps/dokploy/public/locales/ko/common.json b/apps/dokploy/public/locales/ko/common.json index 0967ef42..7ef3ea85 100644 --- a/apps/dokploy/public/locales/ko/common.json +++ b/apps/dokploy/public/locales/ko/common.json @@ -1 +1,41 @@ -{} +{ + "settings.common.save": "저장", + "settings.server.domain.title": "서버 도메인", + "settings.server.domain.description": "서버 애플리케이션에 도메인을 추가합니다.", + "settings.server.domain.form.domain": "도메인", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 이메일", + "settings.server.domain.form.certificate.label": "인증서", + "settings.server.domain.form.certificate.placeholder": "인증서 선택", + "settings.server.domain.form.certificateOptions.none": "없음", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (기본)", + "settings.server.webServer.title": "웹 서버", + "settings.server.webServer.description": "웹 서버를 재시작하거나 정리합니다.", + "settings.server.webServer.actions": "작업", + "settings.server.webServer.reload": "재시작", + "settings.server.webServer.watchLogs": "로그 보기", + "settings.server.webServer.updateServerIp": "서버 IP 갱신", + "settings.server.webServer.server.label": "서버", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "환경 변수 수정", + "settings.server.webServer.storage.label": "저장 공간", + "settings.server.webServer.storage.cleanUnusedImages": "사용하지 않는 이미지 정리", + "settings.server.webServer.storage.cleanUnusedVolumes": "사용하지 않는 볼륨 정리", + "settings.server.webServer.storage.cleanStoppedContainers": "정지된 컨테이너 정리", + "settings.server.webServer.storage.cleanDockerBuilder": "도커 빌더 & 시스템 정리", + "settings.server.webServer.storage.cleanMonitoring": "모니터링 데이터 정리", + "settings.server.webServer.storage.cleanAll": "전체 정리", + "settings.profile.title": "계정", + "settings.profile.description": "여기에서 프로필 세부 정보를 변경하세요.", + "settings.profile.email": "이메일", + "settings.profile.password": "비밀번호", + "settings.profile.avatar": "아바타", + "settings.appearance.title": "외관", + "settings.appearance.description": "대시보드의 테마를 사용자 설정합니다.", + "settings.appearance.theme": "테마", + "settings.appearance.themeDescription": "대시보드 테마 선택", + "settings.appearance.themes.light": "라이트", + "settings.appearance.themes.dark": "다크", + "settings.appearance.themes.system": "시스템", + "settings.appearance.language": "언어", + "settings.appearance.languageDescription": "대시보드에서 사용할 언어 선택" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/ko/settings.json b/apps/dokploy/public/locales/ko/settings.json deleted file mode 100644 index db877ee6..00000000 --- a/apps/dokploy/public/locales/ko/settings.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "settings.common.save": "저장", - "settings.server.domain.title": "서버 도메인", - "settings.server.domain.description": "서버 애플리케이션에 도메인을 추가합니다.", - "settings.server.domain.form.domain": "도메인", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 이메일", - "settings.server.domain.form.certificate.label": "인증서", - "settings.server.domain.form.certificate.placeholder": "인증서 선택", - "settings.server.domain.form.certificateOptions.none": "없음", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (기본)", - - "settings.server.webServer.title": "웹 서버", - "settings.server.webServer.description": "웹 서버를 재시작하거나 정리합니다.", - "settings.server.webServer.actions": "작업", - "settings.server.webServer.reload": "재시작", - "settings.server.webServer.watchLogs": "로그 보기", - "settings.server.webServer.updateServerIp": "서버 IP 갱신", - "settings.server.webServer.server.label": "서버", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "환경 변수 수정", - "settings.server.webServer.storage.label": "저장 공간", - "settings.server.webServer.storage.cleanUnusedImages": "사용하지 않는 이미지 정리", - "settings.server.webServer.storage.cleanUnusedVolumes": "사용하지 않는 볼륨 정리", - "settings.server.webServer.storage.cleanStoppedContainers": "정지된 컨테이너 정리", - "settings.server.webServer.storage.cleanDockerBuilder": "도커 빌더 & 시스템 정리", - "settings.server.webServer.storage.cleanMonitoring": "모니터링 데이터 정리", - "settings.server.webServer.storage.cleanAll": "전체 정리", - - "settings.profile.title": "계정", - "settings.profile.description": "여기에서 프로필 세부 정보를 변경하세요.", - "settings.profile.email": "이메일", - "settings.profile.password": "비밀번호", - "settings.profile.avatar": "아바타", - - "settings.appearance.title": "외관", - "settings.appearance.description": "대시보드의 테마를 사용자 설정합니다.", - "settings.appearance.theme": "테마", - "settings.appearance.themeDescription": "대시보드 테마 선택", - "settings.appearance.themes.light": "라이트", - "settings.appearance.themes.dark": "다크", - "settings.appearance.themes.system": "시스템", - "settings.appearance.language": "언어", - "settings.appearance.languageDescription": "대시보드에서 사용할 언어 선택" -} diff --git a/apps/dokploy/public/locales/kz/common.json b/apps/dokploy/public/locales/kz/common.json index 0967ef42..500564fd 100644 --- a/apps/dokploy/public/locales/kz/common.json +++ b/apps/dokploy/public/locales/kz/common.json @@ -1 +1,41 @@ -{} +{ + "settings.common.save": "Сақтау", + "settings.server.domain.title": "Сервер домені", + "settings.server.domain.description": "Dokploy сервер қолданбасына домен енгізіңіз.", + "settings.server.domain.form.domain": "Домен", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Эл. поштасы", + "settings.server.domain.form.certificate.label": "Сертификат", + "settings.server.domain.form.certificate.placeholder": "Сертификатты таңдаңыз", + "settings.server.domain.form.certificateOptions.none": "Жоқ", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Стандартты)", + "settings.server.webServer.title": "Веб-Сервер", + "settings.server.webServer.description": "Веб-серверді қайта жүктеу немесе тазалау.", + "settings.server.webServer.actions": "Әрекеттер", + "settings.server.webServer.reload": "Қайта жүктеу", + "settings.server.webServer.watchLogs": "Журналдарды қарау", + "settings.server.webServer.updateServerIp": "Сервердің IP жаңарту", + "settings.server.webServer.server.label": "Сервер", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Env Өзгерту", + "settings.server.webServer.storage.label": "Диск кеңістігі", + "settings.server.webServer.storage.cleanUnusedImages": "Пайдаланылмаған образды тазалау", + "settings.server.webServer.storage.cleanUnusedVolumes": "Пайдаланылмаған томды тазалау", + "settings.server.webServer.storage.cleanStoppedContainers": "Тоқтатылған контейнерлерді тазалау", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & Системаны тазалау", + "settings.server.webServer.storage.cleanMonitoring": "Мониторингті тазалау", + "settings.server.webServer.storage.cleanAll": "Барлығын тазалау", + "settings.profile.title": "Аккаунт", + "settings.profile.description": "Профиль мәліметтерін осы жерден өзгертіңіз.", + "settings.profile.email": "Эл. пошта", + "settings.profile.password": "Құпия сөз", + "settings.profile.avatar": "Аватар", + "settings.appearance.title": "Сыртқы түрі", + "settings.appearance.description": "Dokploy сыртқы келбетін өзгерту.", + "settings.appearance.theme": "Келбеті", + "settings.appearance.themeDescription": "Жүйе тақтасының келбетің таңдаңыз", + "settings.appearance.themes.light": "Жарық", + "settings.appearance.themes.dark": "Қараңғы", + "settings.appearance.themes.system": "Жүйелік", + "settings.appearance.language": "Тіл", + "settings.appearance.languageDescription": "Жүйе тақтасының тілің таңдаңыз" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/kz/settings.json b/apps/dokploy/public/locales/kz/settings.json deleted file mode 100644 index bf8f4137..00000000 --- a/apps/dokploy/public/locales/kz/settings.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "settings.common.save": "Сақтау", - "settings.server.domain.title": "Сервер домені", - "settings.server.domain.description": "Dokploy сервер қолданбасына домен енгізіңіз.", - "settings.server.domain.form.domain": "Домен", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Эл. поштасы", - "settings.server.domain.form.certificate.label": "Сертификат", - "settings.server.domain.form.certificate.placeholder": "Сертификатты таңдаңыз", - "settings.server.domain.form.certificateOptions.none": "Жоқ", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Стандартты)", - "settings.server.webServer.title": "Веб-Сервер", - "settings.server.webServer.description": "Веб-серверді қайта жүктеу немесе тазалау.", - "settings.server.webServer.actions": "Әрекеттер", - "settings.server.webServer.reload": "Қайта жүктеу", - "settings.server.webServer.watchLogs": "Журналдарды қарау", - "settings.server.webServer.updateServerIp": "Сервердің IP жаңарту", - "settings.server.webServer.server.label": "Сервер", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Env Өзгерту", - "settings.server.webServer.storage.label": "Диск кеңістігі", - "settings.server.webServer.storage.cleanUnusedImages": "Пайдаланылмаған образды тазалау", - "settings.server.webServer.storage.cleanUnusedVolumes": "Пайдаланылмаған томды тазалау", - "settings.server.webServer.storage.cleanStoppedContainers": "Тоқтатылған контейнерлерді тазалау", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & Системаны тазалау", - "settings.server.webServer.storage.cleanMonitoring": "Мониторингті тазалау", - "settings.server.webServer.storage.cleanAll": "Барлығын тазалау", - "settings.profile.title": "Аккаунт", - "settings.profile.description": "Профиль мәліметтерін осы жерден өзгертіңіз.", - "settings.profile.email": "Эл. пошта", - "settings.profile.password": "Құпия сөз", - "settings.profile.avatar": "Аватар", - "settings.appearance.title": "Сыртқы түрі", - "settings.appearance.description": "Dokploy сыртқы келбетін өзгерту.", - "settings.appearance.theme": "Келбеті", - "settings.appearance.themeDescription": "Жүйе тақтасының келбетің таңдаңыз", - "settings.appearance.themes.light": "Жарық", - "settings.appearance.themes.dark": "Қараңғы", - "settings.appearance.themes.system": "Жүйелік", - "settings.appearance.language": "Тіл", - "settings.appearance.languageDescription": "Жүйе тақтасының тілің таңдаңыз" -} diff --git a/apps/dokploy/public/locales/ml/common.json b/apps/dokploy/public/locales/ml/common.json index 0967ef42..a9651f34 100644 --- a/apps/dokploy/public/locales/ml/common.json +++ b/apps/dokploy/public/locales/ml/common.json @@ -1 +1,54 @@ -{} +{ + "settings.common.save": "സേവ് ചെയ്യുക", + "settings.common.enterTerminal": "ടർമിനലിൽ പ്രവേശിക്കുക", + "settings.server.domain.title": "സർവർ ഡോമെയ്ൻ", + "settings.server.domain.description": "നിങ്ങളുടെ സർവർ അപ്ലിക്കേഷനിൽ ഒരു ഡോമെയ്ൻ ചേർക്കുക.", + "settings.server.domain.form.domain": "ഡോമെയ്ൻ", + "settings.server.domain.form.letsEncryptEmail": "ലെറ്റ്സ് എൻക്രിപ്റ്റ് ഇമെയിൽ", + "settings.server.domain.form.certificate.label": "സർട്ടിഫിക്കറ്റ് പ്രൊവൈഡർ", + "settings.server.domain.form.certificate.placeholder": "ഒരു സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുക", + "settings.server.domain.form.certificateOptions.none": "ഒന്നുമില്ല", + "settings.server.domain.form.certificateOptions.letsencrypt": "ലെറ്റ്സ് എൻക്രിപ്റ്റ്", + "settings.server.webServer.title": "വെബ് സർവർ", + "settings.server.webServer.description": "വെബ് സർവർ റീലോഡ് ചെയ്യുക അല്ലെങ്കിൽ ശുചീകരിക്കുക.", + "settings.server.webServer.actions": "നടപടികൾ", + "settings.server.webServer.reload": "റീലോഡ് ചെയ്യുക", + "settings.server.webServer.watchLogs": "ലോഗുകൾ കാണുക", + "settings.server.webServer.updateServerIp": "സർവർ IP അപ്ഡേറ്റ് ചെയ്യുക", + "settings.server.webServer.server.label": "സർവർ", + "settings.server.webServer.traefik.label": "ട്രാഫിക്", + "settings.server.webServer.traefik.modifyEnv": "ചുറ്റുപാടുകൾ മാറ്റുക", + "settings.server.webServer.traefik.managePorts": "അധിക പോർട്ട് മാപ്പിംഗ്", + "settings.server.webServer.traefik.managePortsDescription": "ട്രാഫിക്കിനായി അധിക പോർട്ടുകൾ ചേർക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക", + "settings.server.webServer.traefik.targetPort": "ടാർഗറ്റ് പോർട്ട്", + "settings.server.webServer.traefik.publishedPort": "പ്രസിദ്ധീകരിച്ച പോർട്ട്", + "settings.server.webServer.traefik.addPort": "പോർട്ട് ചേർക്കുക", + "settings.server.webServer.traefik.portsUpdated": "പോർട്ടുകൾ വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", + "settings.server.webServer.traefik.portsUpdateError": "പോർട്ടുകൾ അപ്ഡേറ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു", + "settings.server.webServer.traefik.publishMode": "പ്രസിദ്ധീകരണ മോഡ്", + "settings.server.webServer.storage.label": "ഇടം", + "settings.server.webServer.storage.cleanUnusedImages": "ഉപയോഗിക്കാത്ത ഇമേജുകൾ ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanUnusedVolumes": "ഉപയോഗിക്കാത്ത വോള്യങ്ങൾ ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanStoppedContainers": "നിർത്തിയ കണ്ടെയ്‌നറുകൾ ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanDockerBuilder": "ഡോക്കർ ബിൽഡറും സിസ്റ്റവും ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanMonitoring": "മോണിറ്ററിംഗ് ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanAll": "എല്ലാം ശുചീകരിക്കുക", + "settings.profile.title": "അക്കൗണ്ട്", + "settings.profile.description": "നിങ്ങളുടെ പ്രൊഫൈൽ വിശദാംശങ്ങൾ ഇവിടെ മാറ്റുക.", + "settings.profile.email": "ഇമെയിൽ", + "settings.profile.password": "പാസ്വേഡ്", + "settings.profile.avatar": "അവതാർ", + "settings.appearance.title": "ദൃശ്യമാനം", + "settings.appearance.description": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന്റെ തീം ഇഷ്ടാനുസൃതമാക്കുക.", + "settings.appearance.theme": "തീം", + "settings.appearance.themeDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു തീം തിരഞ്ഞെടുക്കുക", + "settings.appearance.themes.light": "ലൈറ്റ്", + "settings.appearance.themes.dark": "ഡാർക്ക്", + "settings.appearance.themes.system": "സിസ്റ്റം", + "settings.appearance.language": "ഭാഷ", + "settings.appearance.languageDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക", + "settings.terminal.connectionSettings": "കണക്ഷൻ ക്രമീകരണങ്ങൾ", + "settings.terminal.ipAddress": "IP വിലാസം", + "settings.terminal.port": "പോർട്ട്", + "settings.terminal.username": "ഉപയോക്തൃനാമം" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/ml/settings.json b/apps/dokploy/public/locales/ml/settings.json deleted file mode 100644 index cb62b6ec..00000000 --- a/apps/dokploy/public/locales/ml/settings.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "settings.common.save": "സേവ് ചെയ്യുക", - "settings.common.enterTerminal": "ടർമിനലിൽ പ്രവേശിക്കുക", - "settings.server.domain.title": "സർവർ ഡോമെയ്ൻ", - "settings.server.domain.description": "നിങ്ങളുടെ സർവർ അപ്ലിക്കേഷനിൽ ഒരു ഡോമെയ്ൻ ചേർക്കുക.", - "settings.server.domain.form.domain": "ഡോമെയ്ൻ", - "settings.server.domain.form.letsEncryptEmail": "ലെറ്റ്സ് എൻക്രിപ്റ്റ് ഇമെയിൽ", - "settings.server.domain.form.certificate.label": "സർട്ടിഫിക്കറ്റ് പ്രൊവൈഡർ", - "settings.server.domain.form.certificate.placeholder": "ഒരു സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുക", - "settings.server.domain.form.certificateOptions.none": "ഒന്നുമില്ല", - "settings.server.domain.form.certificateOptions.letsencrypt": "ലെറ്റ്സ് എൻക്രിപ്റ്റ്", - - "settings.server.webServer.title": "വെബ് സർവർ", - "settings.server.webServer.description": "വെബ് സർവർ റീലോഡ് ചെയ്യുക അല്ലെങ്കിൽ ശുചീകരിക്കുക.", - "settings.server.webServer.actions": "നടപടികൾ", - "settings.server.webServer.reload": "റീലോഡ് ചെയ്യുക", - "settings.server.webServer.watchLogs": "ലോഗുകൾ കാണുക", - "settings.server.webServer.updateServerIp": "സർവർ IP അപ്ഡേറ്റ് ചെയ്യുക", - "settings.server.webServer.server.label": "സർവർ", - "settings.server.webServer.traefik.label": "ട്രാഫിക്", - "settings.server.webServer.traefik.modifyEnv": "ചുറ്റുപാടുകൾ മാറ്റുക", - "settings.server.webServer.traefik.managePorts": "അധിക പോർട്ട് മാപ്പിംഗ്", - "settings.server.webServer.traefik.managePortsDescription": "ട്രാഫിക്കിനായി അധിക പോർട്ടുകൾ ചേർക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക", - "settings.server.webServer.traefik.targetPort": "ടാർഗറ്റ് പോർട്ട്", - "settings.server.webServer.traefik.publishedPort": "പ്രസിദ്ധീകരിച്ച പോർട്ട്", - "settings.server.webServer.traefik.addPort": "പോർട്ട് ചേർക്കുക", - "settings.server.webServer.traefik.portsUpdated": "പോർട്ടുകൾ വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", - "settings.server.webServer.traefik.portsUpdateError": "പോർട്ടുകൾ അപ്ഡേറ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു", - "settings.server.webServer.traefik.publishMode": "പ്രസിദ്ധീകരണ മോഡ്", - "settings.server.webServer.storage.label": "ഇടം", - "settings.server.webServer.storage.cleanUnusedImages": "ഉപയോഗിക്കാത്ത ഇമേജുകൾ ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanUnusedVolumes": "ഉപയോഗിക്കാത്ത വോള്യങ്ങൾ ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanStoppedContainers": "നിർത്തിയ കണ്ടെയ്‌നറുകൾ ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanDockerBuilder": "ഡോക്കർ ബിൽഡറും സിസ്റ്റവും ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanMonitoring": "മോണിറ്ററിംഗ് ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanAll": "എല്ലാം ശുചീകരിക്കുക", - - "settings.profile.title": "അക്കൗണ്ട്", - "settings.profile.description": "നിങ്ങളുടെ പ്രൊഫൈൽ വിശദാംശങ്ങൾ ഇവിടെ മാറ്റുക.", - "settings.profile.email": "ഇമെയിൽ", - "settings.profile.password": "പാസ്വേഡ്", - "settings.profile.avatar": "അവതാർ", - - "settings.appearance.title": "ദൃശ്യമാനം", - "settings.appearance.description": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന്റെ തീം ഇഷ്ടാനുസൃതമാക്കുക.", - "settings.appearance.theme": "തീം", - "settings.appearance.themeDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു തീം തിരഞ്ഞെടുക്കുക", - "settings.appearance.themes.light": "ലൈറ്റ്", - "settings.appearance.themes.dark": "ഡാർക്ക്", - "settings.appearance.themes.system": "സിസ്റ്റം", - "settings.appearance.language": "ഭാഷ", - "settings.appearance.languageDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക", - - "settings.terminal.connectionSettings": "കണക്ഷൻ ക്രമീകരണങ്ങൾ", - "settings.terminal.ipAddress": "IP വിലാസം", - "settings.terminal.port": "പോർട്ട്", - "settings.terminal.username": "ഉപയോക്തൃനാമം" -} diff --git a/apps/dokploy/public/locales/no/common.json b/apps/dokploy/public/locales/no/common.json index 0967ef42..c68f4427 100644 --- a/apps/dokploy/public/locales/no/common.json +++ b/apps/dokploy/public/locales/no/common.json @@ -1 +1,49 @@ -{} +{ + "settings.common.save": "Lagre", + "settings.server.domain.title": "Serverdomene", + "settings.server.domain.description": "Legg til et domene i serverapplikasjonen din.", + "settings.server.domain.form.domain": "Domene", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Epost", + "settings.server.domain.form.certificate.label": "Sertifikatleverandør", + "settings.server.domain.form.certificate.placeholder": "Velg et sertifikat", + "settings.server.domain.form.certificateOptions.none": "Ingen", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + "settings.server.webServer.title": "Webserver", + "settings.server.webServer.description": "Last på nytt eller rens webserveren.", + "settings.server.webServer.actions": "Handlinger", + "settings.server.webServer.reload": "Last på nytt", + "settings.server.webServer.watchLogs": "Se logger", + "settings.server.webServer.updateServerIp": "Oppdater server-IP", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Endre miljø", + "settings.server.webServer.traefik.managePorts": "Ytterligere portkartlegginger", + "settings.server.webServer.traefik.managePortsDescription": "Legg til eller fjern flere porter for Traefik", + "settings.server.webServer.traefik.targetPort": "Målport", + "settings.server.webServer.traefik.publishedPort": "Publisert port", + "settings.server.webServer.traefik.addPort": "Legg til port", + "settings.server.webServer.traefik.portsUpdated": "Portene ble oppdatert", + "settings.server.webServer.traefik.portsUpdateError": "Kunne ikke oppdatere portene", + "settings.server.webServer.traefik.publishMode": "Publiseringsmodus", + "settings.server.webServer.storage.label": "Lagring", + "settings.server.webServer.storage.cleanUnusedImages": "Rens ubrukte bilder", + "settings.server.webServer.storage.cleanUnusedVolumes": "Rens ubrukte volumer", + "settings.server.webServer.storage.cleanStoppedContainers": "Rens stoppete containere", + "settings.server.webServer.storage.cleanDockerBuilder": "Rens Docker Builder og System", + "settings.server.webServer.storage.cleanMonitoring": "Rens overvåking", + "settings.server.webServer.storage.cleanAll": "Rens alt", + "settings.profile.title": "Konto", + "settings.profile.description": "Endre detaljene for profilen din her.", + "settings.profile.email": "Epost", + "settings.profile.password": "Passord", + "settings.profile.avatar": "Avatar", + "settings.appearance.title": "Utseende", + "settings.appearance.description": "Tilpass temaet for dashbordet ditt.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Velg et tema for dashbordet ditt", + "settings.appearance.themes.light": "Lys", + "settings.appearance.themes.dark": "Mørk", + "settings.appearance.themes.system": "System", + "settings.appearance.language": "Språk", + "settings.appearance.languageDescription": "Velg et språk for dashbordet ditt" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/no/settings.json b/apps/dokploy/public/locales/no/settings.json deleted file mode 100644 index 03c6bc4a..00000000 --- a/apps/dokploy/public/locales/no/settings.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "settings.common.save": "Lagre", - "settings.server.domain.title": "Serverdomene", - "settings.server.domain.description": "Legg til et domene i serverapplikasjonen din.", - "settings.server.domain.form.domain": "Domene", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Epost", - "settings.server.domain.form.certificate.label": "Sertifikatleverandør", - "settings.server.domain.form.certificate.placeholder": "Velg et sertifikat", - "settings.server.domain.form.certificateOptions.none": "Ingen", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - - "settings.server.webServer.title": "Webserver", - "settings.server.webServer.description": "Last på nytt eller rens webserveren.", - "settings.server.webServer.actions": "Handlinger", - "settings.server.webServer.reload": "Last på nytt", - "settings.server.webServer.watchLogs": "Se logger", - "settings.server.webServer.updateServerIp": "Oppdater server-IP", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Endre miljø", - "settings.server.webServer.traefik.managePorts": "Ytterligere portkartlegginger", - "settings.server.webServer.traefik.managePortsDescription": "Legg til eller fjern flere porter for Traefik", - "settings.server.webServer.traefik.targetPort": "Målport", - "settings.server.webServer.traefik.publishedPort": "Publisert port", - "settings.server.webServer.traefik.addPort": "Legg til port", - "settings.server.webServer.traefik.portsUpdated": "Portene ble oppdatert", - "settings.server.webServer.traefik.portsUpdateError": "Kunne ikke oppdatere portene", - "settings.server.webServer.traefik.publishMode": "Publiseringsmodus", - "settings.server.webServer.storage.label": "Lagring", - "settings.server.webServer.storage.cleanUnusedImages": "Rens ubrukte bilder", - "settings.server.webServer.storage.cleanUnusedVolumes": "Rens ubrukte volumer", - "settings.server.webServer.storage.cleanStoppedContainers": "Rens stoppete containere", - "settings.server.webServer.storage.cleanDockerBuilder": "Rens Docker Builder og System", - "settings.server.webServer.storage.cleanMonitoring": "Rens overvåking", - "settings.server.webServer.storage.cleanAll": "Rens alt", - - "settings.profile.title": "Konto", - "settings.profile.description": "Endre detaljene for profilen din her.", - "settings.profile.email": "Epost", - "settings.profile.password": "Passord", - "settings.profile.avatar": "Avatar", - - "settings.appearance.title": "Utseende", - "settings.appearance.description": "Tilpass temaet for dashbordet ditt.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Velg et tema for dashbordet ditt", - "settings.appearance.themes.light": "Lys", - "settings.appearance.themes.dark": "Mørk", - "settings.appearance.themes.system": "System", - "settings.appearance.language": "Språk", - "settings.appearance.languageDescription": "Velg et språk for dashbordet ditt" -} diff --git a/apps/dokploy/public/locales/pl/common.json b/apps/dokploy/public/locales/pl/common.json index 0967ef42..90f9851d 100644 --- a/apps/dokploy/public/locales/pl/common.json +++ b/apps/dokploy/public/locales/pl/common.json @@ -1 +1,54 @@ -{} +{ + "settings.common.save": "Zapisz", + "settings.common.enterTerminal": "Otwórz terminal", + "settings.server.domain.title": "Domena", + "settings.server.domain.description": "Dodaj domenę do aplikacji", + "settings.server.domain.form.domain": "Domena", + "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt", + "settings.server.domain.form.certificate.label": "Certyfikat", + "settings.server.domain.form.certificate.placeholder": "Wybierz certyfikat", + "settings.server.domain.form.certificateOptions.none": "Brak", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Domyślny)", + "settings.server.webServer.title": "Serwer", + "settings.server.webServer.description": "Przeładuj lub wyczyść serwer", + "settings.server.webServer.actions": "Akcje", + "settings.server.webServer.reload": "Przeładuj", + "settings.server.webServer.watchLogs": "Obserwuj logi", + "settings.server.webServer.updateServerIp": "Zaktualizuj IP serwera", + "settings.server.webServer.server.label": "Serwer", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Zmodyfikuj środowisko", + "settings.server.webServer.traefik.managePorts": "Dodatkowe mapowania portów", + "settings.server.webServer.traefik.managePortsDescription": "Dodaj lub usuń dodatkowe porty dla Traefik", + "settings.server.webServer.traefik.targetPort": "Port docelowy", + "settings.server.webServer.traefik.publishedPort": "Port opublikowany", + "settings.server.webServer.traefik.addPort": "Dodaj port", + "settings.server.webServer.traefik.portsUpdated": "Porty zaktualizowane pomyślnie", + "settings.server.webServer.traefik.portsUpdateError": "Nie udało się zaktualizować portów", + "settings.server.webServer.traefik.publishMode": "Tryb publikacji", + "settings.server.webServer.storage.label": "Przestrzeń", + "settings.server.webServer.storage.cleanUnusedImages": "Wyczyść nieużywane obrazy", + "settings.server.webServer.storage.cleanUnusedVolumes": "Wyczyść nieużywane wolumeny", + "settings.server.webServer.storage.cleanStoppedContainers": "Wyczyść zatrzymane kontenery", + "settings.server.webServer.storage.cleanDockerBuilder": "Wyczyść Docker Builder i System", + "settings.server.webServer.storage.cleanMonitoring": "Wyczyść monitorowanie", + "settings.server.webServer.storage.cleanAll": "Wyczyść wszystko", + "settings.profile.title": "Konto", + "settings.profile.description": "Zmień szczegóły swojego profilu", + "settings.profile.email": "Email", + "settings.profile.password": "Hasło", + "settings.profile.avatar": "Avatar", + "settings.appearance.title": "Wygląd", + "settings.appearance.description": "Dostosuj motyw swojego pulpitu", + "settings.appearance.theme": "Motyw", + "settings.appearance.themeDescription": "Wybierz motyw swojego pulpitu", + "settings.appearance.themes.light": "Jasny", + "settings.appearance.themes.dark": "Ciemny", + "settings.appearance.themes.system": "System", + "settings.appearance.language": "Język", + "settings.appearance.languageDescription": "Wybierz język swojego pulpitu", + "settings.terminal.connectionSettings": "Ustawienia połączenia", + "settings.terminal.ipAddress": "Adres IP", + "settings.terminal.port": "Port", + "settings.terminal.username": "Nazwa użytkownika" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/pl/settings.json b/apps/dokploy/public/locales/pl/settings.json deleted file mode 100644 index 9899fc13..00000000 --- a/apps/dokploy/public/locales/pl/settings.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "settings.common.save": "Zapisz", - "settings.common.enterTerminal": "Otwórz terminal", - "settings.server.domain.title": "Domena", - "settings.server.domain.description": "Dodaj domenę do aplikacji", - "settings.server.domain.form.domain": "Domena", - "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt", - "settings.server.domain.form.certificate.label": "Certyfikat", - "settings.server.domain.form.certificate.placeholder": "Wybierz certyfikat", - "settings.server.domain.form.certificateOptions.none": "Brak", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Domyślny)", - - "settings.server.webServer.title": "Serwer", - "settings.server.webServer.description": "Przeładuj lub wyczyść serwer", - "settings.server.webServer.actions": "Akcje", - "settings.server.webServer.reload": "Przeładuj", - "settings.server.webServer.watchLogs": "Obserwuj logi", - "settings.server.webServer.updateServerIp": "Zaktualizuj IP serwera", - "settings.server.webServer.server.label": "Serwer", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Zmodyfikuj środowisko", - "settings.server.webServer.traefik.managePorts": "Dodatkowe mapowania portów", - "settings.server.webServer.traefik.managePortsDescription": "Dodaj lub usuń dodatkowe porty dla Traefik", - "settings.server.webServer.traefik.targetPort": "Port docelowy", - "settings.server.webServer.traefik.publishedPort": "Port opublikowany", - "settings.server.webServer.traefik.addPort": "Dodaj port", - "settings.server.webServer.traefik.portsUpdated": "Porty zaktualizowane pomyślnie", - "settings.server.webServer.traefik.portsUpdateError": "Nie udało się zaktualizować portów", - "settings.server.webServer.traefik.publishMode": "Tryb publikacji", - "settings.server.webServer.storage.label": "Przestrzeń", - "settings.server.webServer.storage.cleanUnusedImages": "Wyczyść nieużywane obrazy", - "settings.server.webServer.storage.cleanUnusedVolumes": "Wyczyść nieużywane wolumeny", - "settings.server.webServer.storage.cleanStoppedContainers": "Wyczyść zatrzymane kontenery", - "settings.server.webServer.storage.cleanDockerBuilder": "Wyczyść Docker Builder i System", - "settings.server.webServer.storage.cleanMonitoring": "Wyczyść monitorowanie", - "settings.server.webServer.storage.cleanAll": "Wyczyść wszystko", - - "settings.profile.title": "Konto", - "settings.profile.description": "Zmień szczegóły swojego profilu", - "settings.profile.email": "Email", - "settings.profile.password": "Hasło", - "settings.profile.avatar": "Avatar", - - "settings.appearance.title": "Wygląd", - "settings.appearance.description": "Dostosuj motyw swojego pulpitu", - "settings.appearance.theme": "Motyw", - "settings.appearance.themeDescription": "Wybierz motyw swojego pulpitu", - "settings.appearance.themes.light": "Jasny", - "settings.appearance.themes.dark": "Ciemny", - "settings.appearance.themes.system": "System", - "settings.appearance.language": "Język", - "settings.appearance.languageDescription": "Wybierz język swojego pulpitu", - - "settings.terminal.connectionSettings": "Ustawienia połączenia", - "settings.terminal.ipAddress": "Adres IP", - "settings.terminal.port": "Port", - "settings.terminal.username": "Nazwa użytkownika" -} diff --git a/apps/dokploy/public/locales/pt-br/common.json b/apps/dokploy/public/locales/pt-br/common.json index 0967ef42..d3525a89 100644 --- a/apps/dokploy/public/locales/pt-br/common.json +++ b/apps/dokploy/public/locales/pt-br/common.json @@ -1 +1,41 @@ -{} +{ + "settings.common.save": "Salvar", + "settings.server.domain.title": "Domínio do Servidor", + "settings.server.domain.description": "Configure o domínio do servidor", + "settings.server.domain.form.domain": "Domínio", + "settings.server.domain.form.letsEncryptEmail": "Email do Let's Encrypt", + "settings.server.domain.form.certificate.label": "Certificado", + "settings.server.domain.form.certificate.placeholder": "Selecione um Certificado", + "settings.server.domain.form.certificateOptions.none": "Nenhum", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Padrão)", + "settings.server.webServer.title": "Servidor web", + "settings.server.webServer.description": "Limpar e recarregar servidor web.", + "settings.server.webServer.actions": "Ações", + "settings.server.webServer.reload": "Recarregar", + "settings.server.webServer.watchLogs": "Ver logs", + "settings.server.webServer.updateServerIp": "Atualizar IP do Servidor", + "settings.server.webServer.server.label": "Servidor", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Alterar Env", + "settings.server.webServer.storage.label": "Armazenamento", + "settings.server.webServer.storage.cleanUnusedImages": "Limpar imagens não utilizadas", + "settings.server.webServer.storage.cleanUnusedVolumes": "Limpar volumes não utilizados", + "settings.server.webServer.storage.cleanStoppedContainers": "Limpar containers parados", + "settings.server.webServer.storage.cleanDockerBuilder": "Limpar Docker Builder & System", + "settings.server.webServer.storage.cleanMonitoring": "Limpar Monitoramento", + "settings.server.webServer.storage.cleanAll": "Limpar Tudo", + "settings.profile.title": "Conta", + "settings.profile.description": "Altere os detalhes do seu perfil aqui.", + "settings.profile.email": "Email", + "settings.profile.password": "Senha", + "settings.profile.avatar": "Avatar", + "settings.appearance.title": "Aparencia", + "settings.appearance.description": "Personalize o tema do seu dashboard.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Selecione um tema para o dashboard", + "settings.appearance.themes.light": "Claro", + "settings.appearance.themes.dark": "Escuro", + "settings.appearance.themes.system": "Automático", + "settings.appearance.language": "Linguagem", + "settings.appearance.languageDescription": "Selecione o idioma do dashboard" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/pt-br/settings.json b/apps/dokploy/public/locales/pt-br/settings.json deleted file mode 100644 index f4d90a2f..00000000 --- a/apps/dokploy/public/locales/pt-br/settings.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "settings.common.save": "Salvar", - "settings.server.domain.title": "Domínio do Servidor", - "settings.server.domain.description": "Configure o domínio do servidor", - "settings.server.domain.form.domain": "Domínio", - "settings.server.domain.form.letsEncryptEmail": "Email do Let's Encrypt", - "settings.server.domain.form.certificate.label": "Certificado", - "settings.server.domain.form.certificate.placeholder": "Selecione um Certificado", - "settings.server.domain.form.certificateOptions.none": "Nenhum", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Padrão)", - - "settings.server.webServer.title": "Servidor web", - "settings.server.webServer.description": "Limpar e recarregar servidor web.", - "settings.server.webServer.actions": "Ações", - "settings.server.webServer.reload": "Recarregar", - "settings.server.webServer.watchLogs": "Ver logs", - "settings.server.webServer.updateServerIp": "Atualizar IP do Servidor", - "settings.server.webServer.server.label": "Servidor", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Alterar Env", - "settings.server.webServer.storage.label": "Armazenamento", - "settings.server.webServer.storage.cleanUnusedImages": "Limpar imagens não utilizadas", - "settings.server.webServer.storage.cleanUnusedVolumes": "Limpar volumes não utilizados", - "settings.server.webServer.storage.cleanStoppedContainers": "Limpar containers parados", - "settings.server.webServer.storage.cleanDockerBuilder": "Limpar Docker Builder & System", - "settings.server.webServer.storage.cleanMonitoring": "Limpar Monitoramento", - "settings.server.webServer.storage.cleanAll": "Limpar Tudo", - - "settings.profile.title": "Conta", - "settings.profile.description": "Altere os detalhes do seu perfil aqui.", - "settings.profile.email": "Email", - "settings.profile.password": "Senha", - "settings.profile.avatar": "Avatar", - - "settings.appearance.title": "Aparencia", - "settings.appearance.description": "Personalize o tema do seu dashboard.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Selecione um tema para o dashboard", - "settings.appearance.themes.light": "Claro", - "settings.appearance.themes.dark": "Escuro", - "settings.appearance.themes.system": "Automático", - "settings.appearance.language": "Linguagem", - "settings.appearance.languageDescription": "Selecione o idioma do dashboard" -} diff --git a/apps/dokploy/public/locales/ru/common.json b/apps/dokploy/public/locales/ru/common.json index 0967ef42..42816e85 100644 --- a/apps/dokploy/public/locales/ru/common.json +++ b/apps/dokploy/public/locales/ru/common.json @@ -1 +1,54 @@ -{} +{ + "settings.common.save": "Сохранить", + "settings.common.enterTerminal": "Открыть терминал", + "settings.server.domain.title": "Домен сервера", + "settings.server.domain.description": "Установите домен для вашего серверного приложения Dokploy.", + "settings.server.domain.form.domain": "Домен", + "settings.server.domain.form.letsEncryptEmail": "Email для Let's Encrypt", + "settings.server.domain.form.certificate.label": "Сертификат", + "settings.server.domain.form.certificate.placeholder": "Выберите сертификат", + "settings.server.domain.form.certificateOptions.none": "Нет", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + "settings.server.webServer.title": "Веб-сервер", + "settings.server.webServer.description": "Перезагрузка или очистка веб-сервера.", + "settings.server.webServer.actions": "Действия", + "settings.server.webServer.reload": "Перезагрузить", + "settings.server.webServer.watchLogs": "Просмотр логов", + "settings.server.webServer.updateServerIp": "Изменить IP адрес", + "settings.server.webServer.server.label": "Сервер", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Изменить переменные окружения", + "settings.server.webServer.traefik.managePorts": "Назначение портов", + "settings.server.webServer.traefik.managePortsDescription": "Добавить или удалить дополнительные порты для Traefik", + "settings.server.webServer.traefik.targetPort": "Внутренний порт", + "settings.server.webServer.traefik.publishedPort": "Внешний порт", + "settings.server.webServer.traefik.addPort": "Добавить порт", + "settings.server.webServer.traefik.portsUpdated": "Порты успешно обновлены", + "settings.server.webServer.traefik.portsUpdateError": "Не удалось обновить порты", + "settings.server.webServer.traefik.publishMode": "Режим сопоставления", + "settings.server.webServer.storage.label": "Дисковое пространство", + "settings.server.webServer.storage.cleanUnusedImages": "Очистить неиспользуемые образы", + "settings.server.webServer.storage.cleanUnusedVolumes": "Очистить неиспользуемые тома", + "settings.server.webServer.storage.cleanStoppedContainers": "Очистить остановленные контейнеры", + "settings.server.webServer.storage.cleanDockerBuilder": "Очистить Docker Builder и систему", + "settings.server.webServer.storage.cleanMonitoring": "Очистить мониторинг", + "settings.server.webServer.storage.cleanAll": "Очистить все", + "settings.profile.title": "Аккаунт", + "settings.profile.description": "Измените данные вашего профиля.", + "settings.profile.email": "Email", + "settings.profile.password": "Пароль", + "settings.profile.avatar": "Аватар", + "settings.appearance.title": "Внешний вид", + "settings.appearance.description": "Настройте тему Dokploy.", + "settings.appearance.theme": "Тема", + "settings.appearance.themeDescription": "Выберите тему системной панели", + "settings.appearance.themes.light": "Светлая", + "settings.appearance.themes.dark": "Темная", + "settings.appearance.themes.system": "Системная", + "settings.appearance.language": "Язык", + "settings.appearance.languageDescription": "Выберите язык для панели управления", + "settings.terminal.connectionSettings": "Настройки подключения", + "settings.terminal.ipAddress": "IP адрес", + "settings.terminal.port": "Порт", + "settings.terminal.username": "Имя пользователя" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/ru/settings.json b/apps/dokploy/public/locales/ru/settings.json deleted file mode 100644 index 0d87ed15..00000000 --- a/apps/dokploy/public/locales/ru/settings.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "settings.common.save": "Сохранить", - "settings.common.enterTerminal": "Открыть терминал", - "settings.server.domain.title": "Домен сервера", - "settings.server.domain.description": "Установите домен для вашего серверного приложения Dokploy.", - "settings.server.domain.form.domain": "Домен", - "settings.server.domain.form.letsEncryptEmail": "Email для Let's Encrypt", - "settings.server.domain.form.certificate.label": "Сертификат", - "settings.server.domain.form.certificate.placeholder": "Выберите сертификат", - "settings.server.domain.form.certificateOptions.none": "Нет", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - - "settings.server.webServer.title": "Веб-сервер", - "settings.server.webServer.description": "Перезагрузка или очистка веб-сервера.", - "settings.server.webServer.actions": "Действия", - "settings.server.webServer.reload": "Перезагрузить", - "settings.server.webServer.watchLogs": "Просмотр логов", - "settings.server.webServer.updateServerIp": "Изменить IP адрес", - "settings.server.webServer.server.label": "Сервер", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Изменить переменные окружения", - "settings.server.webServer.traefik.managePorts": "Назначение портов", - "settings.server.webServer.traefik.managePortsDescription": "Добавить или удалить дополнительные порты для Traefik", - "settings.server.webServer.traefik.targetPort": "Внутренний порт", - "settings.server.webServer.traefik.publishedPort": "Внешний порт", - "settings.server.webServer.traefik.addPort": "Добавить порт", - "settings.server.webServer.traefik.portsUpdated": "Порты успешно обновлены", - "settings.server.webServer.traefik.portsUpdateError": "Не удалось обновить порты", - "settings.server.webServer.traefik.publishMode": "Режим сопоставления", - "settings.server.webServer.storage.label": "Дисковое пространство", - "settings.server.webServer.storage.cleanUnusedImages": "Очистить неиспользуемые образы", - "settings.server.webServer.storage.cleanUnusedVolumes": "Очистить неиспользуемые тома", - "settings.server.webServer.storage.cleanStoppedContainers": "Очистить остановленные контейнеры", - "settings.server.webServer.storage.cleanDockerBuilder": "Очистить Docker Builder и систему", - "settings.server.webServer.storage.cleanMonitoring": "Очистить мониторинг", - "settings.server.webServer.storage.cleanAll": "Очистить все", - - "settings.profile.title": "Аккаунт", - "settings.profile.description": "Измените данные вашего профиля.", - "settings.profile.email": "Email", - "settings.profile.password": "Пароль", - "settings.profile.avatar": "Аватар", - - "settings.appearance.title": "Внешний вид", - "settings.appearance.description": "Настройте тему Dokploy.", - "settings.appearance.theme": "Тема", - "settings.appearance.themeDescription": "Выберите тему системной панели", - "settings.appearance.themes.light": "Светлая", - "settings.appearance.themes.dark": "Темная", - "settings.appearance.themes.system": "Системная", - "settings.appearance.language": "Язык", - "settings.appearance.languageDescription": "Выберите язык для панели управления", - - "settings.terminal.connectionSettings": "Настройки подключения", - "settings.terminal.ipAddress": "IP адрес", - "settings.terminal.port": "Порт", - "settings.terminal.username": "Имя пользователя" -} diff --git a/apps/dokploy/public/locales/tr/common.json b/apps/dokploy/public/locales/tr/common.json index 0967ef42..c460260d 100644 --- a/apps/dokploy/public/locales/tr/common.json +++ b/apps/dokploy/public/locales/tr/common.json @@ -1 +1,41 @@ -{} +{ + "settings.common.save": "Kaydet", + "settings.server.domain.title": "Sunucu Alanı", + "settings.server.domain.description": "Sunucu uygulamanıza bir alan adı ekleyin.", + "settings.server.domain.form.domain": "Alan Adı", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-postası", + "settings.server.domain.form.certificate.label": "Sertifika", + "settings.server.domain.form.certificate.placeholder": "Bir sertifika seçin", + "settings.server.domain.form.certificateOptions.none": "Hiçbiri", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Varsayılan)", + "settings.server.webServer.title": "Web Sunucusu", + "settings.server.webServer.description": "Web sunucusunu yeniden yükleyin veya temizleyin.", + "settings.server.webServer.actions": "İşlemler", + "settings.server.webServer.reload": "Yeniden Yükle", + "settings.server.webServer.watchLogs": "Günlükleri İzle", + "settings.server.webServer.updateServerIp": "Sunucu IP'sini Güncelle", + "settings.server.webServer.server.label": "Sunucu", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Env Değiştir", + "settings.server.webServer.storage.label": "Alan", + "settings.server.webServer.storage.cleanUnusedImages": "Kullanılmayan görüntüleri temizle", + "settings.server.webServer.storage.cleanUnusedVolumes": "Kullanılmayan birimleri temizle", + "settings.server.webServer.storage.cleanStoppedContainers": "Durmuş konteynerleri temizle", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder ve Sistemi Temizle", + "settings.server.webServer.storage.cleanMonitoring": "İzlemeyi Temizle", + "settings.server.webServer.storage.cleanAll": "Hepsini temizle", + "settings.profile.title": "Hesap", + "settings.profile.description": "Profil detaylarınızı buradan değiştirebilirsiniz.", + "settings.profile.email": "E-posta", + "settings.profile.password": "Şifre", + "settings.profile.avatar": "Profil Resmi", + "settings.appearance.title": "Görünüm", + "settings.appearance.description": "Kontrol panelinin temasını özelleştirin.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Kontrol paneli için bir tema seçin", + "settings.appearance.themes.light": "Açık", + "settings.appearance.themes.dark": "Koyu", + "settings.appearance.themes.system": "Sistem", + "settings.appearance.language": "Dil", + "settings.appearance.languageDescription": "Kontrol paneli için bir dil seçin" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/tr/settings.json b/apps/dokploy/public/locales/tr/settings.json deleted file mode 100644 index 47a6629f..00000000 --- a/apps/dokploy/public/locales/tr/settings.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "settings.common.save": "Kaydet", - "settings.server.domain.title": "Sunucu Alanı", - "settings.server.domain.description": "Sunucu uygulamanıza bir alan adı ekleyin.", - "settings.server.domain.form.domain": "Alan Adı", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-postası", - "settings.server.domain.form.certificate.label": "Sertifika", - "settings.server.domain.form.certificate.placeholder": "Bir sertifika seçin", - "settings.server.domain.form.certificateOptions.none": "Hiçbiri", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Varsayılan)", - - "settings.server.webServer.title": "Web Sunucusu", - "settings.server.webServer.description": "Web sunucusunu yeniden yükleyin veya temizleyin.", - "settings.server.webServer.actions": "İşlemler", - "settings.server.webServer.reload": "Yeniden Yükle", - "settings.server.webServer.watchLogs": "Günlükleri İzle", - "settings.server.webServer.updateServerIp": "Sunucu IP'sini Güncelle", - "settings.server.webServer.server.label": "Sunucu", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Env Değiştir", - "settings.server.webServer.storage.label": "Alan", - "settings.server.webServer.storage.cleanUnusedImages": "Kullanılmayan görüntüleri temizle", - "settings.server.webServer.storage.cleanUnusedVolumes": "Kullanılmayan birimleri temizle", - "settings.server.webServer.storage.cleanStoppedContainers": "Durmuş konteynerleri temizle", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder ve Sistemi Temizle", - "settings.server.webServer.storage.cleanMonitoring": "İzlemeyi Temizle", - "settings.server.webServer.storage.cleanAll": "Hepsini temizle", - - "settings.profile.title": "Hesap", - "settings.profile.description": "Profil detaylarınızı buradan değiştirebilirsiniz.", - "settings.profile.email": "E-posta", - "settings.profile.password": "Şifre", - "settings.profile.avatar": "Profil Resmi", - - "settings.appearance.title": "Görünüm", - "settings.appearance.description": "Kontrol panelinin temasını özelleştirin.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Kontrol paneli için bir tema seçin", - "settings.appearance.themes.light": "Açık", - "settings.appearance.themes.dark": "Koyu", - "settings.appearance.themes.system": "Sistem", - "settings.appearance.language": "Dil", - "settings.appearance.languageDescription": "Kontrol paneli için bir dil seçin" -} diff --git a/apps/dokploy/public/locales/uk/common.json b/apps/dokploy/public/locales/uk/common.json index 0967ef42..33a28f32 100644 --- a/apps/dokploy/public/locales/uk/common.json +++ b/apps/dokploy/public/locales/uk/common.json @@ -1 +1,54 @@ -{} +{ + "settings.common.save": "Зберегти", + "settings.common.enterTerminal": "Увійти в термінал", + "settings.server.domain.title": "Домен сервера", + "settings.server.domain.description": "Додайте домен до вашого серверного застосунку.", + "settings.server.domain.form.domain": "Домен", + "settings.server.domain.form.letsEncryptEmail": "Електронна пошта для Let's Encrypt", + "settings.server.domain.form.certificate.label": "Постачальник сертифікатів", + "settings.server.domain.form.certificate.placeholder": "Оберіть сертифікат", + "settings.server.domain.form.certificateOptions.none": "Відсутній", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + "settings.server.webServer.title": "Веб-сервер", + "settings.server.webServer.description": "Перезавантажте або очистьте веб-сервер.", + "settings.server.webServer.actions": "Дії", + "settings.server.webServer.reload": "Перезавантажити", + "settings.server.webServer.watchLogs": "Перегляд логів", + "settings.server.webServer.updateServerIp": "Оновити IP-адресу сервера", + "settings.server.webServer.server.label": "Сервер", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Змінити середовище", + "settings.server.webServer.traefik.managePorts": "Додаткові порти", + "settings.server.webServer.traefik.managePortsDescription": "Додайте або видаліть порти для Traefik", + "settings.server.webServer.traefik.targetPort": "Цільовий порт", + "settings.server.webServer.traefik.publishedPort": "Опублікований порт", + "settings.server.webServer.traefik.addPort": "Додати порт", + "settings.server.webServer.traefik.portsUpdated": "Порти успішно оновлено", + "settings.server.webServer.traefik.portsUpdateError": "Не вдалося оновити порти", + "settings.server.webServer.traefik.publishMode": "Режим публікації", + "settings.server.webServer.storage.label": "Дисковий простір", + "settings.server.webServer.storage.cleanUnusedImages": "Очистити невикористані образи", + "settings.server.webServer.storage.cleanUnusedVolumes": "Очистити невикористані томи", + "settings.server.webServer.storage.cleanStoppedContainers": "Очистити зупинені контейнери", + "settings.server.webServer.storage.cleanDockerBuilder": "Очистити Docker Builder і систему", + "settings.server.webServer.storage.cleanMonitoring": "Очистити моніторинг", + "settings.server.webServer.storage.cleanAll": "Очистити все", + "settings.profile.title": "Обліковий запис", + "settings.profile.description": "Змініть дані вашого профілю.", + "settings.profile.email": "Електронна пошта", + "settings.profile.password": "Пароль", + "settings.profile.avatar": "Аватар", + "settings.appearance.title": "Зовнішній вигляд", + "settings.appearance.description": "Налаштуйте тему вашої панелі керування.", + "settings.appearance.theme": "Тема", + "settings.appearance.themeDescription": "Оберіть тему для вашої панелі керування", + "settings.appearance.themes.light": "Світла", + "settings.appearance.themes.dark": "Темна", + "settings.appearance.themes.system": "Системна", + "settings.appearance.language": "Мова", + "settings.appearance.languageDescription": "Оберіть мову для вашої панелі керування", + "settings.terminal.connectionSettings": "Налаштування з'єднання", + "settings.terminal.ipAddress": "IP-адреса", + "settings.terminal.port": "Порт", + "settings.terminal.username": "Ім'я користувача" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/uk/settings.json b/apps/dokploy/public/locales/uk/settings.json deleted file mode 100644 index 766a1bff..00000000 --- a/apps/dokploy/public/locales/uk/settings.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "settings.common.save": "Зберегти", - "settings.common.enterTerminal": "Увійти в термінал", - "settings.server.domain.title": "Домен сервера", - "settings.server.domain.description": "Додайте домен до вашого серверного застосунку.", - "settings.server.domain.form.domain": "Домен", - "settings.server.domain.form.letsEncryptEmail": "Електронна пошта для Let's Encrypt", - "settings.server.domain.form.certificate.label": "Постачальник сертифікатів", - "settings.server.domain.form.certificate.placeholder": "Оберіть сертифікат", - "settings.server.domain.form.certificateOptions.none": "Відсутній", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - - "settings.server.webServer.title": "Веб-сервер", - "settings.server.webServer.description": "Перезавантажте або очистьте веб-сервер.", - "settings.server.webServer.actions": "Дії", - "settings.server.webServer.reload": "Перезавантажити", - "settings.server.webServer.watchLogs": "Перегляд логів", - "settings.server.webServer.updateServerIp": "Оновити IP-адресу сервера", - "settings.server.webServer.server.label": "Сервер", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Змінити середовище", - "settings.server.webServer.traefik.managePorts": "Додаткові порти", - "settings.server.webServer.traefik.managePortsDescription": "Додайте або видаліть порти для Traefik", - "settings.server.webServer.traefik.targetPort": "Цільовий порт", - "settings.server.webServer.traefik.publishedPort": "Опублікований порт", - "settings.server.webServer.traefik.addPort": "Додати порт", - "settings.server.webServer.traefik.portsUpdated": "Порти успішно оновлено", - "settings.server.webServer.traefik.portsUpdateError": "Не вдалося оновити порти", - "settings.server.webServer.traefik.publishMode": "Режим публікації", - "settings.server.webServer.storage.label": "Дисковий простір", - "settings.server.webServer.storage.cleanUnusedImages": "Очистити невикористані образи", - "settings.server.webServer.storage.cleanUnusedVolumes": "Очистити невикористані томи", - "settings.server.webServer.storage.cleanStoppedContainers": "Очистити зупинені контейнери", - "settings.server.webServer.storage.cleanDockerBuilder": "Очистити Docker Builder і систему", - "settings.server.webServer.storage.cleanMonitoring": "Очистити моніторинг", - "settings.server.webServer.storage.cleanAll": "Очистити все", - - "settings.profile.title": "Обліковий запис", - "settings.profile.description": "Змініть дані вашого профілю.", - "settings.profile.email": "Електронна пошта", - "settings.profile.password": "Пароль", - "settings.profile.avatar": "Аватар", - - "settings.appearance.title": "Зовнішній вигляд", - "settings.appearance.description": "Налаштуйте тему вашої панелі керування.", - "settings.appearance.theme": "Тема", - "settings.appearance.themeDescription": "Оберіть тему для вашої панелі керування", - "settings.appearance.themes.light": "Світла", - "settings.appearance.themes.dark": "Темна", - "settings.appearance.themes.system": "Системна", - "settings.appearance.language": "Мова", - "settings.appearance.languageDescription": "Оберіть мову для вашої панелі керування", - - "settings.terminal.connectionSettings": "Налаштування з'єднання", - "settings.terminal.ipAddress": "IP-адреса", - "settings.terminal.port": "Порт", - "settings.terminal.username": "Ім'я користувача" -} diff --git a/apps/dokploy/public/locales/zh-Hans/auth.json b/apps/dokploy/public/locales/zh-Hans/auth.json deleted file mode 100644 index b3a498d5..00000000 --- a/apps/dokploy/public/locales/zh-Hans/auth.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "auth.signIn": "登录", - "auth.signInDescription": "请输入您的邮箱和密码登录", - "auth.signInWithGoogle": "使用 Google 登录", - "auth.signInWithGithub": "使用 GitHub 登录", - "auth.email": "邮箱", - "auth.password": "密码", - "auth.password.placeholder": "请输入密码", - "auth.login": "登录", - "auth.forgetPassword": "忘记密码?", - "auth.createAccount": "创建账号", - "auth.twoFactorCode": "两步认证", - "auth.twoFactorCodeDescription": "请输入您的认证器应用中的6位数字验证码", - "auth.lostAuthenticator": "无法访问认证器应用?", - "auth.back": "返回", - "auth.verify": "验证", - "auth.enterBackupCode": "输入备用码", - "auth.enterBackupCodeDescription": "输入备用码以访问您的账户", - "auth.backupCode": "备用码", - "auth.backupCode.placeholder": "请输入您的备用码", - "auth.backupCodeDescription": "输入您在设置两步认证时收到的备用码", - "auth.cancel": "取消", - "auth.invalidTwoFactorCode": "请输入有效的6位数字验证码", - "auth.twoFactorVerificationError": "验证两步认证码时发生错误", - "auth.invalidBackupCode": "请输入有效的备用码", - "auth.backupCodeVerificationError": "验证备用码时发生错误", - "auth.githubSignInError": "使用 GitHub 登录时发生错误", - "auth.googleSignInError": "使用 Google 登录时发生错误", - "auth.unknownError": "未知错误" -} diff --git a/apps/dokploy/public/locales/zh-Hans/common.json b/apps/dokploy/public/locales/zh-Hans/common.json index 4a1f21b4..b8cf16ec 100644 --- a/apps/dokploy/public/locales/zh-Hans/common.json +++ b/apps/dokploy/public/locales/zh-Hans/common.json @@ -1,60 +1,231 @@ { - "common.side.home": "主页", - "common.side.settings": "设置", - "common.side.extra": "其他", - - "common.side.projects": "项目", - "common.side.monitoring": "监控", - "common.side.traefik": "Traefik", - "common.side.docker": "Docker", - "common.side.swarm": "Swarm", - "common.side.requests": "请求", - "common.side.web-server": "本地服务器", - "common.side.profile": "个人资料", - "common.side.remote-servers": "远程服务器", - "common.side.users": "用户", - "common.side.ssh-keys": "SSH 密钥", - "common.side.ai": "AI", - "common.side.git": "Git 集成", - "common.side.registry": "注册表", - "common.side.s3-destinations": "S3 存储", - "common.side.certificates": "证书", - "common.side.cluster": "集群", - "common.side.notifications": "通知", - "common.side.billing": "账单", - "common.side.documentation": "文档", - "common.side.support": "支持", - "common.side.sponsor": "赞助", - - "common.side.invitations.pending-invitations": "待处理邀请", - "common.side.invitations.no-pending-invitations": "没有待处理的邀请", - "common.side.invitations.accept-invitation": "接受邀请", - "common.side.invitations.confirm-accept-invitation": "您确定要接受此邀请吗?", - "common.side.invitations.error-accepting-invitation": "接受邀请时出错", - "common.side.invitations.invitation-accepted": "邀请已成功接受", - "common.side.invitations.expires": "有效期:{{expireDate}}", - "common.side.invitations.role": "角色:{{role}}", - - "common.side.organizations": "组织", - "common.side.organizations.select-organization": "选择组织", - "common.side.organizations.delete-organization": "删除组织", - "common.side.organizations.confirm-delete-organization": "您确定要删除此组织吗?", - "common.side.organizations.organization-deleted": "组织已成功删除", - "common.side.organizations.error-deleting-organization": "删除组织时出错", - "common.side.organizations.createOrganization": "创建组织", - "common.side.organizations.updateOrganization": "更新组织", - "common.side.organizations.createOrganizationDescription": "创建一个新组织来管理您的项目。", - "common.side.organizations.updateOrganizationDescription": "更新组织名称和标志", - "common.side.organizations.name": "名称", - "common.side.organizations.name.placeholder": "请输入组织名称", - "common.side.organizations.logoURL": "Logo 图片地址", - "common.side.organizations.createSuccess": "组织创建成功", - "common.side.organizations.updateSuccess": "组织更新成功", - "common.side.organizations.createFailed": "创建组织失败", - "common.side.organizations.updateFailed": "更新组织失败", - - "common.account": "账户", - "common.account.mine": "我的账户", - "common.account.logout": "注销", - "common.account.selectLanguage": "选择语言" -} + "auth.signIn": "登录", + "auth.signInDescription": "请输入您的邮箱和密码登录", + "auth.signInWithGoogle": "使用 Google 登录", + "auth.signInWithGithub": "使用 GitHub 登录", + "auth.email": "邮箱", + "auth.password": "密码", + "auth.password.placeholder": "请输入密码", + "auth.login": "登录", + "auth.forgetPassword": "忘记密码?", + "auth.createAccount": "创建账号", + "auth.twoFactorCode": "两步认证", + "auth.twoFactorCodeDescription": "请输入您的认证器应用中的6位数字验证码", + "auth.lostAuthenticator": "无法访问认证器应用?", + "auth.back": "返回", + "auth.verify": "验证", + "auth.enterBackupCode": "输入备用码", + "auth.enterBackupCodeDescription": "输入备用码以访问您的账户", + "auth.backupCode": "备用码", + "auth.backupCode.placeholder": "请输入您的备用码", + "auth.backupCodeDescription": "输入您在设置两步认证时收到的备用码", + "auth.cancel": "取消", + "auth.invalidTwoFactorCode": "请输入有效的6位数字验证码", + "auth.twoFactorVerificationError": "验证两步认证码时发生错误", + "auth.invalidBackupCode": "请输入有效的备用码", + "auth.backupCodeVerificationError": "验证备用码时发生错误", + "auth.githubSignInError": "使用 GitHub 登录时发生错误", + "auth.googleSignInError": "使用 Google 登录时发生错误", + "auth.unknownError": "未知错误", + "common.side.home": "主页", + "common.side.settings": "设置", + "common.side.extra": "其他", + "common.side.projects": "项目", + "common.side.monitoring": "监控", + "common.side.traefik": "Traefik", + "common.side.docker": "Docker", + "common.side.swarm": "Swarm", + "common.side.requests": "请求", + "common.side.web-server": "本地服务器", + "common.side.profile": "个人资料", + "common.side.remote-servers": "远程服务器", + "common.side.users": "用户", + "common.side.ssh-keys": "SSH 密钥", + "common.side.ai": "AI", + "common.side.git": "Git 集成", + "common.side.registry": "注册表", + "common.side.s3-destinations": "S3 存储", + "common.side.certificates": "证书", + "common.side.cluster": "集群", + "common.side.notifications": "通知", + "common.side.billing": "账单", + "common.side.documentation": "文档", + "common.side.support": "支持", + "common.side.sponsor": "赞助", + "common.side.invitations.pending-invitations": "待处理邀请", + "common.side.invitations.no-pending-invitations": "没有待处理的邀请", + "common.side.invitations.accept-invitation": "接受邀请", + "common.side.invitations.confirm-accept-invitation": "您确定要接受此邀请吗?", + "common.side.invitations.error-accepting-invitation": "接受邀请时出错", + "common.side.invitations.invitation-accepted": "邀请已成功接受", + "common.side.invitations.expires": "有效期:{{expireDate}}", + "common.side.invitations.role": "角色:{{role}}", + "common.side.organizations": "组织", + "common.side.organizations.select-organization": "选择组织", + "common.side.organizations.delete-organization": "删除组织", + "common.side.organizations.confirm-delete-organization": "您确定要删除此组织吗?", + "common.side.organizations.organization-deleted": "组织已成功删除", + "common.side.organizations.error-deleting-organization": "删除组织时出错", + "common.side.organizations.createOrganization": "创建组织", + "common.side.organizations.updateOrganization": "更新组织", + "common.side.organizations.createOrganizationDescription": "创建一个新组织来管理您的项目。", + "common.side.organizations.updateOrganizationDescription": "更新组织名称和标志", + "common.side.organizations.name": "名称", + "common.side.organizations.name.placeholder": "请输入组织名称", + "common.side.organizations.logoURL": "Logo 图片地址", + "common.side.organizations.createSuccess": "组织创建成功", + "common.side.organizations.updateSuccess": "组织更新成功", + "common.side.organizations.createFailed": "创建组织失败", + "common.side.organizations.updateFailed": "更新组织失败", + "common.account": "账户", + "common.account.mine": "我的账户", + "common.account.logout": "注销", + "common.account.selectLanguage": "选择语言", + "home.projects.title": "项目", + "home.projects.description": "创建和管理您的项目", + "settings.common.save": "保存", + "settings.common.enterTerminal": "进入终端", + "settings.server.domain.title": "域名设置", + "settings.server.domain.description": "添加域名到服务器", + "settings.server.domain.form.domain": "域名", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 邮箱", + "settings.server.domain.form.certificate.label": "证书", + "settings.server.domain.form.certificate.placeholder": "选择一个证书", + "settings.server.domain.form.certificateOptions.none": "无", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + "settings.server.webServer.title": "服务器设置", + "settings.server.webServer.description": "管理服务器", + "settings.server.webServer.actions": "操作", + "settings.server.webServer.reload": "重新加载", + "settings.server.webServer.watchLogs": "查看日志", + "settings.server.webServer.updateServerIp": "更新服务器 IP", + "settings.server.webServer.server.label": "服务器", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "修改环境变量", + "settings.server.webServer.traefik.managePorts": "端口转发", + "settings.server.webServer.traefik.managePortsDescription": "添加或删除 Traefik 的其他端口", + "settings.server.webServer.traefik.targetPort": "目标端口", + "settings.server.webServer.traefik.publishedPort": "对外端口", + "settings.server.webServer.traefik.addPort": "添加端口", + "settings.server.webServer.traefik.portsUpdated": "端口更新成功", + "settings.server.webServer.traefik.portsUpdateError": "端口更新失败", + "settings.server.webServer.traefik.publishMode": "端口映射", + "settings.server.webServer.storage.label": "存储空间", + "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的镜像", + "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷", + "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器", + "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 与 系统缓存", + "settings.server.webServer.storage.cleanMonitoring": "清理监控数据", + "settings.server.webServer.storage.cleanAll": "清理所有内容", + "settings.profile.title": "账户", + "settings.profile.description": "更改您的个人资料", + "settings.profile.email": "邮箱", + "settings.profile.oldPassword": "旧密码", + "settings.profile.newPassword": "新密码", + "settings.profile.password": "密码", + "settings.profile.avatar": "头像", + "settings.2fa.enable2fa": "启用 2FA", + "settings.2fa.title": "2FA 设置", + "settings.2fa.enterPassword": "输入您的密码以开始 2FA 设置", + "settings.2fa.scanQrCodeAndVerify": "扫描二维码并使用您的身份验证器应用程序进行验证", + "settings.2fa.password": "密码", + "settings.2fa.enterPasswordPlaceholder": "输入您的密码", + "settings.2fa.enterPasswordDescription": "输入您的密码以启用 2FA", + "settings.2fa.continue": "继续", + "settings.2fa.scanQrCode": "使用您的身份验证器应用程序扫描此二维码", + "settings.2fa.qrCodeAlt": "2FA 二维码", + "settings.2fa.cantScanQrCode": "无法扫描二维码?", + "settings.2fa.backupCodes": "备份代码", + "settings.2fa.saveBackupCodes": "将这些备份代码保存在安全的地方。如果您丢失了身份验证设备,可以使用它们访问您的帐户。", + "settings.2fa.verificationCode": "验证码", + "settings.2fa.enterVerificationCode": "输入您的身份验证器应用程序中的 6 位数代码", + "settings.2fa.errorSettingUp": "设置 2FA 时出错", + "settings.2fa.errorVerifyingPassword": "验证密码时出错", + "settings.2fa.invalidCode": "无效的代码。请再试一次。", + "settings.2fa.invalidVerificationCode": "无效的验证码", + "settings.2fa.success": "2FA 配置成功", + "settings.2fa.connectionError": "连接错误。请检查您的互联网连接。", + "settings.2fa.errorVerifyingCode": "验证代码时出错", + "settings.2fa.errorVerifying2faCode": "验证 2FA 代码时出错", + "settings.appearance.title": "外观", + "settings.appearance.description": "自定义面板主题", + "settings.appearance.theme": "主题", + "settings.appearance.themeDescription": "选择面板主题", + "settings.appearance.themes.light": "明亮", + "settings.appearance.themes.dark": "黑暗", + "settings.appearance.themes.system": "系统主题", + "settings.appearance.language": "语言", + "settings.appearance.languageDescription": "选择面板语言", + "settings.terminal.connectionSettings": "终端设置", + "settings.terminal.ipAddress": "IP", + "settings.terminal.port": "端口", + "settings.terminal.username": "用户名", + "settings.api.apiCliKeys": "API/CLI 密钥", + "settings.api.generateAndManageKeys": "生成和管理 API 密钥以访问 API/CLI", + "settings.api.swaggerApi": "Swagger API:", + "settings.api.view": "查看", + "settings.api.created": "创建于", + "settings.api.ago": "前", + "settings.api.expiresIn": "过期于", + "settings.api.deleteApiKey": "删除 API 密钥", + "settings.api.deleteApiKeyDescription": "您确定要删除此 API 密钥吗?此操作无法撤销。", + "settings.api.apiKeyDeleted": "API 密钥删除成功", + "settings.api.errorDeletingApiKey": "删除 API 密钥时出错", + "settings.api.noApiKeysFound": "未找到 API 密钥", + "settings.api.errorGeneratingApiKey": "生成 API 密钥失败", + "settings.api.generateNewKey": "生成新密钥", + "settings.api.generateApiKey": "生成 API 密钥", + "settings.api.createNewApiKeyDescription": "创建一个新的 API 密钥以访问 API。您可以设置过期日期和自定义前缀以便更好地组织。", + "settings.api.name": "名称", + "settings.api.namePlaceholder": "我的 API 密钥", + "settings.api.prefix": "前缀", + "settings.api.prefixPlaceholder": "我的应用", + "settings.api.expiration": "过期时间", + "settings.api.selectExpirationTime": "选择过期时间", + "settings.api.expirationOptions.Never": "从不过期", + "settings.api.expirationOptions.1 day": "1 天", + "settings.api.expirationOptions.7 days": "7 天", + "settings.api.expirationOptions.30 days": "30 天", + "settings.api.expirationOptions.90 days": "90 天", + "settings.api.expirationOptions.1 year": "1 年", + "settings.api.organization": "组织", + "settings.api.selectOrganization": "选择组织", + "settings.api.rateLimiting": "速率限制", + "settings.api.enableRateLimiting": "启用速率限制", + "settings.api.limitRequestsDescription": "限制在时间窗口内的请求数量", + "settings.api.timeWindow": "时间窗口", + "settings.api.selectTimeWindow": "选择时间窗口", + "settings.api.timeWindowOptions.1 minute": "1 分钟", + "settings.api.timeWindowOptions.5 minutes": "5 分钟", + "settings.api.timeWindowOptions.15 minutes": "15 分钟", + "settings.api.timeWindowOptions.30 minutes": "30 分钟", + "settings.api.timeWindowOptions.1 hour": "1 小时", + "settings.api.timeWindowOptions.1 day": "1 天", + "settings.api.timeWindowDescription": "请求计数的持续时间", + "settings.api.maxRequests": "最大请求数", + "settings.api.maxRequestsPlaceholder": "100", + "settings.api.maxRequestsDescription": "时间窗口内允许的最大请求数", + "settings.api.requestLimiting": "请求限制", + "settings.api.totalRequestLimit": "总请求限制", + "settings.api.totalRequestLimitPlaceholder": "留空表示无限制", + "settings.api.totalRequestLimitDescription": "允许的总请求数(留空表示无限制)", + "settings.api.refillAmount": "补充数量", + "settings.api.refillAmountPlaceholder": "补充数量", + "settings.api.refillAmountDescription": "每次补充时添加的请求数量", + "settings.api.refillInterval": "补充间隔", + "settings.api.selectRefillInterval": "选择补充间隔", + "settings.api.refillIntervalOptions.1 hour": "1 小时", + "settings.api.refillIntervalOptions.6 hours": "6 小时", + "settings.api.refillIntervalOptions.12 hours": "12 小时", + "settings.api.refillIntervalOptions.1 day": "1 天", + "settings.api.refillIntervalOptions.7 days": "7 天", + "settings.api.refillIntervalOptions.30 days": "30 天", + "settings.api.refillIntervalDescription": "请求限制的补充频率", + "settings.api.cancel": "取消", + "settings.api.generate": "生成", + "settings.api.apiKeyGeneratedSuccessfully": "API 密钥生成成功", + "settings.api.copyApiKeyNow": "请立即复制您的 API 密钥。您将无法再次查看它!", + "settings.api.apiKeyCopied": "API 密钥已复制到剪贴板", + "settings.api.copyToClipboard": "复制到剪贴板", + "settings.api.close": "关闭" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/zh-Hans/home.json b/apps/dokploy/public/locales/zh-Hans/home.json deleted file mode 100644 index 253c3d77..00000000 --- a/apps/dokploy/public/locales/zh-Hans/home.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "home.projects.title": "项目", - "home.projects.description": "创建和管理您的项目" -} diff --git a/apps/dokploy/public/locales/zh-Hans/settings.json b/apps/dokploy/public/locales/zh-Hans/settings.json deleted file mode 100644 index 964e97e6..00000000 --- a/apps/dokploy/public/locales/zh-Hans/settings.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "settings.common.save": "保存", - "settings.common.enterTerminal": "进入终端", - "settings.server.domain.title": "域名设置", - "settings.server.domain.description": "添加域名到服务器", - "settings.server.domain.form.domain": "域名", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 邮箱", - "settings.server.domain.form.certificate.label": "证书", - "settings.server.domain.form.certificate.placeholder": "选择一个证书", - "settings.server.domain.form.certificateOptions.none": "无", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - - "settings.server.webServer.title": "服务器设置", - "settings.server.webServer.description": "管理服务器", - "settings.server.webServer.actions": "操作", - "settings.server.webServer.reload": "重新加载", - "settings.server.webServer.watchLogs": "查看日志", - "settings.server.webServer.updateServerIp": "更新服务器 IP", - "settings.server.webServer.server.label": "服务器", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "修改环境变量", - "settings.server.webServer.traefik.managePorts": "端口转发", - "settings.server.webServer.traefik.managePortsDescription": "添加或删除 Traefik 的其他端口", - "settings.server.webServer.traefik.targetPort": "目标端口", - "settings.server.webServer.traefik.publishedPort": "对外端口", - "settings.server.webServer.traefik.addPort": "添加端口", - "settings.server.webServer.traefik.portsUpdated": "端口更新成功", - "settings.server.webServer.traefik.portsUpdateError": "端口更新失败", - "settings.server.webServer.traefik.publishMode": "端口映射", - "settings.server.webServer.storage.label": "存储空间", - "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的镜像", - "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷", - "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器", - "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 与 系统缓存", - "settings.server.webServer.storage.cleanMonitoring": "清理监控数据", - "settings.server.webServer.storage.cleanAll": "清理所有内容", - - "settings.profile.title": "账户", - "settings.profile.description": "更改您的个人资料", - "settings.profile.email": "邮箱", - "settings.profile.oldPassword": "旧密码", - "settings.profile.newPassword": "新密码", - "settings.profile.password": "密码", - "settings.profile.avatar": "头像", - - "settings.2fa.enable2fa": "启用 2FA", - "settings.2fa.title": "2FA 设置", - "settings.2fa.enterPassword": "输入您的密码以开始 2FA 设置", - "settings.2fa.scanQrCodeAndVerify": "扫描二维码并使用您的身份验证器应用程序进行验证", - "settings.2fa.password": "密码", - "settings.2fa.enterPasswordPlaceholder": "输入您的密码", - "settings.2fa.enterPasswordDescription": "输入您的密码以启用 2FA", - "settings.2fa.continue": "继续", - "settings.2fa.scanQrCode": "使用您的身份验证器应用程序扫描此二维码", - "settings.2fa.qrCodeAlt": "2FA 二维码", - "settings.2fa.cantScanQrCode": "无法扫描二维码?", - "settings.2fa.backupCodes": "备份代码", - "settings.2fa.saveBackupCodes": "将这些备份代码保存在安全的地方。如果您丢失了身份验证设备,可以使用它们访问您的帐户。", - "settings.2fa.verificationCode": "验证码", - "settings.2fa.enterVerificationCode": "输入您的身份验证器应用程序中的 6 位数代码", - "settings.2fa.errorSettingUp": "设置 2FA 时出错", - "settings.2fa.errorVerifyingPassword": "验证密码时出错", - "settings.2fa.invalidCode": "无效的代码。请再试一次。", - "settings.2fa.invalidVerificationCode": "无效的验证码", - "settings.2fa.success": "2FA 配置成功", - "settings.2fa.connectionError": "连接错误。请检查您的互联网连接。", - "settings.2fa.errorVerifyingCode": "验证代码时出错", - "settings.2fa.errorVerifying2faCode": "验证 2FA 代码时出错", - - "settings.appearance.title": "外观", - "settings.appearance.description": "自定义面板主题", - "settings.appearance.theme": "主题", - "settings.appearance.themeDescription": "选择面板主题", - "settings.appearance.themes.light": "明亮", - "settings.appearance.themes.dark": "黑暗", - "settings.appearance.themes.system": "系统主题", - "settings.appearance.language": "语言", - "settings.appearance.languageDescription": "选择面板语言", - - "settings.terminal.connectionSettings": "终端设置", - "settings.terminal.ipAddress": "IP", - "settings.terminal.port": "端口", - "settings.terminal.username": "用户名", - - "settings.api.apiCliKeys": "API/CLI 密钥", - "settings.api.generateAndManageKeys": "生成和管理 API 密钥以访问 API/CLI", - "settings.api.swaggerApi": "Swagger API:", - "settings.api.view": "查看", - "settings.api.created": "创建于", - "settings.api.ago": "前", - "settings.api.expiresIn": "过期于", - "settings.api.deleteApiKey": "删除 API 密钥", - "settings.api.deleteApiKeyDescription": "您确定要删除此 API 密钥吗?此操作无法撤销。", - "settings.api.apiKeyDeleted": "API 密钥删除成功", - "settings.api.errorDeletingApiKey": "删除 API 密钥时出错", - "settings.api.noApiKeysFound": "未找到 API 密钥", - "settings.api.errorGeneratingApiKey": "生成 API 密钥失败", - "settings.api.generateNewKey": "生成新密钥", - "settings.api.generateApiKey": "生成 API 密钥", - "settings.api.createNewApiKeyDescription": "创建一个新的 API 密钥以访问 API。您可以设置过期日期和自定义前缀以便更好地组织。", - "settings.api.name": "名称", - "settings.api.namePlaceholder": "我的 API 密钥", - "settings.api.prefix": "前缀", - "settings.api.prefixPlaceholder": "我的应用", - "settings.api.expiration": "过期时间", - "settings.api.selectExpirationTime": "选择过期时间", - "settings.api.expirationOptions.Never": "从不过期", - "settings.api.expirationOptions.1 day": "1 天", - "settings.api.expirationOptions.7 days": "7 天", - "settings.api.expirationOptions.30 days": "30 天", - "settings.api.expirationOptions.90 days": "90 天", - "settings.api.expirationOptions.1 year": "1 年", - "settings.api.organization": "组织", - "settings.api.selectOrganization": "选择组织", - "settings.api.rateLimiting": "速率限制", - "settings.api.enableRateLimiting": "启用速率限制", - "settings.api.limitRequestsDescription": "限制在时间窗口内的请求数量", - "settings.api.timeWindow": "时间窗口", - "settings.api.selectTimeWindow": "选择时间窗口", - "settings.api.timeWindowOptions.1 minute": "1 分钟", - "settings.api.timeWindowOptions.5 minutes": "5 分钟", - "settings.api.timeWindowOptions.15 minutes": "15 分钟", - "settings.api.timeWindowOptions.30 minutes": "30 分钟", - "settings.api.timeWindowOptions.1 hour": "1 小时", - "settings.api.timeWindowOptions.1 day": "1 天", - "settings.api.timeWindowDescription": "请求计数的持续时间", - "settings.api.maxRequests": "最大请求数", - "settings.api.maxRequestsPlaceholder": "100", - "settings.api.maxRequestsDescription": "时间窗口内允许的最大请求数", - "settings.api.requestLimiting": "请求限制", - "settings.api.totalRequestLimit": "总请求限制", - "settings.api.totalRequestLimitPlaceholder": "留空表示无限制", - "settings.api.totalRequestLimitDescription": "允许的总请求数(留空表示无限制)", - "settings.api.refillAmount": "补充数量", - "settings.api.refillAmountPlaceholder": "补充数量", - "settings.api.refillAmountDescription": "每次补充时添加的请求数量", - "settings.api.refillInterval": "补充间隔", - "settings.api.selectRefillInterval": "选择补充间隔", - "settings.api.refillIntervalOptions.1 hour": "1 小时", - "settings.api.refillIntervalOptions.6 hours": "6 小时", - "settings.api.refillIntervalOptions.12 hours": "12 小时", - "settings.api.refillIntervalOptions.1 day": "1 天", - "settings.api.refillIntervalOptions.7 days": "7 天", - "settings.api.refillIntervalOptions.30 days": "30 天", - "settings.api.refillIntervalDescription": "请求限制的补充频率", - "settings.api.cancel": "取消", - "settings.api.generate": "生成", - "settings.api.apiKeyGeneratedSuccessfully": "API 密钥生成成功", - "settings.api.copyApiKeyNow": "请立即复制您的 API 密钥。您将无法再次查看它!", - "settings.api.apiKeyCopied": "API 密钥已复制到剪贴板", - "settings.api.copyToClipboard": "复制到剪贴板", - "settings.api.close": "关闭" -} diff --git a/apps/dokploy/public/locales/zh-Hant/common.json b/apps/dokploy/public/locales/zh-Hant/common.json index 0967ef42..8278bf34 100644 --- a/apps/dokploy/public/locales/zh-Hant/common.json +++ b/apps/dokploy/public/locales/zh-Hant/common.json @@ -1 +1,54 @@ -{} +{ + "settings.common.save": "儲存", + "settings.common.enterTerminal": "進入終端機", + "settings.server.domain.title": "網域設定", + "settings.server.domain.description": "新增網域至伺服器", + "settings.server.domain.form.domain": "網域", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 信箱", + "settings.server.domain.form.certificate.label": "憑證", + "settings.server.domain.form.certificate.placeholder": "選擇一個憑證", + "settings.server.domain.form.certificateOptions.none": "無", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + "settings.server.webServer.title": "伺服器設定", + "settings.server.webServer.description": "管理伺服器", + "settings.server.webServer.actions": "操作", + "settings.server.webServer.reload": "重新載入", + "settings.server.webServer.watchLogs": "查看日誌", + "settings.server.webServer.updateServerIp": "更新伺服器 IP", + "settings.server.webServer.server.label": "伺服器", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "修改環境變數", + "settings.server.webServer.traefik.managePorts": "埠轉發", + "settings.server.webServer.traefik.managePortsDescription": "新增或移除 Traefik 的其他埠", + "settings.server.webServer.traefik.targetPort": "目標埠", + "settings.server.webServer.traefik.publishedPort": "對外埠", + "settings.server.webServer.traefik.addPort": "新增埠", + "settings.server.webServer.traefik.portsUpdated": "埠更新成功", + "settings.server.webServer.traefik.portsUpdateError": "埠更新失敗", + "settings.server.webServer.traefik.publishMode": "埠對應模式", + "settings.server.webServer.storage.label": "儲存空間", + "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的映像檔", + "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷", + "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器", + "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 和系統快取", + "settings.server.webServer.storage.cleanMonitoring": "清理監控數據", + "settings.server.webServer.storage.cleanAll": "清理所有內容", + "settings.profile.title": "帳戶", + "settings.profile.description": "更改您的個人資料", + "settings.profile.email": "信箱", + "settings.profile.password": "密碼", + "settings.profile.avatar": "頭像", + "settings.appearance.title": "外觀", + "settings.appearance.description": "自訂面板主題", + "settings.appearance.theme": "主題", + "settings.appearance.themeDescription": "選擇面板主題", + "settings.appearance.themes.light": "明亮", + "settings.appearance.themes.dark": "黑暗", + "settings.appearance.themes.system": "系統", + "settings.appearance.language": "語言", + "settings.appearance.languageDescription": "選擇面板語言", + "settings.terminal.connectionSettings": "終端機設定", + "settings.terminal.ipAddress": "IP 位址", + "settings.terminal.port": "埠", + "settings.terminal.username": "使用者名稱" +} \ No newline at end of file diff --git a/apps/dokploy/public/locales/zh-Hant/settings.json b/apps/dokploy/public/locales/zh-Hant/settings.json deleted file mode 100644 index 9d690037..00000000 --- a/apps/dokploy/public/locales/zh-Hant/settings.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "settings.common.save": "儲存", - "settings.common.enterTerminal": "進入終端機", - "settings.server.domain.title": "網域設定", - "settings.server.domain.description": "新增網域至伺服器", - "settings.server.domain.form.domain": "網域", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 信箱", - "settings.server.domain.form.certificate.label": "憑證", - "settings.server.domain.form.certificate.placeholder": "選擇一個憑證", - "settings.server.domain.form.certificateOptions.none": "無", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - - "settings.server.webServer.title": "伺服器設定", - "settings.server.webServer.description": "管理伺服器", - "settings.server.webServer.actions": "操作", - "settings.server.webServer.reload": "重新載入", - "settings.server.webServer.watchLogs": "查看日誌", - "settings.server.webServer.updateServerIp": "更新伺服器 IP", - "settings.server.webServer.server.label": "伺服器", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "修改環境變數", - "settings.server.webServer.traefik.managePorts": "埠轉發", - "settings.server.webServer.traefik.managePortsDescription": "新增或移除 Traefik 的其他埠", - "settings.server.webServer.traefik.targetPort": "目標埠", - "settings.server.webServer.traefik.publishedPort": "對外埠", - "settings.server.webServer.traefik.addPort": "新增埠", - "settings.server.webServer.traefik.portsUpdated": "埠更新成功", - "settings.server.webServer.traefik.portsUpdateError": "埠更新失敗", - "settings.server.webServer.traefik.publishMode": "埠對應模式", - "settings.server.webServer.storage.label": "儲存空間", - "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的映像檔", - "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷", - "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器", - "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 和系統快取", - "settings.server.webServer.storage.cleanMonitoring": "清理監控數據", - "settings.server.webServer.storage.cleanAll": "清理所有內容", - - "settings.profile.title": "帳戶", - "settings.profile.description": "更改您的個人資料", - "settings.profile.email": "信箱", - "settings.profile.password": "密碼", - "settings.profile.avatar": "頭像", - - "settings.appearance.title": "外觀", - "settings.appearance.description": "自訂面板主題", - "settings.appearance.theme": "主題", - "settings.appearance.themeDescription": "選擇面板主題", - "settings.appearance.themes.light": "明亮", - "settings.appearance.themes.dark": "黑暗", - "settings.appearance.themes.system": "系統", - "settings.appearance.language": "語言", - "settings.appearance.languageDescription": "選擇面板語言", - - "settings.terminal.connectionSettings": "終端機設定", - "settings.terminal.ipAddress": "IP 位址", - "settings.terminal.port": "埠", - "settings.terminal.username": "使用者名稱" -} diff --git a/apps/dokploy/scripts/combine-translations.mjs b/apps/dokploy/scripts/combine-translations.mjs new file mode 100644 index 00000000..0af15e84 --- /dev/null +++ b/apps/dokploy/scripts/combine-translations.mjs @@ -0,0 +1,54 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const LOCALES_DIR = path.join(__dirname, "../public/locales"); + +// Get all language directories +const languages = fs + .readdirSync(LOCALES_DIR) + .filter((file) => fs.statSync(path.join(LOCALES_DIR, file)).isDirectory()); + +// Process each language +for (const lang of languages) { + const langDir = path.join(LOCALES_DIR, lang); + const jsonFiles = fs + .readdirSync(langDir) + .filter((file) => file.endsWith(".json")); + + // Combine all JSON files for this language + const combinedTranslations = {}; + + for (const file of jsonFiles) { + const content = JSON.parse( + fs.readFileSync(path.join(langDir, file), "utf8") + ); + Object.assign(combinedTranslations, content); + } + + // Create a backup of the original directory + const backupDir = path.join(LOCALES_DIR, `${lang}_backup`); + if (!fs.existsSync(backupDir)) { + fs.mkdirSync(backupDir); + for (const file of jsonFiles) { + fs.copyFileSync(path.join(langDir, file), path.join(backupDir, file)); + } + } + + // Write the combined translations + const outputFile = path.join(LOCALES_DIR, `${lang}.json`); + fs.writeFileSync(outputFile, JSON.stringify(combinedTranslations, null, 2)); + + // Remove the original directory after backup + fs.rmSync(langDir, { recursive: true, force: true }); + + console.log( + `✅ Processed ${lang}: Combined ${jsonFiles.length} files into ${lang}.json` + ); +} + +console.log("\n🎉 All translations have been combined successfully!"); +console.log( + "📁 Backups of the original files are stored in [language]_backup directories" +); diff --git a/apps/dokploy/utils/i18n.ts b/apps/dokploy/utils/i18n.ts index a9838cb7..aaf74046 100644 --- a/apps/dokploy/utils/i18n.ts +++ b/apps/dokploy/utils/i18n.ts @@ -8,11 +8,8 @@ export function getLocale(cookies: NextApiRequestCookies) { import { Languages } from "@/lib/languages"; import { serverSideTranslations as originalServerSideTranslations } from "next-i18next/serverSideTranslations"; -export const serverSideTranslations = ( - locale: string, - namespaces = ["common"], -) => - originalServerSideTranslations(locale, namespaces, { +export const serverSideTranslations = (locale: string) => + originalServerSideTranslations(locale, ["common"], { fallbackLng: "en", keySeparator: false, i18n: { From cd32c550312bc2f572fb921999be3d48e87d626c Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 21:40:39 -0600 Subject: [PATCH 32/43] chore: remove combine-translations script as it is no longer needed --- apps/dokploy/scripts/combine-translations.mjs | 54 ------------------- 1 file changed, 54 deletions(-) delete mode 100644 apps/dokploy/scripts/combine-translations.mjs diff --git a/apps/dokploy/scripts/combine-translations.mjs b/apps/dokploy/scripts/combine-translations.mjs deleted file mode 100644 index 0af15e84..00000000 --- a/apps/dokploy/scripts/combine-translations.mjs +++ /dev/null @@ -1,54 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const LOCALES_DIR = path.join(__dirname, "../public/locales"); - -// Get all language directories -const languages = fs - .readdirSync(LOCALES_DIR) - .filter((file) => fs.statSync(path.join(LOCALES_DIR, file)).isDirectory()); - -// Process each language -for (const lang of languages) { - const langDir = path.join(LOCALES_DIR, lang); - const jsonFiles = fs - .readdirSync(langDir) - .filter((file) => file.endsWith(".json")); - - // Combine all JSON files for this language - const combinedTranslations = {}; - - for (const file of jsonFiles) { - const content = JSON.parse( - fs.readFileSync(path.join(langDir, file), "utf8") - ); - Object.assign(combinedTranslations, content); - } - - // Create a backup of the original directory - const backupDir = path.join(LOCALES_DIR, `${lang}_backup`); - if (!fs.existsSync(backupDir)) { - fs.mkdirSync(backupDir); - for (const file of jsonFiles) { - fs.copyFileSync(path.join(langDir, file), path.join(backupDir, file)); - } - } - - // Write the combined translations - const outputFile = path.join(LOCALES_DIR, `${lang}.json`); - fs.writeFileSync(outputFile, JSON.stringify(combinedTranslations, null, 2)); - - // Remove the original directory after backup - fs.rmSync(langDir, { recursive: true, force: true }); - - console.log( - `✅ Processed ${lang}: Combined ${jsonFiles.length} files into ${lang}.json` - ); -} - -console.log("\n🎉 All translations have been combined successfully!"); -console.log( - "📁 Backups of the original files are stored in [language]_backup directories" -); From c2e05e86d93f9cc761d0c5a2d02da4cfabcf796b Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:08:49 -0600 Subject: [PATCH 33/43] Revert "feat(i18n): update zh-Hans translation" --- .../organization/handle-organization.tsx | 36 +-- .../components/dashboard/projects/show.tsx | 14 +- .../dashboard/settings/api/add-api-key.tsx | 127 ++++------ .../dashboard/settings/api/show-api-keys.tsx | 39 ++- .../dashboard/settings/profile/enable-2fa.tsx | 56 ++--- .../settings/profile/profile-form.tsx | 8 +- .../servers/actions/show-dokploy-actions.tsx | 2 +- .../servers/actions/show-storage-actions.tsx | 2 +- .../servers/actions/show-traefik-actions.tsx | 2 +- .../settings/servers/handle-servers.tsx | 2 +- .../settings/servers/show-servers.tsx | 6 +- .../dashboard/settings/web-domain.tsx | 2 +- .../dashboard/settings/web-server.tsx | 2 +- .../web-server/local-server-config.tsx | 2 +- .../web-server/manage-traefik-ports.tsx | 2 +- apps/dokploy/components/layouts/side.tsx | 110 +++------ apps/dokploy/components/layouts/user-nav.tsx | 30 +-- apps/dokploy/lib/languages.ts | 71 ++---- apps/dokploy/pages/dashboard/docker.tsx | 7 +- apps/dokploy/pages/dashboard/monitoring.tsx | 7 +- apps/dokploy/pages/dashboard/projects.tsx | 3 - apps/dokploy/pages/dashboard/requests.tsx | 7 +- apps/dokploy/pages/dashboard/settings/ai.tsx | 2 +- .../pages/dashboard/settings/billing.tsx | 4 - .../pages/dashboard/settings/certificates.tsx | 3 - .../pages/dashboard/settings/cluster.tsx | 3 - .../pages/dashboard/settings/destinations.tsx | 3 - .../dashboard/settings/git-providers.tsx | 7 +- .../pages/dashboard/settings/index.tsx | 3 - .../dashboard/settings/notifications.tsx | 3 - .../pages/dashboard/settings/profile.tsx | 2 +- .../pages/dashboard/settings/registry.tsx | 3 - .../pages/dashboard/settings/server.tsx | 2 +- .../pages/dashboard/settings/servers.tsx | 2 +- .../pages/dashboard/settings/ssh-keys.tsx | 7 +- .../pages/dashboard/settings/users.tsx | 3 - apps/dokploy/pages/dashboard/swarm.tsx | 7 +- apps/dokploy/pages/dashboard/traefik.tsx | 7 +- apps/dokploy/pages/index.tsx | 79 +++--- apps/dokploy/public/locales/az/common.json | 55 +---- apps/dokploy/public/locales/az/settings.json | 58 +++++ apps/dokploy/public/locales/de/common.json | 42 +--- apps/dokploy/public/locales/de/settings.json | 44 ++++ apps/dokploy/public/locales/en/common.json | 232 +----------------- apps/dokploy/public/locales/en/settings.json | 58 +++++ apps/dokploy/public/locales/es/common.json | 50 +--- apps/dokploy/public/locales/es/settings.json | 52 ++++ apps/dokploy/public/locales/fa/common.json | 42 +--- apps/dokploy/public/locales/fa/settings.json | 44 ++++ apps/dokploy/public/locales/fr/common.json | 42 +--- apps/dokploy/public/locales/fr/settings.json | 44 ++++ apps/dokploy/public/locales/id/common.json | 55 +---- apps/dokploy/public/locales/id/settings.json | 58 +++++ apps/dokploy/public/locales/it/common.json | 42 +--- apps/dokploy/public/locales/it/settings.json | 44 ++++ apps/dokploy/public/locales/ja/common.json | 42 +--- apps/dokploy/public/locales/ja/settings.json | 44 ++++ apps/dokploy/public/locales/ko/common.json | 42 +--- apps/dokploy/public/locales/ko/settings.json | 44 ++++ apps/dokploy/public/locales/kz/common.json | 42 +--- apps/dokploy/public/locales/kz/settings.json | 41 ++++ apps/dokploy/public/locales/ml/common.json | 55 +---- apps/dokploy/public/locales/ml/settings.json | 58 +++++ apps/dokploy/public/locales/no/common.json | 50 +--- apps/dokploy/public/locales/no/settings.json | 52 ++++ apps/dokploy/public/locales/pl/common.json | 55 +---- apps/dokploy/public/locales/pl/settings.json | 58 +++++ apps/dokploy/public/locales/pt-br/common.json | 42 +--- .../public/locales/pt-br/settings.json | 44 ++++ apps/dokploy/public/locales/ru/common.json | 55 +---- apps/dokploy/public/locales/ru/settings.json | 58 +++++ apps/dokploy/public/locales/tr/common.json | 42 +--- apps/dokploy/public/locales/tr/settings.json | 44 ++++ apps/dokploy/public/locales/uk/common.json | 55 +---- apps/dokploy/public/locales/uk/settings.json | 58 +++++ .../public/locales/zh-Hans/common.json | 232 +----------------- .../public/locales/zh-Hans/settings.json | 58 +++++ .../public/locales/zh-Hant/common.json | 55 +---- .../public/locales/zh-Hant/settings.json | 58 +++++ apps/dokploy/utils/i18n.ts | 8 +- packages/server/package.json | 2 +- 81 files changed, 1268 insertions(+), 1765 deletions(-) create mode 100644 apps/dokploy/public/locales/az/settings.json create mode 100644 apps/dokploy/public/locales/de/settings.json create mode 100644 apps/dokploy/public/locales/en/settings.json create mode 100644 apps/dokploy/public/locales/es/settings.json create mode 100644 apps/dokploy/public/locales/fa/settings.json create mode 100644 apps/dokploy/public/locales/fr/settings.json create mode 100644 apps/dokploy/public/locales/id/settings.json create mode 100644 apps/dokploy/public/locales/it/settings.json create mode 100644 apps/dokploy/public/locales/ja/settings.json create mode 100644 apps/dokploy/public/locales/ko/settings.json create mode 100644 apps/dokploy/public/locales/kz/settings.json create mode 100644 apps/dokploy/public/locales/ml/settings.json create mode 100644 apps/dokploy/public/locales/no/settings.json create mode 100644 apps/dokploy/public/locales/pl/settings.json create mode 100644 apps/dokploy/public/locales/pt-br/settings.json create mode 100644 apps/dokploy/public/locales/ru/settings.json create mode 100644 apps/dokploy/public/locales/tr/settings.json create mode 100644 apps/dokploy/public/locales/uk/settings.json create mode 100644 apps/dokploy/public/locales/zh-Hans/settings.json create mode 100644 apps/dokploy/public/locales/zh-Hant/settings.json diff --git a/apps/dokploy/components/dashboard/organization/handle-organization.tsx b/apps/dokploy/components/dashboard/organization/handle-organization.tsx index 2d30bc82..014c37df 100644 --- a/apps/dokploy/components/dashboard/organization/handle-organization.tsx +++ b/apps/dokploy/components/dashboard/organization/handle-organization.tsx @@ -21,7 +21,6 @@ import { Input } from "@/components/ui/input"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { PenBoxIcon, Plus } from "lucide-react"; -import { useTranslation } from "next-i18next"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; @@ -42,7 +41,6 @@ interface Props { } export function AddOrganization({ organizationId }: Props) { - const { t } = useTranslation(); const [open, setOpen] = useState(false); const utils = api.useUtils(); const { data: organization } = api.organization.one.useQuery( @@ -83,9 +81,7 @@ export function AddOrganization({ organizationId }: Props) { .then(() => { form.reset(); toast.success( - organizationId - ? t("common.side.organizations.updateSuccess") - : t("common.side.organizations.createSuccess"), + `Organization ${organizationId ? "updated" : "created"} successfully`, ); utils.organization.all.invalidate(); setOpen(false); @@ -93,9 +89,7 @@ export function AddOrganization({ organizationId }: Props) { .catch((error) => { console.error(error); toast.error( - organizationId - ? t("common.side.organizations.updateFailed") - : t("common.side.organizations.createFailed"), + `Failed to ${organizationId ? "update" : "create"} organization`, ); }); }; @@ -119,7 +113,7 @@ export function AddOrganization({ organizationId }: Props) {
- {t("common.side.organizations.createOrganization")} + Add organization
)} @@ -127,14 +121,12 @@ export function AddOrganization({ organizationId }: Props) { - {organizationId - ? t("common.side.organizations.updateOrganization") - : t("common.side.organizations.createOrganization")} + {organizationId ? "Update organization" : "Add organization"} {organizationId - ? t("common.side.organizations.updateOrganizationDescription") - : t("common.side.organizations.createOrganizationDescription")} + ? "Update the organization name and logo" + : "Create a new organization to manage your projects."} @@ -147,14 +139,10 @@ export function AddOrganization({ organizationId }: Props) { name="name" render={({ field }) => ( - - {t("common.side.organizations.name")} - + Name @@ -168,9 +156,7 @@ export function AddOrganization({ organizationId }: Props) { name="logo" render={({ field }) => ( - - {t("common.side.organizations.logoURL")} - + Logo URL diff --git a/apps/dokploy/components/dashboard/projects/show.tsx b/apps/dokploy/components/dashboard/projects/show.tsx index 61c73dc7..f5566143 100644 --- a/apps/dokploy/components/dashboard/projects/show.tsx +++ b/apps/dokploy/components/dashboard/projects/show.tsx @@ -47,11 +47,9 @@ import { useMemo, useState } from "react"; import { toast } from "sonner"; import { HandleProject } from "./handle-project"; import { ProjectEnvironment } from "./project-environment"; -import { useTranslation } from "next-i18next"; export const ShowProjects = () => { const utils = api.useUtils(); - const { t } = useTranslation(); const { data, isLoading } = api.project.all.useQuery(); const { data: auth } = api.user.get.useQuery(); const { mutateAsync } = api.project.remove.useMutation(); @@ -78,10 +76,10 @@ export const ShowProjects = () => { - {t("home.projects.title")} + Projects - {t("home.projects.description")} + Create and manage your projects @@ -188,9 +186,7 @@ export const ShowProjects = () => { target="_blank" href={`${domain.https ? "https" : "http"}://${domain.host}${domain.path}`} > - - {domain.host} - + {domain.host} @@ -226,9 +222,7 @@ export const ShowProjects = () => { target="_blank" href={`${domain.https ? "https" : "http"}://${domain.host}${domain.path}`} > - - {domain.host} - + {domain.host} diff --git a/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx b/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx index a26f885c..131d7ddf 100644 --- a/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx +++ b/apps/dokploy/components/dashboard/settings/api/add-api-key.tsx @@ -33,7 +33,6 @@ import { import { Switch } from "@/components/ui/switch"; import copy from "copy-to-clipboard"; import { CodeEditor } from "@/components/shared/code-editor"; -import { useTranslation } from "next-i18next"; const formSchema = z.object({ name: z.string().min(1, "Name is required"), @@ -80,7 +79,6 @@ const REFILL_INTERVAL_OPTIONS = [ ]; export const AddApiKey = () => { - const { t } = useTranslation(); const [open, setOpen] = useState(false); const [showSuccessModal, setShowSuccessModal] = useState(false); const [newApiKey, setNewApiKey] = useState(""); @@ -97,7 +95,7 @@ export const AddApiKey = () => { void refetch(); }, onError: () => { - toast.error(t("settings.api.errorGeneratingApiKey")); + toast.error("Failed to generate API key"); }, }); @@ -142,13 +140,14 @@ export const AddApiKey = () => { <> - + - {t("settings.api.generateApiKey")} + Generate API Key - {t("settings.api.createNewApiKeyDescription")} + Create a new API key for accessing the API. You can set an + expiration date and a custom prefix for better organization.
@@ -158,12 +157,9 @@ export const AddApiKey = () => { name="name" render={({ field }) => ( - {t("settings.api.name")} + Name - + @@ -174,12 +170,9 @@ export const AddApiKey = () => { name="prefix" render={({ field }) => ( - {t("settings.api.prefix")} + Prefix - + @@ -190,7 +183,7 @@ export const AddApiKey = () => { name="expiresIn" render={({ field }) => ( - {t("settings.api.expiration")} + Expiration - + @@ -247,20 +234,16 @@ export const AddApiKey = () => { {/* Rate Limiting Section */}
-

- {t("settings.api.rateLimiting")} -

+

Rate Limiting

(
- - {t("settings.api.enableRateLimiting")} - + Enable Rate Limiting - {t("settings.api.limitRequestsDescription")} + Limit the number of requests within a time window
@@ -280,7 +263,7 @@ export const AddApiKey = () => { name="rateLimitTimeWindow" render={({ field }) => ( - {t("settings.api.timeWindow")} + Time Window - {t("settings.api.timeWindowDescription")} + The duration in which requests are counted @@ -321,13 +298,11 @@ export const AddApiKey = () => { name="rateLimitMax" render={({ field }) => ( - {t("settings.api.maxRequests")} + Maximum Requests field.onChange( @@ -339,7 +314,8 @@ export const AddApiKey = () => { /> - {t("settings.api.maxRequestsDescription")} + Maximum number of requests allowed within the time + window @@ -351,23 +327,17 @@ export const AddApiKey = () => { {/* Request Limiting Section */}
-

- {t("settings.api.requestLimiting")} -

+

Request Limiting

( - - {t("settings.api.totalRequestLimit")} - + Total Request Limit field.onChange( @@ -379,7 +349,8 @@ export const AddApiKey = () => { /> - {t("settings.api.totalRequestLimitDescription")} + Total number of requests allowed (leave empty for + unlimited) @@ -391,13 +362,11 @@ export const AddApiKey = () => { name="refillAmount" render={({ field }) => ( - {t("settings.api.refillAmount")} + Refill Amount field.onChange( @@ -409,7 +378,7 @@ export const AddApiKey = () => { /> - {t("settings.api.refillAmountDescription")} + Number of requests to add on each refill @@ -421,7 +390,7 @@ export const AddApiKey = () => { name="refillInterval" render={({ field }) => ( - {t("settings.api.refillInterval")} + Refill Interval - {t("settings.api.refillIntervalDescription")} + How often to refill the request limit @@ -462,9 +425,9 @@ export const AddApiKey = () => { variant="outline" onClick={() => setOpen(false)} > - {t("settings.api.cancel")} + Cancel - +
@@ -474,11 +437,9 @@ export const AddApiKey = () => { - - {t("settings.api.apiKeyGeneratedSuccessfully")} - + API Key Generated Successfully - {t("settings.api.copyApiKeyNow")} + Please copy your API key now. You won't be able to see it again!
@@ -492,16 +453,16 @@ export const AddApiKey = () => {
diff --git a/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx b/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx index 23ac355f..6744f1de 100644 --- a/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx +++ b/apps/dokploy/components/dashboard/settings/api/show-api-keys.tsx @@ -14,11 +14,8 @@ import { formatDistanceToNow } from "date-fns"; import { DialogAction } from "@/components/shared/dialog-action"; import { AddApiKey } from "./add-api-key"; import { Badge } from "@/components/ui/badge"; -import { useTranslation } from "next-i18next"; -import { getDateFnsLocaleByCode } from "@/lib/languages"; export const ShowApiKeys = () => { - const { t, i18n } = useTranslation(); const { data, refetch } = api.user.get.useQuery(); const { mutateAsync: deleteApiKey, isLoading: isLoadingDelete } = api.user.deleteApiKey.useMutation(); @@ -31,24 +28,22 @@ export const ShowApiKeys = () => {
- {t("settings.api.apiCliKeys")} + API/CLI Keys - {t("settings.api.generateAndManageKeys")} + Generate and manage API keys to access the API/CLI
- {t("settings.api.swaggerApi")} + Swagger API: - - {t("settings.api.view")} - + View
@@ -67,11 +62,9 @@ export const ShowApiKeys = () => {
- {t("settings.api.created")}{" "} - {formatDistanceToNow(new Date(apiKey.createdAt), { - locale: getDateFnsLocaleByCode(i18n.language), - })}{" "} - {t("settings.api.ago")} + Created{" "} + {formatDistanceToNow(new Date(apiKey.createdAt))}{" "} + ago {apiKey.prefix && ( { className="flex items-center gap-1" > - {t("settings.api.expiresIn")}{" "} - {formatDistanceToNow(new Date(apiKey.expiresAt), { - locale: getDateFnsLocaleByCode(i18n.language), - })}{" "} + Expires in{" "} + {formatDistanceToNow( + new Date(apiKey.expiresAt), + )}{" "} )}
{ try { @@ -106,12 +99,12 @@ export const ShowApiKeys = () => { apiKeyId: apiKey.id, }); await refetch(); - toast.success(t("settings.api.apiKeyDeleted")); + toast.success("API key deleted successfully"); } catch (error) { toast.error( error instanceof Error ? error.message - : t("settings.api.errorDeletingApiKey"), + : "Error deleting API key", ); } }} @@ -131,7 +124,7 @@ export const ShowApiKeys = () => {
- {t("settings.api.noApiKeysFound")} + No API keys found
)} diff --git a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx index 8bad0c9b..6cf2c6a5 100644 --- a/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/enable-2fa.tsx @@ -26,7 +26,6 @@ import { authClient } from "@/lib/auth-client"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { Fingerprint, QrCode } from "lucide-react"; -import { useTranslation } from "next-i18next"; import QRCode from "qrcode"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; @@ -56,7 +55,6 @@ type PinForm = z.infer; export const Enable2FA = () => { const utils = api.useUtils(); - const { t } = useTranslation(); const [data, setData] = useState(null); const [backupCodes, setBackupCodes] = useState([]); const [isDialogOpen, setIsDialogOpen] = useState(false); @@ -88,15 +86,13 @@ export const Enable2FA = () => { }); setStep("verify"); - toast.success(t("settings.2fa.scanQrCode")); + toast.success("Scan the QR code with your authenticator app"); } else { throw new Error("No TOTP URI received from server"); } } catch (error) { toast.error( - error instanceof Error - ? error.message - : t("settings.2fa.errorSettingUp"), + error instanceof Error ? error.message : "Error setting up 2FA", ); passwordForm.setError("password", { message: @@ -116,9 +112,9 @@ export const Enable2FA = () => { if (result.error) { if (result.error.code === "INVALID_TWO_FACTOR_AUTHENTICATION") { pinForm.setError("pin", { - message: t("settings.2fa.invalidCode"), + message: "Invalid code. Please try again.", }); - toast.error(t("settings.2fa.invalidVerificationCode")); + toast.error("Invalid verification code"); return; } @@ -129,14 +125,14 @@ export const Enable2FA = () => { throw new Error("No response received from server"); } - toast.success(t("settings.2fa.success")); + toast.success("2FA configured successfully"); utils.user.get.invalidate(); setIsDialogOpen(false); } catch (error) { if (error instanceof Error) { const errorMessage = error.message === "Failed to fetch" - ? t("settings.2fa.connectionError") + ? "Connection error. Please check your internet connection." : error.message; pinForm.setError("pin", { @@ -145,9 +141,9 @@ export const Enable2FA = () => { toast.error(errorMessage); } else { pinForm.setError("pin", { - message: t("settings.2fa.errorVerifyingCode"), + message: "Error verifying code", }); - toast.error(t("settings.2fa.errorVerifying2faCode")); + toast.error("Error verifying 2FA code"); } } }; @@ -181,16 +177,16 @@ export const Enable2FA = () => { - {t("settings.2fa.title")} + 2FA Setup {step === "password" - ? t("settings.2fa.enterPassword") - : t("settings.2fa.scanQrCodeAndVerify")} + ? "Enter your password to begin 2FA setup" + : "Scan the QR code and verify with your authenticator app"} @@ -206,16 +202,16 @@ export const Enable2FA = () => { name="password" render={({ field }) => ( - {t("settings.2fa.password")} + Password - {t("settings.2fa.enterPasswordDescription")} + Enter your password to enable 2FA @@ -226,7 +222,7 @@ export const Enable2FA = () => { className="w-full" isLoading={isPasswordLoading} > - {t("settings.2fa.continue")} + Continue @@ -243,16 +239,16 @@ export const Enable2FA = () => {
- {t("settings.2fa.scanQrCode")} + Scan this QR code with your authenticator app {t("settings.2fa.qrCodeAlt")}
- {t("settings.2fa.cantScanQrCode")} + Can't scan the QR code? {data.secret} @@ -262,9 +258,7 @@ export const Enable2FA = () => { {backupCodes && backupCodes.length > 0 && (
-

- {t("settings.2fa.backupCodes")} -

+

Backup Codes

{backupCodes.map((code, index) => ( { ))}

- {t("settings.2fa.saveBackupCodes")} + Save these backup codes in a secure place. You can use + them to access your account if you lose access to your + authenticator device.

)} @@ -293,7 +289,7 @@ export const Enable2FA = () => { name="pin" render={({ field }) => ( - {t("settings.2fa.verificationCode")} + Verification Code @@ -307,7 +303,7 @@ export const Enable2FA = () => { - {t("settings.2fa.enterVerificationCode")} + Enter the 6-digit code from your authenticator app @@ -319,7 +315,7 @@ export const Enable2FA = () => { className="w-full" isLoading={isPasswordLoading} > - {t("settings.2fa.enable2fa")} + Enable 2FA diff --git a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx index 6a5508cf..32179378 100644 --- a/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx +++ b/apps/dokploy/components/dashboard/settings/profile/profile-form.tsx @@ -62,7 +62,7 @@ export const ProfileForm = () => { isError, error, } = api.user.update.useMutation(); - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const [gravatarHash, setGravatarHash] = useState(null); const availableAvatars = useMemo(() => { @@ -170,9 +170,7 @@ export const ProfileForm = () => { name="currentPassword" render={({ field }) => ( - - {t("settings.profile.oldPassword")} - + Current Password { render={({ field }) => ( - {t("settings.profile.newPassword")} + {t("settings.profile.password")} { - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const { mutateAsync: reloadServer, isLoading } = api.settings.reloadServer.useMutation(); diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx index 2a8d0f1b..3492ba7c 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-storage-actions.tsx @@ -17,7 +17,7 @@ interface Props { serverId?: string; } export const ShowStorageActions = ({ serverId }: Props) => { - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const { mutateAsync: cleanAll, isLoading: cleanAllIsLoading } = api.settings.cleanAll.useMutation(); diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx index a348d6f0..b43686bd 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx @@ -20,7 +20,7 @@ interface Props { serverId?: string; } export const ShowTraefikActions = ({ serverId }: Props) => { - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const { mutateAsync: reloadTraefik, isLoading: reloadTraefikIsLoading } = api.settings.reloadTraefik.useMutation(); diff --git a/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx b/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx index 629eb724..97994145 100644 --- a/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/handle-servers.tsx @@ -61,7 +61,7 @@ interface Props { } export const HandleServers = ({ serverId }: Props) => { - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const utils = api.useUtils(); const [isOpen, setIsOpen] = useState(false); diff --git a/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx b/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx index 5b7016c9..3f3ff4e9 100644 --- a/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/show-servers.tsx @@ -44,7 +44,7 @@ import { ShowTraefikFileSystemModal } from "./show-traefik-file-system-modal"; import { WelcomeSuscription } from "./welcome-stripe/welcome-suscription"; export const ShowServers = () => { - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const router = useRouter(); const query = router.query; const { data, refetch, isLoading } = api.server.all.useQuery(); @@ -235,7 +235,9 @@ export const ShowServers = () => { serverId={server.serverId} > - {t("common.enterTerminal")} + {t( + "settings.common.enterTerminal", + )} )} diff --git a/apps/dokploy/components/dashboard/settings/web-domain.tsx b/apps/dokploy/components/dashboard/settings/web-domain.tsx index ac228a4d..a579df39 100644 --- a/apps/dokploy/components/dashboard/settings/web-domain.tsx +++ b/apps/dokploy/components/dashboard/settings/web-domain.tsx @@ -51,7 +51,7 @@ const addServerDomain = z type AddServerDomain = z.infer; export const WebDomain = () => { - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const { data, refetch } = api.user.get.useQuery(); const { mutateAsync, isLoading } = api.settings.assignDomainServer.useMutation(); diff --git a/apps/dokploy/components/dashboard/settings/web-server.tsx b/apps/dokploy/components/dashboard/settings/web-server.tsx index 09d7a9b2..64b6d634 100644 --- a/apps/dokploy/components/dashboard/settings/web-server.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server.tsx @@ -15,7 +15,7 @@ import { ToggleDockerCleanup } from "./servers/actions/toggle-docker-cleanup"; import { UpdateServer } from "./web-server/update-server"; export const WebServer = () => { - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const { data } = api.user.get.useQuery(); const { data: dokployVersion } = api.settings.getDokployVersion.useQuery(); diff --git a/apps/dokploy/components/dashboard/settings/web-server/local-server-config.tsx b/apps/dokploy/components/dashboard/settings/web-server/local-server-config.tsx index 6a1f02fa..e30408e6 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/local-server-config.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/local-server-config.tsx @@ -52,7 +52,7 @@ interface Props { } const LocalServerConfig = ({ onSave }: Props) => { - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const form = useForm({ defaultValues: getLocalServerData(), diff --git a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx index b4d75113..a6958b16 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx @@ -54,7 +54,7 @@ const TraefikPortsSchema = z.object({ type TraefikPortsForm = z.infer; export const ManageTraefikPorts = ({ children, serverId }: Props) => { - const { t } = useTranslation(); + const { t } = useTranslation("settings"); const [open, setOpen] = useState(false); const form = useForm({ diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx index f5125b22..1640a1db 100644 --- a/apps/dokploy/components/layouts/side.tsx +++ b/apps/dokploy/components/layouts/side.tsx @@ -86,7 +86,6 @@ import { Logo } from "../shared/logo"; import { Button } from "../ui/button"; import { UpdateServerButton } from "./update-server"; import { UserNav } from "./user-nav"; -import { useTranslation } from "next-i18next"; // The types of the queries we are going to use type AuthQueryOutput = inferRouterOutputs["user"]["get"]; @@ -94,7 +93,6 @@ type AuthQueryOutput = inferRouterOutputs["user"]["get"]; type SingleNavItem = { isSingle?: true; title: string; - titleKey: string; url: string; icon?: LucideIcon; isEnabled?: (opts: { @@ -112,7 +110,6 @@ type NavItem = | { isSingle: false; title: string; - titleKey: string; icon: LucideIcon; items: SingleNavItem[]; isEnabled?: (opts: { @@ -125,7 +122,6 @@ type NavItem = // Represents an external link item (used for the help section) type ExternalLink = { name: string; - nameKey: string; url: string; icon: React.ComponentType<{ className?: string }>; isEnabled?: (opts: { @@ -151,14 +147,12 @@ const MENU: Menu = { { isSingle: true, title: "Projects", - titleKey: "common.side.projects", url: "/dashboard/projects", icon: Folder, }, { isSingle: true, title: "Monitoring", - titleKey: "common.side.monitoring", url: "/dashboard/monitoring", icon: BarChartHorizontalBigIcon, // Only enabled in non-cloud environments @@ -167,7 +161,6 @@ const MENU: Menu = { { isSingle: true, title: "Traefik File System", - titleKey: "common.side.traefik", url: "/dashboard/traefik", icon: GalleryVerticalEnd, // Only enabled for admins and users with access to Traefik files in non-cloud environments @@ -180,7 +173,6 @@ const MENU: Menu = { { isSingle: true, title: "Docker", - titleKey: "common.side.docker", url: "/dashboard/docker", icon: BlocksIcon, // Only enabled for admins and users with access to Docker in non-cloud environments @@ -190,7 +182,6 @@ const MENU: Menu = { { isSingle: true, title: "Swarm", - titleKey: "common.side.swarm", url: "/dashboard/swarm", icon: PieChart, // Only enabled for admins and users with access to Docker in non-cloud environments @@ -200,7 +191,6 @@ const MENU: Menu = { { isSingle: true, title: "Requests", - titleKey: "common.side.requests", url: "/dashboard/requests", icon: Forward, // Only enabled for admins and users with access to Docker in non-cloud environments @@ -269,7 +259,6 @@ const MENU: Menu = { { isSingle: true, title: "Web Server", - titleKey: "common.side.web-server", url: "/dashboard/settings/server", icon: Activity, // Only enabled for admins in non-cloud environments @@ -278,14 +267,12 @@ const MENU: Menu = { { isSingle: true, title: "Profile", - titleKey: "common.side.profile", url: "/dashboard/settings/profile", icon: User, }, { isSingle: true, title: "Remote Servers", - titleKey: "common.side.remote-servers", url: "/dashboard/settings/servers", icon: Server, // Only enabled for admins @@ -294,7 +281,6 @@ const MENU: Menu = { { isSingle: true, title: "Users", - titleKey: "common.side.users", icon: Users, url: "/dashboard/settings/users", // Only enabled for admins @@ -303,7 +289,6 @@ const MENU: Menu = { { isSingle: true, title: "SSH Keys", - titleKey: "common.side.ssh-keys", icon: KeyRound, url: "/dashboard/settings/ssh-keys", // Only enabled for admins and users with access to SSH keys @@ -312,7 +297,6 @@ const MENU: Menu = { }, { title: "AI", - titleKey: "common.side.ai", icon: BotIcon, url: "/dashboard/settings/ai", isSingle: true, @@ -321,7 +305,6 @@ const MENU: Menu = { { isSingle: true, title: "Git", - titleKey: "common.side.git", url: "/dashboard/settings/git-providers", icon: GitBranch, // Only enabled for admins and users with access to Git providers @@ -331,7 +314,6 @@ const MENU: Menu = { { isSingle: true, title: "Registry", - titleKey: "common.side.registry", url: "/dashboard/settings/registry", icon: Package, // Only enabled for admins @@ -340,7 +322,6 @@ const MENU: Menu = { { isSingle: true, title: "S3 Destinations", - titleKey: "common.side.s3-destinations", url: "/dashboard/settings/destinations", icon: Database, // Only enabled for admins @@ -350,7 +331,6 @@ const MENU: Menu = { { isSingle: true, title: "Certificates", - titleKey: "common.side.certificates", url: "/dashboard/settings/certificates", icon: ShieldCheck, // Only enabled for admins @@ -359,7 +339,6 @@ const MENU: Menu = { { isSingle: true, title: "Cluster", - titleKey: "common.side.cluster", url: "/dashboard/settings/cluster", icon: Boxes, // Only enabled for admins in non-cloud environments @@ -368,7 +347,6 @@ const MENU: Menu = { { isSingle: true, title: "Notifications", - titleKey: "common.side.notifications", url: "/dashboard/settings/notifications", icon: Bell, // Only enabled for admins @@ -377,7 +355,6 @@ const MENU: Menu = { { isSingle: true, title: "Billing", - titleKey: "common.side.billing", url: "/dashboard/settings/billing", icon: CreditCard, // Only enabled for admins in cloud environments @@ -388,19 +365,16 @@ const MENU: Menu = { help: [ { name: "Documentation", - nameKey: "common.side.documentation", url: "https://docs.dokploy.com/docs/core", icon: BookIcon, }, { name: "Support", - nameKey: "common.side.support", url: "https://discord.gg/2tBnJ3jDJc", icon: CircleHelp, }, { name: "Sponsor", - nameKey: "common.side.sponsor", url: "https://opencollective.com/dokploy", icon: ({ className }) => (

- {activeOrganization?.name ?? - t("common.side.organizations.select-organization")} + {activeOrganization?.name ?? "Select Organization"}

@@ -620,7 +592,7 @@ function SidebarLogo() { sideOffset={4} > - {t("common.side.organizations")} + Organizations {organizations?.map((org) => (
@@ -648,12 +620,8 @@ function SidebarLogo() {
{ await deleteOrganization({ @@ -662,17 +630,13 @@ function SidebarLogo() { .then(() => { refetch(); toast.success( - t( - "common.side.organizations.organization-deleted", - ), + "Organization deleted successfully", ); }) .catch((error) => { toast.error( error?.message || - t( - "common.side.organizations.error-deleting-organization", - ), + "Error deleting organization", ); }); }} @@ -725,9 +689,7 @@ function SidebarLogo() { side={"right"} className="w-80" > - - {t("common.side.invitations.pending-invitations")} - + Pending Invitations
{invitations && invitations.length > 0 ? ( invitations.map((invitation) => ( @@ -740,23 +702,16 @@ function SidebarLogo() { {invitation?.organization?.name}
- {t("common.side.invitations.expires", { - expireDate: new Date( - invitation.expiresAt, - ).toLocaleString(), - })} + Expires:{" "} + {new Date(invitation.expiresAt).toLocaleString()}
- {t("common.side.invitations.role", { - role: invitation.role, - })} + Role: {invitation.role}
{ const { error } = @@ -766,31 +721,24 @@ function SidebarLogo() { if (error) { toast.error( - error.message || - t( - "common.side.invitations.error-accepting-invitation", - ), + error.message || "Error accepting invitation", ); } else { - toast.success( - t( - "common.side.invitations.invitation-accepted", - ), - ); + toast.success("Invitation accepted successfully"); await refetchInvitations(); await refetch(); } }} >
)) ) : ( - {t("common.side.invitations.no-pending-invitations")} + No pending invitations )}
@@ -804,8 +752,6 @@ function SidebarLogo() { } export default function Page({ children }: Props) { - const { t } = useTranslation(); - const [defaultOpen, setDefaultOpen] = useState( undefined, ); @@ -872,7 +818,7 @@ export default function Page({ children }: Props) { - {t("common.side.home")} + Home {filteredHome.map((item) => { const isSingle = item.isSingle !== false; @@ -893,7 +839,7 @@ export default function Page({ children }: Props) { {isSingle ? ( )} - {t(item.titleKey)} + {item.title} ) : ( <> {item.icon && } @@ -961,7 +907,7 @@ export default function Page({ children }: Props) { - {t("common.side.settings")} + Settings {filteredSettings.map((item) => { const isSingle = item.isSingle !== false; @@ -982,7 +928,7 @@ export default function Page({ children }: Props) { {isSingle ? ( )} - {t(item.titleKey)} + {item.title} ) : ( <> {item.icon && } - {t(item.titleKey)} + {item.title} {item.items?.length && ( )} @@ -1050,7 +996,7 @@ export default function Page({ children }: Props) { - {t("common.side.extra")} + Extra {help.map((item: ExternalLink) => ( @@ -1064,7 +1010,7 @@ export default function Page({ children }: Props) { - {t(item.nameKey)} + {item.name} @@ -1111,7 +1057,7 @@ export default function Page({ children }: Props) { href={activeItem?.url || "/"} className="flex items-center gap-1.5" > - {activeItem?.titleKey ? t(activeItem.titleKey) : ""} + {activeItem?.title} diff --git a/apps/dokploy/components/layouts/user-nav.tsx b/apps/dokploy/components/layouts/user-nav.tsx index c54e53cb..85cb96f3 100644 --- a/apps/dokploy/components/layouts/user-nav.tsx +++ b/apps/dokploy/components/layouts/user-nav.tsx @@ -23,13 +23,11 @@ import { ChevronsUpDown } from "lucide-react"; import { useRouter } from "next/router"; import { ModeToggle } from "../ui/modeToggle"; import { SidebarMenuButton } from "../ui/sidebar"; -import { useTranslation } from "next-i18next"; const _AUTO_CHECK_UPDATES_INTERVAL_MINUTES = 7; export const UserNav = () => { const router = useRouter(); - const { t } = useTranslation(); const { data } = api.user.get.useQuery(); const { data: isCloud } = api.settings.isCloud.useQuery(); @@ -51,9 +49,7 @@ export const UserNav = () => { CN
- - {t("common.account")} - + Account {data?.user?.email}
@@ -67,7 +63,7 @@ export const UserNav = () => { >
- {t("common.account.mine")} + My Account {data?.user?.email} @@ -82,7 +78,7 @@ export const UserNav = () => { router.push("/dashboard/settings/profile"); }} > - {t("common.side.profile")} + Profile { router.push("/dashboard/projects"); }} > - {t("common.side.projects")} + Projects {!isCloud ? ( <> @@ -100,7 +96,7 @@ export const UserNav = () => { router.push("/dashboard/monitoring"); }} > - {t("common.side.monitoring")} + Monitoring {(data?.role === "owner" || data?.canAccessToTraefikFiles) && ( { router.push("/dashboard/traefik"); }} > - {t("common.side.traefik")} + Traefik )} {(data?.role === "owner" || data?.canAccessToDocker) && ( @@ -121,7 +117,7 @@ export const UserNav = () => { }); }} > - {t("common.side.docker")} + Docker )} @@ -132,7 +128,7 @@ export const UserNav = () => { router.push("/dashboard/settings"); }} > - {t("common.side.settings")} + Settings )} @@ -145,7 +141,7 @@ export const UserNav = () => { router.push("/dashboard/settings/servers"); }} > - {t("common.side.remote-servers")} + Servers )} @@ -156,7 +152,7 @@ export const UserNav = () => { router.push("/dashboard/settings"); }} > - {t("common.side.settings")} + Settings )} @@ -169,7 +165,7 @@ export const UserNav = () => { router.push("/dashboard/settings/billing"); }} > - {t("common.side.billing")} + Billing )} @@ -185,7 +181,7 @@ export const UserNav = () => { // }); }} > - {t("common.account.logout")} + Log out
@@ -295,11 +291,11 @@ export default function Home({ IS_CLOUD }: Props) { name="password" render={({ field }) => ( - {t("auth.password")} + Password @@ -312,7 +308,7 @@ export default function Home({ IS_CLOUD }: Props) { type="submit" isLoading={isLoginLoading} > - {t("auth.login")} + Login @@ -326,7 +322,7 @@ export default function Home({ IS_CLOUD }: Props) { autoComplete="off" >
- + - {t("auth.twoFactorCodeDescription")} + Enter the 6-digit code from your authenticator app
@@ -365,14 +361,14 @@ export default function Home({ IS_CLOUD }: Props) { setTwoFactorCode(""); }} > - {t("auth.back")} + Back
@@ -383,23 +379,24 @@ export default function Home({ IS_CLOUD }: Props) { > - {t("auth.enterBackupCode")} + Enter Backup Code - {t("auth.enterBackupCodeDescription")} + Enter one of your backup codes to access your account
- + setBackupCode(e.target.value)} - placeholder={t("auth.backupCode.placeholder")} + placeholder="Enter your backup code" className="font-mono" /> - {t("auth.backupCodeDescription")} + Enter one of the backup codes you received when setting up + 2FA
@@ -413,14 +410,14 @@ export default function Home({ IS_CLOUD }: Props) { setBackupCode(""); }} > - {t("auth.cancel")} + Cancel
@@ -436,7 +433,7 @@ export default function Home({ IS_CLOUD }: Props) { className="hover:underline text-muted-foreground" href="/register" > - {t("auth.createAccount")} + Create an account )}
@@ -447,7 +444,7 @@ export default function Home({ IS_CLOUD }: Props) { className="hover:underline text-muted-foreground" href="/send-reset-password" > - {t("auth.forgetPassword")} + Lost your password? ) : ( - {t("auth.forgetPassword")} + Lost your password? )}
@@ -470,9 +467,6 @@ Home.getLayout = (page: ReactElement) => { return {page}; }; export async function getServerSideProps(context: GetServerSidePropsContext) { - const { req } = context; - const locale = getLocale(req.cookies); - if (IS_CLOUD) { try { const { user } = await validateRequest(context.req); @@ -517,7 +511,6 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { return { props: { hasAdmin, - ...(await serverSideTranslations(locale)), }, }; } diff --git a/apps/dokploy/public/locales/az/common.json b/apps/dokploy/public/locales/az/common.json index c552ee84..0967ef42 100644 --- a/apps/dokploy/public/locales/az/common.json +++ b/apps/dokploy/public/locales/az/common.json @@ -1,54 +1 @@ -{ - "settings.common.save": "Yadda saxla", - "settings.common.enterTerminal": "Terminala daxil ol", - "settings.server.domain.title": "Server Domeni", - "settings.server.domain.description": "Server tətbiqinizə domen əlavə edin.", - "settings.server.domain.form.domain": "Domen", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-poçtu", - "settings.server.domain.form.certificate.label": "Sertifikat Təminatçısı", - "settings.server.domain.form.certificate.placeholder": "Sertifikat seçin", - "settings.server.domain.form.certificateOptions.none": "Heç biri", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - "settings.server.webServer.title": "Veb Server", - "settings.server.webServer.description": "Veb serveri yenidən yüklə və ya təmizlə.", - "settings.server.webServer.actions": "Əməliyyatlar", - "settings.server.webServer.reload": "Yenidən yüklə", - "settings.server.webServer.watchLogs": "Logları izlə", - "settings.server.webServer.updateServerIp": "Server IP-ni Yenilə", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Mühiti Dəyişdir", - "settings.server.webServer.traefik.managePorts": "Əlavə Port Təyinatları", - "settings.server.webServer.traefik.managePortsDescription": "Traefik üçün əlavə portlar əlavə edin və ya silin", - "settings.server.webServer.traefik.targetPort": "Hədəf Port", - "settings.server.webServer.traefik.publishedPort": "Dərc Edilmiş Port", - "settings.server.webServer.traefik.addPort": "Port Əlavə Et", - "settings.server.webServer.traefik.portsUpdated": "Portlar uğurla yeniləndi", - "settings.server.webServer.traefik.portsUpdateError": "Portların yenilənməsi uğursuz oldu", - "settings.server.webServer.traefik.publishMode": "Dərc Rejimi", - "settings.server.webServer.storage.label": "Yer", - "settings.server.webServer.storage.cleanUnusedImages": "İstifadə edilməyən şəkilləri təmizlə", - "settings.server.webServer.storage.cleanUnusedVolumes": "İstifadə edilməyən həcmləri təmizlə", - "settings.server.webServer.storage.cleanStoppedContainers": "Dayandırılmış konteynerləri təmizlə", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder və Sistemi təmizlə", - "settings.server.webServer.storage.cleanMonitoring": "Monitorinqi təmizlə", - "settings.server.webServer.storage.cleanAll": "Hamısını təmizlə", - "settings.profile.title": "Hesab", - "settings.profile.description": "Profilinizin məlumatlarını buradan dəyişin.", - "settings.profile.email": "E-poçt", - "settings.profile.password": "Şifrə", - "settings.profile.avatar": "Avatar", - "settings.appearance.title": "Görünüş", - "settings.appearance.description": "İdarəetmə panelinizin görünüşünü fərdiləşdirin.", - "settings.appearance.theme": "Mövzu", - "settings.appearance.themeDescription": "İdarəetmə paneliniz üçün mövzu seçin", - "settings.appearance.themes.light": "İşıqlı", - "settings.appearance.themes.dark": "Qaranlıq", - "settings.appearance.themes.system": "Sistem", - "settings.appearance.language": "Dil", - "settings.appearance.languageDescription": "İdarəetmə paneliniz üçün dil seçin", - "settings.terminal.connectionSettings": "Bağlantı parametrləri", - "settings.terminal.ipAddress": "IP Ünvanı", - "settings.terminal.port": "Port", - "settings.terminal.username": "İstifadəçi adı" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/az/settings.json b/apps/dokploy/public/locales/az/settings.json new file mode 100644 index 00000000..fb286bf0 --- /dev/null +++ b/apps/dokploy/public/locales/az/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "Yadda saxla", + "settings.common.enterTerminal": "Terminala daxil ol", + "settings.server.domain.title": "Server Domeni", + "settings.server.domain.description": "Server tətbiqinizə domen əlavə edin.", + "settings.server.domain.form.domain": "Domen", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-poçtu", + "settings.server.domain.form.certificate.label": "Sertifikat Təminatçısı", + "settings.server.domain.form.certificate.placeholder": "Sertifikat seçin", + "settings.server.domain.form.certificateOptions.none": "Heç biri", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "Veb Server", + "settings.server.webServer.description": "Veb serveri yenidən yüklə və ya təmizlə.", + "settings.server.webServer.actions": "Əməliyyatlar", + "settings.server.webServer.reload": "Yenidən yüklə", + "settings.server.webServer.watchLogs": "Logları izlə", + "settings.server.webServer.updateServerIp": "Server IP-ni Yenilə", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Mühiti Dəyişdir", + "settings.server.webServer.traefik.managePorts": "Əlavə Port Təyinatları", + "settings.server.webServer.traefik.managePortsDescription": "Traefik üçün əlavə portlar əlavə edin və ya silin", + "settings.server.webServer.traefik.targetPort": "Hədəf Port", + "settings.server.webServer.traefik.publishedPort": "Dərc Edilmiş Port", + "settings.server.webServer.traefik.addPort": "Port Əlavə Et", + "settings.server.webServer.traefik.portsUpdated": "Portlar uğurla yeniləndi", + "settings.server.webServer.traefik.portsUpdateError": "Portların yenilənməsi uğursuz oldu", + "settings.server.webServer.traefik.publishMode": "Dərc Rejimi", + "settings.server.webServer.storage.label": "Yer", + "settings.server.webServer.storage.cleanUnusedImages": "İstifadə edilməyən şəkilləri təmizlə", + "settings.server.webServer.storage.cleanUnusedVolumes": "İstifadə edilməyən həcmləri təmizlə", + "settings.server.webServer.storage.cleanStoppedContainers": "Dayandırılmış konteynerləri təmizlə", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder və Sistemi təmizlə", + "settings.server.webServer.storage.cleanMonitoring": "Monitorinqi təmizlə", + "settings.server.webServer.storage.cleanAll": "Hamısını təmizlə", + + "settings.profile.title": "Hesab", + "settings.profile.description": "Profilinizin məlumatlarını buradan dəyişin.", + "settings.profile.email": "E-poçt", + "settings.profile.password": "Şifrə", + "settings.profile.avatar": "Avatar", + + "settings.appearance.title": "Görünüş", + "settings.appearance.description": "İdarəetmə panelinizin görünüşünü fərdiləşdirin.", + "settings.appearance.theme": "Mövzu", + "settings.appearance.themeDescription": "İdarəetmə paneliniz üçün mövzu seçin", + "settings.appearance.themes.light": "İşıqlı", + "settings.appearance.themes.dark": "Qaranlıq", + "settings.appearance.themes.system": "Sistem", + "settings.appearance.language": "Dil", + "settings.appearance.languageDescription": "İdarəetmə paneliniz üçün dil seçin", + + "settings.terminal.connectionSettings": "Bağlantı parametrləri", + "settings.terminal.ipAddress": "IP Ünvanı", + "settings.terminal.port": "Port", + "settings.terminal.username": "İstifadəçi adı" +} diff --git a/apps/dokploy/public/locales/de/common.json b/apps/dokploy/public/locales/de/common.json index d4014d31..0967ef42 100644 --- a/apps/dokploy/public/locales/de/common.json +++ b/apps/dokploy/public/locales/de/common.json @@ -1,41 +1 @@ -{ - "settings.common.save": "Speichern", - "settings.server.domain.title": "Server-Domain", - "settings.server.domain.description": "Füg eine Domain zu deiner Server-Anwendung hinzu.", - "settings.server.domain.form.domain": "Domain", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-Mail", - "settings.server.domain.form.certificate.label": "Zertifikat", - "settings.server.domain.form.certificate.placeholder": "Wähl ein Zertifikat aus", - "settings.server.domain.form.certificateOptions.none": "Keins", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Standard)", - "settings.server.webServer.title": "Web-Server", - "settings.server.webServer.description": "Lade den Web-Server neu oder reinige ihn.", - "settings.server.webServer.actions": "Aktionen", - "settings.server.webServer.reload": "Neu laden", - "settings.server.webServer.watchLogs": "Logs anschauen", - "settings.server.webServer.updateServerIp": "Server-IP Aktualisieren", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Umgebungsvariablen ändern", - "settings.server.webServer.storage.label": "Speicherplatz", - "settings.server.webServer.storage.cleanUnusedImages": "Nicht genutzte Bilder löschen", - "settings.server.webServer.storage.cleanUnusedVolumes": "Nicht genutzte Volumes löschen", - "settings.server.webServer.storage.cleanStoppedContainers": "Gestoppte Container löschen", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & System bereinigen", - "settings.server.webServer.storage.cleanMonitoring": "Monitoring bereinigen", - "settings.server.webServer.storage.cleanAll": "Alles bereinigen", - "settings.profile.title": "Konto", - "settings.profile.description": "Ändere die Details deines Profiles hier.", - "settings.profile.email": "E-Mail", - "settings.profile.password": "Passwort", - "settings.profile.avatar": "Avatar", - "settings.appearance.title": "Aussehen", - "settings.appearance.description": "Pass das Design deines Dashboards an.", - "settings.appearance.theme": "Theme", - "settings.appearance.themeDescription": "Wähl ein Theme für dein Dashboard aus", - "settings.appearance.themes.light": "Hell", - "settings.appearance.themes.dark": "Dunkel", - "settings.appearance.themes.system": "System", - "settings.appearance.language": "Sprache", - "settings.appearance.languageDescription": "Wähl eine Sprache für dein Dashboard aus" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/de/settings.json b/apps/dokploy/public/locales/de/settings.json new file mode 100644 index 00000000..e2ba0623 --- /dev/null +++ b/apps/dokploy/public/locales/de/settings.json @@ -0,0 +1,44 @@ +{ + "settings.common.save": "Speichern", + "settings.server.domain.title": "Server-Domain", + "settings.server.domain.description": "Füg eine Domain zu deiner Server-Anwendung hinzu.", + "settings.server.domain.form.domain": "Domain", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-Mail", + "settings.server.domain.form.certificate.label": "Zertifikat", + "settings.server.domain.form.certificate.placeholder": "Wähl ein Zertifikat aus", + "settings.server.domain.form.certificateOptions.none": "Keins", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Standard)", + + "settings.server.webServer.title": "Web-Server", + "settings.server.webServer.description": "Lade den Web-Server neu oder reinige ihn.", + "settings.server.webServer.actions": "Aktionen", + "settings.server.webServer.reload": "Neu laden", + "settings.server.webServer.watchLogs": "Logs anschauen", + "settings.server.webServer.updateServerIp": "Server-IP Aktualisieren", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Umgebungsvariablen ändern", + "settings.server.webServer.storage.label": "Speicherplatz", + "settings.server.webServer.storage.cleanUnusedImages": "Nicht genutzte Bilder löschen", + "settings.server.webServer.storage.cleanUnusedVolumes": "Nicht genutzte Volumes löschen", + "settings.server.webServer.storage.cleanStoppedContainers": "Gestoppte Container löschen", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & System bereinigen", + "settings.server.webServer.storage.cleanMonitoring": "Monitoring bereinigen", + "settings.server.webServer.storage.cleanAll": "Alles bereinigen", + + "settings.profile.title": "Konto", + "settings.profile.description": "Ändere die Details deines Profiles hier.", + "settings.profile.email": "E-Mail", + "settings.profile.password": "Passwort", + "settings.profile.avatar": "Avatar", + + "settings.appearance.title": "Aussehen", + "settings.appearance.description": "Pass das Design deines Dashboards an.", + "settings.appearance.theme": "Theme", + "settings.appearance.themeDescription": "Wähl ein Theme für dein Dashboard aus", + "settings.appearance.themes.light": "Hell", + "settings.appearance.themes.dark": "Dunkel", + "settings.appearance.themes.system": "System", + "settings.appearance.language": "Sprache", + "settings.appearance.languageDescription": "Wähl eine Sprache für dein Dashboard aus" +} diff --git a/apps/dokploy/public/locales/en/common.json b/apps/dokploy/public/locales/en/common.json index fd595802..0967ef42 100644 --- a/apps/dokploy/public/locales/en/common.json +++ b/apps/dokploy/public/locales/en/common.json @@ -1,231 +1 @@ -{ - "auth.signIn": "Sign In", - "auth.signInDescription": "Enter your email and password to sign in", - "auth.signInWithGoogle": "Sign in with Google", - "auth.signInWithGithub": "Sign in with GitHub", - "auth.email": "Email", - "auth.password": "Password", - "auth.password.placeholder": "Enter your password", - "auth.login": "Login", - "auth.forgetPassword": "Lost your password?", - "auth.createAccount": "Create an account", - "auth.twoFactorCode": "2FA Code", - "auth.twoFactorCodeDescription": "Enter the 6-digit code from your authenticator app", - "auth.lostAuthenticator": "Lost access to your authenticator app?", - "auth.back": "Back", - "auth.verify": "Verify", - "auth.enterBackupCode": "Enter Backup Code", - "auth.enterBackupCodeDescription": "Enter one of your backup codes to access your account", - "auth.backupCode": "Backup Code", - "auth.backupCode.placeholder": "Enter your backup code", - "auth.backupCodeDescription": "Enter one of the backup codes you received when setting up 2FA", - "auth.cancel": "Cancel", - "auth.invalidTwoFactorCode": "Please enter a valid 6-digit code", - "auth.twoFactorVerificationError": "An error occurred while verifying 2FA code", - "auth.invalidBackupCode": "Please enter a valid backup code", - "auth.backupCodeVerificationError": "An error occurred while verifying backup code", - "auth.githubSignInError": "An error occurred while signing in with GitHub", - "auth.googleSignInError": "An error occurred while signing in with Google", - "auth.unknownError": "Unknown error", - "common.side.home": "Home", - "common.side.settings": "Settings", - "common.side.extra": "Extra", - "common.side.projects": "Projects", - "common.side.monitoring": "Monitoring", - "common.side.traefik": "Traefik File System", - "common.side.docker": "Docker", - "common.side.swarm": "Swarm", - "common.side.requests": "Requests", - "common.side.web-server": "Web Server", - "common.side.profile": "Profile", - "common.side.remote-servers": "Remote Servers", - "common.side.users": "Users", - "common.side.ssh-keys": "SSH Keys", - "common.side.ai": "AI", - "common.side.git": "Git", - "common.side.registry": "Registry", - "common.side.s3-destinations": "S3 Destinations", - "common.side.certificates": "Certificates", - "common.side.cluster": "Cluster", - "common.side.notifications": "Notifications", - "common.side.billing": "Billing", - "common.side.documentation": "Documentation", - "common.side.support": "Support", - "common.side.sponsor": "Sponsor", - "common.side.invitations.pending-invitations": "Pending Invitations", - "common.side.invitations.no-pending-invitations": "No pending invitations", - "common.side.invitations.accept-invitation": "Accept Invitation", - "common.side.invitations.confirm-accept-invitation": "Are you sure you want to accept this invitation?", - "common.side.invitations.error-accepting-invitation": "Error accepting invitation", - "common.side.invitations.invitation-accepted": "Invitation accepted successfully", - "common.side.invitations.expires": "Expires: {{expireDate}}", - "common.side.invitations.role": "Role: {{role}}", - "common.side.organizations": "Organizations", - "common.side.organizations.select-organization": "Select Organization", - "common.side.organizations.delete-organization": "Delete Organization", - "common.side.organizations.confirm-delete-organization": "Are you sure you want to delete this organization?", - "common.side.organizations.organization-deleted": "Organization deleted successfully", - "common.side.organizations.error-deleting-organization": "Error deleting organization", - "common.side.organizations.createOrganization": "Create organization", - "common.side.organizations.updateOrganization": "Update organization", - "common.side.organizations.createOrganizationDescription": "Create a new organization to manage your projects.", - "common.side.organizations.updateOrganizationDescription": "Update the organization name and logo", - "common.side.organizations.name": "Name", - "common.side.organizations.name.placeholder": "Organization name", - "common.side.organizations.logoURL": "Logo URL", - "common.side.organizations.createSuccess": "Organization created successfully", - "common.side.organizations.updateSuccess": "Organization updated successfully", - "common.side.organizations.createFailed": "Failed to create organization", - "common.side.organizations.updateFailed": "Failed to update organization", - "common.account": "Account", - "common.account.mine": "My Account", - "common.account.logout": "Logout", - "common.account.selectLanguage": "Select Language", - "home.projects.title": "Projects", - "home.projects.description": "Create and manage your projects", - "settings.common.save": "Save", - "settings.common.enterTerminal": "Terminal", - "settings.server.domain.title": "Server Domain", - "settings.server.domain.description": "Add a domain to your server application.", - "settings.server.domain.form.domain": "Domain", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Email", - "settings.server.domain.form.certificate.label": "Certificate Provider", - "settings.server.domain.form.certificate.placeholder": "Select a certificate", - "settings.server.domain.form.certificateOptions.none": "None", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - "settings.server.webServer.title": "Web Server", - "settings.server.webServer.description": "Reload or clean the web server.", - "settings.server.webServer.actions": "Actions", - "settings.server.webServer.reload": "Reload", - "settings.server.webServer.watchLogs": "View Logs", - "settings.server.webServer.updateServerIp": "Update Server IP", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Modify Environment", - "settings.server.webServer.traefik.managePorts": "Additional Port Mappings", - "settings.server.webServer.traefik.managePortsDescription": "Add or remove additional ports for Traefik", - "settings.server.webServer.traefik.targetPort": "Target Port", - "settings.server.webServer.traefik.publishedPort": "Published Port", - "settings.server.webServer.traefik.addPort": "Add Port", - "settings.server.webServer.traefik.portsUpdated": "Ports updated successfully", - "settings.server.webServer.traefik.portsUpdateError": "Failed to update ports", - "settings.server.webServer.traefik.publishMode": "Publish Mode", - "settings.server.webServer.storage.label": "Space", - "settings.server.webServer.storage.cleanUnusedImages": "Clean unused images", - "settings.server.webServer.storage.cleanUnusedVolumes": "Clean unused volumes", - "settings.server.webServer.storage.cleanStoppedContainers": "Clean stopped containers", - "settings.server.webServer.storage.cleanDockerBuilder": "Clean Docker Builder & System", - "settings.server.webServer.storage.cleanMonitoring": "Clean Monitoring", - "settings.server.webServer.storage.cleanAll": "Clean all", - "settings.profile.title": "Account", - "settings.profile.description": "Change the details of your profile here.", - "settings.profile.email": "Email", - "settings.profile.oldPassword": "Current Password", - "settings.profile.newPassword": "New Password", - "settings.profile.password": "Password", - "settings.profile.avatar": "Avatar", - "settings.2fa.enable2fa": "Enable 2FA", - "settings.2fa.title": "2FA Setup", - "settings.2fa.enterPassword": "Enter your password to begin 2FA setup", - "settings.2fa.scanQrCodeAndVerify": "Scan the QR code and verify with your authenticator app", - "settings.2fa.password": "Password", - "settings.2fa.enterPasswordPlaceholder": "Enter your password", - "settings.2fa.enterPasswordDescription": "Enter your password to enable 2FA", - "settings.2fa.continue": "Continue", - "settings.2fa.scanQrCode": "Scan this QR code with your authenticator app", - "settings.2fa.qrCodeAlt": "2FA QR Code", - "settings.2fa.cantScanQrCode": "Can't scan the QR code?", - "settings.2fa.backupCodes": "Backup Codes", - "settings.2fa.saveBackupCodes": "Save these backup codes in a secure place. You can use them to access your account if you lose access to your authenticator device.", - "settings.2fa.verificationCode": "Verification Code", - "settings.2fa.enterVerificationCode": "Enter the 6-digit code from your authenticator app", - "settings.2fa.errorSettingUp": "Error setting up 2FA", - "settings.2fa.errorVerifyingPassword": "Error verifying password", - "settings.2fa.invalidCode": "Invalid code. Please try again.", - "settings.2fa.invalidVerificationCode": "Invalid verification code", - "settings.2fa.success": "2FA configured successfully", - "settings.2fa.connectionError": "Connection error. Please check your internet connection.", - "settings.2fa.errorVerifyingCode": "Error verifying code", - "settings.2fa.errorVerifying2faCode": "Error verifying 2FA code", - "settings.appearance.title": "Appearance", - "settings.appearance.description": "Customize the theme of your dashboard.", - "settings.appearance.theme": "Theme", - "settings.appearance.themeDescription": "Select a theme for your dashboard", - "settings.appearance.themes.light": "Light", - "settings.appearance.themes.dark": "Dark", - "settings.appearance.themes.system": "System", - "settings.appearance.language": "Language", - "settings.appearance.languageDescription": "Select a language for your dashboard", - "settings.terminal.connectionSettings": "Connection settings", - "settings.terminal.ipAddress": "IP Address", - "settings.terminal.port": "Port", - "settings.terminal.username": "Username", - "settings.api.apiCliKeys": "API/CLI Keys", - "settings.api.generateAndManageKeys": "Generate and manage API keys to access the API/CLI", - "settings.api.swaggerApi": "Swagger API:", - "settings.api.view": "View", - "settings.api.created": "Created", - "settings.api.ago": "ago", - "settings.api.expiresIn": "Expires in", - "settings.api.deleteApiKey": "Delete API Key", - "settings.api.deleteApiKeyDescription": "Are you sure you want to delete this API key? This action cannot be undone.", - "settings.api.apiKeyDeleted": "API key deleted successfully", - "settings.api.errorDeletingApiKey": "Error deleting API key", - "settings.api.noApiKeysFound": "No API keys found", - "settings.api.errorGeneratingApiKey": "Failed to generate API key", - "settings.api.generateNewKey": "Generate New Key", - "settings.api.generateApiKey": "Generate API Key", - "settings.api.createNewApiKeyDescription": "Create a new API key for accessing the API. You can set an expiration date and a custom prefix for better organization.", - "settings.api.name": "Name", - "settings.api.namePlaceholder": "My API Key", - "settings.api.prefix": "Prefix", - "settings.api.prefixPlaceholder": "my_app", - "settings.api.expiration": "Expiration", - "settings.api.selectExpirationTime": "Select expiration time", - "settings.api.expirationOptions.Never": "Never", - "settings.api.expirationOptions.1 day": "1 day", - "settings.api.expirationOptions.7 days": "7 days", - "settings.api.expirationOptions.30 days": "30 days", - "settings.api.expirationOptions.90 days": "90 days", - "settings.api.expirationOptions.1 year": "1 year", - "settings.api.organization": "Organization", - "settings.api.selectOrganization": "Select organization", - "settings.api.rateLimiting": "Rate Limiting", - "settings.api.enableRateLimiting": "Enable Rate Limiting", - "settings.api.limitRequestsDescription": "Limit the number of requests within a time window", - "settings.api.timeWindow": "Time Window", - "settings.api.selectTimeWindow": "Select time window", - "settings.api.timeWindowOptions.1 minute": "1 minute", - "settings.api.timeWindowOptions.5 minutes": "5 minutes", - "settings.api.timeWindowOptions.15 minutes": "15 minutes", - "settings.api.timeWindowOptions.30 minutes": "30 minutes", - "settings.api.timeWindowOptions.1 hour": "1 hour", - "settings.api.timeWindowOptions.1 day": "1 day", - "settings.api.timeWindowDescription": "The duration in which requests are counted", - "settings.api.maxRequests": "Maximum Requests", - "settings.api.maxRequestsPlaceholder": "100", - "settings.api.maxRequestsDescription": "Maximum number of requests allowed within the time window", - "settings.api.requestLimiting": "Request Limiting", - "settings.api.totalRequestLimit": "Total Request Limit", - "settings.api.totalRequestLimitPlaceholder": "Leave empty for unlimited", - "settings.api.totalRequestLimitDescription": "Total number of requests allowed (leave empty for unlimited)", - "settings.api.refillAmount": "Refill Amount", - "settings.api.refillAmountPlaceholder": "Amount to refill", - "settings.api.refillAmountDescription": "Number of requests to add on each refill", - "settings.api.refillInterval": "Refill Interval", - "settings.api.selectRefillInterval": "Select refill interval", - "settings.api.refillIntervalOptions.1 hour": "1 hour", - "settings.api.refillIntervalOptions.6 hours": "6 hours", - "settings.api.refillIntervalOptions.12 hours": "12 hours", - "settings.api.refillIntervalOptions.1 day": "1 day", - "settings.api.refillIntervalOptions.7 days": "7 days", - "settings.api.refillIntervalOptions.30 days": "30 days", - "settings.api.refillIntervalDescription": "How often to refill the request limit", - "settings.api.cancel": "Cancel", - "settings.api.generate": "Generate", - "settings.api.apiKeyGeneratedSuccessfully": "API Key Generated Successfully", - "settings.api.copyApiKeyNow": "Please copy your API key now. You won't be able to see it again!", - "settings.api.apiKeyCopied": "API key copied to clipboard", - "settings.api.copyToClipboard": "Copy to Clipboard", - "settings.api.close": "Close" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/en/settings.json b/apps/dokploy/public/locales/en/settings.json new file mode 100644 index 00000000..699a456e --- /dev/null +++ b/apps/dokploy/public/locales/en/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "Save", + "settings.common.enterTerminal": "Terminal", + "settings.server.domain.title": "Server Domain", + "settings.server.domain.description": "Add a domain to your server application.", + "settings.server.domain.form.domain": "Domain", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Email", + "settings.server.domain.form.certificate.label": "Certificate Provider", + "settings.server.domain.form.certificate.placeholder": "Select a certificate", + "settings.server.domain.form.certificateOptions.none": "None", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "Web Server", + "settings.server.webServer.description": "Reload or clean the web server.", + "settings.server.webServer.actions": "Actions", + "settings.server.webServer.reload": "Reload", + "settings.server.webServer.watchLogs": "View Logs", + "settings.server.webServer.updateServerIp": "Update Server IP", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Modify Environment", + "settings.server.webServer.traefik.managePorts": "Additional Port Mappings", + "settings.server.webServer.traefik.managePortsDescription": "Add or remove additional ports for Traefik", + "settings.server.webServer.traefik.targetPort": "Target Port", + "settings.server.webServer.traefik.publishedPort": "Published Port", + "settings.server.webServer.traefik.addPort": "Add Port", + "settings.server.webServer.traefik.portsUpdated": "Ports updated successfully", + "settings.server.webServer.traefik.portsUpdateError": "Failed to update ports", + "settings.server.webServer.traefik.publishMode": "Publish Mode", + "settings.server.webServer.storage.label": "Space", + "settings.server.webServer.storage.cleanUnusedImages": "Clean unused images", + "settings.server.webServer.storage.cleanUnusedVolumes": "Clean unused volumes", + "settings.server.webServer.storage.cleanStoppedContainers": "Clean stopped containers", + "settings.server.webServer.storage.cleanDockerBuilder": "Clean Docker Builder & System", + "settings.server.webServer.storage.cleanMonitoring": "Clean Monitoring", + "settings.server.webServer.storage.cleanAll": "Clean all", + + "settings.profile.title": "Account", + "settings.profile.description": "Change the details of your profile here.", + "settings.profile.email": "Email", + "settings.profile.password": "Password", + "settings.profile.avatar": "Avatar", + + "settings.appearance.title": "Appearance", + "settings.appearance.description": "Customize the theme of your dashboard.", + "settings.appearance.theme": "Theme", + "settings.appearance.themeDescription": "Select a theme for your dashboard", + "settings.appearance.themes.light": "Light", + "settings.appearance.themes.dark": "Dark", + "settings.appearance.themes.system": "System", + "settings.appearance.language": "Language", + "settings.appearance.languageDescription": "Select a language for your dashboard", + + "settings.terminal.connectionSettings": "Connection settings", + "settings.terminal.ipAddress": "IP Address", + "settings.terminal.port": "Port", + "settings.terminal.username": "Username" +} diff --git a/apps/dokploy/public/locales/es/common.json b/apps/dokploy/public/locales/es/common.json index 38e3466c..0967ef42 100644 --- a/apps/dokploy/public/locales/es/common.json +++ b/apps/dokploy/public/locales/es/common.json @@ -1,49 +1 @@ -{ - "settings.common.save": "Guardar", - "settings.server.domain.title": "Dominio del Servidor", - "settings.server.domain.description": "Añade un dominio a tu aplicación de servidor.", - "settings.server.domain.form.domain": "Dominio", - "settings.server.domain.form.letsEncryptEmail": "Correo de Let's Encrypt", - "settings.server.domain.form.certificate.label": "Proveedor de Certificado", - "settings.server.domain.form.certificate.placeholder": "Selecciona un certificado", - "settings.server.domain.form.certificateOptions.none": "Ninguno", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - "settings.server.webServer.title": "Servidor Web", - "settings.server.webServer.description": "Recarga o limpia el servidor web.", - "settings.server.webServer.actions": "Acciones", - "settings.server.webServer.reload": "Recargar", - "settings.server.webServer.watchLogs": "Ver registros", - "settings.server.webServer.updateServerIp": "Actualizar IP del Servidor", - "settings.server.webServer.server.label": "Servidor", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Modificar Entorno", - "settings.server.webServer.traefik.managePorts": "Asignación Adicional de Puertos", - "settings.server.webServer.traefik.managePortsDescription": "Añadir o eliminar puertos adicionales para Traefik", - "settings.server.webServer.traefik.targetPort": "Puerto de Destino", - "settings.server.webServer.traefik.publishedPort": "Puerto Publicado", - "settings.server.webServer.traefik.addPort": "Añadir Puerto", - "settings.server.webServer.traefik.portsUpdated": "Puertos actualizados correctamente", - "settings.server.webServer.traefik.portsUpdateError": "Error al actualizar los puertos", - "settings.server.webServer.traefik.publishMode": "Modo de Publicación", - "settings.server.webServer.storage.label": "Espacio", - "settings.server.webServer.storage.cleanUnusedImages": "Limpiar imágenes no utilizadas", - "settings.server.webServer.storage.cleanUnusedVolumes": "Limpiar volúmenes no utilizados", - "settings.server.webServer.storage.cleanStoppedContainers": "Limpiar contenedores detenidos", - "settings.server.webServer.storage.cleanDockerBuilder": "Limpiar Constructor de Docker y Sistema", - "settings.server.webServer.storage.cleanMonitoring": "Limpiar Monitoreo", - "settings.server.webServer.storage.cleanAll": "Limpiar todo", - "settings.profile.title": "Cuenta", - "settings.profile.description": "Cambia los detalles de tu perfil aquí.", - "settings.profile.email": "Correo electrónico", - "settings.profile.password": "Contraseña", - "settings.profile.avatar": "Avatar", - "settings.appearance.title": "Apariencia", - "settings.appearance.description": "Personaliza el tema de tu panel.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Selecciona un tema para tu panel", - "settings.appearance.themes.light": "Claro", - "settings.appearance.themes.dark": "Oscuro", - "settings.appearance.themes.system": "Sistema", - "settings.appearance.language": "Idioma", - "settings.appearance.languageDescription": "Selecciona un idioma para tu panel" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/es/settings.json b/apps/dokploy/public/locales/es/settings.json new file mode 100644 index 00000000..90a41cd0 --- /dev/null +++ b/apps/dokploy/public/locales/es/settings.json @@ -0,0 +1,52 @@ +{ + "settings.common.save": "Guardar", + "settings.server.domain.title": "Dominio del Servidor", + "settings.server.domain.description": "Añade un dominio a tu aplicación de servidor.", + "settings.server.domain.form.domain": "Dominio", + "settings.server.domain.form.letsEncryptEmail": "Correo de Let's Encrypt", + "settings.server.domain.form.certificate.label": "Proveedor de Certificado", + "settings.server.domain.form.certificate.placeholder": "Selecciona un certificado", + "settings.server.domain.form.certificateOptions.none": "Ninguno", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "Servidor Web", + "settings.server.webServer.description": "Recarga o limpia el servidor web.", + "settings.server.webServer.actions": "Acciones", + "settings.server.webServer.reload": "Recargar", + "settings.server.webServer.watchLogs": "Ver registros", + "settings.server.webServer.updateServerIp": "Actualizar IP del Servidor", + "settings.server.webServer.server.label": "Servidor", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Modificar Entorno", + "settings.server.webServer.traefik.managePorts": "Asignación Adicional de Puertos", + "settings.server.webServer.traefik.managePortsDescription": "Añadir o eliminar puertos adicionales para Traefik", + "settings.server.webServer.traefik.targetPort": "Puerto de Destino", + "settings.server.webServer.traefik.publishedPort": "Puerto Publicado", + "settings.server.webServer.traefik.addPort": "Añadir Puerto", + "settings.server.webServer.traefik.portsUpdated": "Puertos actualizados correctamente", + "settings.server.webServer.traefik.portsUpdateError": "Error al actualizar los puertos", + "settings.server.webServer.traefik.publishMode": "Modo de Publicación", + "settings.server.webServer.storage.label": "Espacio", + "settings.server.webServer.storage.cleanUnusedImages": "Limpiar imágenes no utilizadas", + "settings.server.webServer.storage.cleanUnusedVolumes": "Limpiar volúmenes no utilizados", + "settings.server.webServer.storage.cleanStoppedContainers": "Limpiar contenedores detenidos", + "settings.server.webServer.storage.cleanDockerBuilder": "Limpiar Constructor de Docker y Sistema", + "settings.server.webServer.storage.cleanMonitoring": "Limpiar Monitoreo", + "settings.server.webServer.storage.cleanAll": "Limpiar todo", + + "settings.profile.title": "Cuenta", + "settings.profile.description": "Cambia los detalles de tu perfil aquí.", + "settings.profile.email": "Correo electrónico", + "settings.profile.password": "Contraseña", + "settings.profile.avatar": "Avatar", + + "settings.appearance.title": "Apariencia", + "settings.appearance.description": "Personaliza el tema de tu panel.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Selecciona un tema para tu panel", + "settings.appearance.themes.light": "Claro", + "settings.appearance.themes.dark": "Oscuro", + "settings.appearance.themes.system": "Sistema", + "settings.appearance.language": "Idioma", + "settings.appearance.languageDescription": "Selecciona un idioma para tu panel" +} diff --git a/apps/dokploy/public/locales/fa/common.json b/apps/dokploy/public/locales/fa/common.json index 8d4c1485..0967ef42 100644 --- a/apps/dokploy/public/locales/fa/common.json +++ b/apps/dokploy/public/locales/fa/common.json @@ -1,41 +1 @@ -{ - "settings.common.save": "ذخیره", - "settings.server.domain.title": "دامنه سرور", - "settings.server.domain.description": "یک دامنه به برنامه سرور خود اضافه کنید.", - "settings.server.domain.form.domain": "دامنه", - "settings.server.domain.form.letsEncryptEmail": "ایمیل Let's Encrypt", - "settings.server.domain.form.certificate.label": "گواهینامه", - "settings.server.domain.form.certificate.placeholder": "یک گواهینامه انتخاب کنید", - "settings.server.domain.form.certificateOptions.none": "هیچکدام", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (پیش‌فرض)", - "settings.server.webServer.title": "وب سرور", - "settings.server.webServer.description": "وب سرور را بازنشانی یا پاک کنید.", - "settings.server.webServer.actions": "اقدامات", - "settings.server.webServer.reload": "بارگذاری مجدد", - "settings.server.webServer.watchLogs": "مشاهده گزارش‌ها", - "settings.server.webServer.updateServerIp": "به‌روزرسانی آی‌پی سرور", - "settings.server.webServer.server.label": "سرور", - "settings.server.webServer.traefik.label": "ترافیک", - "settings.server.webServer.traefik.modifyEnv": "ویرایش محیط", - "settings.server.webServer.storage.label": "فضا", - "settings.server.webServer.storage.cleanUnusedImages": "پاکسازی Image های بدون استفاده", - "settings.server.webServer.storage.cleanUnusedVolumes": "پاک‌سازی ولوم‌های بدون استفاده", - "settings.server.webServer.storage.cleanStoppedContainers": "پاک‌سازی کانتینرهای متوقف‌شده", - "settings.server.webServer.storage.cleanDockerBuilder": "پاک‌سازی بیلدر و سیستم داکر", - "settings.server.webServer.storage.cleanMonitoring": "پاک‌سازی پایش", - "settings.server.webServer.storage.cleanAll": "پاک‌سازی همه", - "settings.profile.title": "حساب کاربری", - "settings.profile.description": "جزئیات پروفایل خود را در اینجا تغییر دهید.", - "settings.profile.email": "ایمیل", - "settings.profile.password": "رمز عبور", - "settings.profile.avatar": "تصویر پروفایل", - "settings.appearance.title": "ظاهر", - "settings.appearance.description": "تم داشبورد خود را سفارشی کنید.", - "settings.appearance.theme": "تم", - "settings.appearance.themeDescription": "یک تم برای داشبورد خود انتخاب کنید", - "settings.appearance.themes.light": "روشن", - "settings.appearance.themes.dark": "تاریک", - "settings.appearance.themes.system": "سیستم", - "settings.appearance.language": "زبان", - "settings.appearance.languageDescription": "یک زبان برای داشبورد خود انتخاب کنید" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/fa/settings.json b/apps/dokploy/public/locales/fa/settings.json new file mode 100644 index 00000000..f28aaa27 --- /dev/null +++ b/apps/dokploy/public/locales/fa/settings.json @@ -0,0 +1,44 @@ +{ + "settings.common.save": "ذخیره", + "settings.server.domain.title": "دامنه سرور", + "settings.server.domain.description": "یک دامنه به برنامه سرور خود اضافه کنید.", + "settings.server.domain.form.domain": "دامنه", + "settings.server.domain.form.letsEncryptEmail": "ایمیل Let's Encrypt", + "settings.server.domain.form.certificate.label": "گواهینامه", + "settings.server.domain.form.certificate.placeholder": "یک گواهینامه انتخاب کنید", + "settings.server.domain.form.certificateOptions.none": "هیچکدام", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (پیش‌فرض)", + + "settings.server.webServer.title": "وب سرور", + "settings.server.webServer.description": "وب سرور را بازنشانی یا پاک کنید.", + "settings.server.webServer.actions": "اقدامات", + "settings.server.webServer.reload": "بارگذاری مجدد", + "settings.server.webServer.watchLogs": "مشاهده گزارش‌ها", + "settings.server.webServer.updateServerIp": "به‌روزرسانی آی‌پی سرور", + "settings.server.webServer.server.label": "سرور", + "settings.server.webServer.traefik.label": "ترافیک", + "settings.server.webServer.traefik.modifyEnv": "ویرایش محیط", + "settings.server.webServer.storage.label": "فضا", + "settings.server.webServer.storage.cleanUnusedImages": "پاکسازی Image های بدون استفاده", + "settings.server.webServer.storage.cleanUnusedVolumes": "پاک‌سازی ولوم‌های بدون استفاده", + "settings.server.webServer.storage.cleanStoppedContainers": "پاک‌سازی کانتینرهای متوقف‌شده", + "settings.server.webServer.storage.cleanDockerBuilder": "پاک‌سازی بیلدر و سیستم داکر", + "settings.server.webServer.storage.cleanMonitoring": "پاک‌سازی پایش", + "settings.server.webServer.storage.cleanAll": "پاک‌سازی همه", + + "settings.profile.title": "حساب کاربری", + "settings.profile.description": "جزئیات پروفایل خود را در اینجا تغییر دهید.", + "settings.profile.email": "ایمیل", + "settings.profile.password": "رمز عبور", + "settings.profile.avatar": "تصویر پروفایل", + + "settings.appearance.title": "ظاهر", + "settings.appearance.description": "تم داشبورد خود را سفارشی کنید.", + "settings.appearance.theme": "تم", + "settings.appearance.themeDescription": "یک تم برای داشبورد خود انتخاب کنید", + "settings.appearance.themes.light": "روشن", + "settings.appearance.themes.dark": "تاریک", + "settings.appearance.themes.system": "سیستم", + "settings.appearance.language": "زبان", + "settings.appearance.languageDescription": "یک زبان برای داشبورد خود انتخاب کنید" +} diff --git a/apps/dokploy/public/locales/fr/common.json b/apps/dokploy/public/locales/fr/common.json index 4e35087a..0967ef42 100644 --- a/apps/dokploy/public/locales/fr/common.json +++ b/apps/dokploy/public/locales/fr/common.json @@ -1,41 +1 @@ -{ - "settings.common.save": "Sauvegarder", - "settings.server.domain.title": "Nom de domaine du serveur", - "settings.server.domain.description": "Ajouter un nom de domaine au serveur de votre application.", - "settings.server.domain.form.domain": "Domaine", - "settings.server.domain.form.letsEncryptEmail": "Adresse email Let's Encrypt", - "settings.server.domain.form.certificate.label": "Certificat", - "settings.server.domain.form.certificate.placeholder": "Choisir un certificat", - "settings.server.domain.form.certificateOptions.none": "Aucun", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Par défaut)", - "settings.server.webServer.title": "Serveur web", - "settings.server.webServer.description": "Recharger ou nettoyer le serveur web.", - "settings.server.webServer.actions": "Actions", - "settings.server.webServer.reload": "Recharger", - "settings.server.webServer.watchLogs": "Consulter les logs", - "settings.server.webServer.updateServerIp": "Mettre à jour l'IP du serveur", - "settings.server.webServer.server.label": "Serveur", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Modifier les variables d'environnement", - "settings.server.webServer.storage.label": "Stockage", - "settings.server.webServer.storage.cleanUnusedImages": "Supprimer les images inutilisées", - "settings.server.webServer.storage.cleanUnusedVolumes": "Supprimer les volumes inutilisés", - "settings.server.webServer.storage.cleanStoppedContainers": "Supprimer les conteneurs arrêtés", - "settings.server.webServer.storage.cleanDockerBuilder": "Nettoyer le Docker Builder & System", - "settings.server.webServer.storage.cleanMonitoring": "Nettoyer le monitoring", - "settings.server.webServer.storage.cleanAll": "Tout nettoyer", - "settings.profile.title": "Compte", - "settings.profile.description": "Modifier les informations de votre compte ici.", - "settings.profile.email": "Adresse Email", - "settings.profile.password": "Mot de passe", - "settings.profile.avatar": "Photo de profil", - "settings.appearance.title": "Apparence", - "settings.appearance.description": "Customiser le thème de votre dashboard.", - "settings.appearance.theme": "Thème", - "settings.appearance.themeDescription": "Choisir un thème pour votre dashboard", - "settings.appearance.themes.light": "Clair", - "settings.appearance.themes.dark": "Sombre", - "settings.appearance.themes.system": "Système", - "settings.appearance.language": "Langue", - "settings.appearance.languageDescription": "Sélectionner une langue pour votre dashboard" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/fr/settings.json b/apps/dokploy/public/locales/fr/settings.json new file mode 100644 index 00000000..8901cf1f --- /dev/null +++ b/apps/dokploy/public/locales/fr/settings.json @@ -0,0 +1,44 @@ +{ + "settings.common.save": "Sauvegarder", + "settings.server.domain.title": "Nom de domaine du serveur", + "settings.server.domain.description": "Ajouter un nom de domaine au serveur de votre application.", + "settings.server.domain.form.domain": "Domaine", + "settings.server.domain.form.letsEncryptEmail": "Adresse email Let's Encrypt", + "settings.server.domain.form.certificate.label": "Certificat", + "settings.server.domain.form.certificate.placeholder": "Choisir un certificat", + "settings.server.domain.form.certificateOptions.none": "Aucun", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Par défaut)", + + "settings.server.webServer.title": "Serveur web", + "settings.server.webServer.description": "Recharger ou nettoyer le serveur web.", + "settings.server.webServer.actions": "Actions", + "settings.server.webServer.reload": "Recharger", + "settings.server.webServer.watchLogs": "Consulter les logs", + "settings.server.webServer.updateServerIp": "Mettre à jour l'IP du serveur", + "settings.server.webServer.server.label": "Serveur", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Modifier les variables d'environnement", + "settings.server.webServer.storage.label": "Stockage", + "settings.server.webServer.storage.cleanUnusedImages": "Supprimer les images inutilisées", + "settings.server.webServer.storage.cleanUnusedVolumes": "Supprimer les volumes inutilisés", + "settings.server.webServer.storage.cleanStoppedContainers": "Supprimer les conteneurs arrêtés", + "settings.server.webServer.storage.cleanDockerBuilder": "Nettoyer le Docker Builder & System", + "settings.server.webServer.storage.cleanMonitoring": "Nettoyer le monitoring", + "settings.server.webServer.storage.cleanAll": "Tout nettoyer", + + "settings.profile.title": "Compte", + "settings.profile.description": "Modifier les informations de votre compte ici.", + "settings.profile.email": "Adresse Email", + "settings.profile.password": "Mot de passe", + "settings.profile.avatar": "Photo de profil", + + "settings.appearance.title": "Apparence", + "settings.appearance.description": "Customiser le thème de votre dashboard.", + "settings.appearance.theme": "Thème", + "settings.appearance.themeDescription": "Choisir un thème pour votre dashboard", + "settings.appearance.themes.light": "Clair", + "settings.appearance.themes.dark": "Sombre", + "settings.appearance.themes.system": "Système", + "settings.appearance.language": "Langue", + "settings.appearance.languageDescription": "Sélectionner une langue pour votre dashboard" +} diff --git a/apps/dokploy/public/locales/id/common.json b/apps/dokploy/public/locales/id/common.json index 2ebfb1d8..0967ef42 100644 --- a/apps/dokploy/public/locales/id/common.json +++ b/apps/dokploy/public/locales/id/common.json @@ -1,54 +1 @@ -{ - "settings.common.save": "Simpan", - "settings.common.enterTerminal": "Buka Terminal", - "settings.server.domain.title": "Domain Server", - "settings.server.domain.description": "Tambahkan domain ke aplikasi server anda.", - "settings.server.domain.form.domain": "Domain", - "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt", - "settings.server.domain.form.certificate.label": "Penyedia Sertifikat", - "settings.server.domain.form.certificate.placeholder": "Pilih sertifikat", - "settings.server.domain.form.certificateOptions.none": "Tidak ada", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - "settings.server.webServer.title": "Server Web", - "settings.server.webServer.description": "Muat ulang atau bersihkan server web.", - "settings.server.webServer.actions": "Opsi", - "settings.server.webServer.reload": "Muat ulang", - "settings.server.webServer.watchLogs": "Lihat log", - "settings.server.webServer.updateServerIp": "Perbarui IP Server", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Ubah Environment", - "settings.server.webServer.traefik.managePorts": "Pengaturan Port Tambahan", - "settings.server.webServer.traefik.managePortsDescription": "Tambahkan atau hapus port tambahan untuk Traefik", - "settings.server.webServer.traefik.targetPort": "Port Tujuan", - "settings.server.webServer.traefik.publishedPort": "Port saai ini", - "settings.server.webServer.traefik.addPort": "Tambah Port", - "settings.server.webServer.traefik.portsUpdated": "Port berhasil diperbarui", - "settings.server.webServer.traefik.portsUpdateError": "Gagal memperbarui Port", - "settings.server.webServer.traefik.publishMode": "Pilihan mode Port", - "settings.server.webServer.storage.label": "Penyimpanan", - "settings.server.webServer.storage.cleanUnusedImages": "Hapus Image tidak terpakai", - "settings.server.webServer.storage.cleanUnusedVolumes": "Hapus Volume tidak terpakai", - "settings.server.webServer.storage.cleanStoppedContainers": "Hapus Container tidak aktif", - "settings.server.webServer.storage.cleanDockerBuilder": "Bersihkan Docker Builder & System", - "settings.server.webServer.storage.cleanMonitoring": "Bersihkan Monitoring", - "settings.server.webServer.storage.cleanAll": "Bersihkan", - "settings.profile.title": "Akun", - "settings.profile.description": "Ubah detail profil Anda di sini.", - "settings.profile.email": "Email", - "settings.profile.password": "Kata Sandi", - "settings.profile.avatar": "Avatar", - "settings.appearance.title": "Tampilan", - "settings.appearance.description": "Sesuaikan tema dasbor Anda.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Pilih tema untuk dasbor Anda", - "settings.appearance.themes.light": "Terang", - "settings.appearance.themes.dark": "Gelap", - "settings.appearance.themes.system": "Sistem", - "settings.appearance.language": "Bahasa", - "settings.appearance.languageDescription": "Pilih bahasa untuk dasbor Anda", - "settings.terminal.connectionSettings": "Pengaturan koneksi", - "settings.terminal.ipAddress": "Alamat IP", - "settings.terminal.port": "Port", - "settings.terminal.username": "Username" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/id/settings.json b/apps/dokploy/public/locales/id/settings.json new file mode 100644 index 00000000..489ddc01 --- /dev/null +++ b/apps/dokploy/public/locales/id/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "Simpan", + "settings.common.enterTerminal": "Buka Terminal", + "settings.server.domain.title": "Domain Server", + "settings.server.domain.description": "Tambahkan domain ke aplikasi server anda.", + "settings.server.domain.form.domain": "Domain", + "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt", + "settings.server.domain.form.certificate.label": "Penyedia Sertifikat", + "settings.server.domain.form.certificate.placeholder": "Pilih sertifikat", + "settings.server.domain.form.certificateOptions.none": "Tidak ada", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "Server Web", + "settings.server.webServer.description": "Muat ulang atau bersihkan server web.", + "settings.server.webServer.actions": "Opsi", + "settings.server.webServer.reload": "Muat ulang", + "settings.server.webServer.watchLogs": "Lihat log", + "settings.server.webServer.updateServerIp": "Perbarui IP Server", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Ubah Environment", + "settings.server.webServer.traefik.managePorts": "Pengaturan Port Tambahan", + "settings.server.webServer.traefik.managePortsDescription": "Tambahkan atau hapus port tambahan untuk Traefik", + "settings.server.webServer.traefik.targetPort": "Port Tujuan", + "settings.server.webServer.traefik.publishedPort": "Port saai ini", + "settings.server.webServer.traefik.addPort": "Tambah Port", + "settings.server.webServer.traefik.portsUpdated": "Port berhasil diperbarui", + "settings.server.webServer.traefik.portsUpdateError": "Gagal memperbarui Port", + "settings.server.webServer.traefik.publishMode": "Pilihan mode Port", + "settings.server.webServer.storage.label": "Penyimpanan", + "settings.server.webServer.storage.cleanUnusedImages": "Hapus Image tidak terpakai", + "settings.server.webServer.storage.cleanUnusedVolumes": "Hapus Volume tidak terpakai", + "settings.server.webServer.storage.cleanStoppedContainers": "Hapus Container tidak aktif", + "settings.server.webServer.storage.cleanDockerBuilder": "Bersihkan Docker Builder & System", + "settings.server.webServer.storage.cleanMonitoring": "Bersihkan Monitoring", + "settings.server.webServer.storage.cleanAll": "Bersihkan", + + "settings.profile.title": "Akun", + "settings.profile.description": "Ubah detail profil Anda di sini.", + "settings.profile.email": "Email", + "settings.profile.password": "Kata Sandi", + "settings.profile.avatar": "Avatar", + + "settings.appearance.title": "Tampilan", + "settings.appearance.description": "Sesuaikan tema dasbor Anda.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Pilih tema untuk dasbor Anda", + "settings.appearance.themes.light": "Terang", + "settings.appearance.themes.dark": "Gelap", + "settings.appearance.themes.system": "Sistem", + "settings.appearance.language": "Bahasa", + "settings.appearance.languageDescription": "Pilih bahasa untuk dasbor Anda", + + "settings.terminal.connectionSettings": "Pengaturan koneksi", + "settings.terminal.ipAddress": "Alamat IP", + "settings.terminal.port": "Port", + "settings.terminal.username": "Username" +} diff --git a/apps/dokploy/public/locales/it/common.json b/apps/dokploy/public/locales/it/common.json index 28e71cd3..0967ef42 100644 --- a/apps/dokploy/public/locales/it/common.json +++ b/apps/dokploy/public/locales/it/common.json @@ -1,41 +1 @@ -{ - "settings.common.save": "Salva", - "settings.server.domain.title": "Dominio del server", - "settings.server.domain.description": "Aggiungi un dominio alla tua applicazione server.", - "settings.server.domain.form.domain": "Dominio", - "settings.server.domain.form.letsEncryptEmail": "Email di Let's Encrypt", - "settings.server.domain.form.certificate.label": "Certificato", - "settings.server.domain.form.certificate.placeholder": "Seleziona un certificato", - "settings.server.domain.form.certificateOptions.none": "Nessuno", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Predefinito)", - "settings.server.webServer.title": "Server Web", - "settings.server.webServer.description": "Ricarica o pulisci il server web.", - "settings.server.webServer.actions": "Azioni", - "settings.server.webServer.reload": "Ricarica", - "settings.server.webServer.watchLogs": "Guarda i log", - "settings.server.webServer.updateServerIp": "Aggiorna IP del server", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Modifica Env", - "settings.server.webServer.storage.label": "Spazio", - "settings.server.webServer.storage.cleanUnusedImages": "Pulisci immagini inutilizzate", - "settings.server.webServer.storage.cleanUnusedVolumes": "Pulisci volumi inutilizzati", - "settings.server.webServer.storage.cleanStoppedContainers": "Pulisci container fermati", - "settings.server.webServer.storage.cleanDockerBuilder": "Pulisci Docker Builder e sistema", - "settings.server.webServer.storage.cleanMonitoring": "Pulisci monitoraggio", - "settings.server.webServer.storage.cleanAll": "Pulisci tutto", - "settings.profile.title": "Account", - "settings.profile.description": "Modifica i dettagli del tuo profilo qui.", - "settings.profile.email": "Email", - "settings.profile.password": "Password", - "settings.profile.avatar": "Avatar", - "settings.appearance.title": "Aspetto", - "settings.appearance.description": "Personalizza il tema della tua dashboard.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Seleziona un tema per la tua dashboard", - "settings.appearance.themes.light": "Chiaro", - "settings.appearance.themes.dark": "Scuro", - "settings.appearance.themes.system": "Sistema", - "settings.appearance.language": "Lingua", - "settings.appearance.languageDescription": "Seleziona una lingua per la tua dashboard" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/it/settings.json b/apps/dokploy/public/locales/it/settings.json new file mode 100644 index 00000000..6280e44e --- /dev/null +++ b/apps/dokploy/public/locales/it/settings.json @@ -0,0 +1,44 @@ +{ + "settings.common.save": "Salva", + "settings.server.domain.title": "Dominio del server", + "settings.server.domain.description": "Aggiungi un dominio alla tua applicazione server.", + "settings.server.domain.form.domain": "Dominio", + "settings.server.domain.form.letsEncryptEmail": "Email di Let's Encrypt", + "settings.server.domain.form.certificate.label": "Certificato", + "settings.server.domain.form.certificate.placeholder": "Seleziona un certificato", + "settings.server.domain.form.certificateOptions.none": "Nessuno", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Predefinito)", + + "settings.server.webServer.title": "Server Web", + "settings.server.webServer.description": "Ricarica o pulisci il server web.", + "settings.server.webServer.actions": "Azioni", + "settings.server.webServer.reload": "Ricarica", + "settings.server.webServer.watchLogs": "Guarda i log", + "settings.server.webServer.updateServerIp": "Aggiorna IP del server", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Modifica Env", + "settings.server.webServer.storage.label": "Spazio", + "settings.server.webServer.storage.cleanUnusedImages": "Pulisci immagini inutilizzate", + "settings.server.webServer.storage.cleanUnusedVolumes": "Pulisci volumi inutilizzati", + "settings.server.webServer.storage.cleanStoppedContainers": "Pulisci container fermati", + "settings.server.webServer.storage.cleanDockerBuilder": "Pulisci Docker Builder e sistema", + "settings.server.webServer.storage.cleanMonitoring": "Pulisci monitoraggio", + "settings.server.webServer.storage.cleanAll": "Pulisci tutto", + + "settings.profile.title": "Account", + "settings.profile.description": "Modifica i dettagli del tuo profilo qui.", + "settings.profile.email": "Email", + "settings.profile.password": "Password", + "settings.profile.avatar": "Avatar", + + "settings.appearance.title": "Aspetto", + "settings.appearance.description": "Personalizza il tema della tua dashboard.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Seleziona un tema per la tua dashboard", + "settings.appearance.themes.light": "Chiaro", + "settings.appearance.themes.dark": "Scuro", + "settings.appearance.themes.system": "Sistema", + "settings.appearance.language": "Lingua", + "settings.appearance.languageDescription": "Seleziona una lingua per la tua dashboard" +} diff --git a/apps/dokploy/public/locales/ja/common.json b/apps/dokploy/public/locales/ja/common.json index 9403e247..0967ef42 100644 --- a/apps/dokploy/public/locales/ja/common.json +++ b/apps/dokploy/public/locales/ja/common.json @@ -1,41 +1 @@ -{ - "settings.common.save": "保存", - "settings.server.domain.title": "サーバードメイン", - "settings.server.domain.description": "サーバーアプリケーションにドメインを追加", - "settings.server.domain.form.domain": "ドメイン", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt メールアドレス", - "settings.server.domain.form.certificate.label": "証明書", - "settings.server.domain.form.certificate.placeholder": "証明書を選択", - "settings.server.domain.form.certificateOptions.none": "なし", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (デフォルト)", - "settings.server.webServer.title": "ウェブサーバー", - "settings.server.webServer.description": "ウェブサーバーをリロードまたはクリーンアップします", - "settings.server.webServer.actions": "アクション", - "settings.server.webServer.reload": "リロード", - "settings.server.webServer.watchLogs": "ログを監視", - "settings.server.webServer.updateServerIp": "サーバーIPを更新", - "settings.server.webServer.server.label": "サーバー", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "環境設定を変更", - "settings.server.webServer.storage.label": "ストレージ", - "settings.server.webServer.storage.cleanUnusedImages": "未使用のイメージを削除", - "settings.server.webServer.storage.cleanUnusedVolumes": "未使用のボリュームを削除", - "settings.server.webServer.storage.cleanStoppedContainers": "停止中のコンテナを削除", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker ビルダー&システムをクリーンアップ", - "settings.server.webServer.storage.cleanMonitoring": "モニタリングをクリーンアップ", - "settings.server.webServer.storage.cleanAll": "すべてをクリーンアップ", - "settings.profile.title": "アカウント", - "settings.profile.description": "ここでプロフィールの詳細を変更できます", - "settings.profile.email": "メールアドレス", - "settings.profile.password": "パスワード", - "settings.profile.avatar": "アバター", - "settings.appearance.title": "外観", - "settings.appearance.description": "ダッシュボードのテーマをカスタマイズ", - "settings.appearance.theme": "テーマ", - "settings.appearance.themeDescription": "ダッシュボードのテーマを選択してください", - "settings.appearance.themes.light": "ライト", - "settings.appearance.themes.dark": "ダーク", - "settings.appearance.themes.system": "システム", - "settings.appearance.language": "言語", - "settings.appearance.languageDescription": "ダッシュボードの言語を選択してください" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/ja/settings.json b/apps/dokploy/public/locales/ja/settings.json new file mode 100644 index 00000000..757586b7 --- /dev/null +++ b/apps/dokploy/public/locales/ja/settings.json @@ -0,0 +1,44 @@ +{ + "settings.common.save": "保存", + "settings.server.domain.title": "サーバードメイン", + "settings.server.domain.description": "サーバーアプリケーションにドメインを追加", + "settings.server.domain.form.domain": "ドメイン", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt メールアドレス", + "settings.server.domain.form.certificate.label": "証明書", + "settings.server.domain.form.certificate.placeholder": "証明書を選択", + "settings.server.domain.form.certificateOptions.none": "なし", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (デフォルト)", + + "settings.server.webServer.title": "ウェブサーバー", + "settings.server.webServer.description": "ウェブサーバーをリロードまたはクリーンアップします", + "settings.server.webServer.actions": "アクション", + "settings.server.webServer.reload": "リロード", + "settings.server.webServer.watchLogs": "ログを監視", + "settings.server.webServer.updateServerIp": "サーバーIPを更新", + "settings.server.webServer.server.label": "サーバー", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "環境設定を変更", + "settings.server.webServer.storage.label": "ストレージ", + "settings.server.webServer.storage.cleanUnusedImages": "未使用のイメージを削除", + "settings.server.webServer.storage.cleanUnusedVolumes": "未使用のボリュームを削除", + "settings.server.webServer.storage.cleanStoppedContainers": "停止中のコンテナを削除", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker ビルダー&システムをクリーンアップ", + "settings.server.webServer.storage.cleanMonitoring": "モニタリングをクリーンアップ", + "settings.server.webServer.storage.cleanAll": "すべてをクリーンアップ", + + "settings.profile.title": "アカウント", + "settings.profile.description": "ここでプロフィールの詳細を変更できます", + "settings.profile.email": "メールアドレス", + "settings.profile.password": "パスワード", + "settings.profile.avatar": "アバター", + + "settings.appearance.title": "外観", + "settings.appearance.description": "ダッシュボードのテーマをカスタマイズ", + "settings.appearance.theme": "テーマ", + "settings.appearance.themeDescription": "ダッシュボードのテーマを選択してください", + "settings.appearance.themes.light": "ライト", + "settings.appearance.themes.dark": "ダーク", + "settings.appearance.themes.system": "システム", + "settings.appearance.language": "言語", + "settings.appearance.languageDescription": "ダッシュボードの言語を選択してください" +} diff --git a/apps/dokploy/public/locales/ko/common.json b/apps/dokploy/public/locales/ko/common.json index 7ef3ea85..0967ef42 100644 --- a/apps/dokploy/public/locales/ko/common.json +++ b/apps/dokploy/public/locales/ko/common.json @@ -1,41 +1 @@ -{ - "settings.common.save": "저장", - "settings.server.domain.title": "서버 도메인", - "settings.server.domain.description": "서버 애플리케이션에 도메인을 추가합니다.", - "settings.server.domain.form.domain": "도메인", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 이메일", - "settings.server.domain.form.certificate.label": "인증서", - "settings.server.domain.form.certificate.placeholder": "인증서 선택", - "settings.server.domain.form.certificateOptions.none": "없음", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (기본)", - "settings.server.webServer.title": "웹 서버", - "settings.server.webServer.description": "웹 서버를 재시작하거나 정리합니다.", - "settings.server.webServer.actions": "작업", - "settings.server.webServer.reload": "재시작", - "settings.server.webServer.watchLogs": "로그 보기", - "settings.server.webServer.updateServerIp": "서버 IP 갱신", - "settings.server.webServer.server.label": "서버", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "환경 변수 수정", - "settings.server.webServer.storage.label": "저장 공간", - "settings.server.webServer.storage.cleanUnusedImages": "사용하지 않는 이미지 정리", - "settings.server.webServer.storage.cleanUnusedVolumes": "사용하지 않는 볼륨 정리", - "settings.server.webServer.storage.cleanStoppedContainers": "정지된 컨테이너 정리", - "settings.server.webServer.storage.cleanDockerBuilder": "도커 빌더 & 시스템 정리", - "settings.server.webServer.storage.cleanMonitoring": "모니터링 데이터 정리", - "settings.server.webServer.storage.cleanAll": "전체 정리", - "settings.profile.title": "계정", - "settings.profile.description": "여기에서 프로필 세부 정보를 변경하세요.", - "settings.profile.email": "이메일", - "settings.profile.password": "비밀번호", - "settings.profile.avatar": "아바타", - "settings.appearance.title": "외관", - "settings.appearance.description": "대시보드의 테마를 사용자 설정합니다.", - "settings.appearance.theme": "테마", - "settings.appearance.themeDescription": "대시보드 테마 선택", - "settings.appearance.themes.light": "라이트", - "settings.appearance.themes.dark": "다크", - "settings.appearance.themes.system": "시스템", - "settings.appearance.language": "언어", - "settings.appearance.languageDescription": "대시보드에서 사용할 언어 선택" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/ko/settings.json b/apps/dokploy/public/locales/ko/settings.json new file mode 100644 index 00000000..db877ee6 --- /dev/null +++ b/apps/dokploy/public/locales/ko/settings.json @@ -0,0 +1,44 @@ +{ + "settings.common.save": "저장", + "settings.server.domain.title": "서버 도메인", + "settings.server.domain.description": "서버 애플리케이션에 도메인을 추가합니다.", + "settings.server.domain.form.domain": "도메인", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 이메일", + "settings.server.domain.form.certificate.label": "인증서", + "settings.server.domain.form.certificate.placeholder": "인증서 선택", + "settings.server.domain.form.certificateOptions.none": "없음", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (기본)", + + "settings.server.webServer.title": "웹 서버", + "settings.server.webServer.description": "웹 서버를 재시작하거나 정리합니다.", + "settings.server.webServer.actions": "작업", + "settings.server.webServer.reload": "재시작", + "settings.server.webServer.watchLogs": "로그 보기", + "settings.server.webServer.updateServerIp": "서버 IP 갱신", + "settings.server.webServer.server.label": "서버", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "환경 변수 수정", + "settings.server.webServer.storage.label": "저장 공간", + "settings.server.webServer.storage.cleanUnusedImages": "사용하지 않는 이미지 정리", + "settings.server.webServer.storage.cleanUnusedVolumes": "사용하지 않는 볼륨 정리", + "settings.server.webServer.storage.cleanStoppedContainers": "정지된 컨테이너 정리", + "settings.server.webServer.storage.cleanDockerBuilder": "도커 빌더 & 시스템 정리", + "settings.server.webServer.storage.cleanMonitoring": "모니터링 데이터 정리", + "settings.server.webServer.storage.cleanAll": "전체 정리", + + "settings.profile.title": "계정", + "settings.profile.description": "여기에서 프로필 세부 정보를 변경하세요.", + "settings.profile.email": "이메일", + "settings.profile.password": "비밀번호", + "settings.profile.avatar": "아바타", + + "settings.appearance.title": "외관", + "settings.appearance.description": "대시보드의 테마를 사용자 설정합니다.", + "settings.appearance.theme": "테마", + "settings.appearance.themeDescription": "대시보드 테마 선택", + "settings.appearance.themes.light": "라이트", + "settings.appearance.themes.dark": "다크", + "settings.appearance.themes.system": "시스템", + "settings.appearance.language": "언어", + "settings.appearance.languageDescription": "대시보드에서 사용할 언어 선택" +} diff --git a/apps/dokploy/public/locales/kz/common.json b/apps/dokploy/public/locales/kz/common.json index 500564fd..0967ef42 100644 --- a/apps/dokploy/public/locales/kz/common.json +++ b/apps/dokploy/public/locales/kz/common.json @@ -1,41 +1 @@ -{ - "settings.common.save": "Сақтау", - "settings.server.domain.title": "Сервер домені", - "settings.server.domain.description": "Dokploy сервер қолданбасына домен енгізіңіз.", - "settings.server.domain.form.domain": "Домен", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Эл. поштасы", - "settings.server.domain.form.certificate.label": "Сертификат", - "settings.server.domain.form.certificate.placeholder": "Сертификатты таңдаңыз", - "settings.server.domain.form.certificateOptions.none": "Жоқ", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Стандартты)", - "settings.server.webServer.title": "Веб-Сервер", - "settings.server.webServer.description": "Веб-серверді қайта жүктеу немесе тазалау.", - "settings.server.webServer.actions": "Әрекеттер", - "settings.server.webServer.reload": "Қайта жүктеу", - "settings.server.webServer.watchLogs": "Журналдарды қарау", - "settings.server.webServer.updateServerIp": "Сервердің IP жаңарту", - "settings.server.webServer.server.label": "Сервер", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Env Өзгерту", - "settings.server.webServer.storage.label": "Диск кеңістігі", - "settings.server.webServer.storage.cleanUnusedImages": "Пайдаланылмаған образды тазалау", - "settings.server.webServer.storage.cleanUnusedVolumes": "Пайдаланылмаған томды тазалау", - "settings.server.webServer.storage.cleanStoppedContainers": "Тоқтатылған контейнерлерді тазалау", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & Системаны тазалау", - "settings.server.webServer.storage.cleanMonitoring": "Мониторингті тазалау", - "settings.server.webServer.storage.cleanAll": "Барлығын тазалау", - "settings.profile.title": "Аккаунт", - "settings.profile.description": "Профиль мәліметтерін осы жерден өзгертіңіз.", - "settings.profile.email": "Эл. пошта", - "settings.profile.password": "Құпия сөз", - "settings.profile.avatar": "Аватар", - "settings.appearance.title": "Сыртқы түрі", - "settings.appearance.description": "Dokploy сыртқы келбетін өзгерту.", - "settings.appearance.theme": "Келбеті", - "settings.appearance.themeDescription": "Жүйе тақтасының келбетің таңдаңыз", - "settings.appearance.themes.light": "Жарық", - "settings.appearance.themes.dark": "Қараңғы", - "settings.appearance.themes.system": "Жүйелік", - "settings.appearance.language": "Тіл", - "settings.appearance.languageDescription": "Жүйе тақтасының тілің таңдаңыз" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/kz/settings.json b/apps/dokploy/public/locales/kz/settings.json new file mode 100644 index 00000000..bf8f4137 --- /dev/null +++ b/apps/dokploy/public/locales/kz/settings.json @@ -0,0 +1,41 @@ +{ + "settings.common.save": "Сақтау", + "settings.server.domain.title": "Сервер домені", + "settings.server.domain.description": "Dokploy сервер қолданбасына домен енгізіңіз.", + "settings.server.domain.form.domain": "Домен", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Эл. поштасы", + "settings.server.domain.form.certificate.label": "Сертификат", + "settings.server.domain.form.certificate.placeholder": "Сертификатты таңдаңыз", + "settings.server.domain.form.certificateOptions.none": "Жоқ", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Стандартты)", + "settings.server.webServer.title": "Веб-Сервер", + "settings.server.webServer.description": "Веб-серверді қайта жүктеу немесе тазалау.", + "settings.server.webServer.actions": "Әрекеттер", + "settings.server.webServer.reload": "Қайта жүктеу", + "settings.server.webServer.watchLogs": "Журналдарды қарау", + "settings.server.webServer.updateServerIp": "Сервердің IP жаңарту", + "settings.server.webServer.server.label": "Сервер", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Env Өзгерту", + "settings.server.webServer.storage.label": "Диск кеңістігі", + "settings.server.webServer.storage.cleanUnusedImages": "Пайдаланылмаған образды тазалау", + "settings.server.webServer.storage.cleanUnusedVolumes": "Пайдаланылмаған томды тазалау", + "settings.server.webServer.storage.cleanStoppedContainers": "Тоқтатылған контейнерлерді тазалау", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder & Системаны тазалау", + "settings.server.webServer.storage.cleanMonitoring": "Мониторингті тазалау", + "settings.server.webServer.storage.cleanAll": "Барлығын тазалау", + "settings.profile.title": "Аккаунт", + "settings.profile.description": "Профиль мәліметтерін осы жерден өзгертіңіз.", + "settings.profile.email": "Эл. пошта", + "settings.profile.password": "Құпия сөз", + "settings.profile.avatar": "Аватар", + "settings.appearance.title": "Сыртқы түрі", + "settings.appearance.description": "Dokploy сыртқы келбетін өзгерту.", + "settings.appearance.theme": "Келбеті", + "settings.appearance.themeDescription": "Жүйе тақтасының келбетің таңдаңыз", + "settings.appearance.themes.light": "Жарық", + "settings.appearance.themes.dark": "Қараңғы", + "settings.appearance.themes.system": "Жүйелік", + "settings.appearance.language": "Тіл", + "settings.appearance.languageDescription": "Жүйе тақтасының тілің таңдаңыз" +} diff --git a/apps/dokploy/public/locales/ml/common.json b/apps/dokploy/public/locales/ml/common.json index a9651f34..0967ef42 100644 --- a/apps/dokploy/public/locales/ml/common.json +++ b/apps/dokploy/public/locales/ml/common.json @@ -1,54 +1 @@ -{ - "settings.common.save": "സേവ് ചെയ്യുക", - "settings.common.enterTerminal": "ടർമിനലിൽ പ്രവേശിക്കുക", - "settings.server.domain.title": "സർവർ ഡോമെയ്ൻ", - "settings.server.domain.description": "നിങ്ങളുടെ സർവർ അപ്ലിക്കേഷനിൽ ഒരു ഡോമെയ്ൻ ചേർക്കുക.", - "settings.server.domain.form.domain": "ഡോമെയ്ൻ", - "settings.server.domain.form.letsEncryptEmail": "ലെറ്റ്സ് എൻക്രിപ്റ്റ് ഇമെയിൽ", - "settings.server.domain.form.certificate.label": "സർട്ടിഫിക്കറ്റ് പ്രൊവൈഡർ", - "settings.server.domain.form.certificate.placeholder": "ഒരു സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുക", - "settings.server.domain.form.certificateOptions.none": "ഒന്നുമില്ല", - "settings.server.domain.form.certificateOptions.letsencrypt": "ലെറ്റ്സ് എൻക്രിപ്റ്റ്", - "settings.server.webServer.title": "വെബ് സർവർ", - "settings.server.webServer.description": "വെബ് സർവർ റീലോഡ് ചെയ്യുക അല്ലെങ്കിൽ ശുചീകരിക്കുക.", - "settings.server.webServer.actions": "നടപടികൾ", - "settings.server.webServer.reload": "റീലോഡ് ചെയ്യുക", - "settings.server.webServer.watchLogs": "ലോഗുകൾ കാണുക", - "settings.server.webServer.updateServerIp": "സർവർ IP അപ്ഡേറ്റ് ചെയ്യുക", - "settings.server.webServer.server.label": "സർവർ", - "settings.server.webServer.traefik.label": "ട്രാഫിക്", - "settings.server.webServer.traefik.modifyEnv": "ചുറ്റുപാടുകൾ മാറ്റുക", - "settings.server.webServer.traefik.managePorts": "അധിക പോർട്ട് മാപ്പിംഗ്", - "settings.server.webServer.traefik.managePortsDescription": "ട്രാഫിക്കിനായി അധിക പോർട്ടുകൾ ചേർക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക", - "settings.server.webServer.traefik.targetPort": "ടാർഗറ്റ് പോർട്ട്", - "settings.server.webServer.traefik.publishedPort": "പ്രസിദ്ധീകരിച്ച പോർട്ട്", - "settings.server.webServer.traefik.addPort": "പോർട്ട് ചേർക്കുക", - "settings.server.webServer.traefik.portsUpdated": "പോർട്ടുകൾ വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", - "settings.server.webServer.traefik.portsUpdateError": "പോർട്ടുകൾ അപ്ഡേറ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു", - "settings.server.webServer.traefik.publishMode": "പ്രസിദ്ധീകരണ മോഡ്", - "settings.server.webServer.storage.label": "ഇടം", - "settings.server.webServer.storage.cleanUnusedImages": "ഉപയോഗിക്കാത്ത ഇമേജുകൾ ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanUnusedVolumes": "ഉപയോഗിക്കാത്ത വോള്യങ്ങൾ ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanStoppedContainers": "നിർത്തിയ കണ്ടെയ്‌നറുകൾ ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanDockerBuilder": "ഡോക്കർ ബിൽഡറും സിസ്റ്റവും ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanMonitoring": "മോണിറ്ററിംഗ് ശുചീകരിക്കുക", - "settings.server.webServer.storage.cleanAll": "എല്ലാം ശുചീകരിക്കുക", - "settings.profile.title": "അക്കൗണ്ട്", - "settings.profile.description": "നിങ്ങളുടെ പ്രൊഫൈൽ വിശദാംശങ്ങൾ ഇവിടെ മാറ്റുക.", - "settings.profile.email": "ഇമെയിൽ", - "settings.profile.password": "പാസ്വേഡ്", - "settings.profile.avatar": "അവതാർ", - "settings.appearance.title": "ദൃശ്യമാനം", - "settings.appearance.description": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന്റെ തീം ഇഷ്ടാനുസൃതമാക്കുക.", - "settings.appearance.theme": "തീം", - "settings.appearance.themeDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു തീം തിരഞ്ഞെടുക്കുക", - "settings.appearance.themes.light": "ലൈറ്റ്", - "settings.appearance.themes.dark": "ഡാർക്ക്", - "settings.appearance.themes.system": "സിസ്റ്റം", - "settings.appearance.language": "ഭാഷ", - "settings.appearance.languageDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക", - "settings.terminal.connectionSettings": "കണക്ഷൻ ക്രമീകരണങ്ങൾ", - "settings.terminal.ipAddress": "IP വിലാസം", - "settings.terminal.port": "പോർട്ട്", - "settings.terminal.username": "ഉപയോക്തൃനാമം" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/ml/settings.json b/apps/dokploy/public/locales/ml/settings.json new file mode 100644 index 00000000..cb62b6ec --- /dev/null +++ b/apps/dokploy/public/locales/ml/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "സേവ് ചെയ്യുക", + "settings.common.enterTerminal": "ടർമിനലിൽ പ്രവേശിക്കുക", + "settings.server.domain.title": "സർവർ ഡോമെയ്ൻ", + "settings.server.domain.description": "നിങ്ങളുടെ സർവർ അപ്ലിക്കേഷനിൽ ഒരു ഡോമെയ്ൻ ചേർക്കുക.", + "settings.server.domain.form.domain": "ഡോമെയ്ൻ", + "settings.server.domain.form.letsEncryptEmail": "ലെറ്റ്സ് എൻക്രിപ്റ്റ് ഇമെയിൽ", + "settings.server.domain.form.certificate.label": "സർട്ടിഫിക്കറ്റ് പ്രൊവൈഡർ", + "settings.server.domain.form.certificate.placeholder": "ഒരു സർട്ടിഫിക്കറ്റ് തിരഞ്ഞെടുക്കുക", + "settings.server.domain.form.certificateOptions.none": "ഒന്നുമില്ല", + "settings.server.domain.form.certificateOptions.letsencrypt": "ലെറ്റ്സ് എൻക്രിപ്റ്റ്", + + "settings.server.webServer.title": "വെബ് സർവർ", + "settings.server.webServer.description": "വെബ് സർവർ റീലോഡ് ചെയ്യുക അല്ലെങ്കിൽ ശുചീകരിക്കുക.", + "settings.server.webServer.actions": "നടപടികൾ", + "settings.server.webServer.reload": "റീലോഡ് ചെയ്യുക", + "settings.server.webServer.watchLogs": "ലോഗുകൾ കാണുക", + "settings.server.webServer.updateServerIp": "സർവർ IP അപ്ഡേറ്റ് ചെയ്യുക", + "settings.server.webServer.server.label": "സർവർ", + "settings.server.webServer.traefik.label": "ട്രാഫിക്", + "settings.server.webServer.traefik.modifyEnv": "ചുറ്റുപാടുകൾ മാറ്റുക", + "settings.server.webServer.traefik.managePorts": "അധിക പോർട്ട് മാപ്പിംഗ്", + "settings.server.webServer.traefik.managePortsDescription": "ട്രാഫിക്കിനായി അധിക പോർട്ടുകൾ ചേർക്കുക അല്ലെങ്കിൽ നീക്കം ചെയ്യുക", + "settings.server.webServer.traefik.targetPort": "ടാർഗറ്റ് പോർട്ട്", + "settings.server.webServer.traefik.publishedPort": "പ്രസിദ്ധീകരിച്ച പോർട്ട്", + "settings.server.webServer.traefik.addPort": "പോർട്ട് ചേർക്കുക", + "settings.server.webServer.traefik.portsUpdated": "പോർട്ടുകൾ വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", + "settings.server.webServer.traefik.portsUpdateError": "പോർട്ടുകൾ അപ്ഡേറ്റ് ചെയ്യാൻ പരാജയപ്പെട്ടു", + "settings.server.webServer.traefik.publishMode": "പ്രസിദ്ധീകരണ മോഡ്", + "settings.server.webServer.storage.label": "ഇടം", + "settings.server.webServer.storage.cleanUnusedImages": "ഉപയോഗിക്കാത്ത ഇമേജുകൾ ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanUnusedVolumes": "ഉപയോഗിക്കാത്ത വോള്യങ്ങൾ ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanStoppedContainers": "നിർത്തിയ കണ്ടെയ്‌നറുകൾ ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanDockerBuilder": "ഡോക്കർ ബിൽഡറും സിസ്റ്റവും ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanMonitoring": "മോണിറ്ററിംഗ് ശുചീകരിക്കുക", + "settings.server.webServer.storage.cleanAll": "എല്ലാം ശുചീകരിക്കുക", + + "settings.profile.title": "അക്കൗണ്ട്", + "settings.profile.description": "നിങ്ങളുടെ പ്രൊഫൈൽ വിശദാംശങ്ങൾ ഇവിടെ മാറ്റുക.", + "settings.profile.email": "ഇമെയിൽ", + "settings.profile.password": "പാസ്വേഡ്", + "settings.profile.avatar": "അവതാർ", + + "settings.appearance.title": "ദൃശ്യമാനം", + "settings.appearance.description": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന്റെ തീം ഇഷ്ടാനുസൃതമാക്കുക.", + "settings.appearance.theme": "തീം", + "settings.appearance.themeDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു തീം തിരഞ്ഞെടുക്കുക", + "settings.appearance.themes.light": "ലൈറ്റ്", + "settings.appearance.themes.dark": "ഡാർക്ക്", + "settings.appearance.themes.system": "സിസ്റ്റം", + "settings.appearance.language": "ഭാഷ", + "settings.appearance.languageDescription": "നിങ്ങളുടെ ഡാഷ്ബോർഡിന് ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക", + + "settings.terminal.connectionSettings": "കണക്ഷൻ ക്രമീകരണങ്ങൾ", + "settings.terminal.ipAddress": "IP വിലാസം", + "settings.terminal.port": "പോർട്ട്", + "settings.terminal.username": "ഉപയോക്തൃനാമം" +} diff --git a/apps/dokploy/public/locales/no/common.json b/apps/dokploy/public/locales/no/common.json index c68f4427..0967ef42 100644 --- a/apps/dokploy/public/locales/no/common.json +++ b/apps/dokploy/public/locales/no/common.json @@ -1,49 +1 @@ -{ - "settings.common.save": "Lagre", - "settings.server.domain.title": "Serverdomene", - "settings.server.domain.description": "Legg til et domene i serverapplikasjonen din.", - "settings.server.domain.form.domain": "Domene", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Epost", - "settings.server.domain.form.certificate.label": "Sertifikatleverandør", - "settings.server.domain.form.certificate.placeholder": "Velg et sertifikat", - "settings.server.domain.form.certificateOptions.none": "Ingen", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - "settings.server.webServer.title": "Webserver", - "settings.server.webServer.description": "Last på nytt eller rens webserveren.", - "settings.server.webServer.actions": "Handlinger", - "settings.server.webServer.reload": "Last på nytt", - "settings.server.webServer.watchLogs": "Se logger", - "settings.server.webServer.updateServerIp": "Oppdater server-IP", - "settings.server.webServer.server.label": "Server", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Endre miljø", - "settings.server.webServer.traefik.managePorts": "Ytterligere portkartlegginger", - "settings.server.webServer.traefik.managePortsDescription": "Legg til eller fjern flere porter for Traefik", - "settings.server.webServer.traefik.targetPort": "Målport", - "settings.server.webServer.traefik.publishedPort": "Publisert port", - "settings.server.webServer.traefik.addPort": "Legg til port", - "settings.server.webServer.traefik.portsUpdated": "Portene ble oppdatert", - "settings.server.webServer.traefik.portsUpdateError": "Kunne ikke oppdatere portene", - "settings.server.webServer.traefik.publishMode": "Publiseringsmodus", - "settings.server.webServer.storage.label": "Lagring", - "settings.server.webServer.storage.cleanUnusedImages": "Rens ubrukte bilder", - "settings.server.webServer.storage.cleanUnusedVolumes": "Rens ubrukte volumer", - "settings.server.webServer.storage.cleanStoppedContainers": "Rens stoppete containere", - "settings.server.webServer.storage.cleanDockerBuilder": "Rens Docker Builder og System", - "settings.server.webServer.storage.cleanMonitoring": "Rens overvåking", - "settings.server.webServer.storage.cleanAll": "Rens alt", - "settings.profile.title": "Konto", - "settings.profile.description": "Endre detaljene for profilen din her.", - "settings.profile.email": "Epost", - "settings.profile.password": "Passord", - "settings.profile.avatar": "Avatar", - "settings.appearance.title": "Utseende", - "settings.appearance.description": "Tilpass temaet for dashbordet ditt.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Velg et tema for dashbordet ditt", - "settings.appearance.themes.light": "Lys", - "settings.appearance.themes.dark": "Mørk", - "settings.appearance.themes.system": "System", - "settings.appearance.language": "Språk", - "settings.appearance.languageDescription": "Velg et språk for dashbordet ditt" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/no/settings.json b/apps/dokploy/public/locales/no/settings.json new file mode 100644 index 00000000..03c6bc4a --- /dev/null +++ b/apps/dokploy/public/locales/no/settings.json @@ -0,0 +1,52 @@ +{ + "settings.common.save": "Lagre", + "settings.server.domain.title": "Serverdomene", + "settings.server.domain.description": "Legg til et domene i serverapplikasjonen din.", + "settings.server.domain.form.domain": "Domene", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt Epost", + "settings.server.domain.form.certificate.label": "Sertifikatleverandør", + "settings.server.domain.form.certificate.placeholder": "Velg et sertifikat", + "settings.server.domain.form.certificateOptions.none": "Ingen", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "Webserver", + "settings.server.webServer.description": "Last på nytt eller rens webserveren.", + "settings.server.webServer.actions": "Handlinger", + "settings.server.webServer.reload": "Last på nytt", + "settings.server.webServer.watchLogs": "Se logger", + "settings.server.webServer.updateServerIp": "Oppdater server-IP", + "settings.server.webServer.server.label": "Server", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Endre miljø", + "settings.server.webServer.traefik.managePorts": "Ytterligere portkartlegginger", + "settings.server.webServer.traefik.managePortsDescription": "Legg til eller fjern flere porter for Traefik", + "settings.server.webServer.traefik.targetPort": "Målport", + "settings.server.webServer.traefik.publishedPort": "Publisert port", + "settings.server.webServer.traefik.addPort": "Legg til port", + "settings.server.webServer.traefik.portsUpdated": "Portene ble oppdatert", + "settings.server.webServer.traefik.portsUpdateError": "Kunne ikke oppdatere portene", + "settings.server.webServer.traefik.publishMode": "Publiseringsmodus", + "settings.server.webServer.storage.label": "Lagring", + "settings.server.webServer.storage.cleanUnusedImages": "Rens ubrukte bilder", + "settings.server.webServer.storage.cleanUnusedVolumes": "Rens ubrukte volumer", + "settings.server.webServer.storage.cleanStoppedContainers": "Rens stoppete containere", + "settings.server.webServer.storage.cleanDockerBuilder": "Rens Docker Builder og System", + "settings.server.webServer.storage.cleanMonitoring": "Rens overvåking", + "settings.server.webServer.storage.cleanAll": "Rens alt", + + "settings.profile.title": "Konto", + "settings.profile.description": "Endre detaljene for profilen din her.", + "settings.profile.email": "Epost", + "settings.profile.password": "Passord", + "settings.profile.avatar": "Avatar", + + "settings.appearance.title": "Utseende", + "settings.appearance.description": "Tilpass temaet for dashbordet ditt.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Velg et tema for dashbordet ditt", + "settings.appearance.themes.light": "Lys", + "settings.appearance.themes.dark": "Mørk", + "settings.appearance.themes.system": "System", + "settings.appearance.language": "Språk", + "settings.appearance.languageDescription": "Velg et språk for dashbordet ditt" +} diff --git a/apps/dokploy/public/locales/pl/common.json b/apps/dokploy/public/locales/pl/common.json index 90f9851d..0967ef42 100644 --- a/apps/dokploy/public/locales/pl/common.json +++ b/apps/dokploy/public/locales/pl/common.json @@ -1,54 +1 @@ -{ - "settings.common.save": "Zapisz", - "settings.common.enterTerminal": "Otwórz terminal", - "settings.server.domain.title": "Domena", - "settings.server.domain.description": "Dodaj domenę do aplikacji", - "settings.server.domain.form.domain": "Domena", - "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt", - "settings.server.domain.form.certificate.label": "Certyfikat", - "settings.server.domain.form.certificate.placeholder": "Wybierz certyfikat", - "settings.server.domain.form.certificateOptions.none": "Brak", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Domyślny)", - "settings.server.webServer.title": "Serwer", - "settings.server.webServer.description": "Przeładuj lub wyczyść serwer", - "settings.server.webServer.actions": "Akcje", - "settings.server.webServer.reload": "Przeładuj", - "settings.server.webServer.watchLogs": "Obserwuj logi", - "settings.server.webServer.updateServerIp": "Zaktualizuj IP serwera", - "settings.server.webServer.server.label": "Serwer", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Zmodyfikuj środowisko", - "settings.server.webServer.traefik.managePorts": "Dodatkowe mapowania portów", - "settings.server.webServer.traefik.managePortsDescription": "Dodaj lub usuń dodatkowe porty dla Traefik", - "settings.server.webServer.traefik.targetPort": "Port docelowy", - "settings.server.webServer.traefik.publishedPort": "Port opublikowany", - "settings.server.webServer.traefik.addPort": "Dodaj port", - "settings.server.webServer.traefik.portsUpdated": "Porty zaktualizowane pomyślnie", - "settings.server.webServer.traefik.portsUpdateError": "Nie udało się zaktualizować portów", - "settings.server.webServer.traefik.publishMode": "Tryb publikacji", - "settings.server.webServer.storage.label": "Przestrzeń", - "settings.server.webServer.storage.cleanUnusedImages": "Wyczyść nieużywane obrazy", - "settings.server.webServer.storage.cleanUnusedVolumes": "Wyczyść nieużywane wolumeny", - "settings.server.webServer.storage.cleanStoppedContainers": "Wyczyść zatrzymane kontenery", - "settings.server.webServer.storage.cleanDockerBuilder": "Wyczyść Docker Builder i System", - "settings.server.webServer.storage.cleanMonitoring": "Wyczyść monitorowanie", - "settings.server.webServer.storage.cleanAll": "Wyczyść wszystko", - "settings.profile.title": "Konto", - "settings.profile.description": "Zmień szczegóły swojego profilu", - "settings.profile.email": "Email", - "settings.profile.password": "Hasło", - "settings.profile.avatar": "Avatar", - "settings.appearance.title": "Wygląd", - "settings.appearance.description": "Dostosuj motyw swojego pulpitu", - "settings.appearance.theme": "Motyw", - "settings.appearance.themeDescription": "Wybierz motyw swojego pulpitu", - "settings.appearance.themes.light": "Jasny", - "settings.appearance.themes.dark": "Ciemny", - "settings.appearance.themes.system": "System", - "settings.appearance.language": "Język", - "settings.appearance.languageDescription": "Wybierz język swojego pulpitu", - "settings.terminal.connectionSettings": "Ustawienia połączenia", - "settings.terminal.ipAddress": "Adres IP", - "settings.terminal.port": "Port", - "settings.terminal.username": "Nazwa użytkownika" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/pl/settings.json b/apps/dokploy/public/locales/pl/settings.json new file mode 100644 index 00000000..9899fc13 --- /dev/null +++ b/apps/dokploy/public/locales/pl/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "Zapisz", + "settings.common.enterTerminal": "Otwórz terminal", + "settings.server.domain.title": "Domena", + "settings.server.domain.description": "Dodaj domenę do aplikacji", + "settings.server.domain.form.domain": "Domena", + "settings.server.domain.form.letsEncryptEmail": "Email Let's Encrypt", + "settings.server.domain.form.certificate.label": "Certyfikat", + "settings.server.domain.form.certificate.placeholder": "Wybierz certyfikat", + "settings.server.domain.form.certificateOptions.none": "Brak", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Domyślny)", + + "settings.server.webServer.title": "Serwer", + "settings.server.webServer.description": "Przeładuj lub wyczyść serwer", + "settings.server.webServer.actions": "Akcje", + "settings.server.webServer.reload": "Przeładuj", + "settings.server.webServer.watchLogs": "Obserwuj logi", + "settings.server.webServer.updateServerIp": "Zaktualizuj IP serwera", + "settings.server.webServer.server.label": "Serwer", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Zmodyfikuj środowisko", + "settings.server.webServer.traefik.managePorts": "Dodatkowe mapowania portów", + "settings.server.webServer.traefik.managePortsDescription": "Dodaj lub usuń dodatkowe porty dla Traefik", + "settings.server.webServer.traefik.targetPort": "Port docelowy", + "settings.server.webServer.traefik.publishedPort": "Port opublikowany", + "settings.server.webServer.traefik.addPort": "Dodaj port", + "settings.server.webServer.traefik.portsUpdated": "Porty zaktualizowane pomyślnie", + "settings.server.webServer.traefik.portsUpdateError": "Nie udało się zaktualizować portów", + "settings.server.webServer.traefik.publishMode": "Tryb publikacji", + "settings.server.webServer.storage.label": "Przestrzeń", + "settings.server.webServer.storage.cleanUnusedImages": "Wyczyść nieużywane obrazy", + "settings.server.webServer.storage.cleanUnusedVolumes": "Wyczyść nieużywane wolumeny", + "settings.server.webServer.storage.cleanStoppedContainers": "Wyczyść zatrzymane kontenery", + "settings.server.webServer.storage.cleanDockerBuilder": "Wyczyść Docker Builder i System", + "settings.server.webServer.storage.cleanMonitoring": "Wyczyść monitorowanie", + "settings.server.webServer.storage.cleanAll": "Wyczyść wszystko", + + "settings.profile.title": "Konto", + "settings.profile.description": "Zmień szczegóły swojego profilu", + "settings.profile.email": "Email", + "settings.profile.password": "Hasło", + "settings.profile.avatar": "Avatar", + + "settings.appearance.title": "Wygląd", + "settings.appearance.description": "Dostosuj motyw swojego pulpitu", + "settings.appearance.theme": "Motyw", + "settings.appearance.themeDescription": "Wybierz motyw swojego pulpitu", + "settings.appearance.themes.light": "Jasny", + "settings.appearance.themes.dark": "Ciemny", + "settings.appearance.themes.system": "System", + "settings.appearance.language": "Język", + "settings.appearance.languageDescription": "Wybierz język swojego pulpitu", + + "settings.terminal.connectionSettings": "Ustawienia połączenia", + "settings.terminal.ipAddress": "Adres IP", + "settings.terminal.port": "Port", + "settings.terminal.username": "Nazwa użytkownika" +} diff --git a/apps/dokploy/public/locales/pt-br/common.json b/apps/dokploy/public/locales/pt-br/common.json index d3525a89..0967ef42 100644 --- a/apps/dokploy/public/locales/pt-br/common.json +++ b/apps/dokploy/public/locales/pt-br/common.json @@ -1,41 +1 @@ -{ - "settings.common.save": "Salvar", - "settings.server.domain.title": "Domínio do Servidor", - "settings.server.domain.description": "Configure o domínio do servidor", - "settings.server.domain.form.domain": "Domínio", - "settings.server.domain.form.letsEncryptEmail": "Email do Let's Encrypt", - "settings.server.domain.form.certificate.label": "Certificado", - "settings.server.domain.form.certificate.placeholder": "Selecione um Certificado", - "settings.server.domain.form.certificateOptions.none": "Nenhum", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Padrão)", - "settings.server.webServer.title": "Servidor web", - "settings.server.webServer.description": "Limpar e recarregar servidor web.", - "settings.server.webServer.actions": "Ações", - "settings.server.webServer.reload": "Recarregar", - "settings.server.webServer.watchLogs": "Ver logs", - "settings.server.webServer.updateServerIp": "Atualizar IP do Servidor", - "settings.server.webServer.server.label": "Servidor", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Alterar Env", - "settings.server.webServer.storage.label": "Armazenamento", - "settings.server.webServer.storage.cleanUnusedImages": "Limpar imagens não utilizadas", - "settings.server.webServer.storage.cleanUnusedVolumes": "Limpar volumes não utilizados", - "settings.server.webServer.storage.cleanStoppedContainers": "Limpar containers parados", - "settings.server.webServer.storage.cleanDockerBuilder": "Limpar Docker Builder & System", - "settings.server.webServer.storage.cleanMonitoring": "Limpar Monitoramento", - "settings.server.webServer.storage.cleanAll": "Limpar Tudo", - "settings.profile.title": "Conta", - "settings.profile.description": "Altere os detalhes do seu perfil aqui.", - "settings.profile.email": "Email", - "settings.profile.password": "Senha", - "settings.profile.avatar": "Avatar", - "settings.appearance.title": "Aparencia", - "settings.appearance.description": "Personalize o tema do seu dashboard.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Selecione um tema para o dashboard", - "settings.appearance.themes.light": "Claro", - "settings.appearance.themes.dark": "Escuro", - "settings.appearance.themes.system": "Automático", - "settings.appearance.language": "Linguagem", - "settings.appearance.languageDescription": "Selecione o idioma do dashboard" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/pt-br/settings.json b/apps/dokploy/public/locales/pt-br/settings.json new file mode 100644 index 00000000..f4d90a2f --- /dev/null +++ b/apps/dokploy/public/locales/pt-br/settings.json @@ -0,0 +1,44 @@ +{ + "settings.common.save": "Salvar", + "settings.server.domain.title": "Domínio do Servidor", + "settings.server.domain.description": "Configure o domínio do servidor", + "settings.server.domain.form.domain": "Domínio", + "settings.server.domain.form.letsEncryptEmail": "Email do Let's Encrypt", + "settings.server.domain.form.certificate.label": "Certificado", + "settings.server.domain.form.certificate.placeholder": "Selecione um Certificado", + "settings.server.domain.form.certificateOptions.none": "Nenhum", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Padrão)", + + "settings.server.webServer.title": "Servidor web", + "settings.server.webServer.description": "Limpar e recarregar servidor web.", + "settings.server.webServer.actions": "Ações", + "settings.server.webServer.reload": "Recarregar", + "settings.server.webServer.watchLogs": "Ver logs", + "settings.server.webServer.updateServerIp": "Atualizar IP do Servidor", + "settings.server.webServer.server.label": "Servidor", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Alterar Env", + "settings.server.webServer.storage.label": "Armazenamento", + "settings.server.webServer.storage.cleanUnusedImages": "Limpar imagens não utilizadas", + "settings.server.webServer.storage.cleanUnusedVolumes": "Limpar volumes não utilizados", + "settings.server.webServer.storage.cleanStoppedContainers": "Limpar containers parados", + "settings.server.webServer.storage.cleanDockerBuilder": "Limpar Docker Builder & System", + "settings.server.webServer.storage.cleanMonitoring": "Limpar Monitoramento", + "settings.server.webServer.storage.cleanAll": "Limpar Tudo", + + "settings.profile.title": "Conta", + "settings.profile.description": "Altere os detalhes do seu perfil aqui.", + "settings.profile.email": "Email", + "settings.profile.password": "Senha", + "settings.profile.avatar": "Avatar", + + "settings.appearance.title": "Aparencia", + "settings.appearance.description": "Personalize o tema do seu dashboard.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Selecione um tema para o dashboard", + "settings.appearance.themes.light": "Claro", + "settings.appearance.themes.dark": "Escuro", + "settings.appearance.themes.system": "Automático", + "settings.appearance.language": "Linguagem", + "settings.appearance.languageDescription": "Selecione o idioma do dashboard" +} diff --git a/apps/dokploy/public/locales/ru/common.json b/apps/dokploy/public/locales/ru/common.json index 42816e85..0967ef42 100644 --- a/apps/dokploy/public/locales/ru/common.json +++ b/apps/dokploy/public/locales/ru/common.json @@ -1,54 +1 @@ -{ - "settings.common.save": "Сохранить", - "settings.common.enterTerminal": "Открыть терминал", - "settings.server.domain.title": "Домен сервера", - "settings.server.domain.description": "Установите домен для вашего серверного приложения Dokploy.", - "settings.server.domain.form.domain": "Домен", - "settings.server.domain.form.letsEncryptEmail": "Email для Let's Encrypt", - "settings.server.domain.form.certificate.label": "Сертификат", - "settings.server.domain.form.certificate.placeholder": "Выберите сертификат", - "settings.server.domain.form.certificateOptions.none": "Нет", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - "settings.server.webServer.title": "Веб-сервер", - "settings.server.webServer.description": "Перезагрузка или очистка веб-сервера.", - "settings.server.webServer.actions": "Действия", - "settings.server.webServer.reload": "Перезагрузить", - "settings.server.webServer.watchLogs": "Просмотр логов", - "settings.server.webServer.updateServerIp": "Изменить IP адрес", - "settings.server.webServer.server.label": "Сервер", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Изменить переменные окружения", - "settings.server.webServer.traefik.managePorts": "Назначение портов", - "settings.server.webServer.traefik.managePortsDescription": "Добавить или удалить дополнительные порты для Traefik", - "settings.server.webServer.traefik.targetPort": "Внутренний порт", - "settings.server.webServer.traefik.publishedPort": "Внешний порт", - "settings.server.webServer.traefik.addPort": "Добавить порт", - "settings.server.webServer.traefik.portsUpdated": "Порты успешно обновлены", - "settings.server.webServer.traefik.portsUpdateError": "Не удалось обновить порты", - "settings.server.webServer.traefik.publishMode": "Режим сопоставления", - "settings.server.webServer.storage.label": "Дисковое пространство", - "settings.server.webServer.storage.cleanUnusedImages": "Очистить неиспользуемые образы", - "settings.server.webServer.storage.cleanUnusedVolumes": "Очистить неиспользуемые тома", - "settings.server.webServer.storage.cleanStoppedContainers": "Очистить остановленные контейнеры", - "settings.server.webServer.storage.cleanDockerBuilder": "Очистить Docker Builder и систему", - "settings.server.webServer.storage.cleanMonitoring": "Очистить мониторинг", - "settings.server.webServer.storage.cleanAll": "Очистить все", - "settings.profile.title": "Аккаунт", - "settings.profile.description": "Измените данные вашего профиля.", - "settings.profile.email": "Email", - "settings.profile.password": "Пароль", - "settings.profile.avatar": "Аватар", - "settings.appearance.title": "Внешний вид", - "settings.appearance.description": "Настройте тему Dokploy.", - "settings.appearance.theme": "Тема", - "settings.appearance.themeDescription": "Выберите тему системной панели", - "settings.appearance.themes.light": "Светлая", - "settings.appearance.themes.dark": "Темная", - "settings.appearance.themes.system": "Системная", - "settings.appearance.language": "Язык", - "settings.appearance.languageDescription": "Выберите язык для панели управления", - "settings.terminal.connectionSettings": "Настройки подключения", - "settings.terminal.ipAddress": "IP адрес", - "settings.terminal.port": "Порт", - "settings.terminal.username": "Имя пользователя" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/ru/settings.json b/apps/dokploy/public/locales/ru/settings.json new file mode 100644 index 00000000..0d87ed15 --- /dev/null +++ b/apps/dokploy/public/locales/ru/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "Сохранить", + "settings.common.enterTerminal": "Открыть терминал", + "settings.server.domain.title": "Домен сервера", + "settings.server.domain.description": "Установите домен для вашего серверного приложения Dokploy.", + "settings.server.domain.form.domain": "Домен", + "settings.server.domain.form.letsEncryptEmail": "Email для Let's Encrypt", + "settings.server.domain.form.certificate.label": "Сертификат", + "settings.server.domain.form.certificate.placeholder": "Выберите сертификат", + "settings.server.domain.form.certificateOptions.none": "Нет", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "Веб-сервер", + "settings.server.webServer.description": "Перезагрузка или очистка веб-сервера.", + "settings.server.webServer.actions": "Действия", + "settings.server.webServer.reload": "Перезагрузить", + "settings.server.webServer.watchLogs": "Просмотр логов", + "settings.server.webServer.updateServerIp": "Изменить IP адрес", + "settings.server.webServer.server.label": "Сервер", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Изменить переменные окружения", + "settings.server.webServer.traefik.managePorts": "Назначение портов", + "settings.server.webServer.traefik.managePortsDescription": "Добавить или удалить дополнительные порты для Traefik", + "settings.server.webServer.traefik.targetPort": "Внутренний порт", + "settings.server.webServer.traefik.publishedPort": "Внешний порт", + "settings.server.webServer.traefik.addPort": "Добавить порт", + "settings.server.webServer.traefik.portsUpdated": "Порты успешно обновлены", + "settings.server.webServer.traefik.portsUpdateError": "Не удалось обновить порты", + "settings.server.webServer.traefik.publishMode": "Режим сопоставления", + "settings.server.webServer.storage.label": "Дисковое пространство", + "settings.server.webServer.storage.cleanUnusedImages": "Очистить неиспользуемые образы", + "settings.server.webServer.storage.cleanUnusedVolumes": "Очистить неиспользуемые тома", + "settings.server.webServer.storage.cleanStoppedContainers": "Очистить остановленные контейнеры", + "settings.server.webServer.storage.cleanDockerBuilder": "Очистить Docker Builder и систему", + "settings.server.webServer.storage.cleanMonitoring": "Очистить мониторинг", + "settings.server.webServer.storage.cleanAll": "Очистить все", + + "settings.profile.title": "Аккаунт", + "settings.profile.description": "Измените данные вашего профиля.", + "settings.profile.email": "Email", + "settings.profile.password": "Пароль", + "settings.profile.avatar": "Аватар", + + "settings.appearance.title": "Внешний вид", + "settings.appearance.description": "Настройте тему Dokploy.", + "settings.appearance.theme": "Тема", + "settings.appearance.themeDescription": "Выберите тему системной панели", + "settings.appearance.themes.light": "Светлая", + "settings.appearance.themes.dark": "Темная", + "settings.appearance.themes.system": "Системная", + "settings.appearance.language": "Язык", + "settings.appearance.languageDescription": "Выберите язык для панели управления", + + "settings.terminal.connectionSettings": "Настройки подключения", + "settings.terminal.ipAddress": "IP адрес", + "settings.terminal.port": "Порт", + "settings.terminal.username": "Имя пользователя" +} diff --git a/apps/dokploy/public/locales/tr/common.json b/apps/dokploy/public/locales/tr/common.json index c460260d..0967ef42 100644 --- a/apps/dokploy/public/locales/tr/common.json +++ b/apps/dokploy/public/locales/tr/common.json @@ -1,41 +1 @@ -{ - "settings.common.save": "Kaydet", - "settings.server.domain.title": "Sunucu Alanı", - "settings.server.domain.description": "Sunucu uygulamanıza bir alan adı ekleyin.", - "settings.server.domain.form.domain": "Alan Adı", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-postası", - "settings.server.domain.form.certificate.label": "Sertifika", - "settings.server.domain.form.certificate.placeholder": "Bir sertifika seçin", - "settings.server.domain.form.certificateOptions.none": "Hiçbiri", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Varsayılan)", - "settings.server.webServer.title": "Web Sunucusu", - "settings.server.webServer.description": "Web sunucusunu yeniden yükleyin veya temizleyin.", - "settings.server.webServer.actions": "İşlemler", - "settings.server.webServer.reload": "Yeniden Yükle", - "settings.server.webServer.watchLogs": "Günlükleri İzle", - "settings.server.webServer.updateServerIp": "Sunucu IP'sini Güncelle", - "settings.server.webServer.server.label": "Sunucu", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Env Değiştir", - "settings.server.webServer.storage.label": "Alan", - "settings.server.webServer.storage.cleanUnusedImages": "Kullanılmayan görüntüleri temizle", - "settings.server.webServer.storage.cleanUnusedVolumes": "Kullanılmayan birimleri temizle", - "settings.server.webServer.storage.cleanStoppedContainers": "Durmuş konteynerleri temizle", - "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder ve Sistemi Temizle", - "settings.server.webServer.storage.cleanMonitoring": "İzlemeyi Temizle", - "settings.server.webServer.storage.cleanAll": "Hepsini temizle", - "settings.profile.title": "Hesap", - "settings.profile.description": "Profil detaylarınızı buradan değiştirebilirsiniz.", - "settings.profile.email": "E-posta", - "settings.profile.password": "Şifre", - "settings.profile.avatar": "Profil Resmi", - "settings.appearance.title": "Görünüm", - "settings.appearance.description": "Kontrol panelinin temasını özelleştirin.", - "settings.appearance.theme": "Tema", - "settings.appearance.themeDescription": "Kontrol paneli için bir tema seçin", - "settings.appearance.themes.light": "Açık", - "settings.appearance.themes.dark": "Koyu", - "settings.appearance.themes.system": "Sistem", - "settings.appearance.language": "Dil", - "settings.appearance.languageDescription": "Kontrol paneli için bir dil seçin" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/tr/settings.json b/apps/dokploy/public/locales/tr/settings.json new file mode 100644 index 00000000..47a6629f --- /dev/null +++ b/apps/dokploy/public/locales/tr/settings.json @@ -0,0 +1,44 @@ +{ + "settings.common.save": "Kaydet", + "settings.server.domain.title": "Sunucu Alanı", + "settings.server.domain.description": "Sunucu uygulamanıza bir alan adı ekleyin.", + "settings.server.domain.form.domain": "Alan Adı", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt E-postası", + "settings.server.domain.form.certificate.label": "Sertifika", + "settings.server.domain.form.certificate.placeholder": "Bir sertifika seçin", + "settings.server.domain.form.certificateOptions.none": "Hiçbiri", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt (Varsayılan)", + + "settings.server.webServer.title": "Web Sunucusu", + "settings.server.webServer.description": "Web sunucusunu yeniden yükleyin veya temizleyin.", + "settings.server.webServer.actions": "İşlemler", + "settings.server.webServer.reload": "Yeniden Yükle", + "settings.server.webServer.watchLogs": "Günlükleri İzle", + "settings.server.webServer.updateServerIp": "Sunucu IP'sini Güncelle", + "settings.server.webServer.server.label": "Sunucu", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Env Değiştir", + "settings.server.webServer.storage.label": "Alan", + "settings.server.webServer.storage.cleanUnusedImages": "Kullanılmayan görüntüleri temizle", + "settings.server.webServer.storage.cleanUnusedVolumes": "Kullanılmayan birimleri temizle", + "settings.server.webServer.storage.cleanStoppedContainers": "Durmuş konteynerleri temizle", + "settings.server.webServer.storage.cleanDockerBuilder": "Docker Builder ve Sistemi Temizle", + "settings.server.webServer.storage.cleanMonitoring": "İzlemeyi Temizle", + "settings.server.webServer.storage.cleanAll": "Hepsini temizle", + + "settings.profile.title": "Hesap", + "settings.profile.description": "Profil detaylarınızı buradan değiştirebilirsiniz.", + "settings.profile.email": "E-posta", + "settings.profile.password": "Şifre", + "settings.profile.avatar": "Profil Resmi", + + "settings.appearance.title": "Görünüm", + "settings.appearance.description": "Kontrol panelinin temasını özelleştirin.", + "settings.appearance.theme": "Tema", + "settings.appearance.themeDescription": "Kontrol paneli için bir tema seçin", + "settings.appearance.themes.light": "Açık", + "settings.appearance.themes.dark": "Koyu", + "settings.appearance.themes.system": "Sistem", + "settings.appearance.language": "Dil", + "settings.appearance.languageDescription": "Kontrol paneli için bir dil seçin" +} diff --git a/apps/dokploy/public/locales/uk/common.json b/apps/dokploy/public/locales/uk/common.json index 33a28f32..0967ef42 100644 --- a/apps/dokploy/public/locales/uk/common.json +++ b/apps/dokploy/public/locales/uk/common.json @@ -1,54 +1 @@ -{ - "settings.common.save": "Зберегти", - "settings.common.enterTerminal": "Увійти в термінал", - "settings.server.domain.title": "Домен сервера", - "settings.server.domain.description": "Додайте домен до вашого серверного застосунку.", - "settings.server.domain.form.domain": "Домен", - "settings.server.domain.form.letsEncryptEmail": "Електронна пошта для Let's Encrypt", - "settings.server.domain.form.certificate.label": "Постачальник сертифікатів", - "settings.server.domain.form.certificate.placeholder": "Оберіть сертифікат", - "settings.server.domain.form.certificateOptions.none": "Відсутній", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - "settings.server.webServer.title": "Веб-сервер", - "settings.server.webServer.description": "Перезавантажте або очистьте веб-сервер.", - "settings.server.webServer.actions": "Дії", - "settings.server.webServer.reload": "Перезавантажити", - "settings.server.webServer.watchLogs": "Перегляд логів", - "settings.server.webServer.updateServerIp": "Оновити IP-адресу сервера", - "settings.server.webServer.server.label": "Сервер", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "Змінити середовище", - "settings.server.webServer.traefik.managePorts": "Додаткові порти", - "settings.server.webServer.traefik.managePortsDescription": "Додайте або видаліть порти для Traefik", - "settings.server.webServer.traefik.targetPort": "Цільовий порт", - "settings.server.webServer.traefik.publishedPort": "Опублікований порт", - "settings.server.webServer.traefik.addPort": "Додати порт", - "settings.server.webServer.traefik.portsUpdated": "Порти успішно оновлено", - "settings.server.webServer.traefik.portsUpdateError": "Не вдалося оновити порти", - "settings.server.webServer.traefik.publishMode": "Режим публікації", - "settings.server.webServer.storage.label": "Дисковий простір", - "settings.server.webServer.storage.cleanUnusedImages": "Очистити невикористані образи", - "settings.server.webServer.storage.cleanUnusedVolumes": "Очистити невикористані томи", - "settings.server.webServer.storage.cleanStoppedContainers": "Очистити зупинені контейнери", - "settings.server.webServer.storage.cleanDockerBuilder": "Очистити Docker Builder і систему", - "settings.server.webServer.storage.cleanMonitoring": "Очистити моніторинг", - "settings.server.webServer.storage.cleanAll": "Очистити все", - "settings.profile.title": "Обліковий запис", - "settings.profile.description": "Змініть дані вашого профілю.", - "settings.profile.email": "Електронна пошта", - "settings.profile.password": "Пароль", - "settings.profile.avatar": "Аватар", - "settings.appearance.title": "Зовнішній вигляд", - "settings.appearance.description": "Налаштуйте тему вашої панелі керування.", - "settings.appearance.theme": "Тема", - "settings.appearance.themeDescription": "Оберіть тему для вашої панелі керування", - "settings.appearance.themes.light": "Світла", - "settings.appearance.themes.dark": "Темна", - "settings.appearance.themes.system": "Системна", - "settings.appearance.language": "Мова", - "settings.appearance.languageDescription": "Оберіть мову для вашої панелі керування", - "settings.terminal.connectionSettings": "Налаштування з'єднання", - "settings.terminal.ipAddress": "IP-адреса", - "settings.terminal.port": "Порт", - "settings.terminal.username": "Ім'я користувача" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/uk/settings.json b/apps/dokploy/public/locales/uk/settings.json new file mode 100644 index 00000000..766a1bff --- /dev/null +++ b/apps/dokploy/public/locales/uk/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "Зберегти", + "settings.common.enterTerminal": "Увійти в термінал", + "settings.server.domain.title": "Домен сервера", + "settings.server.domain.description": "Додайте домен до вашого серверного застосунку.", + "settings.server.domain.form.domain": "Домен", + "settings.server.domain.form.letsEncryptEmail": "Електронна пошта для Let's Encrypt", + "settings.server.domain.form.certificate.label": "Постачальник сертифікатів", + "settings.server.domain.form.certificate.placeholder": "Оберіть сертифікат", + "settings.server.domain.form.certificateOptions.none": "Відсутній", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "Веб-сервер", + "settings.server.webServer.description": "Перезавантажте або очистьте веб-сервер.", + "settings.server.webServer.actions": "Дії", + "settings.server.webServer.reload": "Перезавантажити", + "settings.server.webServer.watchLogs": "Перегляд логів", + "settings.server.webServer.updateServerIp": "Оновити IP-адресу сервера", + "settings.server.webServer.server.label": "Сервер", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "Змінити середовище", + "settings.server.webServer.traefik.managePorts": "Додаткові порти", + "settings.server.webServer.traefik.managePortsDescription": "Додайте або видаліть порти для Traefik", + "settings.server.webServer.traefik.targetPort": "Цільовий порт", + "settings.server.webServer.traefik.publishedPort": "Опублікований порт", + "settings.server.webServer.traefik.addPort": "Додати порт", + "settings.server.webServer.traefik.portsUpdated": "Порти успішно оновлено", + "settings.server.webServer.traefik.portsUpdateError": "Не вдалося оновити порти", + "settings.server.webServer.traefik.publishMode": "Режим публікації", + "settings.server.webServer.storage.label": "Дисковий простір", + "settings.server.webServer.storage.cleanUnusedImages": "Очистити невикористані образи", + "settings.server.webServer.storage.cleanUnusedVolumes": "Очистити невикористані томи", + "settings.server.webServer.storage.cleanStoppedContainers": "Очистити зупинені контейнери", + "settings.server.webServer.storage.cleanDockerBuilder": "Очистити Docker Builder і систему", + "settings.server.webServer.storage.cleanMonitoring": "Очистити моніторинг", + "settings.server.webServer.storage.cleanAll": "Очистити все", + + "settings.profile.title": "Обліковий запис", + "settings.profile.description": "Змініть дані вашого профілю.", + "settings.profile.email": "Електронна пошта", + "settings.profile.password": "Пароль", + "settings.profile.avatar": "Аватар", + + "settings.appearance.title": "Зовнішній вигляд", + "settings.appearance.description": "Налаштуйте тему вашої панелі керування.", + "settings.appearance.theme": "Тема", + "settings.appearance.themeDescription": "Оберіть тему для вашої панелі керування", + "settings.appearance.themes.light": "Світла", + "settings.appearance.themes.dark": "Темна", + "settings.appearance.themes.system": "Системна", + "settings.appearance.language": "Мова", + "settings.appearance.languageDescription": "Оберіть мову для вашої панелі керування", + + "settings.terminal.connectionSettings": "Налаштування з'єднання", + "settings.terminal.ipAddress": "IP-адреса", + "settings.terminal.port": "Порт", + "settings.terminal.username": "Ім'я користувача" +} diff --git a/apps/dokploy/public/locales/zh-Hans/common.json b/apps/dokploy/public/locales/zh-Hans/common.json index b8cf16ec..0967ef42 100644 --- a/apps/dokploy/public/locales/zh-Hans/common.json +++ b/apps/dokploy/public/locales/zh-Hans/common.json @@ -1,231 +1 @@ -{ - "auth.signIn": "登录", - "auth.signInDescription": "请输入您的邮箱和密码登录", - "auth.signInWithGoogle": "使用 Google 登录", - "auth.signInWithGithub": "使用 GitHub 登录", - "auth.email": "邮箱", - "auth.password": "密码", - "auth.password.placeholder": "请输入密码", - "auth.login": "登录", - "auth.forgetPassword": "忘记密码?", - "auth.createAccount": "创建账号", - "auth.twoFactorCode": "两步认证", - "auth.twoFactorCodeDescription": "请输入您的认证器应用中的6位数字验证码", - "auth.lostAuthenticator": "无法访问认证器应用?", - "auth.back": "返回", - "auth.verify": "验证", - "auth.enterBackupCode": "输入备用码", - "auth.enterBackupCodeDescription": "输入备用码以访问您的账户", - "auth.backupCode": "备用码", - "auth.backupCode.placeholder": "请输入您的备用码", - "auth.backupCodeDescription": "输入您在设置两步认证时收到的备用码", - "auth.cancel": "取消", - "auth.invalidTwoFactorCode": "请输入有效的6位数字验证码", - "auth.twoFactorVerificationError": "验证两步认证码时发生错误", - "auth.invalidBackupCode": "请输入有效的备用码", - "auth.backupCodeVerificationError": "验证备用码时发生错误", - "auth.githubSignInError": "使用 GitHub 登录时发生错误", - "auth.googleSignInError": "使用 Google 登录时发生错误", - "auth.unknownError": "未知错误", - "common.side.home": "主页", - "common.side.settings": "设置", - "common.side.extra": "其他", - "common.side.projects": "项目", - "common.side.monitoring": "监控", - "common.side.traefik": "Traefik", - "common.side.docker": "Docker", - "common.side.swarm": "Swarm", - "common.side.requests": "请求", - "common.side.web-server": "本地服务器", - "common.side.profile": "个人资料", - "common.side.remote-servers": "远程服务器", - "common.side.users": "用户", - "common.side.ssh-keys": "SSH 密钥", - "common.side.ai": "AI", - "common.side.git": "Git 集成", - "common.side.registry": "注册表", - "common.side.s3-destinations": "S3 存储", - "common.side.certificates": "证书", - "common.side.cluster": "集群", - "common.side.notifications": "通知", - "common.side.billing": "账单", - "common.side.documentation": "文档", - "common.side.support": "支持", - "common.side.sponsor": "赞助", - "common.side.invitations.pending-invitations": "待处理邀请", - "common.side.invitations.no-pending-invitations": "没有待处理的邀请", - "common.side.invitations.accept-invitation": "接受邀请", - "common.side.invitations.confirm-accept-invitation": "您确定要接受此邀请吗?", - "common.side.invitations.error-accepting-invitation": "接受邀请时出错", - "common.side.invitations.invitation-accepted": "邀请已成功接受", - "common.side.invitations.expires": "有效期:{{expireDate}}", - "common.side.invitations.role": "角色:{{role}}", - "common.side.organizations": "组织", - "common.side.organizations.select-organization": "选择组织", - "common.side.organizations.delete-organization": "删除组织", - "common.side.organizations.confirm-delete-organization": "您确定要删除此组织吗?", - "common.side.organizations.organization-deleted": "组织已成功删除", - "common.side.organizations.error-deleting-organization": "删除组织时出错", - "common.side.organizations.createOrganization": "创建组织", - "common.side.organizations.updateOrganization": "更新组织", - "common.side.organizations.createOrganizationDescription": "创建一个新组织来管理您的项目。", - "common.side.organizations.updateOrganizationDescription": "更新组织名称和标志", - "common.side.organizations.name": "名称", - "common.side.organizations.name.placeholder": "请输入组织名称", - "common.side.organizations.logoURL": "Logo 图片地址", - "common.side.organizations.createSuccess": "组织创建成功", - "common.side.organizations.updateSuccess": "组织更新成功", - "common.side.organizations.createFailed": "创建组织失败", - "common.side.organizations.updateFailed": "更新组织失败", - "common.account": "账户", - "common.account.mine": "我的账户", - "common.account.logout": "注销", - "common.account.selectLanguage": "选择语言", - "home.projects.title": "项目", - "home.projects.description": "创建和管理您的项目", - "settings.common.save": "保存", - "settings.common.enterTerminal": "进入终端", - "settings.server.domain.title": "域名设置", - "settings.server.domain.description": "添加域名到服务器", - "settings.server.domain.form.domain": "域名", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 邮箱", - "settings.server.domain.form.certificate.label": "证书", - "settings.server.domain.form.certificate.placeholder": "选择一个证书", - "settings.server.domain.form.certificateOptions.none": "无", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - "settings.server.webServer.title": "服务器设置", - "settings.server.webServer.description": "管理服务器", - "settings.server.webServer.actions": "操作", - "settings.server.webServer.reload": "重新加载", - "settings.server.webServer.watchLogs": "查看日志", - "settings.server.webServer.updateServerIp": "更新服务器 IP", - "settings.server.webServer.server.label": "服务器", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "修改环境变量", - "settings.server.webServer.traefik.managePorts": "端口转发", - "settings.server.webServer.traefik.managePortsDescription": "添加或删除 Traefik 的其他端口", - "settings.server.webServer.traefik.targetPort": "目标端口", - "settings.server.webServer.traefik.publishedPort": "对外端口", - "settings.server.webServer.traefik.addPort": "添加端口", - "settings.server.webServer.traefik.portsUpdated": "端口更新成功", - "settings.server.webServer.traefik.portsUpdateError": "端口更新失败", - "settings.server.webServer.traefik.publishMode": "端口映射", - "settings.server.webServer.storage.label": "存储空间", - "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的镜像", - "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷", - "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器", - "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 与 系统缓存", - "settings.server.webServer.storage.cleanMonitoring": "清理监控数据", - "settings.server.webServer.storage.cleanAll": "清理所有内容", - "settings.profile.title": "账户", - "settings.profile.description": "更改您的个人资料", - "settings.profile.email": "邮箱", - "settings.profile.oldPassword": "旧密码", - "settings.profile.newPassword": "新密码", - "settings.profile.password": "密码", - "settings.profile.avatar": "头像", - "settings.2fa.enable2fa": "启用 2FA", - "settings.2fa.title": "2FA 设置", - "settings.2fa.enterPassword": "输入您的密码以开始 2FA 设置", - "settings.2fa.scanQrCodeAndVerify": "扫描二维码并使用您的身份验证器应用程序进行验证", - "settings.2fa.password": "密码", - "settings.2fa.enterPasswordPlaceholder": "输入您的密码", - "settings.2fa.enterPasswordDescription": "输入您的密码以启用 2FA", - "settings.2fa.continue": "继续", - "settings.2fa.scanQrCode": "使用您的身份验证器应用程序扫描此二维码", - "settings.2fa.qrCodeAlt": "2FA 二维码", - "settings.2fa.cantScanQrCode": "无法扫描二维码?", - "settings.2fa.backupCodes": "备份代码", - "settings.2fa.saveBackupCodes": "将这些备份代码保存在安全的地方。如果您丢失了身份验证设备,可以使用它们访问您的帐户。", - "settings.2fa.verificationCode": "验证码", - "settings.2fa.enterVerificationCode": "输入您的身份验证器应用程序中的 6 位数代码", - "settings.2fa.errorSettingUp": "设置 2FA 时出错", - "settings.2fa.errorVerifyingPassword": "验证密码时出错", - "settings.2fa.invalidCode": "无效的代码。请再试一次。", - "settings.2fa.invalidVerificationCode": "无效的验证码", - "settings.2fa.success": "2FA 配置成功", - "settings.2fa.connectionError": "连接错误。请检查您的互联网连接。", - "settings.2fa.errorVerifyingCode": "验证代码时出错", - "settings.2fa.errorVerifying2faCode": "验证 2FA 代码时出错", - "settings.appearance.title": "外观", - "settings.appearance.description": "自定义面板主题", - "settings.appearance.theme": "主题", - "settings.appearance.themeDescription": "选择面板主题", - "settings.appearance.themes.light": "明亮", - "settings.appearance.themes.dark": "黑暗", - "settings.appearance.themes.system": "系统主题", - "settings.appearance.language": "语言", - "settings.appearance.languageDescription": "选择面板语言", - "settings.terminal.connectionSettings": "终端设置", - "settings.terminal.ipAddress": "IP", - "settings.terminal.port": "端口", - "settings.terminal.username": "用户名", - "settings.api.apiCliKeys": "API/CLI 密钥", - "settings.api.generateAndManageKeys": "生成和管理 API 密钥以访问 API/CLI", - "settings.api.swaggerApi": "Swagger API:", - "settings.api.view": "查看", - "settings.api.created": "创建于", - "settings.api.ago": "前", - "settings.api.expiresIn": "过期于", - "settings.api.deleteApiKey": "删除 API 密钥", - "settings.api.deleteApiKeyDescription": "您确定要删除此 API 密钥吗?此操作无法撤销。", - "settings.api.apiKeyDeleted": "API 密钥删除成功", - "settings.api.errorDeletingApiKey": "删除 API 密钥时出错", - "settings.api.noApiKeysFound": "未找到 API 密钥", - "settings.api.errorGeneratingApiKey": "生成 API 密钥失败", - "settings.api.generateNewKey": "生成新密钥", - "settings.api.generateApiKey": "生成 API 密钥", - "settings.api.createNewApiKeyDescription": "创建一个新的 API 密钥以访问 API。您可以设置过期日期和自定义前缀以便更好地组织。", - "settings.api.name": "名称", - "settings.api.namePlaceholder": "我的 API 密钥", - "settings.api.prefix": "前缀", - "settings.api.prefixPlaceholder": "我的应用", - "settings.api.expiration": "过期时间", - "settings.api.selectExpirationTime": "选择过期时间", - "settings.api.expirationOptions.Never": "从不过期", - "settings.api.expirationOptions.1 day": "1 天", - "settings.api.expirationOptions.7 days": "7 天", - "settings.api.expirationOptions.30 days": "30 天", - "settings.api.expirationOptions.90 days": "90 天", - "settings.api.expirationOptions.1 year": "1 年", - "settings.api.organization": "组织", - "settings.api.selectOrganization": "选择组织", - "settings.api.rateLimiting": "速率限制", - "settings.api.enableRateLimiting": "启用速率限制", - "settings.api.limitRequestsDescription": "限制在时间窗口内的请求数量", - "settings.api.timeWindow": "时间窗口", - "settings.api.selectTimeWindow": "选择时间窗口", - "settings.api.timeWindowOptions.1 minute": "1 分钟", - "settings.api.timeWindowOptions.5 minutes": "5 分钟", - "settings.api.timeWindowOptions.15 minutes": "15 分钟", - "settings.api.timeWindowOptions.30 minutes": "30 分钟", - "settings.api.timeWindowOptions.1 hour": "1 小时", - "settings.api.timeWindowOptions.1 day": "1 天", - "settings.api.timeWindowDescription": "请求计数的持续时间", - "settings.api.maxRequests": "最大请求数", - "settings.api.maxRequestsPlaceholder": "100", - "settings.api.maxRequestsDescription": "时间窗口内允许的最大请求数", - "settings.api.requestLimiting": "请求限制", - "settings.api.totalRequestLimit": "总请求限制", - "settings.api.totalRequestLimitPlaceholder": "留空表示无限制", - "settings.api.totalRequestLimitDescription": "允许的总请求数(留空表示无限制)", - "settings.api.refillAmount": "补充数量", - "settings.api.refillAmountPlaceholder": "补充数量", - "settings.api.refillAmountDescription": "每次补充时添加的请求数量", - "settings.api.refillInterval": "补充间隔", - "settings.api.selectRefillInterval": "选择补充间隔", - "settings.api.refillIntervalOptions.1 hour": "1 小时", - "settings.api.refillIntervalOptions.6 hours": "6 小时", - "settings.api.refillIntervalOptions.12 hours": "12 小时", - "settings.api.refillIntervalOptions.1 day": "1 天", - "settings.api.refillIntervalOptions.7 days": "7 天", - "settings.api.refillIntervalOptions.30 days": "30 天", - "settings.api.refillIntervalDescription": "请求限制的补充频率", - "settings.api.cancel": "取消", - "settings.api.generate": "生成", - "settings.api.apiKeyGeneratedSuccessfully": "API 密钥生成成功", - "settings.api.copyApiKeyNow": "请立即复制您的 API 密钥。您将无法再次查看它!", - "settings.api.apiKeyCopied": "API 密钥已复制到剪贴板", - "settings.api.copyToClipboard": "复制到剪贴板", - "settings.api.close": "关闭" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/zh-Hans/settings.json b/apps/dokploy/public/locales/zh-Hans/settings.json new file mode 100644 index 00000000..c74fb21f --- /dev/null +++ b/apps/dokploy/public/locales/zh-Hans/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "保存", + "settings.common.enterTerminal": "进入终端", + "settings.server.domain.title": "域名设置", + "settings.server.domain.description": "添加域名到服务器", + "settings.server.domain.form.domain": "域名", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 邮箱", + "settings.server.domain.form.certificate.label": "证书", + "settings.server.domain.form.certificate.placeholder": "选择一个证书", + "settings.server.domain.form.certificateOptions.none": "无", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "服务器设置", + "settings.server.webServer.description": "管理服务器", + "settings.server.webServer.actions": "操作", + "settings.server.webServer.reload": "重新加载", + "settings.server.webServer.watchLogs": "查看日志", + "settings.server.webServer.updateServerIp": "更新服务器 IP", + "settings.server.webServer.server.label": "服务器", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "修改环境变量", + "settings.server.webServer.traefik.managePorts": "端口转发", + "settings.server.webServer.traefik.managePortsDescription": "添加或删除 Traefik 的其他端口", + "settings.server.webServer.traefik.targetPort": "目标端口", + "settings.server.webServer.traefik.publishedPort": "对外端口", + "settings.server.webServer.traefik.addPort": "添加端口", + "settings.server.webServer.traefik.portsUpdated": "端口更新成功", + "settings.server.webServer.traefik.portsUpdateError": "端口更新失败", + "settings.server.webServer.traefik.publishMode": "端口映射", + "settings.server.webServer.storage.label": "存储空间", + "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的镜像", + "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷", + "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器", + "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 与 系统缓存", + "settings.server.webServer.storage.cleanMonitoring": "清理监控数据", + "settings.server.webServer.storage.cleanAll": "清理所有内容", + + "settings.profile.title": "账户", + "settings.profile.description": "更改您的个人资料", + "settings.profile.email": "邮箱", + "settings.profile.password": "密码", + "settings.profile.avatar": "头像", + + "settings.appearance.title": "外观", + "settings.appearance.description": "自定义面板主题", + "settings.appearance.theme": "主题", + "settings.appearance.themeDescription": "选择面板主题", + "settings.appearance.themes.light": "明亮", + "settings.appearance.themes.dark": "黑暗", + "settings.appearance.themes.system": "系统主题", + "settings.appearance.language": "语言", + "settings.appearance.languageDescription": "选择面板语言", + + "settings.terminal.connectionSettings": "终端设置", + "settings.terminal.ipAddress": "IP", + "settings.terminal.port": "端口", + "settings.terminal.username": "用户名" +} diff --git a/apps/dokploy/public/locales/zh-Hant/common.json b/apps/dokploy/public/locales/zh-Hant/common.json index 8278bf34..0967ef42 100644 --- a/apps/dokploy/public/locales/zh-Hant/common.json +++ b/apps/dokploy/public/locales/zh-Hant/common.json @@ -1,54 +1 @@ -{ - "settings.common.save": "儲存", - "settings.common.enterTerminal": "進入終端機", - "settings.server.domain.title": "網域設定", - "settings.server.domain.description": "新增網域至伺服器", - "settings.server.domain.form.domain": "網域", - "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 信箱", - "settings.server.domain.form.certificate.label": "憑證", - "settings.server.domain.form.certificate.placeholder": "選擇一個憑證", - "settings.server.domain.form.certificateOptions.none": "無", - "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", - "settings.server.webServer.title": "伺服器設定", - "settings.server.webServer.description": "管理伺服器", - "settings.server.webServer.actions": "操作", - "settings.server.webServer.reload": "重新載入", - "settings.server.webServer.watchLogs": "查看日誌", - "settings.server.webServer.updateServerIp": "更新伺服器 IP", - "settings.server.webServer.server.label": "伺服器", - "settings.server.webServer.traefik.label": "Traefik", - "settings.server.webServer.traefik.modifyEnv": "修改環境變數", - "settings.server.webServer.traefik.managePorts": "埠轉發", - "settings.server.webServer.traefik.managePortsDescription": "新增或移除 Traefik 的其他埠", - "settings.server.webServer.traefik.targetPort": "目標埠", - "settings.server.webServer.traefik.publishedPort": "對外埠", - "settings.server.webServer.traefik.addPort": "新增埠", - "settings.server.webServer.traefik.portsUpdated": "埠更新成功", - "settings.server.webServer.traefik.portsUpdateError": "埠更新失敗", - "settings.server.webServer.traefik.publishMode": "埠對應模式", - "settings.server.webServer.storage.label": "儲存空間", - "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的映像檔", - "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷", - "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器", - "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 和系統快取", - "settings.server.webServer.storage.cleanMonitoring": "清理監控數據", - "settings.server.webServer.storage.cleanAll": "清理所有內容", - "settings.profile.title": "帳戶", - "settings.profile.description": "更改您的個人資料", - "settings.profile.email": "信箱", - "settings.profile.password": "密碼", - "settings.profile.avatar": "頭像", - "settings.appearance.title": "外觀", - "settings.appearance.description": "自訂面板主題", - "settings.appearance.theme": "主題", - "settings.appearance.themeDescription": "選擇面板主題", - "settings.appearance.themes.light": "明亮", - "settings.appearance.themes.dark": "黑暗", - "settings.appearance.themes.system": "系統", - "settings.appearance.language": "語言", - "settings.appearance.languageDescription": "選擇面板語言", - "settings.terminal.connectionSettings": "終端機設定", - "settings.terminal.ipAddress": "IP 位址", - "settings.terminal.port": "埠", - "settings.terminal.username": "使用者名稱" -} \ No newline at end of file +{} diff --git a/apps/dokploy/public/locales/zh-Hant/settings.json b/apps/dokploy/public/locales/zh-Hant/settings.json new file mode 100644 index 00000000..9d690037 --- /dev/null +++ b/apps/dokploy/public/locales/zh-Hant/settings.json @@ -0,0 +1,58 @@ +{ + "settings.common.save": "儲存", + "settings.common.enterTerminal": "進入終端機", + "settings.server.domain.title": "網域設定", + "settings.server.domain.description": "新增網域至伺服器", + "settings.server.domain.form.domain": "網域", + "settings.server.domain.form.letsEncryptEmail": "Let's Encrypt 信箱", + "settings.server.domain.form.certificate.label": "憑證", + "settings.server.domain.form.certificate.placeholder": "選擇一個憑證", + "settings.server.domain.form.certificateOptions.none": "無", + "settings.server.domain.form.certificateOptions.letsencrypt": "Let's Encrypt", + + "settings.server.webServer.title": "伺服器設定", + "settings.server.webServer.description": "管理伺服器", + "settings.server.webServer.actions": "操作", + "settings.server.webServer.reload": "重新載入", + "settings.server.webServer.watchLogs": "查看日誌", + "settings.server.webServer.updateServerIp": "更新伺服器 IP", + "settings.server.webServer.server.label": "伺服器", + "settings.server.webServer.traefik.label": "Traefik", + "settings.server.webServer.traefik.modifyEnv": "修改環境變數", + "settings.server.webServer.traefik.managePorts": "埠轉發", + "settings.server.webServer.traefik.managePortsDescription": "新增或移除 Traefik 的其他埠", + "settings.server.webServer.traefik.targetPort": "目標埠", + "settings.server.webServer.traefik.publishedPort": "對外埠", + "settings.server.webServer.traefik.addPort": "新增埠", + "settings.server.webServer.traefik.portsUpdated": "埠更新成功", + "settings.server.webServer.traefik.portsUpdateError": "埠更新失敗", + "settings.server.webServer.traefik.publishMode": "埠對應模式", + "settings.server.webServer.storage.label": "儲存空間", + "settings.server.webServer.storage.cleanUnusedImages": "清理未使用的映像檔", + "settings.server.webServer.storage.cleanUnusedVolumes": "清理未使用的卷", + "settings.server.webServer.storage.cleanStoppedContainers": "清理已停止的容器", + "settings.server.webServer.storage.cleanDockerBuilder": "清理 Docker Builder 和系統快取", + "settings.server.webServer.storage.cleanMonitoring": "清理監控數據", + "settings.server.webServer.storage.cleanAll": "清理所有內容", + + "settings.profile.title": "帳戶", + "settings.profile.description": "更改您的個人資料", + "settings.profile.email": "信箱", + "settings.profile.password": "密碼", + "settings.profile.avatar": "頭像", + + "settings.appearance.title": "外觀", + "settings.appearance.description": "自訂面板主題", + "settings.appearance.theme": "主題", + "settings.appearance.themeDescription": "選擇面板主題", + "settings.appearance.themes.light": "明亮", + "settings.appearance.themes.dark": "黑暗", + "settings.appearance.themes.system": "系統", + "settings.appearance.language": "語言", + "settings.appearance.languageDescription": "選擇面板語言", + + "settings.terminal.connectionSettings": "終端機設定", + "settings.terminal.ipAddress": "IP 位址", + "settings.terminal.port": "埠", + "settings.terminal.username": "使用者名稱" +} diff --git a/apps/dokploy/utils/i18n.ts b/apps/dokploy/utils/i18n.ts index aaf74046..e5b88da3 100644 --- a/apps/dokploy/utils/i18n.ts +++ b/apps/dokploy/utils/i18n.ts @@ -8,8 +8,11 @@ export function getLocale(cookies: NextApiRequestCookies) { import { Languages } from "@/lib/languages"; import { serverSideTranslations as originalServerSideTranslations } from "next-i18next/serverSideTranslations"; -export const serverSideTranslations = (locale: string) => - originalServerSideTranslations(locale, ["common"], { +export const serverSideTranslations = ( + locale: string, + namespaces = ["common"], +) => + originalServerSideTranslations(locale, namespaces, { fallbackLng: "en", keySeparator: false, i18n: { @@ -17,5 +20,4 @@ export const serverSideTranslations = (locale: string) => locales: Object.values(Languages).map((language) => language.code), localeDetection: false, }, - reloadOnPrerender: process.env.NODE_ENV === "development", }); diff --git a/packages/server/package.json b/packages/server/package.json index 15b886fc..6a81b808 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -54,7 +54,7 @@ "date-fns": "3.6.0", "dockerode": "4.0.2", "dotenv": "16.4.5", - "drizzle-orm": "^0.39.1", + "drizzle-orm": "^0.39.1", "drizzle-zod": "0.5.1", "hi-base32": "^0.5.1", "js-yaml": "4.1.0", From 10d2493bcc9f19a0ef83bcec9299b92270825c35 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:11:37 -0600 Subject: [PATCH 34/43] feat(auth): add session configuration with expiration and update age settings --- packages/server/src/lib/auth.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/server/src/lib/auth.ts b/packages/server/src/lib/auth.ts index dae72207..9043f203 100644 --- a/packages/server/src/lib/auth.ts +++ b/packages/server/src/lib/auth.ts @@ -137,6 +137,10 @@ const { handler, api } = betterAuth({ }, }, }, + session: { + expiresIn: 60 * 60 * 24 * 3, + updateAge: 60 * 60 * 24, + }, user: { modelName: "users_temp", additionalFields: { From 16e84e431a31fd6d00c56652faa054631e089c57 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:36:43 -0600 Subject: [PATCH 35/43] feat(railpack): add Docker buildx container management to buildRailpack function --- packages/server/src/utils/builders/railpack.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/server/src/utils/builders/railpack.ts b/packages/server/src/utils/builders/railpack.ts index bd2241c6..9cfd1a07 100644 --- a/packages/server/src/utils/builders/railpack.ts +++ b/packages/server/src/utils/builders/railpack.ts @@ -3,6 +3,7 @@ import type { ApplicationNested } from "."; import { prepareEnvironmentVariables } from "../docker/utils"; import { getBuildAppDirectory } from "../filesystem/directory"; import { spawnAsync } from "../process/spawnAsync"; +import { execAsync } from "../process/execAsync"; export const buildRailpack = async ( application: ApplicationNested, @@ -16,6 +17,12 @@ export const buildRailpack = async ( ); try { + await execAsync( + "docker buildx create --use --name builder-containerd --driver docker-container || true", + ); + + await execAsync("docker buildx use builder-containerd"); + // First prepare the build plan and info const prepareArgs = [ "prepare", From 69fdda505d28ed7566922a06c81ed9618d36ce1e Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:37:30 -0600 Subject: [PATCH 36/43] chore(package): bump version from v0.20.2 to v0.20.3 --- apps/dokploy/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json index 257d86c0..64ed2655 100644 --- a/apps/dokploy/package.json +++ b/apps/dokploy/package.json @@ -1,6 +1,6 @@ { "name": "dokploy", - "version": "v0.20.2", + "version": "v0.20.3", "private": true, "license": "Apache-2.0", "type": "module", From 4c90f4754f61079bc074bde88eda56c34ccf6cdb Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:48:25 -0600 Subject: [PATCH 37/43] refactor(monitoring-card): change node display from row to grid layout for improved responsiveness --- .../components/dashboard/swarm/monitoring-card.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx b/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx index 0c38b509..090288a0 100644 --- a/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx +++ b/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx @@ -176,10 +176,12 @@ export default function SwarmMonitorCard({ serverId }: Props) {
-
- {nodes.map((node) => ( - - ))} +
+ {[...nodes, ...nodes, ...nodes, ...nodes, ...nodes, ...nodes].map( + (node) => ( + + ), + )}
From a12beb67487e4b6654107871f67164aabf873776 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:50:24 -0600 Subject: [PATCH 38/43] refactor(monitoring-card): simplify node mapping in dashboard component for better performance --- .../components/dashboard/swarm/monitoring-card.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx b/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx index 090288a0..5ab93610 100644 --- a/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx +++ b/apps/dokploy/components/dashboard/swarm/monitoring-card.tsx @@ -177,11 +177,9 @@ export default function SwarmMonitorCard({ serverId }: Props) {
- {[...nodes, ...nodes, ...nodes, ...nodes, ...nodes, ...nodes].map( - (node) => ( - - ), - )} + {nodes.map((node) => ( + + ))}
From d13871cd08ffee87e24893a8f5cc9096adba7053 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:51:09 -0600 Subject: [PATCH 39/43] refactor(save-github-provider): remove unused GitHub link from save component --- .../general/generic/save-github-provider.tsx | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/apps/dokploy/components/dashboard/application/general/generic/save-github-provider.tsx b/apps/dokploy/components/dashboard/application/general/generic/save-github-provider.tsx index 257e48ea..202c7f88 100644 --- a/apps/dokploy/components/dashboard/application/general/generic/save-github-provider.tsx +++ b/apps/dokploy/components/dashboard/application/general/generic/save-github-provider.tsx @@ -468,16 +468,6 @@ export const SaveGithubProvider = ({ applicationId }: Props) => { Save - {/* create github link */} -
- - Repository - -
From 4c5bc541d67d3d967813b91ede6c2484f0d12196 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 23:00:54 -0600 Subject: [PATCH 40/43] refactor(show-traefik-actions): remove error handling for Traefik reload failure --- .../settings/servers/actions/show-traefik-actions.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx b/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx index b43686bd..c0c45e14 100644 --- a/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/actions/show-traefik-actions.tsx @@ -59,9 +59,7 @@ export const ShowTraefikActions = ({ serverId }: Props) => { .then(async () => { toast.success("Traefik Reloaded"); }) - .catch(() => { - toast.error("Error reloading Traefik"); - }); + .catch(() => {}); }} className="cursor-pointer" > From 160742c2cfca69da2761fc2dda13cde7d1aeb4a9 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 23:55:29 -0600 Subject: [PATCH 41/43] refactor(manage-traefik-ports): remove publishMode from port management and update related logic --- .../web-server/manage-traefik-ports.tsx | 72 ++--------- apps/dokploy/server/api/routers/settings.ts | 116 +++++++++--------- packages/server/src/setup/traefik-setup.ts | 1 - 3 files changed, 73 insertions(+), 116 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx index a6958b16..782e9df8 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx @@ -19,13 +19,6 @@ import { } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; import { ArrowRightLeft, Plus, Trash2 } from "lucide-react"; @@ -44,7 +37,6 @@ interface Props { const PortSchema = z.object({ targetPort: z.number().min(1, "Target port is required"), publishedPort: z.number().min(1, "Published port is required"), - publishMode: z.enum(["ingress", "host"]), }); const TraefikPortsSchema = z.object({ @@ -88,7 +80,7 @@ export const ManageTraefikPorts = ({ children, serverId }: Props) => { }, [currentPorts, form]); const handleAddPort = () => { - append({ targetPort: 0, publishedPort: 0, publishMode: "host" }); + append({ targetPort: 0, publishedPort: 0 }); }; const onSubmit = async (data: TraefikPortsForm) => { @@ -154,7 +146,7 @@ export const ManageTraefikPorts = ({ children, serverId }: Props) => {
{fields.map((field, index) => ( - + { )} /> - ( - - - {t( - "settings.server.webServer.traefik.publishMode", - )} - - - - - )} - /> -
diff --git a/apps/dokploy/server/api/routers/settings.ts b/apps/dokploy/server/api/routers/settings.ts index 461d3e1f..a51ff5d1 100644 --- a/apps/dokploy/server/api/routers/settings.ts +++ b/apps/dokploy/server/api/routers/settings.ts @@ -97,14 +97,20 @@ export const settingsRouter = createTRPCRouter({ toggleDashboard: adminProcedure .input(apiEnableDashboard) .mutation(async ({ input }) => { + const ports = (await getTraefikPorts(input.serverId)).filter( + (port) => + port.targetPort !== 80 && + port.targetPort !== 443 && + port.targetPort !== 8080, + ); await initializeTraefik({ + additionalPorts: ports, enableDashboard: input.enableDashboard, serverId: input.serverId, force: true, }); return true; }), - cleanUnusedImages: adminProcedure .input(apiServerSchema) .mutation(async ({ input }) => { @@ -749,7 +755,6 @@ export const settingsRouter = createTRPCRouter({ z.object({ targetPort: z.number(), publishedPort: z.number(), - publishMode: z.enum(["ingress", "host"]).default("host"), }), ), }), @@ -782,59 +787,7 @@ export const settingsRouter = createTRPCRouter({ getTraefikPorts: adminProcedure .input(apiServerSchema) .query(async ({ input }) => { - const command = `docker container inspect --format='{{json .NetworkSettings.Ports}}' dokploy-traefik`; - - try { - let stdout = ""; - if (input?.serverId) { - const result = await execAsyncRemote(input.serverId, command); - stdout = result.stdout; - } else if (!IS_CLOUD) { - const result = await execAsync(command); - stdout = result.stdout; - } - - const portsMap = JSON.parse(stdout.trim()); - const additionalPorts: Array<{ - targetPort: number; - publishedPort: number; - publishMode: "host" | "ingress"; - }> = []; - - // Convert the Docker container port format to our expected format - for (const [containerPort, bindings] of Object.entries(portsMap)) { - if (!bindings) continue; - - const [port = ""] = containerPort.split("/"); - if (!port) continue; - - const targetPortNum = Number.parseInt(port, 10); - if (Number.isNaN(targetPortNum)) continue; - - // Skip default ports - if ([80, 443, 8080].includes(targetPortNum)) continue; - - for (const binding of bindings as Array<{ HostPort: string }>) { - if (!binding.HostPort) continue; - const publishedPort = Number.parseInt(binding.HostPort, 10); - if (Number.isNaN(publishedPort)) continue; - - additionalPorts.push({ - targetPort: targetPortNum, - publishedPort, - publishMode: "host", // Docker standalone uses host mode by default - }); - } - } - - return additionalPorts; - } catch (error) { - throw new TRPCError({ - code: "INTERNAL_SERVER_ERROR", - message: "Failed to get Traefik ports", - cause: error, - }); - } + return await getTraefikPorts(input?.serverId); }), updateLogCleanup: adminProcedure .input( @@ -853,3 +806,56 @@ export const settingsRouter = createTRPCRouter({ return getLogCleanupStatus(); }), }); + +export const getTraefikPorts = async (serverId?: string) => { + const command = `docker container inspect --format='{{json .NetworkSettings.Ports}}' dokploy-traefik`; + try { + let stdout = ""; + if (serverId) { + const result = await execAsyncRemote(serverId, command); + stdout = result.stdout; + } else if (!IS_CLOUD) { + const result = await execAsync(command); + stdout = result.stdout; + } + + const portsMap = JSON.parse(stdout.trim()); + const additionalPorts: Array<{ + targetPort: number; + publishedPort: number; + }> = []; + + // Convert the Docker container port format to our expected format + for (const [containerPort, bindings] of Object.entries(portsMap)) { + if (!bindings) continue; + + const [port = ""] = containerPort.split("/"); + if (!port) continue; + + const targetPortNum = Number.parseInt(port, 10); + if (Number.isNaN(targetPortNum)) continue; + + // Skip default ports + if ([80, 443].includes(targetPortNum)) continue; + + for (const binding of bindings as Array<{ HostPort: string }>) { + if (!binding.HostPort) continue; + const publishedPort = Number.parseInt(binding.HostPort, 10); + if (Number.isNaN(publishedPort)) continue; + + additionalPorts.push({ + targetPort: targetPortNum, + publishedPort, + }); + } + } + + return additionalPorts; + } catch (error) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Failed to get Traefik ports", + cause: error, + }); + } +}; diff --git a/packages/server/src/setup/traefik-setup.ts b/packages/server/src/setup/traefik-setup.ts index fc6d04fc..4c8a3274 100644 --- a/packages/server/src/setup/traefik-setup.ts +++ b/packages/server/src/setup/traefik-setup.ts @@ -22,7 +22,6 @@ interface TraefikOptions { additionalPorts?: { targetPort: number; publishedPort: number; - publishMode?: "ingress" | "host"; }[]; force?: boolean; } From d42fa738ea849c6fb68b0ba79fa27db0772ef915 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sat, 15 Mar 2025 23:59:18 -0600 Subject: [PATCH 42/43] refactor(side-layout): adjust SidebarMenu gap for improved spacing --- apps/dokploy/components/layouts/side.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx index 1640a1db..15d8728b 100644 --- a/apps/dokploy/components/layouts/side.tsx +++ b/apps/dokploy/components/layouts/side.tsx @@ -908,7 +908,7 @@ export default function Page({ children }: Props) { Settings - + {filteredSettings.map((item) => { const isSingle = item.isSingle !== false; const isActive = isSingle From 60c03e1ca7fb8a5124b9bb993d7c6ab15b9fe689 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 16 Mar 2025 00:18:08 -0600 Subject: [PATCH 43/43] refactor(manage-traefik-ports): remove error handling for port update failure --- .../dashboard/settings/web-server/manage-traefik-ports.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx index 782e9df8..92ef9f12 100644 --- a/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx +++ b/apps/dokploy/components/dashboard/settings/web-server/manage-traefik-ports.tsx @@ -91,9 +91,7 @@ export const ManageTraefikPorts = ({ children, serverId }: Props) => { }); toast.success(t("settings.server.webServer.traefik.portsUpdated")); setOpen(false); - } catch (_error) { - toast.error(t("settings.server.webServer.traefik.portsUpdateError")); - } + } catch (_error) {} }; return (