diff --git a/apps/admin/app/dashboard/nodes/page.tsx b/apps/admin/app/dashboard/nodes/page.tsx index d9389d9..166d0fc 100644 --- a/apps/admin/app/dashboard/nodes/page.tsx +++ b/apps/admin/app/dashboard/nodes/page.tsx @@ -6,6 +6,7 @@ import { deleteNode, filterNodeList, filterServerList, + resetSortWithNode, toggleNodeStatus, updateNode, } from '@/services/admin/server'; @@ -235,6 +236,35 @@ export default function NodesPage() { ]; }, }} + onSort={async (source, target, items) => { + const sourceIndex = items.findIndex((item) => String(item.id) === source); + const targetIndex = items.findIndex((item) => String(item.id) === target); + + const originalSorts = items.map((item) => item.sort); + + const [movedItem] = items.splice(sourceIndex, 1); + items.splice(targetIndex, 0, movedItem!); + + const updatedItems = items.map((item, index) => { + const originalSort = originalSorts[index]; + const newSort = originalSort !== undefined ? originalSort : item.sort; + return { ...item, sort: newSort }; + }); + + const changedItems = updatedItems.filter((item, index) => { + return item.sort !== items[index]?.sort; + }); + + if (changedItems.length > 0) { + resetSortWithNode({ + sort: changedItems.map((item) => ({ + id: item.id, + sort: item.sort, + })) as API.SortItem[], + }); + } + return updatedItems; + }} /> ); } diff --git a/apps/admin/app/dashboard/servers/online-users-cell.tsx b/apps/admin/app/dashboard/servers/online-users-cell.tsx index 2cbff23..82bddb9 100644 --- a/apps/admin/app/dashboard/servers/online-users-cell.tsx +++ b/apps/admin/app/dashboard/servers/online-users-cell.tsx @@ -3,7 +3,7 @@ import { UserDetail } from '@/app/dashboard/user/user-detail'; import { IpLink } from '@/components/ip-link'; import { ProTable } from '@/components/pro-table'; -import { filterServerList } from '@/services/admin/server'; +import { getUserSubscribeById } from '@/services/admin/user'; import { useQuery } from '@tanstack/react-query'; import { Badge } from '@workspace/ui/components/badge'; import { @@ -13,55 +13,85 @@ import { SheetTitle, SheetTrigger, } from '@workspace/ui/components/sheet'; -import type { useTranslations } from 'next-intl'; +import { formatBytes, formatDate } from '@workspace/ui/utils'; +import { useTranslations } from 'next-intl'; import { useState } from 'react'; -function mapOnlineUsers(online: API.ServerStatus['online'] = []): { - uid: string; - ips: string[]; - subscribe?: string; - subscribe_id?: number; - traffic?: number; - expired_at?: number; -}[] { - return (online || []).map((u) => ({ - uid: String(u.user_id || ''), - ips: Array.isArray(u.ip) ? u.ip.map(String) : [], - subscribe: (u as any).subscribe, - subscribe_id: (u as any).subscribe_id, - traffic: (u as any).traffic, - expired_at: (u as any).expired_at, - })); -} - -export default function OnlineUsersCell({ - serverId, - status, - t, +function UserSubscribeInfo({ + subscribeId, + open, + type, }: { - serverId?: number; - status?: API.ServerStatus; - t: ReturnType; + subscribeId: number; + open: boolean; + type: 'account' | 'subscribeName' | 'subscribeId' | 'trafficUsage' | 'expireTime'; }) { - const [open, setOpen] = useState(false); - - const { data: latest } = useQuery({ - queryKey: ['serverStatusById', serverId, open], - enabled: !!serverId && open, + const t = useTranslations('servers'); + const { data } = useQuery({ + enabled: subscribeId !== 0 && open, + queryKey: ['getUserSubscribeById', subscribeId], queryFn: async () => { - const { data } = await filterServerList({ page: 1, size: 1, search: String(serverId) }); - const list = (data?.data?.list || []) as API.Server[]; - return list[0]?.status as API.ServerStatus | undefined; + const { data } = await getUserSubscribeById({ id: subscribeId }); + return data.data; }, }); - const rows = mapOnlineUsers((latest || status)?.online); - const count = rows.length; + if (!data) return --; + + switch (type) { + case 'account': + if (!data.user_id) return --; + return ; + + case 'subscribeName': + if (!data.subscribe?.name) return --; + return {data.subscribe.name}; + + case 'subscribeId': + if (!data.id) return --; + return {data.id}; + + case 'trafficUsage': { + const usedTraffic = data.upload + data.download; + const totalTraffic = data.traffic || 0; + return ( +
+
+ {formatBytes(usedTraffic)} / {totalTraffic > 0 ? formatBytes(totalTraffic) : '无限制'} +
+
+ ); + } + + case 'expireTime': { + if (!data.expire_time) return --; + const isExpired = data.expire_time < Date.now() / 1000; + return ( +
+ {formatDate(data.expire_time)} + {isExpired && ( + + {t('expired')} + + )} +
+ ); + } + + default: + return --; + } +} + +export default function OnlineUsersCell({ status }: { status?: API.ServerStatus }) { + const t = useTranslations('servers'); + const [open, setOpen] = useState(false); + return ( @@ -70,36 +100,20 @@ export default function OnlineUsersCell({ {t('onlineUsers')}
- - > + > header={{ hidden: true }} columns={[ { - accessorKey: 'ips', + accessorKey: 'ip', header: t('ipAddresses'), cell: ({ row }) => { - const ips = row.original.ips; + const ips = row.original.ip; return (
- {ips.map((ip, i) => ( -
- {i === 0 ? ( - - ) : ( - - )} + {ips.map((item, i) => ( +
+ {item.protocol} +
))}
@@ -109,51 +123,63 @@ export default function OnlineUsersCell({ { accessorKey: 'user', header: t('user'), - cell: ({ row }) => , + cell: ({ row }) => ( + + ), }, { accessorKey: 'subscription', header: t('subscription'), cell: ({ row }) => ( - {row.original.subscribe || '--'} + ), }, { accessorKey: 'subscribeId', header: t('subscribeId'), cell: ({ row }) => ( - {row.original.subscribe_id || '--'} + ), }, { accessorKey: 'traffic', header: t('traffic'), - cell: ({ row }) => { - const v = Number(row.original.traffic || 0); - return {(v / 1024 ** 3).toFixed(2)} GB; - }, + cell: ({ row }) => ( + + ), }, { accessorKey: 'expireTime', header: t('expireTime'), - cell: ({ row }) => { - const ts = Number(row.original.expired_at || 0); - if (!ts) return --; - const expired = ts < Date.now() / 1000; - return ( -
- {new Date(ts * 1000).toLocaleString()} - {expired && ( - - {t('expired')} - - )} -
- ); - }, + cell: ({ row }) => ( + + ), }, ]} - request={async () => ({ list: rows, total: rows.length })} + request={async () => ({ + list: status?.online || [], + total: status?.online?.length || 0, + })} />
diff --git a/apps/admin/app/dashboard/servers/page.tsx b/apps/admin/app/dashboard/servers/page.tsx index 77840f9..96105e5 100644 --- a/apps/admin/app/dashboard/servers/page.tsx +++ b/apps/admin/app/dashboard/servers/page.tsx @@ -5,6 +5,7 @@ import { createServer, deleteServer, filterServerList, + resetSortWithServer, updateServer, } from '@/services/admin/server'; import { Badge } from '@workspace/ui/components/badge'; @@ -195,13 +196,7 @@ export default function ServersPage() { { id: 'online_users', header: t('onlineUsers'), - cell: ({ row }) => ( - - ), + cell: ({ row }) => , }, { id: 'traffic_ratio', @@ -288,6 +283,35 @@ export default function ServersPage() { , ], }} + onSort={async (source, target, items) => { + const sourceIndex = items.findIndex((item) => String(item.id) === source); + const targetIndex = items.findIndex((item) => String(item.id) === target); + + const originalSorts = items.map((item) => item.sort); + + const [movedItem] = items.splice(sourceIndex, 1); + items.splice(targetIndex, 0, movedItem!); + + const updatedItems = items.map((item, index) => { + const originalSort = originalSorts[index]; + const newSort = originalSort !== undefined ? originalSort : item.sort; + return { ...item, sort: newSort }; + }); + + const changedItems = updatedItems.filter((item, index) => { + return item.sort !== items[index]?.sort; + }); + + if (changedItems.length > 0) { + resetSortWithServer({ + sort: changedItems.map((item) => ({ + id: item.id, + sort: item.sort, + })) as API.SortItem[], + }); + } + return updatedItems; + }} />
); diff --git a/apps/admin/app/dashboard/system/log-cleanup/log-cleanup-form.tsx b/apps/admin/app/dashboard/system/log-cleanup/log-cleanup-form.tsx new file mode 100644 index 0000000..5c25824 --- /dev/null +++ b/apps/admin/app/dashboard/system/log-cleanup/log-cleanup-form.tsx @@ -0,0 +1,164 @@ +'use client'; + +import { getLogSetting, updateLogSetting } from '@/services/admin/log'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useQuery } from '@tanstack/react-query'; +import { Button } from '@workspace/ui/components/button'; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@workspace/ui/components/form'; +import { ScrollArea } from '@workspace/ui/components/scroll-area'; +import { + Sheet, + SheetContent, + SheetFooter, + SheetHeader, + SheetTitle, + SheetTrigger, +} from '@workspace/ui/components/sheet'; +import { Switch } from '@workspace/ui/components/switch'; +import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; +import { Icon } from '@workspace/ui/custom-components/icon'; +import { useTranslations } from 'next-intl'; +import { useEffect, useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { toast } from 'sonner'; +import { z } from 'zod'; + +const logCleanupSchema = z.object({ + auto_clear: z.boolean(), + clear_days: z.number().min(1), +}); + +type LogCleanupFormData = z.infer; + +export default function LogCleanupForm() { + const t = useTranslations('system'); + const [open, setOpen] = useState(false); + const [loading, setLoading] = useState(false); + + const { data, refetch } = useQuery({ + queryKey: ['getLogSetting'], + queryFn: async () => { + const { data } = await getLogSetting(); + return data.data; + }, + enabled: open, + }); + + const form = useForm({ + resolver: zodResolver(logCleanupSchema), + defaultValues: { + auto_clear: false, + clear_days: 30, + }, + }); + + useEffect(() => { + if (data) { + form.reset(data); + } + }, [data, form]); + + async function onSubmit(values: LogCleanupFormData) { + setLoading(true); + try { + await updateLogSetting(values as API.LogSetting); + toast.success(t('common.saveSuccess')); + refetch(); + setOpen(false); + } catch (error) { + toast.error(t('common.saveFailed')); + } finally { + setLoading(false); + } + } + + return ( + + +
+
+
+ +
+
+

{t('logCleanup.title')}

+

{t('logCleanup.description')}

+
+
+ +
+
+ + + {t('logCleanup.title')} + + +
+ + ( + + {t('logCleanup.autoClear')} + + + + {t('logCleanup.autoClearDescription')} + + + )} + /> + + ( + + {t('logCleanup.clearDays')} + + field.onChange(Number(value))} + disabled={!form.watch('auto_clear')} + /> + + {t('logCleanup.clearDaysDescription')} + + + )} + /> + + +
+ + + + +
+
+ ); +} diff --git a/apps/admin/app/dashboard/system/page.tsx b/apps/admin/app/dashboard/system/page.tsx index 601a064..4a687e9 100644 --- a/apps/admin/app/dashboard/system/page.tsx +++ b/apps/admin/app/dashboard/system/page.tsx @@ -6,6 +6,7 @@ import CurrencyForm from './basic-settings/currency-form'; import PrivacyPolicyForm from './basic-settings/privacy-policy-form'; import SiteForm from './basic-settings/site-form'; import TosForm from './basic-settings/tos-form'; +import LogCleanupForm from './log-cleanup/log-cleanup-form'; import InviteForm from './user-security/invite-form'; import RegisterForm from './user-security/register-form'; import VerifyCodeForm from './user-security/verify-code-form'; @@ -14,7 +15,6 @@ import VerifyForm from './user-security/verify-form'; export default function Page() { const t = useTranslations('system'); - // 定义表单配置 const formSections = [ { title: t('basicSettings'), @@ -34,6 +34,10 @@ export default function Page() { { component: VerifyCodeForm }, ], }, + { + title: t('logSettings'), + forms: [{ component: LogCleanupForm }], + }, ]; return ( diff --git a/apps/admin/app/dashboard/user/user-form.tsx b/apps/admin/app/dashboard/user/user-form.tsx index a856f93..d8e2045 100644 --- a/apps/admin/app/dashboard/user/user-form.tsx +++ b/apps/admin/app/dashboard/user/user-form.tsx @@ -58,6 +58,8 @@ export default function UserForm>({ password: z.string().optional(), referer_id: z.number().optional(), refer_code: z.string().optional(), + referral_percentage: z.number().optional(), + only_first_purchase: z.boolean().optional(), is_admin: z.boolean().optional(), balance: z.number().optional(), gift_amount: z.number().optional(), @@ -218,6 +220,41 @@ export default function UserForm>({ )} /> + ( + + {t('referralPercentage')} + + { + form.setValue(field.name, Number(value)); + }} + /> + + + + )} + /> + ( + + {t('onlyFirstPurchase')} + + + + + )} + /> + + ( + + {t('referralPercentage')} + + { + form.setValue(field.name, value as number); + }} + /> + + + + )} + /> + ( + + {t('onlyFirstPurchase')} + + + + + )} + /> {[ { - title: t('onlineIPCount'), - value: ServerTotal?.online_user_ips || 0, + title: t('onlineUsersCount'), + value: ServerTotal?.online_users || 0, icon: 'uil:users-alt', href: '/dashboard/servers', }, diff --git a/apps/admin/locales/cs-CZ/index.json b/apps/admin/locales/cs-CZ/index.json index 3a394b2..61893d0 100644 --- a/apps/admin/locales/cs-CZ/index.json +++ b/apps/admin/locales/cs-CZ/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Provoz uzlu", "nodes": "uzly", "offlineNodeCount": "Počet offline uzlů", - "onlineIPCount": "Počet online IP", "onlineNodeCount": "Počet online uzlů", + "onlineUsersCount": "Uživatelé online", "pendingTickets": "Čekající lístky", "register": "Registrovat se", "repurchase": "opětovný nákup", diff --git a/apps/admin/locales/cs-CZ/system.json b/apps/admin/locales/cs-CZ/system.json index 9529fdf..a3a43f5 100644 --- a/apps/admin/locales/cs-CZ/system.json +++ b/apps/admin/locales/cs-CZ/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Uložení úspěšné", "title": "Nastavení pozvánek" }, + "logCleanup": { + "autoClear": "Povolit automatické čištění", + "autoClearDescription": "Pokud je povoleno, systém automaticky vymaže vypršené záznamy protokolů", + "clearDays": "Dny uchovávání", + "clearDaysDescription": "Počet dní pro uchovávání protokolů; protokoly starší než toto budou vyčištěny", + "clearDaysPlaceholder": "Zadejte dny uchovávání", + "description": "Nastavte pravidla automatického čištění protokolů a dobu uchovávání", + "title": "Nastavení čištění protokolů" + }, + "logSettings": "Nastavení protokolů", "privacyPolicy": { "description": "Upravte a spravujte obsah zásad ochrany osobních údajů", "title": "Zásady ochrany osobních údajů" diff --git a/apps/admin/locales/cs-CZ/user.json b/apps/admin/locales/cs-CZ/user.json index 23a8596..0a70aaf 100644 --- a/apps/admin/locales/cs-CZ/user.json +++ b/apps/admin/locales/cs-CZ/user.json @@ -50,6 +50,7 @@ "more": "Více", "notifySettingsTitle": "Nastavení oznámení", "onlineDevices": "Online zařízení", + "onlyFirstPurchase": "Pouze první nákup", "orderList": "Seznam objednávek", "password": "Heslo", "passwordPlaceholder": "Zadejte nové heslo (volitelné)", @@ -59,6 +60,8 @@ "refererId": "ID doporučitele", "refererIdPlaceholder": "Zadejte ID doporučitele", "referralCode": "Doporučovací kód", + "referralPercentage": "Procento doporučení", + "referralPercentagePlaceholder": "Zadejte procento doporučení (0-100)", "referrerUserId": "Odesílatel (uživatelské ID)", "remove": "Odstranit", "resetLogs": "Protokoly resetování", diff --git a/apps/admin/locales/de-DE/index.json b/apps/admin/locales/de-DE/index.json index f5b3fb8..7165238 100644 --- a/apps/admin/locales/de-DE/index.json +++ b/apps/admin/locales/de-DE/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Knotenverkehr", "nodes": "Knoten", "offlineNodeCount": "Anzahl der Offline-Knoten", - "onlineIPCount": "Online-IP-Anzahl", "onlineNodeCount": "Anzahl der Online-Knoten", + "onlineUsersCount": "Online-Benutzer", "pendingTickets": "Ausstehende Tickets", "register": "Registrieren", "repurchase": "Wiederkauf", diff --git a/apps/admin/locales/de-DE/system.json b/apps/admin/locales/de-DE/system.json index cdd3bab..462f358 100644 --- a/apps/admin/locales/de-DE/system.json +++ b/apps/admin/locales/de-DE/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Speichern erfolgreich", "title": "Einladungseinstellungen" }, + "logCleanup": { + "autoClear": "Automatische Bereinigung aktivieren", + "autoClearDescription": "Wenn aktiviert, wird das System abgelaufene Protokolle automatisch löschen", + "clearDays": "Aufbewahrungstage", + "clearDaysDescription": "Anzahl der Tage, an denen Protokolle aufbewahrt werden; Protokolle, die älter sind als dies, werden gelöscht", + "clearDaysPlaceholder": "Geben Sie die Aufbewahrungstage ein", + "description": "Konfigurieren Sie automatische Protokollbereinigungsregeln und Aufbewahrungsfristen", + "title": "Protokollbereinigungseinstellungen" + }, + "logSettings": "Protokolleinstellungen", "privacyPolicy": { "description": "Bearbeiten und verwalten Sie den Inhalt der Datenschutzrichtlinie", "title": "Datenschutzrichtlinie" diff --git a/apps/admin/locales/de-DE/user.json b/apps/admin/locales/de-DE/user.json index b8cb2ea..084861e 100644 --- a/apps/admin/locales/de-DE/user.json +++ b/apps/admin/locales/de-DE/user.json @@ -50,6 +50,7 @@ "more": "Mehr", "notifySettingsTitle": "Benachrichtigungseinstellungen", "onlineDevices": "Online-Geräte", + "onlyFirstPurchase": "Nur Erstkäufe", "orderList": "Bestellliste", "password": "Passwort", "passwordPlaceholder": "Neues Passwort eingeben (optional)", @@ -59,6 +60,8 @@ "refererId": "Referenz-ID", "refererIdPlaceholder": "Geben Sie die Referenz-ID ein", "referralCode": "Empfehlungscode", + "referralPercentage": "Empfehlungsprozent", + "referralPercentagePlaceholder": "Geben Sie den Empfehlungsprozentsatz ein (0-100)", "referrerUserId": "Empfehler (Benutzer-ID)", "remove": "Entfernen", "resetLogs": "Zurücksetzprotokolle", diff --git a/apps/admin/locales/en-US/index.json b/apps/admin/locales/en-US/index.json index 1d71336..8f53e2b 100644 --- a/apps/admin/locales/en-US/index.json +++ b/apps/admin/locales/en-US/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Node Traffic", "nodes": "Nodes", "offlineNodeCount": "Offline Nodes", - "onlineIPCount": "Online IPs", "onlineNodeCount": "Online Nodes", + "onlineUsersCount": "Online Users", "pendingTickets": "Pending Tickets", "register": "Register", "repurchase": "Repurchase", diff --git a/apps/admin/locales/en-US/system.json b/apps/admin/locales/en-US/system.json index 20f46c5..c841414 100644 --- a/apps/admin/locales/en-US/system.json +++ b/apps/admin/locales/en-US/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Save Successful", "saveFailed": "Save Failed" }, + "logCleanup": { + "title": "Log Cleanup Settings", + "description": "Configure automatic log cleanup rules and retention period", + "autoClear": "Enable Auto Cleanup", + "autoClearDescription": "When enabled, the system will automatically clear expired log records", + "clearDays": "Retention Days", + "clearDaysDescription": "Number of days to retain logs; logs older than this will be cleaned up", + "clearDaysPlaceholder": "Enter retention days" + }, + "logSettings": "Log Settings", "privacyPolicy": { "title": "Privacy Policy", "description": "Edit and manage privacy policy content" diff --git a/apps/admin/locales/en-US/user.json b/apps/admin/locales/en-US/user.json index 5d8133c..3ece483 100644 --- a/apps/admin/locales/en-US/user.json +++ b/apps/admin/locales/en-US/user.json @@ -50,6 +50,7 @@ "more": "More", "notifySettingsTitle": "Notification Settings", "onlineDevices": "Online Devices", + "onlyFirstPurchase": "First Purchase Only", "orderList": "Order List", "password": "Password", "passwordPlaceholder": "Enter new password (optional)", @@ -59,6 +60,8 @@ "refererId": "Referer ID", "refererIdPlaceholder": "Enter referer ID", "referralCode": "Referral Code", + "referralPercentage": "Referral Percentage", + "referralPercentagePlaceholder": "Enter referral percentage (0-100)", "referrerUserId": "Referrer (User ID)", "remove": "Remove", "resetLogs": "Reset Logs", diff --git a/apps/admin/locales/es-ES/index.json b/apps/admin/locales/es-ES/index.json index 420e49f..97d30b3 100644 --- a/apps/admin/locales/es-ES/index.json +++ b/apps/admin/locales/es-ES/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Tráfico de nodo", "nodes": "nodos", "offlineNodeCount": "Número de nodos fuera de línea", - "onlineIPCount": "Número de IPs en línea", "onlineNodeCount": "Número de nodos en línea", + "onlineUsersCount": "Usuarios en línea", "pendingTickets": "Tickets pendientes", "register": "registrar", "repurchase": "recompra", diff --git a/apps/admin/locales/es-ES/system.json b/apps/admin/locales/es-ES/system.json index 260237d..c359ed4 100644 --- a/apps/admin/locales/es-ES/system.json +++ b/apps/admin/locales/es-ES/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Guardado Exitoso", "title": "Configuración de Invitaciones" }, + "logCleanup": { + "autoClear": "Habilitar limpieza automática", + "autoClearDescription": "Cuando está habilitado, el sistema eliminará automáticamente los registros de log expirados", + "clearDays": "Días de retención", + "clearDaysDescription": "Número de días para retener los registros; los registros más antiguos que esto serán eliminados", + "clearDaysPlaceholder": "Introduce los días de retención", + "description": "Configura las reglas de limpieza automática de registros y el período de retención", + "title": "Configuración de limpieza de registros" + }, + "logSettings": "Configuración de registros", "privacyPolicy": { "description": "Editar y gestionar el contenido de la política de privacidad", "title": "Política de Privacidad" diff --git a/apps/admin/locales/es-ES/user.json b/apps/admin/locales/es-ES/user.json index 19b7fdd..29045ac 100644 --- a/apps/admin/locales/es-ES/user.json +++ b/apps/admin/locales/es-ES/user.json @@ -50,6 +50,7 @@ "more": "Más", "notifySettingsTitle": "Configuración de Notificaciones", "onlineDevices": "Dispositivos en línea", + "onlyFirstPurchase": "Solo Primera Compra", "orderList": "Lista de Pedidos", "password": "Contraseña", "passwordPlaceholder": "Ingrese nueva contraseña (opcional)", @@ -59,6 +60,8 @@ "refererId": "ID del Referente", "refererIdPlaceholder": "Ingrese el ID del referente", "referralCode": "Código de Referencia", + "referralPercentage": "Porcentaje de Referencia", + "referralPercentagePlaceholder": "Introduce el porcentaje de referencia (0-100)", "referrerUserId": "Referente (ID de usuario)", "remove": "Eliminar", "resetLogs": "Registros de Reinicio", diff --git a/apps/admin/locales/es-MX/index.json b/apps/admin/locales/es-MX/index.json index 4f9cabb..ce7cc44 100644 --- a/apps/admin/locales/es-MX/index.json +++ b/apps/admin/locales/es-MX/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Tráfico de nodo", "nodes": "nodos", "offlineNodeCount": "Número de nodos fuera de línea", - "onlineIPCount": "Número de IPs en línea", "onlineNodeCount": "Número de nodos en línea", + "onlineUsersCount": "Usuarios en línea", "pendingTickets": "Tickets pendientes", "register": "Registrarse", "repurchase": "recompra", diff --git a/apps/admin/locales/es-MX/system.json b/apps/admin/locales/es-MX/system.json index 998cbea..dc24a01 100644 --- a/apps/admin/locales/es-MX/system.json +++ b/apps/admin/locales/es-MX/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Guardado Exitoso", "title": "Configuración de Invitaciones" }, + "logCleanup": { + "autoClear": "Habilitar Limpieza Automática", + "autoClearDescription": "Cuando está habilitado, el sistema eliminará automáticamente los registros de log expirados", + "clearDays": "Días de Retención", + "clearDaysDescription": "Número de días para retener los registros; los registros más antiguos que esto serán eliminados", + "clearDaysPlaceholder": "Ingresa los días de retención", + "description": "Configura las reglas de limpieza automática de registros y el período de retención", + "title": "Configuración de Limpieza de Registros" + }, + "logSettings": "Configuración de Registros", "privacyPolicy": { "description": "Editar y gestionar el contenido de la política de privacidad", "title": "Política de Privacidad" diff --git a/apps/admin/locales/es-MX/user.json b/apps/admin/locales/es-MX/user.json index bc709dd..6d4a8dd 100644 --- a/apps/admin/locales/es-MX/user.json +++ b/apps/admin/locales/es-MX/user.json @@ -50,6 +50,7 @@ "more": "Más", "notifySettingsTitle": "Configuración de Notificaciones", "onlineDevices": "Dispositivos en línea", + "onlyFirstPurchase": "Solo Primera Compra", "orderList": "Lista de Pedidos", "password": "Contraseña", "passwordPlaceholder": "Ingresa nueva contraseña (opcional)", @@ -59,6 +60,8 @@ "refererId": "ID del Referente", "refererIdPlaceholder": "Ingrese ID del referente", "referralCode": "Código de Referencia", + "referralPercentage": "Porcentaje de Referencia", + "referralPercentagePlaceholder": "Ingresa el porcentaje de referencia (0-100)", "referrerUserId": "Referente (ID de Usuario)", "remove": "Eliminar", "resetLogs": "Registros de Reinicio", diff --git a/apps/admin/locales/fa-IR/index.json b/apps/admin/locales/fa-IR/index.json index a998769..ef5c312 100644 --- a/apps/admin/locales/fa-IR/index.json +++ b/apps/admin/locales/fa-IR/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "ترافیک نود", "nodes": "گره‌ها", "offlineNodeCount": "گره‌های آفلاین", - "onlineIPCount": "آی‌پی‌های آنلاین", "onlineNodeCount": "گره‌های آنلاین", + "onlineUsersCount": "کاربران آنلاین", "pendingTickets": "بلیط‌های در انتظار", "register": "ثبت نام", "repurchase": "بازخرید", diff --git a/apps/admin/locales/fa-IR/system.json b/apps/admin/locales/fa-IR/system.json index c1860f6..b1686f9 100644 --- a/apps/admin/locales/fa-IR/system.json +++ b/apps/admin/locales/fa-IR/system.json @@ -33,6 +33,16 @@ "saveSuccess": "ذخیره با موفقیت انجام شد", "title": "تنظیمات دعوتنامه" }, + "logCleanup": { + "autoClear": "فعال‌سازی پاک‌سازی خودکار", + "autoClearDescription": "با فعال‌سازی این گزینه، سیستم به‌طور خودکار رکوردهای لاگ منقضی شده را پاک می‌کند", + "clearDays": "روزهای نگهداری", + "clearDaysDescription": "تعداد روزهایی که لاگ‌ها نگهداری می‌شوند؛ لاگ‌های قدیمی‌تر از این مدت پاک خواهند شد", + "clearDaysPlaceholder": "تعداد روزهای نگهداری را وارد کنید", + "description": "پیکربندی قوانین پاک‌سازی خودکار لاگ و دوره نگهداری", + "title": "تنظیمات پاک‌سازی لاگ" + }, + "logSettings": "تنظیمات لاگ", "privacyPolicy": { "description": "محتوای سیاست حفظ حریم خصوصی را ویرایش و مدیریت کنید", "title": "سیاست حفظ حریم خصوصی" diff --git a/apps/admin/locales/fa-IR/user.json b/apps/admin/locales/fa-IR/user.json index 86a45cf..6f294cc 100644 --- a/apps/admin/locales/fa-IR/user.json +++ b/apps/admin/locales/fa-IR/user.json @@ -50,6 +50,7 @@ "more": "بیشتر", "notifySettingsTitle": "تنظیمات اعلان‌ها", "onlineDevices": "دستگاه‌های آنلاین", + "onlyFirstPurchase": "فقط خرید اول", "orderList": "لیست سفارشات", "password": "رمز عبور", "passwordPlaceholder": "رمز عبور جدید را وارد کنید (اختیاری)", @@ -59,6 +60,8 @@ "refererId": "شناسه معرف", "refererIdPlaceholder": "شناسه معرف را وارد کنید", "referralCode": "کد ارجاع", + "referralPercentage": "درصد ارجاع", + "referralPercentagePlaceholder": "درصد ارجاع را وارد کنید (۰-۱۰۰)", "referrerUserId": "ارجاع‌دهنده (شناسه کاربر)", "remove": "حذف", "resetLogs": "گزارشات بازنشانی", diff --git a/apps/admin/locales/fi-FI/index.json b/apps/admin/locales/fi-FI/index.json index 8946b28..c196fe6 100644 --- a/apps/admin/locales/fi-FI/index.json +++ b/apps/admin/locales/fi-FI/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Solmun liikenne", "nodes": "solmut", "offlineNodeCount": "Offline-solmujen määrä", - "onlineIPCount": "Verkossa olevien IP-osoitteiden määrä", "onlineNodeCount": "Verkossa olevien solmujen määrä", + "onlineUsersCount": "Verkkokäyttäjät", "pendingTickets": "Odottavat liput", "register": "Rekisteröidy", "repurchase": "uudelleenosto", diff --git a/apps/admin/locales/fi-FI/system.json b/apps/admin/locales/fi-FI/system.json index 11ad844..d4b1e88 100644 --- a/apps/admin/locales/fi-FI/system.json +++ b/apps/admin/locales/fi-FI/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Tallennus onnistui", "title": "Kutsuasetukset" }, + "logCleanup": { + "autoClear": "Ota automaattinen puhdistus käyttöön", + "autoClearDescription": "Kun tämä on käytössä, järjestelmä puhdistaa automaattisesti vanhentuneet lokitiedot", + "clearDays": "Säilytyspäivät", + "clearDaysDescription": "Päivien määrä, jolloin lokit säilytetään; tätä vanhemmat lokit poistetaan", + "clearDaysPlaceholder": "Syötä säilytyspäivät", + "description": "Määritä automaattiset lokin puhdistus säännöt ja säilytysaika", + "title": "Lokin puhdistuksen asetukset" + }, + "logSettings": "Lokiasetukset", "privacyPolicy": { "description": "Muokkaa ja hallinnoi tietosuojakäytännön sisältöä", "title": "Tietosuojakäytäntö" diff --git a/apps/admin/locales/fi-FI/user.json b/apps/admin/locales/fi-FI/user.json index d457a81..39f2caf 100644 --- a/apps/admin/locales/fi-FI/user.json +++ b/apps/admin/locales/fi-FI/user.json @@ -50,6 +50,7 @@ "more": "Lisää", "notifySettingsTitle": "Ilmoitusasetukset", "onlineDevices": "Verkossa olevat laitteet", + "onlyFirstPurchase": "Vain ensimmäinen ostos", "orderList": "Tilaukset", "password": "Salasana", "passwordPlaceholder": "Syötä uusi salasana (valinnainen)", @@ -59,6 +60,8 @@ "refererId": "Viittaajan ID", "refererIdPlaceholder": "Syötä suosittelijan ID", "referralCode": "Suosituskoodi", + "referralPercentage": "Suositusprosentti", + "referralPercentagePlaceholder": "Syötä suositusprosentti (0-100)", "referrerUserId": "Viittaaja (Käyttäjän ID)", "remove": "Poista", "resetLogs": "Nollauslokit", diff --git a/apps/admin/locales/fr-FR/index.json b/apps/admin/locales/fr-FR/index.json index 473e7d8..680b987 100644 --- a/apps/admin/locales/fr-FR/index.json +++ b/apps/admin/locales/fr-FR/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Trafic du nœud", "nodes": "nœuds", "offlineNodeCount": "Nombre de nœuds hors ligne", - "onlineIPCount": "Nombre d'IP en ligne", "onlineNodeCount": "Nombre de nœuds en ligne", + "onlineUsersCount": "Utilisateurs en ligne", "pendingTickets": "Tickets en attente", "register": "S'inscrire", "repurchase": "Rachat", diff --git a/apps/admin/locales/fr-FR/system.json b/apps/admin/locales/fr-FR/system.json index 400205f..3bcbb55 100644 --- a/apps/admin/locales/fr-FR/system.json +++ b/apps/admin/locales/fr-FR/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Enregistrement réussi", "title": "Paramètres d'invitation" }, + "logCleanup": { + "autoClear": "Activer le nettoyage automatique", + "autoClearDescription": "Lorsque cette option est activée, le système supprimera automatiquement les enregistrements de journaux expirés", + "clearDays": "Jours de conservation", + "clearDaysDescription": "Nombre de jours pour conserver les journaux ; les journaux plus anciens seront supprimés", + "clearDaysPlaceholder": "Entrez le nombre de jours de conservation", + "description": "Configurer les règles de nettoyage automatique des journaux et la période de conservation", + "title": "Paramètres de nettoyage des journaux" + }, + "logSettings": "Paramètres des journaux", "privacyPolicy": { "description": "Modifier et gérer le contenu de la politique de confidentialité", "title": "Politique de confidentialité" diff --git a/apps/admin/locales/fr-FR/user.json b/apps/admin/locales/fr-FR/user.json index 9698f9e..9e81731 100644 --- a/apps/admin/locales/fr-FR/user.json +++ b/apps/admin/locales/fr-FR/user.json @@ -50,6 +50,7 @@ "more": "Plus", "notifySettingsTitle": "Paramètres de notification", "onlineDevices": "Appareils en ligne", + "onlyFirstPurchase": "Premier achat uniquement", "orderList": "Liste des commandes", "password": "Mot de passe", "passwordPlaceholder": "Entrez un nouveau mot de passe (facultatif)", @@ -59,6 +60,8 @@ "refererId": "ID du référent", "refererIdPlaceholder": "Entrez l'ID du référent", "referralCode": "Code de parrainage", + "referralPercentage": "Pourcentage de parrainage", + "referralPercentagePlaceholder": "Entrez le pourcentage de parrainage (0-100)", "referrerUserId": "Référent (ID utilisateur)", "remove": "Supprimer", "resetLogs": "Journaux de réinitialisation", diff --git a/apps/admin/locales/hi-IN/index.json b/apps/admin/locales/hi-IN/index.json index fd92b02..0c248a8 100644 --- a/apps/admin/locales/hi-IN/index.json +++ b/apps/admin/locales/hi-IN/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "नोड ट्रैफिक", "nodes": "नोड्स", "offlineNodeCount": "ऑफ़लाइन नोड की संख्या", - "onlineIPCount": "ऑनलाइन IP संख्या", "onlineNodeCount": "ऑनलाइन नोड की संख्या", + "onlineUsersCount": "ऑनलाइन उपयोगकर्ता", "pendingTickets": "लंबित टिकट", "register": "पंजीकरण", "repurchase": "पुनः खरीद", diff --git a/apps/admin/locales/hi-IN/system.json b/apps/admin/locales/hi-IN/system.json index 72c33ca..481777a 100644 --- a/apps/admin/locales/hi-IN/system.json +++ b/apps/admin/locales/hi-IN/system.json @@ -33,6 +33,16 @@ "saveSuccess": "सहेजना सफल", "title": "आमंत्रण सेटिंग्स" }, + "logCleanup": { + "autoClear": "स्वचालित क्लीनअप सक्षम करें", + "autoClearDescription": "जब सक्षम किया जाता है, तो सिस्टम स्वचालित रूप से समाप्त लॉग रिकॉर्ड को साफ करेगा", + "clearDays": "संरक्षण दिन", + "clearDaysDescription": "लॉग को बनाए रखने के लिए दिनों की संख्या; इससे पुराने लॉग को साफ किया जाएगा", + "clearDaysPlaceholder": "संरक्षण दिन दर्ज करें", + "description": "स्वचालित लॉग क्लीनअप नियम और संरक्षण अवधि कॉन्फ़िगर करें", + "title": "लॉग क्लीनअप सेटिंग्स" + }, + "logSettings": "लॉग सेटिंग्स", "privacyPolicy": { "description": "गोपनीयता नीति सामग्री को संपादित और प्रबंधित करें", "title": "गोपनीयता नीति" diff --git a/apps/admin/locales/hi-IN/user.json b/apps/admin/locales/hi-IN/user.json index bce13e3..3ba082b 100644 --- a/apps/admin/locales/hi-IN/user.json +++ b/apps/admin/locales/hi-IN/user.json @@ -50,6 +50,7 @@ "more": "और", "notifySettingsTitle": "सूचना सेटिंग्स", "onlineDevices": "ऑनलाइन डिवाइस", + "onlyFirstPurchase": "पहली खरीदारी केवल", "orderList": "ऑर्डर सूची", "password": "पासवर्ड", "passwordPlaceholder": "नया पासवर्ड दर्ज करें (वैकल्पिक)", @@ -59,6 +60,8 @@ "refererId": "रेफरर आईडी", "refererIdPlaceholder": "रेफरर आईडी दर्ज करें", "referralCode": "रेफरल कोड", + "referralPercentage": "रेफरल प्रतिशत", + "referralPercentagePlaceholder": "रेफरल प्रतिशत दर्ज करें (0-100)", "referrerUserId": "रेफरर (उपयोगकर्ता आईडी)", "remove": "हटाएं", "resetLogs": "रीसेट लॉग", diff --git a/apps/admin/locales/hu-HU/index.json b/apps/admin/locales/hu-HU/index.json index 90a5f2e..cf07698 100644 --- a/apps/admin/locales/hu-HU/index.json +++ b/apps/admin/locales/hu-HU/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Csomópont forgalom", "nodes": "csomópontok", "offlineNodeCount": "Offline csomópontok száma", - "onlineIPCount": "Online IP-szám", "onlineNodeCount": "Online csomópontok száma", + "onlineUsersCount": "Online Felhasználók", "pendingTickets": "Függőben lévő jegyek", "register": "Regisztráció", "repurchase": "újravásárlás", diff --git a/apps/admin/locales/hu-HU/system.json b/apps/admin/locales/hu-HU/system.json index 1d3aebd..507aed4 100644 --- a/apps/admin/locales/hu-HU/system.json +++ b/apps/admin/locales/hu-HU/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Mentés sikeres", "title": "Meghívási beállítások" }, + "logCleanup": { + "autoClear": "Automatikus Tisztítás Engedélyezése", + "autoClearDescription": "Ha engedélyezve van, a rendszer automatikusan törli a lejárt naplóbejegyzéseket", + "clearDays": "Megőrzési Napok", + "clearDaysDescription": "A naplók megőrzésének napjai; a régebbi naplók törlésre kerülnek", + "clearDaysPlaceholder": "Adja meg a megőrzési napokat", + "description": "Automatikus napló tisztítási szabályok és megőrzési időszak konfigurálása", + "title": "Napló Tisztítási Beállítások" + }, + "logSettings": "Napló Beállítások", "privacyPolicy": { "description": "Adatvédelmi irányelvek tartalmának szerkesztése és kezelése", "title": "Adatvédelmi irányelvek" diff --git a/apps/admin/locales/hu-HU/user.json b/apps/admin/locales/hu-HU/user.json index 36c0300..f89ce2b 100644 --- a/apps/admin/locales/hu-HU/user.json +++ b/apps/admin/locales/hu-HU/user.json @@ -50,6 +50,7 @@ "more": "Több", "notifySettingsTitle": "Értesítési beállítások", "onlineDevices": "Online eszközök", + "onlyFirstPurchase": "Csak első vásárlás", "orderList": "Rendelések listája", "password": "Jelszó", "passwordPlaceholder": "Adjon meg új jelszót (opcionális)", @@ -59,6 +60,8 @@ "refererId": "Hivatkozó azonosító", "refererIdPlaceholder": "Adja meg az ajánló azonosítóját", "referralCode": "Ajánlókód", + "referralPercentage": "Ajánlási százalék", + "referralPercentagePlaceholder": "Írd be az ajánlási százalékot (0-100)", "referrerUserId": "Ajánló (Felhasználói azonosító)", "remove": "Eltávolítás", "resetLogs": "Visszaállítási naplók", diff --git a/apps/admin/locales/ja-JP/index.json b/apps/admin/locales/ja-JP/index.json index 75431dd..9b35400 100644 --- a/apps/admin/locales/ja-JP/index.json +++ b/apps/admin/locales/ja-JP/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "ノードトラフィック", "nodes": "ノード", "offlineNodeCount": "オフラインノード数", - "onlineIPCount": "オンラインIP数", "onlineNodeCount": "オンラインノード数", + "onlineUsersCount": "オンラインユーザー", "pendingTickets": "保留中のチケット", "register": "登録", "repurchase": "再購入", diff --git a/apps/admin/locales/ja-JP/system.json b/apps/admin/locales/ja-JP/system.json index b8cb80d..35c1018 100644 --- a/apps/admin/locales/ja-JP/system.json +++ b/apps/admin/locales/ja-JP/system.json @@ -33,6 +33,16 @@ "saveSuccess": "保存成功", "title": "招待設定" }, + "logCleanup": { + "autoClear": "自動クリーンアップを有効にする", + "autoClearDescription": "有効にすると、システムは期限切れのログレコードを自動的にクリアします", + "clearDays": "保持日数", + "clearDaysDescription": "ログを保持する日数; これを超える古いログはクリーンアップされます", + "clearDaysPlaceholder": "保持日数を入力してください", + "description": "自動ログクリーンアップルールと保持期間を設定します", + "title": "ログクリーンアップ設定" + }, + "logSettings": "ログ設定", "privacyPolicy": { "description": "プライバシーポリシーの内容を編集・管理します", "title": "プライバシーポリシー" diff --git a/apps/admin/locales/ja-JP/user.json b/apps/admin/locales/ja-JP/user.json index 30bcfd4..b46435d 100644 --- a/apps/admin/locales/ja-JP/user.json +++ b/apps/admin/locales/ja-JP/user.json @@ -50,6 +50,7 @@ "more": "もっと見る", "notifySettingsTitle": "通知設定", "onlineDevices": "オンラインデバイス", + "onlyFirstPurchase": "初回購入のみ", "orderList": "注文リスト", "password": "パスワード", "passwordPlaceholder": "新しいパスワードを入力してください(任意)", @@ -59,6 +60,8 @@ "refererId": "リファラーID", "refererIdPlaceholder": "紹介者IDを入力してください", "referralCode": "紹介コード", + "referralPercentage": "紹介割合", + "referralPercentagePlaceholder": "紹介割合を入力してください(0-100)", "referrerUserId": "紹介者(ユーザーID)", "remove": "削除", "resetLogs": "リセット履歴", diff --git a/apps/admin/locales/ko-KR/index.json b/apps/admin/locales/ko-KR/index.json index f00c0f3..920d9a8 100644 --- a/apps/admin/locales/ko-KR/index.json +++ b/apps/admin/locales/ko-KR/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "노드 트래픽", "nodes": "노드", "offlineNodeCount": "오프라인 노드 수", - "onlineIPCount": "온라인 IP 수", "onlineNodeCount": "온라인 노드 수", + "onlineUsersCount": "온라인 사용자", "pendingTickets": "처리 대기 중인 티켓", "register": "등록", "repurchase": "재구매", diff --git a/apps/admin/locales/ko-KR/system.json b/apps/admin/locales/ko-KR/system.json index 38cb689..fbd1fbf 100644 --- a/apps/admin/locales/ko-KR/system.json +++ b/apps/admin/locales/ko-KR/system.json @@ -33,6 +33,16 @@ "saveSuccess": "저장 성공", "title": "초대 설정" }, + "logCleanup": { + "autoClear": "자동 정리 활성화", + "autoClearDescription": "활성화되면 시스템이 만료된 로그 기록을 자동으로 삭제합니다", + "clearDays": "보존 일수", + "clearDaysDescription": "로그를 보존할 일수; 이보다 오래된 로그는 삭제됩니다", + "clearDaysPlaceholder": "보존 일수를 입력하세요", + "description": "자동 로그 정리 규칙 및 보존 기간 구성", + "title": "로그 정리 설정" + }, + "logSettings": "로그 설정", "privacyPolicy": { "description": "개인정보 처리방침 내용 편집 및 관리", "title": "개인정보 처리방침" diff --git a/apps/admin/locales/ko-KR/user.json b/apps/admin/locales/ko-KR/user.json index b499b85..a6834bb 100644 --- a/apps/admin/locales/ko-KR/user.json +++ b/apps/admin/locales/ko-KR/user.json @@ -50,6 +50,7 @@ "more": "더보기", "notifySettingsTitle": "알림 설정", "onlineDevices": "온라인 기기", + "onlyFirstPurchase": "첫 구매 전용", "orderList": "주문 목록", "password": "비밀번호", "passwordPlaceholder": "새 비밀번호 입력 (선택 사항)", @@ -59,6 +60,8 @@ "refererId": "추천인 ID", "refererIdPlaceholder": "추천인 ID를 입력하세요", "referralCode": "추천 코드", + "referralPercentage": "추천 비율", + "referralPercentagePlaceholder": "추천 비율 입력 (0-100)", "referrerUserId": "추천인 (사용자 ID)", "remove": "제거", "resetLogs": "초기화 기록", diff --git a/apps/admin/locales/no-NO/index.json b/apps/admin/locales/no-NO/index.json index 886b562..24fc6a1 100644 --- a/apps/admin/locales/no-NO/index.json +++ b/apps/admin/locales/no-NO/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Nodetrafikk", "nodes": "noder", "offlineNodeCount": "Antall frakoblede noder", - "onlineIPCount": "Antall IP-er på nett", "onlineNodeCount": "Antall noder på nett", + "onlineUsersCount": "Nettbrukere", "pendingTickets": "Ventende billetter", "register": "Registrer", "repurchase": "gjenkjøp", diff --git a/apps/admin/locales/no-NO/system.json b/apps/admin/locales/no-NO/system.json index 3f66c1e..dc6744c 100644 --- a/apps/admin/locales/no-NO/system.json +++ b/apps/admin/locales/no-NO/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Lagring vellykket", "title": "Invitasjonsinnstillinger" }, + "logCleanup": { + "autoClear": "Aktiver automatisk rensing", + "autoClearDescription": "Når aktivert, vil systemet automatisk fjerne utløpte loggposter", + "clearDays": "Oppbevaringsdager", + "clearDaysDescription": "Antall dager for å oppbevare logger; logger eldre enn dette vil bli renset", + "clearDaysPlaceholder": "Skriv inn oppbevaringsdager", + "description": "Konfigurer automatiske regler for loggrensing og oppbevaringsperiode", + "title": "Innstillinger for loggrensing" + }, + "logSettings": "Logginnstillinger", "privacyPolicy": { "description": "Rediger og administrer innholdet i personvernerklæringen", "title": "Personvernerklæring" diff --git a/apps/admin/locales/no-NO/user.json b/apps/admin/locales/no-NO/user.json index 90856de..1125fa3 100644 --- a/apps/admin/locales/no-NO/user.json +++ b/apps/admin/locales/no-NO/user.json @@ -50,6 +50,7 @@ "more": "Mer", "notifySettingsTitle": "Varslingsinnstillinger", "onlineDevices": "Tilkoblede enheter", + "onlyFirstPurchase": "Første kjøp bare", "orderList": "Ordreliste", "password": "Passord", "passwordPlaceholder": "Skriv inn nytt passord (valgfritt)", @@ -59,6 +60,8 @@ "refererId": "Henvisnings-ID", "refererIdPlaceholder": "Skriv inn referanse-ID", "referralCode": "Henvisningskode", + "referralPercentage": "Henvisningsprosent", + "referralPercentagePlaceholder": "Skriv inn henvisningsprosent (0-100)", "referrerUserId": "Henviser (Bruker-ID)", "remove": "Fjern", "resetLogs": "Tilbakestill Logg", diff --git a/apps/admin/locales/pl-PL/index.json b/apps/admin/locales/pl-PL/index.json index 8be510d..ab4b799 100644 --- a/apps/admin/locales/pl-PL/index.json +++ b/apps/admin/locales/pl-PL/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Ruch węzła", "nodes": "węzły", "offlineNodeCount": "Liczba węzłów offline", - "onlineIPCount": "Liczba IP online", "onlineNodeCount": "Liczba węzłów online", + "onlineUsersCount": "Użytkownicy online", "pendingTickets": "Oczekujące zgłoszenia", "register": "Rejestracja", "repurchase": "ponowny zakup", diff --git a/apps/admin/locales/pl-PL/system.json b/apps/admin/locales/pl-PL/system.json index 6af763f..31a1004 100644 --- a/apps/admin/locales/pl-PL/system.json +++ b/apps/admin/locales/pl-PL/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Zapisano pomyślnie", "title": "Ustawienia zaproszeń" }, + "logCleanup": { + "autoClear": "Włącz automatyczne czyszczenie", + "autoClearDescription": "Po włączeniu system automatycznie usunie przestarzałe rekordy logów", + "clearDays": "Dni przechowywania", + "clearDaysDescription": "Liczba dni, przez które logi będą przechowywane; logi starsze niż ten okres zostaną usunięte", + "clearDaysPlaceholder": "Wprowadź dni przechowywania", + "description": "Skonfiguruj zasady automatycznego czyszczenia logów i okres przechowywania", + "title": "Ustawienia czyszczenia logów" + }, + "logSettings": "Ustawienia logów", "privacyPolicy": { "description": "Edytuj i zarządzaj treścią polityki prywatności", "title": "Polityka prywatności" diff --git a/apps/admin/locales/pl-PL/user.json b/apps/admin/locales/pl-PL/user.json index 8bb16eb..9ecf559 100644 --- a/apps/admin/locales/pl-PL/user.json +++ b/apps/admin/locales/pl-PL/user.json @@ -50,6 +50,7 @@ "more": "Więcej", "notifySettingsTitle": "Ustawienia powiadomień", "onlineDevices": "Urządzenia online", + "onlyFirstPurchase": "Tylko pierwsze zakupy", "orderList": "Lista Zamówień", "password": "Hasło", "passwordPlaceholder": "Wprowadź nowe hasło (opcjonalnie)", @@ -59,6 +60,8 @@ "refererId": "Identyfikator polecającego", "refererIdPlaceholder": "Wprowadź identyfikator polecającego", "referralCode": "Kod polecający", + "referralPercentage": "Procent polecenia", + "referralPercentagePlaceholder": "Wprowadź procent polecenia (0-100)", "referrerUserId": "Polecający (ID użytkownika)", "remove": "Usuń", "resetLogs": "Logi Resetowania", diff --git a/apps/admin/locales/pt-BR/index.json b/apps/admin/locales/pt-BR/index.json index fd6af5a..06e4c78 100644 --- a/apps/admin/locales/pt-BR/index.json +++ b/apps/admin/locales/pt-BR/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Tráfego do Nó", "nodes": "nós", "offlineNodeCount": "Contagem de nós offline", - "onlineIPCount": "Contagem de IPs Online", "onlineNodeCount": "Contagem de nós online", + "onlineUsersCount": "Usuários Online", "pendingTickets": "Tickets pendentes", "register": "Registrar", "repurchase": "recompra", diff --git a/apps/admin/locales/pt-BR/system.json b/apps/admin/locales/pt-BR/system.json index 4d3a37a..2fd6717 100644 --- a/apps/admin/locales/pt-BR/system.json +++ b/apps/admin/locales/pt-BR/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Salvo com Sucesso", "title": "Configurações de Convite" }, + "logCleanup": { + "autoClear": "Ativar Limpeza Automática", + "autoClearDescription": "Quando ativado, o sistema limpará automaticamente os registros de log expirados", + "clearDays": "Dias de Retenção", + "clearDaysDescription": "Número de dias para reter logs; logs mais antigos que isso serão limpos", + "clearDaysPlaceholder": "Insira os dias de retenção", + "description": "Configure regras de limpeza automática de logs e período de retenção", + "title": "Configurações de Limpeza de Logs" + }, + "logSettings": "Configurações de Logs", "privacyPolicy": { "description": "Edite e gerencie o conteúdo da política de privacidade", "title": "Política de Privacidade" diff --git a/apps/admin/locales/pt-BR/user.json b/apps/admin/locales/pt-BR/user.json index 0d8eb04..9b7b6f6 100644 --- a/apps/admin/locales/pt-BR/user.json +++ b/apps/admin/locales/pt-BR/user.json @@ -50,6 +50,7 @@ "more": "Mais", "notifySettingsTitle": "Configurações de Notificação", "onlineDevices": "Dispositivos Online", + "onlyFirstPurchase": "Apenas a Primeira Compra", "orderList": "Lista de Pedidos", "password": "Senha", "passwordPlaceholder": "Digite a nova senha (opcional)", @@ -59,6 +60,8 @@ "refererId": "ID do Referente", "refererIdPlaceholder": "Digite o ID do referenciador", "referralCode": "Código de Indicação", + "referralPercentage": "Porcentagem de Referência", + "referralPercentagePlaceholder": "Insira a porcentagem de referência (0-100)", "referrerUserId": "Referente (ID do Usuário)", "remove": "Remover", "resetLogs": "Registros de Redefinição", diff --git a/apps/admin/locales/ro-RO/index.json b/apps/admin/locales/ro-RO/index.json index ebcbe0c..d483722 100644 --- a/apps/admin/locales/ro-RO/index.json +++ b/apps/admin/locales/ro-RO/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Traficul nodului", "nodes": "noduri", "offlineNodeCount": "Număr de noduri offline", - "onlineIPCount": "Număr de IP-uri online", "onlineNodeCount": "Număr de noduri online", + "onlineUsersCount": "Utilizatori online", "pendingTickets": "Tichete în așteptare", "register": "Înregistrare", "repurchase": "recomandare", diff --git a/apps/admin/locales/ro-RO/system.json b/apps/admin/locales/ro-RO/system.json index 5982f4c..4de655d 100644 --- a/apps/admin/locales/ro-RO/system.json +++ b/apps/admin/locales/ro-RO/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Salvare cu Succes", "title": "Setări de Invitație" }, + "logCleanup": { + "autoClear": "Activează curățarea automată", + "autoClearDescription": "Când este activat, sistemul va curăța automat înregistrările de jurnal expirate", + "clearDays": "Zile de păstrare", + "clearDaysDescription": "Numărul de zile pentru care se păstrează jurnalele; jurnalele mai vechi de atât vor fi curățate", + "clearDaysPlaceholder": "Introdu zilele de păstrare", + "description": "Configurează regulile de curățare automată a jurnalelor și perioada de păstrare", + "title": "Setări de curățare a jurnalelor" + }, + "logSettings": "Setări jurnal", "privacyPolicy": { "description": "Editează și gestionează conținutul politicii de confidențialitate", "title": "Politica de Confidențialitate" diff --git a/apps/admin/locales/ro-RO/user.json b/apps/admin/locales/ro-RO/user.json index ad14767..e5f004e 100644 --- a/apps/admin/locales/ro-RO/user.json +++ b/apps/admin/locales/ro-RO/user.json @@ -50,6 +50,7 @@ "more": "Mai mult", "notifySettingsTitle": "Setări notificări", "onlineDevices": "Dispozitive Online", + "onlyFirstPurchase": "Doar prima achiziție", "orderList": "Lista de comenzi", "password": "Parolă", "passwordPlaceholder": "Introduceți o parolă nouă (opțional)", @@ -59,6 +60,8 @@ "refererId": "ID Referent", "refererIdPlaceholder": "Introduceți ID-ul referentului", "referralCode": "Cod de recomandare", + "referralPercentage": "Procentaj de recomandare", + "referralPercentagePlaceholder": "Introduceți procentajul de recomandare (0-100)", "referrerUserId": "Referent (ID Utilizator)", "remove": "Elimină", "resetLogs": "Jurnale de resetare", diff --git a/apps/admin/locales/ru-RU/index.json b/apps/admin/locales/ru-RU/index.json index 27c8068..2cc1886 100644 --- a/apps/admin/locales/ru-RU/index.json +++ b/apps/admin/locales/ru-RU/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Трафик узла", "nodes": "узлы", "offlineNodeCount": "Количество офлайн-узлов", - "onlineIPCount": "Количество онлайн IP", "onlineNodeCount": "Количество онлайн-узлов", + "onlineUsersCount": "Пользователи онлайн", "pendingTickets": "Ожидающие заявки", "register": "Регистрация", "repurchase": "повторная покупка", diff --git a/apps/admin/locales/ru-RU/system.json b/apps/admin/locales/ru-RU/system.json index c987c1d..bc240d9 100644 --- a/apps/admin/locales/ru-RU/system.json +++ b/apps/admin/locales/ru-RU/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Сохранение успешно", "title": "Настройки приглашений" }, + "logCleanup": { + "autoClear": "Включить автоматическую очистку", + "autoClearDescription": "При включении система будет автоматически очищать устаревшие записи журналов", + "clearDays": "Дни хранения", + "clearDaysDescription": "Количество дней для хранения журналов; журналы старше этого будут очищены", + "clearDaysPlaceholder": "Введите количество дней хранения", + "description": "Настройте правила автоматической очистки журналов и период хранения", + "title": "Настройки очистки журналов" + }, + "logSettings": "Настройки журналов", "privacyPolicy": { "description": "Редактирование и управление содержимым политики конфиденциальности", "title": "Политика конфиденциальности" diff --git a/apps/admin/locales/ru-RU/user.json b/apps/admin/locales/ru-RU/user.json index 31d6a98..82164a1 100644 --- a/apps/admin/locales/ru-RU/user.json +++ b/apps/admin/locales/ru-RU/user.json @@ -50,6 +50,7 @@ "more": "Больше", "notifySettingsTitle": "Настройки уведомлений", "onlineDevices": "Подключенные устройства", + "onlyFirstPurchase": "Только первая покупка", "orderList": "Список заказов", "password": "Пароль", "passwordPlaceholder": "Введите новый пароль (необязательно)", @@ -59,6 +60,8 @@ "refererId": "ID реферера", "refererIdPlaceholder": "Введите ID реферера", "referralCode": "Реферальный код", + "referralPercentage": "Процент вознаграждения за рекомендацию", + "referralPercentagePlaceholder": "Введите процент вознаграждения за рекомендацию (0-100)", "referrerUserId": "Реферер (ID пользователя)", "remove": "Удалить", "resetLogs": "Журналы сброса", diff --git a/apps/admin/locales/th-TH/index.json b/apps/admin/locales/th-TH/index.json index 500706b..f54bee9 100644 --- a/apps/admin/locales/th-TH/index.json +++ b/apps/admin/locales/th-TH/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "ปริมาณการใช้งานของโหนด", "nodes": "โหนด", "offlineNodeCount": "จำนวนโหนดออฟไลน์", - "onlineIPCount": "จำนวน IP ออนไลน์", "onlineNodeCount": "จำนวนโหนดออนไลน์", + "onlineUsersCount": "ผู้ใช้งานออนไลน์", "pendingTickets": "บัตรงานที่รอดำเนินการ", "register": "ลงทะเบียน", "repurchase": "ซื้อซ้ำ", diff --git a/apps/admin/locales/th-TH/system.json b/apps/admin/locales/th-TH/system.json index d9617c7..e3e15d9 100644 --- a/apps/admin/locales/th-TH/system.json +++ b/apps/admin/locales/th-TH/system.json @@ -33,6 +33,16 @@ "saveSuccess": "บันทึกสำเร็จ", "title": "การตั้งค่าการเชิญ" }, + "logCleanup": { + "autoClear": "เปิดใช้งานการล้างอัตโนมัติ", + "autoClearDescription": "เมื่อเปิดใช้งาน ระบบจะล้างบันทึกที่หมดอายุโดยอัตโนมัติ", + "clearDays": "จำนวนวันในการเก็บรักษา", + "clearDaysDescription": "จำนวนวันที่จะเก็บบันทึก; บันทึกที่เก่ากว่านี้จะถูกลบออก", + "clearDaysPlaceholder": "กรอกจำนวนวันในการเก็บรักษา", + "description": "กำหนดกฎการล้างบันทึกอัตโนมัติและระยะเวลาการเก็บรักษา", + "title": "การตั้งค่าการล้างบันทึก" + }, + "logSettings": "การตั้งค่าบันทึก", "privacyPolicy": { "description": "แก้ไขและจัดการเนื้อหานโยบายความเป็นส่วนตัว", "title": "นโยบายความเป็นส่วนตัว" diff --git a/apps/admin/locales/th-TH/user.json b/apps/admin/locales/th-TH/user.json index 621f5d0..2755955 100644 --- a/apps/admin/locales/th-TH/user.json +++ b/apps/admin/locales/th-TH/user.json @@ -50,6 +50,7 @@ "more": "เพิ่มเติม", "notifySettingsTitle": "การตั้งค่าการแจ้งเตือน", "onlineDevices": "อุปกรณ์ที่ออนไลน์", + "onlyFirstPurchase": "การซื้อครั้งแรกเท่านั้น", "orderList": "รายการสั่งซื้อ", "password": "รหัสผ่าน", "passwordPlaceholder": "กรุณาใส่รหัสผ่านใหม่ (ไม่บังคับ)", @@ -59,6 +60,8 @@ "refererId": "รหัสผู้แนะนำ", "refererIdPlaceholder": "กรอก ID ผู้แนะนำ", "referralCode": "รหัสแนะนำ", + "referralPercentage": "เปอร์เซ็นต์การแนะนำ", + "referralPercentagePlaceholder": "กรอกเปอร์เซ็นต์การแนะนำ (0-100)", "referrerUserId": "ผู้อ้างอิง (รหัสผู้ใช้)", "remove": "ลบ", "resetLogs": "บันทึกการรีเซ็ต", diff --git a/apps/admin/locales/tr-TR/index.json b/apps/admin/locales/tr-TR/index.json index 794c14a..38fadf6 100644 --- a/apps/admin/locales/tr-TR/index.json +++ b/apps/admin/locales/tr-TR/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Düğüm Trafiği", "nodes": "düğümler", "offlineNodeCount": "Çevrimdışı Düğüm Sayısı", - "onlineIPCount": "Çevrimiçi IP Sayısı", "onlineNodeCount": "Çevrimiçi Düğüm Sayısı", + "onlineUsersCount": "Çevrimiçi Kullanıcılar", "pendingTickets": "Bekleyen Biletler", "register": "Kayıt Ol", "repurchase": "yeniden satın alma", diff --git a/apps/admin/locales/tr-TR/system.json b/apps/admin/locales/tr-TR/system.json index 1cc7d4b..201f1ce 100644 --- a/apps/admin/locales/tr-TR/system.json +++ b/apps/admin/locales/tr-TR/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Başarıyla Kaydedildi", "title": "Davet Ayarları" }, + "logCleanup": { + "autoClear": "Otomatik Temizlemeyi Etkinleştir", + "autoClearDescription": "Etkinleştirildiğinde, sistem süresi dolmuş log kayıtlarını otomatik olarak temizleyecektir", + "clearDays": "Saklama Günleri", + "clearDaysDescription": "Logların saklanacağı gün sayısı; bu süreden daha eski loglar temizlenecektir", + "clearDaysPlaceholder": "Saklama günlerini girin", + "description": "Otomatik log temizleme kurallarını ve saklama süresini yapılandırın", + "title": "Log Temizleme Ayarları" + }, + "logSettings": "Log Ayarları", "privacyPolicy": { "description": "Gizlilik politikası içeriğini düzenleyin ve yönetin", "title": "Gizlilik Politikası" diff --git a/apps/admin/locales/tr-TR/user.json b/apps/admin/locales/tr-TR/user.json index 1481c8c..2086d0c 100644 --- a/apps/admin/locales/tr-TR/user.json +++ b/apps/admin/locales/tr-TR/user.json @@ -50,6 +50,7 @@ "more": "Daha Fazla", "notifySettingsTitle": "Bildirim Ayarları", "onlineDevices": "Çevrimiçi Cihazlar", + "onlyFirstPurchase": "Sadece İlk Alım", "orderList": "Sipariş Listesi", "password": "Şifre", "passwordPlaceholder": "Yeni şifreyi girin (isteğe bağlı)", @@ -59,6 +60,8 @@ "refererId": "Referans Kimliği", "refererIdPlaceholder": "Referans kimliğini girin", "referralCode": "Referans Kodu", + "referralPercentage": "Referans Yüzdesi", + "referralPercentagePlaceholder": "Referans yüzdesini girin (0-100)", "referrerUserId": "Yönlendiren (Kullanıcı Kimliği)", "remove": "Kaldır", "resetLogs": "Sıfırlama Kayıtları", diff --git a/apps/admin/locales/uk-UA/index.json b/apps/admin/locales/uk-UA/index.json index 35e3ac2..20ad4d6 100644 --- a/apps/admin/locales/uk-UA/index.json +++ b/apps/admin/locales/uk-UA/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Трафік вузла", "nodes": "вузли", "offlineNodeCount": "Кількість офлайн-вузлів", - "onlineIPCount": "Кількість онлайн IP", "onlineNodeCount": "Кількість онлайн-вузлів", + "onlineUsersCount": "Користувачі онлайн", "pendingTickets": "Невирішені заявки", "register": "Реєстрація", "repurchase": "повторна покупка", diff --git a/apps/admin/locales/uk-UA/system.json b/apps/admin/locales/uk-UA/system.json index cbe545e..d6fb75b 100644 --- a/apps/admin/locales/uk-UA/system.json +++ b/apps/admin/locales/uk-UA/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Успішно збережено", "title": "Налаштування запрошень" }, + "logCleanup": { + "autoClear": "Увімкнути автоматичне очищення", + "autoClearDescription": "При увімкненні система автоматично очищатиме застарілі записи журналів", + "clearDays": "Дні зберігання", + "clearDaysDescription": "Кількість днів для зберігання журналів; журнали старші за цей термін будуть очищені", + "clearDaysPlaceholder": "Введіть дні зберігання", + "description": "Налаштуйте правила автоматичного очищення журналів та період зберігання", + "title": "Налаштування очищення журналів" + }, + "logSettings": "Налаштування журналів", "privacyPolicy": { "description": "Редагуйте та керуйте змістом політики конфіденційності", "title": "Політика конфіденційності" diff --git a/apps/admin/locales/uk-UA/user.json b/apps/admin/locales/uk-UA/user.json index 9ddd3a1..3de0898 100644 --- a/apps/admin/locales/uk-UA/user.json +++ b/apps/admin/locales/uk-UA/user.json @@ -50,6 +50,7 @@ "more": "Більше", "notifySettingsTitle": "Налаштування сповіщень", "onlineDevices": "Пристрої в мережі", + "onlyFirstPurchase": "Тільки перша покупка", "orderList": "Список замовлень", "password": "Пароль", "passwordPlaceholder": "Введіть новий пароль (необов'язково)", @@ -59,6 +60,8 @@ "refererId": "Ідентифікатор реферера", "refererIdPlaceholder": "Введіть ID реферера", "referralCode": "Реферальний код", + "referralPercentage": "Відсоток рефералів", + "referralPercentagePlaceholder": "Введіть відсоток рефералів (0-100)", "referrerUserId": "Реферер (ID користувача)", "remove": "Видалити", "resetLogs": "Журнали скидання", diff --git a/apps/admin/locales/vi-VN/index.json b/apps/admin/locales/vi-VN/index.json index 4d0ab4e..b2cc4f0 100644 --- a/apps/admin/locales/vi-VN/index.json +++ b/apps/admin/locales/vi-VN/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "Lưu lượng nút", "nodes": "nút", "offlineNodeCount": "Số lượng nút ngoại tuyến", - "onlineIPCount": "Số lượng IP trực tuyến", "onlineNodeCount": "Số lượng nút trực tuyến", + "onlineUsersCount": "Người dùng trực tuyến", "pendingTickets": "Phiếu hỗ trợ đang chờ xử lý", "register": "Đăng ký", "repurchase": "mua lại", diff --git a/apps/admin/locales/vi-VN/system.json b/apps/admin/locales/vi-VN/system.json index 500efd7..1fd59ea 100644 --- a/apps/admin/locales/vi-VN/system.json +++ b/apps/admin/locales/vi-VN/system.json @@ -33,6 +33,16 @@ "saveSuccess": "Lưu thành công", "title": "Cài đặt mời" }, + "logCleanup": { + "autoClear": "Bật Dọn dẹp Tự động", + "autoClearDescription": "Khi được bật, hệ thống sẽ tự động xóa các bản ghi nhật ký đã hết hạn", + "clearDays": "Số Ngày Lưu giữ", + "clearDaysDescription": "Số ngày để lưu giữ nhật ký; nhật ký cũ hơn sẽ bị xóa", + "clearDaysPlaceholder": "Nhập số ngày lưu giữ", + "description": "Cấu hình quy tắc dọn dẹp nhật ký tự động và thời gian lưu giữ", + "title": "Cài đặt Dọn dẹp Nhật ký" + }, + "logSettings": "Cài đặt Nhật ký", "privacyPolicy": { "description": "Chỉnh sửa và quản lý nội dung chính sách bảo mật", "title": "Chính sách bảo mật" diff --git a/apps/admin/locales/vi-VN/user.json b/apps/admin/locales/vi-VN/user.json index 0086345..2464aab 100644 --- a/apps/admin/locales/vi-VN/user.json +++ b/apps/admin/locales/vi-VN/user.json @@ -50,6 +50,7 @@ "more": "Thêm", "notifySettingsTitle": "Cài Đặt Thông Báo", "onlineDevices": "Thiết bị trực tuyến", + "onlyFirstPurchase": "Chỉ Mua Hàng Đầu Tiên", "orderList": "Danh sách đơn hàng", "password": "Mật khẩu", "passwordPlaceholder": "Nhập mật khẩu mới (không bắt buộc)", @@ -59,6 +60,8 @@ "refererId": "ID người giới thiệu", "refererIdPlaceholder": "Nhập mã người giới thiệu", "referralCode": "Mã Giới Thiệu", + "referralPercentage": "Tỷ Lệ Giới Thiệu", + "referralPercentagePlaceholder": "Nhập tỷ lệ giới thiệu (0-100)", "referrerUserId": "Người giới thiệu (ID người dùng)", "remove": "Xóa", "resetLogs": "Nhật ký đặt lại", diff --git a/apps/admin/locales/zh-CN/index.json b/apps/admin/locales/zh-CN/index.json index fa85598..977e923 100644 --- a/apps/admin/locales/zh-CN/index.json +++ b/apps/admin/locales/zh-CN/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "节点流量", "nodes": "节点", "offlineNodeCount": "离线节点数", - "onlineIPCount": "在线IP数", "onlineNodeCount": "在线节点数", + "onlineUsersCount": "在线用户数", "pendingTickets": "待处理工单", "register": "注册", "repurchase": "复购", diff --git a/apps/admin/locales/zh-CN/system.json b/apps/admin/locales/zh-CN/system.json index f391766..b0523a9 100644 --- a/apps/admin/locales/zh-CN/system.json +++ b/apps/admin/locales/zh-CN/system.json @@ -33,6 +33,16 @@ "saveSuccess": "保存成功", "saveFailed": "保存失败" }, + "logCleanup": { + "title": "日志清理设置", + "description": "配置系统日志自动清理规则和保留时间", + "autoClear": "启用自动清理", + "autoClearDescription": "启用后系统将自动清理过期的日志记录", + "clearDays": "保留天数", + "clearDaysDescription": "日志保留的天数,超过此时间的日志将被清理", + "clearDaysPlaceholder": "请输入保留天数" + }, + "logSettings": "日志设置", "privacyPolicy": { "title": "隐私政策", "description": "编辑和管理隐私政策内容" diff --git a/apps/admin/locales/zh-CN/user.json b/apps/admin/locales/zh-CN/user.json index bb9d69e..9f2858b 100644 --- a/apps/admin/locales/zh-CN/user.json +++ b/apps/admin/locales/zh-CN/user.json @@ -50,6 +50,7 @@ "more": "更多", "notifySettingsTitle": "通知设置", "onlineDevices": "在线设备", + "onlyFirstPurchase": "仅首次购买奖励", "orderList": "订单列表", "password": "密码", "passwordPlaceholder": "输入新密码(选填)", @@ -59,6 +60,8 @@ "refererId": "推荐人ID", "refererIdPlaceholder": "输入推荐人ID", "referralCode": "推荐码", + "referralPercentage": "推荐奖励比例", + "referralPercentagePlaceholder": "输入推荐奖励比例(0-100)", "referrerUserId": "推荐人(用户ID)", "remove": "移除", "resetLogs": "重置日志", diff --git a/apps/admin/locales/zh-HK/index.json b/apps/admin/locales/zh-HK/index.json index 6d55158..39e9935 100644 --- a/apps/admin/locales/zh-HK/index.json +++ b/apps/admin/locales/zh-HK/index.json @@ -7,8 +7,8 @@ "nodeTraffic": "節點流量", "nodes": "節點", "offlineNodeCount": "離線節點數", - "onlineIPCount": "線上IP數", "onlineNodeCount": "線上節點數", + "onlineUsersCount": "線上用戶數", "pendingTickets": "待處理工單", "register": "註冊", "repurchase": "回購", diff --git a/apps/admin/locales/zh-HK/system.json b/apps/admin/locales/zh-HK/system.json index bd64717..1e1bfd6 100644 --- a/apps/admin/locales/zh-HK/system.json +++ b/apps/admin/locales/zh-HK/system.json @@ -33,6 +33,16 @@ "saveSuccess": "保存成功", "title": "邀請設置" }, + "logCleanup": { + "autoClear": "啟用自動清理", + "autoClearDescription": "啟用後,系統將自動清除過期的日誌記錄", + "clearDays": "保留天數", + "clearDaysDescription": "保留日誌的天數;超過此天數的日誌將被清除", + "clearDaysPlaceholder": "輸入保留天數", + "description": "配置自動日誌清理規則和保留期限", + "title": "日誌清理設置" + }, + "logSettings": "日誌設置", "privacyPolicy": { "description": "編輯和管理隱私政策內容", "title": "隱私政策" diff --git a/apps/admin/locales/zh-HK/user.json b/apps/admin/locales/zh-HK/user.json index 1d3c794..118a7c4 100644 --- a/apps/admin/locales/zh-HK/user.json +++ b/apps/admin/locales/zh-HK/user.json @@ -50,6 +50,7 @@ "more": "更多", "notifySettingsTitle": "通知設定", "onlineDevices": "在線裝置", + "onlyFirstPurchase": "首次購買專享", "orderList": "訂單列表", "password": "密碼", "passwordPlaceholder": "輸入新密碼(可選)", @@ -59,6 +60,8 @@ "refererId": "推薦人 ID", "refererIdPlaceholder": "輸入推薦人 ID", "referralCode": "推薦碼", + "referralPercentage": "推薦百分比", + "referralPercentagePlaceholder": "輸入推薦百分比(0-100)", "referrerUserId": "推薦人(用戶 ID)", "remove": "移除", "resetLogs": "重置日誌", diff --git a/apps/admin/services/admin/index.ts b/apps/admin/services/admin/index.ts index 4ebecd4..bdf189b 100644 --- a/apps/admin/services/admin/index.ts +++ b/apps/admin/services/admin/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as ads from './ads'; diff --git a/apps/admin/services/admin/log.ts b/apps/admin/services/admin/log.ts index 2637389..cff6bb8 100644 --- a/apps/admin/services/admin/log.ts +++ b/apps/admin/services/admin/log.ts @@ -155,6 +155,26 @@ export async function filterServerTrafficLog( ); } +/** Get log setting GET /v1/admin/log/setting */ +export async function getLogSetting(options?: { [key: string]: any }) { + return request('/v1/admin/log/setting', { + method: 'GET', + ...(options || {}), + }); +} + +/** Update log setting POST /v1/admin/log/setting */ +export async function updateLogSetting(body: API.LogSetting, options?: { [key: string]: any }) { + return request('/v1/admin/log/setting', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** Filter subscribe log GET /v1/admin/log/subscribe/list */ export async function filterSubscribeLog( // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) diff --git a/apps/admin/services/admin/server.ts b/apps/admin/services/admin/server.ts index ee100d0..fdb1522 100644 --- a/apps/admin/services/admin/server.ts +++ b/apps/admin/services/admin/server.ts @@ -111,6 +111,21 @@ export async function filterNodeList( ); } +/** Reset node sort POST /v1/admin/server/node/sort */ +export async function resetSortWithNode( + body: API.ResetSortRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/server/node/sort', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** Toggle Node Status POST /v1/admin/server/node/status/toggle */ export async function toggleNodeStatus( body: API.ToggleNodeStatusRequest, @@ -156,6 +171,21 @@ export async function getServerProtocols( ); } +/** Reset server sort POST /v1/admin/server/server/sort */ +export async function resetSortWithServer( + body: API.ResetSortRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/server/server/sort', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** Update Server POST /v1/admin/server/update */ export async function updateServer( body: API.UpdateServerRequest, diff --git a/apps/admin/services/admin/typings.d.ts b/apps/admin/services/admin/typings.d.ts index 0319406..e67bbac 100644 --- a/apps/admin/services/admin/typings.d.ts +++ b/apps/admin/services/admin/typings.d.ts @@ -366,6 +366,8 @@ declare namespace API { password: string; product_id: number; duration: number; + referral_percentage: number; + only_first_purchase: boolean; referer_user: string; refer_code: string; balance: number; @@ -1289,6 +1291,11 @@ declare namespace API { list: Record; }; + type LogSetting = { + auto_clear: boolean; + clear_days: number; + }; + type MessageLog = { id: number; type: number; @@ -1321,6 +1328,7 @@ declare namespace API { server_id: number; protocol: string; enabled: boolean; + sort?: number; created_at: number; updated_at: number; }; @@ -1622,6 +1630,10 @@ declare namespace API { order_no: string; }; + type ResetSortRequest = { + sort: SortItem[]; + }; + type ResetSubscribeLog = { type: number; user_id: number; @@ -1696,8 +1708,13 @@ declare namespace API { updated_at: number; }; + type ServerOnlineIP = { + ip: string; + protocol: string; + }; + type ServerOnlineUser = { - ip: string[]; + ip: ServerOnlineIP[]; user_id: number; subscribe: string; subscribe_id: number; @@ -1719,14 +1736,15 @@ declare namespace API { }; type ServerStatus = { - online: ServerOnlineUser[]; cpu: number; mem: number; disk: number; + protocol: string; + online: ServerOnlineUser[]; }; type ServerTotalDataResponse = { - online_user_ips: number; + online_users: number; online_servers: number; offline_servers: number; today_upload: number; @@ -2161,6 +2179,8 @@ declare namespace API { avatar: string; balance: number; commission: number; + referral_percentage: number; + only_first_purchase: boolean; gift_amount: number; telegram: number; refer_code: string; @@ -2191,6 +2211,8 @@ declare namespace API { avatar: string; balance: number; commission: number; + referral_percentage: number; + only_first_purchase: boolean; gift_amount: number; telegram: number; refer_code: string; diff --git a/apps/admin/services/common/index.ts b/apps/admin/services/common/index.ts index 73b3bda..61ba129 100644 --- a/apps/admin/services/common/index.ts +++ b/apps/admin/services/common/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as auth from './auth'; diff --git a/apps/admin/services/common/typings.d.ts b/apps/admin/services/common/typings.d.ts index 9f8b561..d5f2883 100644 --- a/apps/admin/services/common/typings.d.ts +++ b/apps/admin/services/common/typings.d.ts @@ -890,6 +890,8 @@ declare namespace API { avatar: string; balance: number; commission: number; + referral_percentage: number; + only_first_purchase: boolean; gift_amount: number; telegram: number; refer_code: string; diff --git a/apps/user/components/affiliate/index.tsx b/apps/user/components/affiliate/index.tsx index 80fd4c2..b985e7d 100644 --- a/apps/user/components/affiliate/index.tsx +++ b/apps/user/components/affiliate/index.tsx @@ -46,7 +46,8 @@ export default function Affiliate() { - ({t('commissionRate')}: {common?.invite?.referral_percentage}%) + ({t('commissionRate')}:{' '} + {user?.referral_percentage || common?.invite?.referral_percentage}%) diff --git a/apps/user/services/common/index.ts b/apps/user/services/common/index.ts index 73b3bda..61ba129 100644 --- a/apps/user/services/common/index.ts +++ b/apps/user/services/common/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as auth from './auth'; diff --git a/apps/user/services/common/typings.d.ts b/apps/user/services/common/typings.d.ts index 9f8b561..d5f2883 100644 --- a/apps/user/services/common/typings.d.ts +++ b/apps/user/services/common/typings.d.ts @@ -890,6 +890,8 @@ declare namespace API { avatar: string; balance: number; commission: number; + referral_percentage: number; + only_first_purchase: boolean; gift_amount: number; telegram: number; refer_code: string; diff --git a/apps/user/services/user/index.ts b/apps/user/services/user/index.ts index f988131..12fe8d0 100644 --- a/apps/user/services/user/index.ts +++ b/apps/user/services/user/index.ts @@ -1,5 +1,5 @@ // @ts-ignore - + // API 更新时间: // API 唯一标识: import * as announcement from './announcement'; diff --git a/apps/user/services/user/typings.d.ts b/apps/user/services/user/typings.d.ts index 2e7da24..1054724 100644 --- a/apps/user/services/user/typings.d.ts +++ b/apps/user/services/user/typings.d.ts @@ -971,6 +971,8 @@ declare namespace API { avatar: string; balance: number; commission: number; + referral_percentage: number; + only_first_purchase: boolean; gift_amount: number; telegram: number; refer_code: string;