diff --git a/apps/admin/app/dashboard/user/[id]/user-login-history/index.tsx b/apps/admin/app/dashboard/user/[id]/user-login-history/index.tsx index e169b61..3fe4f18 100644 --- a/apps/admin/app/dashboard/user/[id]/user-login-history/index.tsx +++ b/apps/admin/app/dashboard/user/[id]/user-login-history/index.tsx @@ -1,6 +1,8 @@ 'use client'; import { ProTable } from '@/components/pro-table'; +import { getUserLoginLogs } from '@/services/admin/user'; +import { Badge } from '@workspace/ui/components/badge'; import { formatDate } from '@workspace/ui/utils'; import { useTranslations } from 'next-intl'; import { useParams } from 'next/navigation'; @@ -10,17 +12,19 @@ export default function UserLoginHistory() { const { id } = useParams<{ id: string }>(); return ( - - > + > columns={[ { - accessorKey: 'ip', + accessorKey: 'success', + header: t('loginStatus'), + cell: ({ row }) => ( + + {row.getValue('success') ? t('success') : t('failed')} + + ), + }, + { + accessorKey: 'login_ip', header: t('loginIp'), }, { @@ -33,16 +37,15 @@ export default function UserLoginHistory() { cell: ({ row }) => formatDate(row.getValue('created_at')), }, ]} - params={[ - { - key: 'search', - placeholder: t('searchIp'), - }, - ]} request={async (pagination, filter) => { + const { data } = await getUserLoginLogs({ + user_id: Number(id), + ...pagination, + ...filter, + }); return { - list: [], - total: 0, + list: data.data?.list || [], + total: data.data?.total || 0, }; }} /> diff --git a/apps/admin/app/dashboard/user/[id]/user-profile/auth-methods-form.tsx b/apps/admin/app/dashboard/user/[id]/user-profile/auth-methods-form.tsx index a70aa8a..0efbf9e 100644 --- a/apps/admin/app/dashboard/user/[id]/user-profile/auth-methods-form.tsx +++ b/apps/admin/app/dashboard/user/[id]/user-profile/auth-methods-form.tsx @@ -1,17 +1,48 @@ 'use client'; +import { + createUserAuthMethod, + deleteUserAuthMethod, + updateUserAuthMethod, +} from '@/services/admin/user'; import { Badge } from '@workspace/ui/components/badge'; import { Button } from '@workspace/ui/components/button'; import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; +import { useTranslations } from 'next-intl'; import { useState } from 'react'; +import { toast } from 'sonner'; export function AuthMethodsForm({ user }: { user: API.User }) { + const t = useTranslations('user'); + const [emailChanges, setEmailChanges] = useState>({}); - const handleRemoveAuth = async (authType: string) => {}; - const handleUpdateEmail = async (authType: string) => {}; - const handleCreateEmail = async (email: string) => {}; + const handleRemoveAuth = async (authType: string) => { + await deleteUserAuthMethod({ + user_id: user.id, + auth_type: authType, + }); + toast.success(t('deleteSuccess')); + }; + + const handleUpdateEmail = async (email: string) => { + await updateUserAuthMethod({ + user_id: user.id, + auth_type: 'email', + auth_identifier: email, + }); + toast.success(t('updateSuccess')); + }; + + const handleCreateEmail = async (email: string) => { + await createUserAuthMethod({ + user_id: user.id, + auth_type: 'email', + auth_identifier: email, + }); + toast.success(t('createSuccess')); + }; const handleEmailChange = (authType: string, value: string) => { setEmailChanges((prev) => ({ @@ -34,7 +65,7 @@ export function AuthMethodsForm({ user }: { user: API.User }) { const handleEmailAction = () => { const email = emailChanges['email']; if (isEmailExists) { - handleUpdateEmail('email'); + handleUpdateEmail(email as string); } else { handleCreateEmail(email as string); } @@ -43,7 +74,7 @@ export function AuthMethodsForm({ user }: { user: API.User }) { return ( - Authentication Settings + {t('authMethodsTitle')}
@@ -52,14 +83,14 @@ export function AuthMethodsForm({ user }: { user: API.User }) {
email
- {defaultEmailMethod.verified ? 'Verified' : 'Unverified'} + {defaultEmailMethod.verified ? t('verified') : t('unverified')}
handleEmailChange('email', value as string)} />
@@ -70,7 +101,7 @@ export function AuthMethodsForm({ user }: { user: API.User }) { (isEmailExists && emailChanges['email'] === defaultEmailMethod.auth_identifier) } > - {isEmailExists ? 'Update' : 'Add'} + {isEmailExists ? t('update') : t('add')}
@@ -82,7 +113,7 @@ export function AuthMethodsForm({ user }: { user: API.User }) {
{method.auth_type}
- {method.verified ? 'Verified' : 'Unverified'} + {method.verified ? t('verified') : t('unverified')}
@@ -94,7 +125,7 @@ export function AuthMethodsForm({ user }: { user: API.User }) { size='sm' onClick={() => handleRemoveAuth(method.auth_type)} > - Remove + {t('remove')}
diff --git a/apps/admin/app/dashboard/user/[id]/user-profile/basic-info-form.tsx b/apps/admin/app/dashboard/user/[id]/user-profile/basic-info-form.tsx index 94bb178..ece80fc 100644 --- a/apps/admin/app/dashboard/user/[id]/user-profile/basic-info-form.tsx +++ b/apps/admin/app/dashboard/user/[id]/user-profile/basic-info-form.tsx @@ -1,7 +1,7 @@ 'use client'; import useGlobalStore from '@/config/use-global'; -import { updateUser } from '@/services/admin/user'; +import { updateUserBasicInfo } from '@/services/admin/user'; import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@workspace/ui/components/button'; import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card'; @@ -18,6 +18,7 @@ import { Switch } from '@workspace/ui/components/switch'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { UploadImage } from '@workspace/ui/custom-components/upload-image'; import { unitConversion } from '@workspace/ui/utils'; +import { useTranslations } from 'next-intl'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import * as z from 'zod'; @@ -37,6 +38,8 @@ const basicInfoSchema = z.object({ type BasicInfoValues = z.infer; export function BasicInfoForm({ user }: { user: API.User }) { + const t = useTranslations('user'); + const { common } = useGlobalStore(); const { currency } = common; @@ -55,11 +58,12 @@ export function BasicInfoForm({ user }: { user: API.User }) { }); async function onSubmit(data: BasicInfoValues) { - await updateUser({ - id: user.id, + await updateUserBasicInfo({ + user_id: user.id, + telegram: user.telegram, ...data, - } as API.UpdateUserRequest); - toast.success('Saved successfully'); + } as API.UpdateUserBasiceInfoRequest); + toast.success(t('updateSuccess')); } return ( @@ -67,9 +71,9 @@ export function BasicInfoForm({ user }: { user: API.User }) {
- Basic Information + {t('basicInfoTitle')} @@ -78,7 +82,7 @@ export function BasicInfoForm({ user }: { user: API.User }) { name='enable' render={({ field }) => ( - Account Enable + {t('accountEnable')} @@ -91,7 +95,7 @@ export function BasicInfoForm({ user }: { user: API.User }) { name='is_admin' render={({ field }) => ( - Administrator + {t('administrator')} @@ -104,7 +108,7 @@ export function BasicInfoForm({ user }: { user: API.User }) { name='balance' render={({ field }) => ( - Balance + {t('balance')} ( - Commission + {t('commission')} ( - Gift Amount + {t('giftAmount')} ( - Referral Code + {t('referralCode')} ( - Referrer (User ID) + {t('referrerUserId')} ( - Avatar + {t('avatar')} ( - Password + {t('password')} - + diff --git a/apps/admin/app/dashboard/user/[id]/user-profile/notify-settings-form.tsx b/apps/admin/app/dashboard/user/[id]/user-profile/notify-settings-form.tsx index 26f6011..fe8cc82 100644 --- a/apps/admin/app/dashboard/user/[id]/user-profile/notify-settings-form.tsx +++ b/apps/admin/app/dashboard/user/[id]/user-profile/notify-settings-form.tsx @@ -1,10 +1,12 @@ 'use client'; +import { updateUserNotifySetting } from '@/services/admin/user'; import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@workspace/ui/components/button'; import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card'; import { Form, FormControl, FormField, FormItem, FormLabel } from '@workspace/ui/components/form'; import { Switch } from '@workspace/ui/components/switch'; +import { useTranslations } from 'next-intl'; import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import * as z from 'zod'; @@ -21,6 +23,8 @@ const notifySettingsSchema = z.object({ type NotifySettingsValues = z.infer; export function NotifySettingsForm({ user }: { user: API.User }) { + const t = useTranslations('user'); + const form = useForm({ resolver: zodResolver(notifySettingsSchema), defaultValues: { @@ -34,7 +38,11 @@ export function NotifySettingsForm({ user }: { user: API.User }) { }); async function onSubmit(data: NotifySettingsValues) { - toast.warning('In Development...'); + await updateUserNotifySetting({ + ...data, + user_id: user.id, + }); + toast.success(t('updateSuccess')); } return ( @@ -42,9 +50,9 @@ export function NotifySettingsForm({ user }: { user: API.User }) { - Notification Settings + {t('notifySettingsTitle')} @@ -54,7 +62,7 @@ export function NotifySettingsForm({ user }: { user: API.User }) { name='enable_email_notify' render={({ field }) => ( - Email Notifications + {t('emailNotifications')} @@ -67,7 +75,7 @@ export function NotifySettingsForm({ user }: { user: API.User }) { name='enable_telegram_notify' render={({ field }) => ( - Telegram Notifications + {t('telegramNotifications')} @@ -80,7 +88,7 @@ export function NotifySettingsForm({ user }: { user: API.User }) { name='enable_balance_notify' render={({ field }) => ( - Balance Change Notifications + {t('balanceNotifications')} @@ -93,7 +101,7 @@ export function NotifySettingsForm({ user }: { user: API.User }) { name='enable_login_notify' render={({ field }) => ( - Login Notifications + {t('loginNotifications')} @@ -106,7 +114,7 @@ export function NotifySettingsForm({ user }: { user: API.User }) { name='enable_subscribe_notify' render={({ field }) => ( - Subscription Notifications + {t('subscriptionNotifications')} @@ -119,7 +127,7 @@ export function NotifySettingsForm({ user }: { user: API.User }) { name='enable_trade_notify' render={({ field }) => ( - Trade Notifications + {t('tradeNotifications')} diff --git a/apps/admin/app/dashboard/user/[id]/user-subscription/index.tsx b/apps/admin/app/dashboard/user/[id]/user-subscription/index.tsx index 2dcab93..9767145 100644 --- a/apps/admin/app/dashboard/user/[id]/user-subscription/index.tsx +++ b/apps/admin/app/dashboard/user/[id]/user-subscription/index.tsx @@ -2,66 +2,40 @@ import { Display } from '@/components/display'; import { ProTable, ProTableActions } from '@/components/pro-table'; +import { createUserSubscribe, getUserSubscribe, updateUserSubscribe } from '@/services/admin/user'; import { Button } from '@workspace/ui/components/button'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { formatDate } from '@workspace/ui/utils'; +import { useTranslations } from 'next-intl'; import { useRef, useState } from 'react'; +import { toast } from 'sonner'; import { SubscriptionDetail } from './subscription-detail'; import { SubscriptionForm } from './subscription-form'; -// 模拟数据 -const mockData: API.Subscribe[] = [ - { - id: 1, - name: 'Basic Package', - description: 'Basic Traffic Package', - unit_price: 9.9, - unit_time: '30d', - discount: [], - replacement: 0, - inventory: 100, - traffic: 1073741824, // 1GB - speed_limit: 10, - device_limit: 3, - quota: 0, - group_id: 1, - server_group: [1], - server: [1, 2], - show: true, - sell: true, - sort: 1, - deduction_ratio: 0, - allow_deduction: false, - reset_cycle: 30, - renewal_reset: true, - created_at: Date.now(), - updated_at: Date.now(), - }, - // 可以添加更多模拟数据... -]; - -interface Props { - userId: string; -} - -export default function UserSubscription({ userId }: Props) { +export default function UserSubscription({ userId }: { userId: number }) { + const t = useTranslations('user'); const [loading, setLoading] = useState(false); const ref = useRef(null); return ( - > + > action={ref} header={{ - title: 'Subscription List', + title: t('subscriptionList'), toolbar: ( Create} - title='Create Subscription' + trigger={t('add')} + title={t('createSubscription')} loading={loading} userId={userId} onSubmit={async (values) => { - console.log('创建订阅:', values); + await createUserSubscribe({ + user_id: userId, + ...values, + }); + toast.success(t('createSuccess')); + ref.current?.refresh(); return true; }} /> @@ -74,34 +48,67 @@ export default function UserSubscription({ userId }: Props) { }, { accessorKey: 'name', - header: '名称', + header: t('subscriptionName'), + cell: ({ row }) => row.original.subscribe.name, + }, + { + accessorKey: 'upload', + header: t('upload'), + cell: ({ row }) => , + }, + { + accessorKey: 'download', + header: t('download'), + cell: ({ row }) => , }, { accessorKey: 'traffic', - header: '流量', - cell: ({ row }) => , + header: t('totalTraffic'), + cell: ({ row }) => , }, { accessorKey: 'speed_limit', - header: '限速', - cell: ({ row }) => `${row.getValue('speed_limit')} Mbps`, + header: t('speedLimit'), + cell: ({ row }) => { + const speed = row.original?.subscribe?.speed_limit; + return ; + }, }, { accessorKey: 'device_limit', - header: '设备限制', + header: t('deviceLimit'), + cell: ({ row }) => { + const limit = row.original?.subscribe?.device_limit; + return ; + }, + }, + { + accessorKey: 'reset_time', + header: t('resetTime'), + cell: ({ row }) => { + return ; + }, + }, + { + accessorKey: 'expire_time', + header: t('expireTime'), + cell: ({ row }) => + row.getValue('expire_time') ? formatDate(row.getValue('expire_time')) : t('permanent'), }, { accessorKey: 'created_at', - header: '创建时间', + header: t('createdAt'), cell: ({ row }) => formatDate(row.getValue('created_at')), }, ]} - request={async () => { - // 模拟异步请求 - await new Promise((resolve) => setTimeout(resolve, 1000)); + request={async (pagination) => { + const { data } = await getUserSubscribe({ + user_id: userId, + ...pagination, + }); return { - list: mockData, - total: mockData.length, + list: data.data?.list || [], + total: data.data?.total || 0, }; }} actions={{ @@ -109,31 +116,38 @@ export default function UserSubscription({ userId }: Props) { return [ Edit} - title='Edit Subscription' + trigger={t('edit')} + title={t('editSubscription')} loading={loading} userId={userId} initialData={row} onSubmit={async (values) => { - console.log('编辑订阅:', values); + await updateUserSubscribe({ + user_id: userId, + user_subscribe_id: row.id, + ...values, + }); + toast.success(t('updateSuccess')); + ref.current?.refresh(); return true; }} />, Details} - subscriptionId={row.id.toString()} + trigger={} + userId={userId} + subscriptionId={row.id} />, Delete} - title='Confirm Delete' - description='Are you sure to delete this subscription?' + trigger={} + title={t('confirmDelete')} + description={t('deleteSubscriptionDescription')} onConfirm={async () => { console.log('删除订阅:', row.id); }} - cancelText='Cancel' - confirmText='Confirm' + cancelText={t('cancel')} + confirmText={t('confirm')} />, ]; }, diff --git a/apps/admin/app/dashboard/user/[id]/user-subscription/subscription-detail.tsx b/apps/admin/app/dashboard/user/[id]/user-subscription/subscription-detail.tsx index 40232d9..9a57186 100644 --- a/apps/admin/app/dashboard/user/[id]/user-subscription/subscription-detail.tsx +++ b/apps/admin/app/dashboard/user/[id]/user-subscription/subscription-detail.tsx @@ -2,6 +2,13 @@ import { Display } from '@/components/display'; import { ProTable } from '@/components/pro-table'; +import { + getUserSubscribeDevices, + getUserSubscribeLogs, + getUserSubscribeTrafficLogs, + kickOfflineByUserDevice, +} from '@/services/admin/user'; +import { Badge } from '@workspace/ui/components/badge'; import { Button } from '@workspace/ui/components/button'; import { Dialog, @@ -10,132 +17,182 @@ import { DialogTitle, DialogTrigger, } from '@workspace/ui/components/dialog'; +import { Switch } from '@workspace/ui/components/switch'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { formatDate } from '@workspace/ui/utils'; +import { useTranslations } from 'next-intl'; import { ReactNode, useState } from 'react'; import { toast } from 'sonner'; -// 模拟数据 -const mockLogs = [ - { id: 1, action: 'Create Subscription', created_at: Date.now() - 86400000 }, - { id: 2, action: 'Update Traffic', created_at: Date.now() - 3600000 }, -]; - -const mockTrafficLogs = [ - { id: 1, traffic: 104857600, created_at: Date.now() - 86400000 }, - { id: 2, traffic: 52428800, created_at: Date.now() - 3600000 }, -]; - -const mockDevices = [ - { id: 1, ip: '192.168.1.1', last_seen_at: Date.now() - 300000 }, - { id: 2, ip: '192.168.1.2', last_seen_at: Date.now() - 600000 }, -]; - -interface Props { +export function SubscriptionDetail({ + trigger, + userId, + subscriptionId, +}: { trigger: ReactNode; - subscriptionId: string; -} - -export function SubscriptionDetail({ trigger }: Props) { + userId: number; + subscriptionId: number; +}) { + const t = useTranslations('user'); const [open, setOpen] = useState(false); - // 模拟下线设备的函数 - const handleOfflineDevice = async (deviceId: number) => { - // TODO: 调用实际的API - console.log('下线设备:', deviceId); - toast.success('设备已下线'); - }; - return ( {trigger} - Subscription Details + {t('subscriptionDetails')}
- Subscription Logs + {t('subscriptionLogs')} - Traffic Logs + {t('trafficLogs')} - Online Devices + {t('onlineDevices')} - formatDate(row.getValue('created_at')), - }, - ]} - request={async () => ({ - list: mockLogs, - total: mockLogs.length, - })} - /> - - - , - }, - { - accessorKey: 'created_at', - header: 'Time', - cell: ({ row }) => formatDate(row.getValue('created_at')), - }, - ]} - request={async () => ({ - list: mockTrafficLogs, - total: mockTrafficLogs.length, - })} - /> - - - > columns={[ { accessorKey: 'ip', header: 'IP', }, { - accessorKey: 'last_seen_at', - header: 'Last Seen', - cell: ({ row }) => formatDate(row.getValue('last_seen_at')), + accessorKey: 'user_agent', + header: 'User Agent', + }, + { + accessorKey: 'token', + header: 'Token', + }, + { + accessorKey: 'created_at', + header: 'Time', + cell: ({ row }) => formatDate(row.getValue('created_at')), }, ]} - request={async () => ({ - list: mockDevices, - total: mockDevices.length, - })} + request={async (pagination) => { + const { data } = await getUserSubscribeLogs({ + user_id: userId, + subscribe_id: subscriptionId, + ...pagination, + }); + return { + list: data.data?.list || [], + total: data.data?.total || 0, + }; + }} + /> + + + > + columns={[ + { + accessorKey: 'download', + header: 'Download', + cell: ({ row }) => , + }, + { + accessorKey: 'upload', + header: 'Upload', + cell: ({ row }) => , + }, + { + accessorKey: 'timestamp', + header: 'Time', + cell: ({ row }) => formatDate(row.getValue('timestamp')), + }, + ]} + request={async (pagination) => { + const { data } = await getUserSubscribeTrafficLogs({ + user_id: userId, + subscribe_id: subscriptionId, + ...pagination, + }); + return { + list: data.data?.list || [], + total: data.data?.total || 0, + }; + }} + /> + + + > + columns={[ + { + accessorKey: 'enabled', + header: 'Enabled', + cell: ({ row }) => ( + { + console.log('Switch:', checked); + }} + /> + ), + }, + { + accessorKey: 'id', + header: 'ID', + }, + { + accessorKey: 'imei', + header: 'IMEI', + }, + { + accessorKey: 'user_agent', + header: 'User Agent', + }, + { + accessorKey: 'ip', + header: 'IP', + }, + { + accessorKey: 'online', + header: 'Online', + cell: ({ row }) => ( + + {row.getValue('online') ? 'Online' : 'Offline'} + + ), + }, + { + accessorKey: 'updated_at', + header: 'Last Seen', + cell: ({ row }) => formatDate(row.getValue('updated_at')), + }, + ]} + request={async (pagination) => { + const { data } = await getUserSubscribeDevices({ + user_id: userId, + subscribe_id: subscriptionId, + ...pagination, + }); + return { + list: data.data?.list || [], + total: data.data?.total || 0, + }; + }} actions={{ render: (row) => { + if (!row.imei) return []; return [ - 下线 - - } - title='Confirm Offline' + trigger={} + title={t('confirmOffline')} description={`Are you sure to offline IP ${row.ip}?`} - onConfirm={() => handleOfflineDevice(row.id)} + onConfirm={async () => { + await kickOfflineByUserDevice({ id: row.id }); + toast.success('已通知下线'); + }} cancelText='Cancel' confirmText='Confirm' />, diff --git a/apps/admin/app/dashboard/user/[id]/user-subscription/subscription-form.tsx b/apps/admin/app/dashboard/user/[id]/user-subscription/subscription-form.tsx index 3daeb87..cf5b859 100644 --- a/apps/admin/app/dashboard/user/[id]/user-subscription/subscription-form.tsx +++ b/apps/admin/app/dashboard/user/[id]/user-subscription/subscription-form.tsx @@ -1,5 +1,8 @@ 'use client'; +import { getSubscribeList } from '@/services/admin/subscribe'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useQuery } from '@tanstack/react-query'; import { Button } from '@workspace/ui/components/button'; import { Form, @@ -9,26 +12,42 @@ import { FormLabel, FormMessage, } from '@workspace/ui/components/form'; -import { Input } from '@workspace/ui/components/input'; +import { ScrollArea } from '@workspace/ui/components/scroll-area'; import { Sheet, SheetContent, + SheetFooter, SheetHeader, SheetTitle, SheetTrigger, } from '@workspace/ui/components/sheet'; +import { Combobox } from '@workspace/ui/custom-components/combobox'; +import { DatePicker } from '@workspace/ui/custom-components/date-picker'; +import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; +import { Icon } from '@workspace/ui/custom-components/icon'; +import { unitConversion } from '@workspace/ui/utils'; +import { useTranslations } from 'next-intl'; import { ReactNode, useState } from 'react'; import { useForm } from 'react-hook-form'; +import { z } from 'zod'; interface Props { trigger: ReactNode; title: string; loading?: boolean; - userId: string; - initialData?: API.Subscribe; + userId: number; + initialData?: API.UserSubscribe; onSubmit: (values: any) => Promise; } +const formSchema = z.object({ + subscribe_id: z.number().optional(), + traffic: z.number().optional(), + speed_limit: z.number().optional(), + device_limit: z.number().optional(), + expired_at: z.number().nullish().optional(), +}); + export function SubscriptionForm({ trigger, title, @@ -37,14 +56,18 @@ export function SubscriptionForm({ initialData, onSubmit, }: Props) { + const t = useTranslations('user'); const [open, setOpen] = useState(false); + const form = useForm({ + resolver: zodResolver(formSchema), defaultValues: { user_id: userId, - name: initialData?.name || '', + subscribe_id: initialData?.subscribe_id || 0, traffic: initialData?.traffic || 0, - speed_limit: initialData?.speed_limit || 0, - device_limit: initialData?.device_limit || 0, + upload: initialData?.upload || 0, + download: initialData?.download || 0, + expired_at: initialData?.expire_time || 0, ...(initialData && { id: initialData.id }), }, }); @@ -57,70 +80,169 @@ export function SubscriptionForm({ } }; + const { data: subscribe } = useQuery({ + queryKey: ['getSubscribeList', 'all'], + queryFn: async () => { + const { data } = await getSubscribeList({ + page: 1, + size: 9999, + }); + return data.data?.list as API.Subscribe[]; + }, + }); + return ( - {trigger} + + + {title} - - - ( - - Name - - - - - - )} - /> - ( - - Traffic (Bytes) - - - - - - )} - /> - ( - - Speed Limit (Mbps) - - - - - - )} - /> - ( - - Device Limit - - - - - - )} - /> - - - + +
+ + ( + + {t('subscription')} + + + placeholder='Select Subscription' + value={field.value} + onChange={(value) => { + form.setValue(field.name, value); + }} + options={subscribe?.map((item: API.Subscribe) => ({ + value: item.id, + label: item.name, + }))} + /> + + + + )} + /> + ( + + {t('trafficLimit')} + + unitConversion('bytesToGb', value)} + formatOutput={(value) => unitConversion('gbToBytes', value)} + suffix='GB' + onValueChange={(value) => { + form.setValue(field.name, value as number); + }} + /> + + + + )} + /> + ( + + {t('uploadTraffic')} + + unitConversion('bytesToGb', value)} + formatOutput={(value) => unitConversion('gbToBytes', value)} + suffix='GB' + onValueChange={(value) => { + form.setValue(field.name, value as number); + }} + /> + + + + )} + /> + ( + + {t('downloadTraffic')} + + unitConversion('bytesToGb', value)} + formatOutput={(value) => unitConversion('gbToBytes', value)} + suffix='GB' + onValueChange={(value) => { + form.setValue(field.name, value as number); + }} + /> + + + + )} + /> + ( + + {t('expiredAt')} + + { + if (value === field.value) { + form.setValue(field.name, 0); + } else { + form.setValue(field.name, value!); + } + }} + /> + + + + )} + /> + + +
+ + + +
); diff --git a/apps/admin/app/dashboard/user/page.tsx b/apps/admin/app/dashboard/user/page.tsx index 94d212f..742f4d8 100644 --- a/apps/admin/app/dashboard/user/page.tsx +++ b/apps/admin/app/dashboard/user/page.tsx @@ -2,7 +2,7 @@ import { Display } from '@/components/display'; import { ProTable, ProTableActions } from '@/components/pro-table'; -import { createUser, deleteUser, getUserList, updateUser } from '@/services/admin/user'; +import { createUser, deleteUser, getUserList, updateUserBasicInfo } from '@/services/admin/user'; import { Badge } from '@workspace/ui/components/badge'; import { Button } from '@workspace/ui/components/button'; import { Switch } from '@workspace/ui/components/switch'; @@ -58,10 +58,10 @@ export default function Page() { { - await updateUser({ + await updateUserBasicInfo({ ...row.original, enable: checked, - } as unknown as API.UpdateUserRequest); + } as unknown as API.UpdateUserBasiceInfoRequest); toast.success(t('updateSuccess')); ref.current?.refresh(); }} diff --git a/apps/admin/locales/cs-CZ/common.json b/apps/admin/locales/cs-CZ/common.json index 5574161..0955fa5 100644 --- a/apps/admin/locales/cs-CZ/common.json +++ b/apps/admin/locales/cs-CZ/common.json @@ -45,6 +45,7 @@ "60002": "Toto předplatné nelze momentálně použít, zkuste to prosím později.", "60003": "Bylo zjištěno existující předplatné. Zrušte ho, než budete pokračovat.", "60004": "Nelze momentálně odstranit, protože předplatné má aktivní uživatele.", + "60005": "Režim jednotného předplatného překročil limit uživatelů", "70001": "Ověřovací kód je nesprávný, zadejte ho prosím znovu.", "80001": "Úkol nebyl úspěšně přidán do fronty, zkuste to prosím později.", "90001": "Vypněte prosím režim DEBUG a zkuste to znovu.", diff --git a/apps/admin/locales/cs-CZ/user.json b/apps/admin/locales/cs-CZ/user.json index a923374..f523e6f 100644 --- a/apps/admin/locales/cs-CZ/user.json +++ b/apps/admin/locales/cs-CZ/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Povolení účtu", "actions": "akce", + "add": "Přidat", + "administrator": "Administrátor", "areaCode": "Směrový kód", "areaCodePlaceholder": "Kód oblasti", "auth": "Autentizace", "authIdentifier": "Identifikátor ověření", "authIdentifierPlaceholder": "Zadejte identifikátor ověření", + "authMethodsTitle": "Nastavení ověřování", "authType": "Typ ověření", "authUser": "Autentizovaný uživatel", + "avatar": "Avatar", "balance": "Zůstatek", + "balanceNotifications": "Oznámení o změně zůstatku", "balancePlaceholder": "Zůstatek", + "basicInfoTitle": "Základní informace", "cancel": "zrušit", "commission": "Provize", "commissionPlaceholder": "Zadejte provizi", "confirm": "Potvrdit", "confirmDelete": "Opravdu chcete smazat?", + "confirmOffline": "Potvrdit offline", "create": "Vytvořit", + "createSubscription": "Vytvořit předplatné", "createSuccess": "Vytvoření úspěšné", "createUser": "Vytvořit uživatele", "createdAt": "Datum registrace", "delete": "smazat", "deleteDescription": "Po odstranění nelze data obnovit, prosím, postupujte opatrně.", + "deleteSubscriptionDescription": "Opravdu chcete smazat toto předplatné?", "deleteSuccess": "Úspěšně odstraněno", "detail": "Detail", + "deviceLimit": "Limit zařízení", + "download": "Stáhnout", + "downloadTraffic": "Stáhnout provoz", "edit": "Upravit", + "editSubscription": "Upravit předplatné", "editUser": "Upravit uživatele", "email": "e-mail", + "emailNotifications": "E-mailová oznámení", "enable": "Povolit", + "expireTime": "Čas vypršení", + "expiredAt": "Platnost vypršela", + "failed": "Neúspěch", "giftAmount": "Částka dárku", "giftAmountPlaceholder": "Zadejte částku dárku", "invalidEmailFormat": "Neplatný formát e-mailu", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Zadejte kód pozvánky (ponechte prázdné pro vygenerování)", "loading": "Načítání...", "loginIp": "Přihlašovací IP", + "loginNotifications": "Oznámení o přihlášení", + "loginStatus": "Stav přihlášení", "loginTime": "Čas přihlášení", "manager": "Manažer", + "notifySettingsTitle": "Nastavení oznámení", + "onlineDevices": "Online zařízení", "password": "Heslo", "passwordPlaceholder": "Zadejte nové heslo (volitelné)", + "permanent": "Trvalý", + "pleaseEnterEmail": "Prosím, zadejte e-mail", "referer": "Doporučitel", "refererId": "ID doporučitele", "refererIdPlaceholder": "Zadejte ID doporučitele", + "referralCode": "Doporučovací kód", + "referrerUserId": "Odesílatel (uživatelské ID)", + "remove": "Odstranit", + "resetTime": "Obnovit čas", + "save": "Uložit", "searchIp": "Vyhledat IP adresu", "selectAuthType": "Vyberte typ ověření", + "speedLimit": "Rychlostní limit", + "subscription": "Předplatné", + "subscriptionDetails": "Podrobnosti o předplatném", + "subscriptionList": "Seznam předplatných", + "subscriptionLogs": "Záznamy o předplatném", + "subscriptionName": "Název předplatného", + "subscriptionNotifications": "Oznámení o předplatném", + "success": "Úspěch", + "telegramNotifications": "Telegram oznámení", "telephone": "Telefonní číslo", "telephonePlaceholder": "Zadejte telefonní číslo", + "totalTraffic": "Celkový provoz", + "tradeNotifications": "Obchodní oznámení", + "trafficLimit": "Limit provozu", + "trafficLogs": "Protokoly provozu", + "unlimited": "Neomezený", + "unverified": "Neověřeno", + "update": "Aktualizovat", "updateSuccess": "Aktualizace byla úspěšná", + "upload": "Nahrát", + "uploadTraffic": "Nahrát provoz", "userAgent": "Uživatelský agent", "userEmail": "Uživatelský e-mail", "userEmailPlaceholder": "Zadejte e-mail uživatele", diff --git a/apps/admin/locales/de-DE/common.json b/apps/admin/locales/de-DE/common.json index d124e61..2f3aee5 100644 --- a/apps/admin/locales/de-DE/common.json +++ b/apps/admin/locales/de-DE/common.json @@ -45,6 +45,7 @@ "60002": "Das Abonnement kann derzeit nicht verwendet werden, bitte versuchen Sie es später erneut.", "60003": "Ein bestehendes Abonnement wurde erkannt. Bitte kündigen Sie es, bevor Sie fortfahren.", "60004": "Kann derzeit nicht gelöscht werden, da das Abonnement aktive Benutzer hat.", + "60005": "Im Single-Abo-Modus wurde das Benutzerlimit überschritten", "70001": "Der Bestätigungscode ist falsch, bitte erneut eingeben.", "80001": "Die Aufgabe wurde nicht erfolgreich in die Warteschlange aufgenommen, bitte versuchen Sie es später erneut.", "90001": "Bitte deaktivieren Sie den DEBUG-Modus und versuchen Sie es erneut.", diff --git a/apps/admin/locales/de-DE/user.json b/apps/admin/locales/de-DE/user.json index 604ce4a..0c7bc6f 100644 --- a/apps/admin/locales/de-DE/user.json +++ b/apps/admin/locales/de-DE/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Konto aktivieren", "actions": "Aktionen", + "add": "Hinzufügen", + "administrator": "Administrator", "areaCode": "Vorwahl", "areaCodePlaceholder": "Vorwahl", "auth": "Authentifizierung", "authIdentifier": "Authentifizierungskennung", "authIdentifierPlaceholder": "Geben Sie die Authentifizierungskennung ein", + "authMethodsTitle": "Authentifizierungseinstellungen", "authType": "Authentifizierungstyp", "authUser": "Authentifizierter Benutzer", + "avatar": "Avatar", "balance": "Kontostand", + "balanceNotifications": "Benachrichtigungen über Kontostandsänderungen", "balancePlaceholder": "Kontostand", + "basicInfoTitle": "Grundinformationen", "cancel": "Abbrechen", "commission": "Provision", "commissionPlaceholder": "Provision eingeben", "confirm": "Bestätigen", "confirmDelete": "Sind Sie sicher, dass Sie löschen möchten?", + "confirmOffline": "Offline bestätigen", "create": "Erstellen", + "createSubscription": "Abonnement erstellen", "createSuccess": "Erstellung erfolgreich", "createUser": "Benutzer erstellen", "createdAt": "Registrierungsdatum", "delete": "Löschen", "deleteDescription": "Nach dem Löschen können die Daten nicht wiederhergestellt werden. Bitte gehen Sie vorsichtig vor.", + "deleteSubscriptionDescription": "Sind Sie sicher, dass Sie dieses Abonnement löschen möchten?", "deleteSuccess": "Erfolgreich gelöscht", "detail": "Detail", + "deviceLimit": "Gerätelimit", + "download": "Herunterladen", + "downloadTraffic": "Download-Verkehr", "edit": "Bearbeiten", + "editSubscription": "Abonnement bearbeiten", "editUser": "Benutzer bearbeiten", "email": "E-Mail", + "emailNotifications": "E-Mail-Benachrichtigungen", "enable": "Aktivieren", + "expireTime": "Ablaufzeit", + "expiredAt": "Abgelaufen am", + "failed": "Fehlgeschlagen", "giftAmount": "Geschenkbetrag", "giftAmountPlaceholder": "Geben Sie den Geschenkbetrag ein", "invalidEmailFormat": "Ungültiges E-Mail-Format", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Einladungscode eingeben (leer lassen, um zu generieren)", "loading": "Laden...", "loginIp": "Login-IP", + "loginNotifications": "Anmeldebenachrichtigungen", + "loginStatus": "Anmeldestatus", "loginTime": "Anmeldezeit", "manager": "Manager", + "notifySettingsTitle": "Benachrichtigungseinstellungen", + "onlineDevices": "Online-Geräte", "password": "Passwort", "passwordPlaceholder": "Neues Passwort eingeben (optional)", + "permanent": "Dauerhaft", + "pleaseEnterEmail": "Bitte E-Mail eingeben", "referer": "Empfehler", "refererId": "Referenz-ID", "refererIdPlaceholder": "Geben Sie die Referenz-ID ein", + "referralCode": "Empfehlungscode", + "referrerUserId": "Empfehler (Benutzer-ID)", + "remove": "Entfernen", + "resetTime": "Zeit zurücksetzen", + "save": "Speichern", "searchIp": "IP-Adresse suchen", "selectAuthType": "Authentifizierungstyp auswählen", + "speedLimit": "Geschwindigkeitsbegrenzung", + "subscription": "Abonnement", + "subscriptionDetails": "Abonnementdetails", + "subscriptionList": "Abonnementsliste", + "subscriptionLogs": "Abonnementprotokolle", + "subscriptionName": "Abonnementname", + "subscriptionNotifications": "Abonnement-Benachrichtigungen", + "success": "Erfolg", + "telegramNotifications": "Telegram-Benachrichtigungen", "telephone": "Telefonnummer", "telephonePlaceholder": "Telefonnummer eingeben", + "totalTraffic": "Gesamtverkehr", + "tradeNotifications": "Handelsbenachrichtigungen", + "trafficLimit": "Verkehrslimit", + "trafficLogs": "Verkehrsprotokolle", + "unlimited": "Unbegrenzt", + "unverified": "Unbestätigt", + "update": "Aktualisieren", "updateSuccess": "Aktualisierung erfolgreich", + "upload": "Hochladen", + "uploadTraffic": "Datenverkehr hochladen", "userAgent": "Benutzeragent", "userEmail": "Benutzer-E-Mail", "userEmailPlaceholder": "Benutzer-E-Mail eingeben", diff --git a/apps/admin/locales/en-US/common.json b/apps/admin/locales/en-US/common.json index c581bae..be8b701 100644 --- a/apps/admin/locales/en-US/common.json +++ b/apps/admin/locales/en-US/common.json @@ -45,6 +45,7 @@ "60002": "Unable to use the subscription at the moment, please try again later.", "60003": "An existing subscription is detected. Please cancel it before proceeding.", "60004": "Unable to delete at the moment as the subscription has active users.", + "60005": "Single subscription mode has exceeded user limit", "70001": "Incorrect verification code, please re-enter.", "80001": "Task was not successfully queued, please try again later.", "90001": "Please disable DEBUG mode and try again.", diff --git a/apps/admin/locales/en-US/user.json b/apps/admin/locales/en-US/user.json index 3005a44..3a4a9e8 100644 --- a/apps/admin/locales/en-US/user.json +++ b/apps/admin/locales/en-US/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Account Enable", "actions": "Actions", + "add": "Add", + "administrator": "Administrator", "areaCode": "Area Code", "areaCodePlaceholder": "Area code", "auth": "Auth", "authIdentifier": "Auth Identifier", "authIdentifierPlaceholder": "Enter auth identifier", + "authMethodsTitle": "Authentication Settings", "authType": "Auth Type", "authUser": "Auth User", + "avatar": "Avatar", "balance": "Balance", + "balanceNotifications": "Balance Change Notifications", "balancePlaceholder": "Balance", + "basicInfoTitle": "Basic Information", "cancel": "Cancel", "commission": "Commission", "commissionPlaceholder": "Enter commission", "confirm": "Confirm", - "confirmDelete": "Are you sure you want to delete?", + "confirmDelete": "Confirm Delete", + "confirmOffline": "Confirm Offline", "create": "Create", + "createSubscription": "Create Subscription", "createSuccess": "Create successful", "createUser": "Create User", "createdAt": "Created At", "delete": "Delete", "deleteDescription": "Data cannot be recovered after deletion, please proceed with caution.", + "deleteSubscriptionDescription": "Are you sure to delete this subscription?", "deleteSuccess": "Delete successful", "detail": "Detail", + "deviceLimit": "Device Limit", + "download": "Download", + "downloadTraffic": "Download Traffic", "edit": "Edit", + "editSubscription": "Edit Subscription", "editUser": "Edit User", "email": "Email", + "emailNotifications": "Email Notifications", "enable": "Enable", + "expireTime": "Expire Time", + "expiredAt": "Expired At", + "failed": "Failed", "giftAmount": "Gift Amount", "giftAmountPlaceholder": "Enter gift amount", "invalidEmailFormat": "Invalid email format", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Enter invite code (leave blank to generate)", "loading": "Loading...", "loginIp": "Login IP", + "loginNotifications": "Login Notifications", + "loginStatus": "Login Status", "loginTime": "Login Time", "manager": "Manager", + "notifySettingsTitle": "Notification Settings", + "onlineDevices": "Online Devices", "password": "Password", "passwordPlaceholder": "Enter new password (optional)", + "permanent": "Permanent", + "pleaseEnterEmail": "Please enter email", "referer": "Referer", "refererId": "Referer ID", "refererIdPlaceholder": "Enter referer ID", + "referralCode": "Referral Code", + "referrerUserId": "Referrer (User ID)", + "remove": "Remove", + "resetTime": "Reset Time", + "save": "Save", "searchIp": "Search IP address", "selectAuthType": "Select auth type", + "speedLimit": "Speed Limit", + "subscription": "Subscription", + "subscriptionDetails": "Subscription Details", + "subscriptionList": "Subscription List", + "subscriptionLogs": "Subscription Logs", + "subscriptionName": "Subscription Name", + "subscriptionNotifications": "Subscription Notifications", + "success": "Success", + "telegramNotifications": "Telegram Notifications", "telephone": "Phone Number", "telephonePlaceholder": "Enter phone number", + "totalTraffic": "Total Traffic", + "tradeNotifications": "Trade Notifications", + "trafficLimit": "Traffic Limit", + "trafficLogs": "Traffic Logs", + "unlimited": "Unlimited", + "unverified": "Unverified", + "update": "Update", "updateSuccess": "Update successful", + "upload": "Upload", + "uploadTraffic": "Upload Traffic", "userAgent": "User Agent", "userEmail": "User Email", "userEmailPlaceholder": "Enter user email", diff --git a/apps/admin/locales/es-ES/common.json b/apps/admin/locales/es-ES/common.json index 2f36677..677a091 100644 --- a/apps/admin/locales/es-ES/common.json +++ b/apps/admin/locales/es-ES/common.json @@ -45,6 +45,7 @@ "60002": "No se puede usar la suscripción por el momento, por favor intente más tarde.", "60003": "Se ha detectado una suscripción existente. Por favor, cancélala antes de continuar.", "60004": "No se puede eliminar en este momento ya que la suscripción tiene usuarios activos.", + "60005": "El modo de suscripción única ha superado el límite de usuarios", "70001": "El código de verificación es incorrecto, por favor ingréselo nuevamente.", "80001": "La tarea no se agregó exitosamente a la cola, por favor intente de nuevo más tarde.", "90001": "Por favor desactive el modo DEBUG e intente nuevamente.", diff --git a/apps/admin/locales/es-ES/user.json b/apps/admin/locales/es-ES/user.json index 68e1ae1..d11721c 100644 --- a/apps/admin/locales/es-ES/user.json +++ b/apps/admin/locales/es-ES/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Habilitar cuenta", "actions": "acciones", + "add": "Agregar", + "administrator": "Administrador", "areaCode": "Código de Área", "areaCodePlaceholder": "Código de área", "auth": "Autenticación", "authIdentifier": "Identificador de Autenticación", "authIdentifierPlaceholder": "Ingrese el identificador de autenticación", + "authMethodsTitle": "Configuración de Autenticación", "authType": "Tipo de Autenticación", "authUser": "Usuario Autenticado", + "avatar": "Avatar", "balance": "Saldo", + "balanceNotifications": "Notificaciones de Cambio de Saldo", "balancePlaceholder": "Saldo", + "basicInfoTitle": "Información Básica", "cancel": "Cancelar", "commission": "Comisión", "commissionPlaceholder": "Ingrese comisión", "confirm": "Confirmar", "confirmDelete": "¿Está seguro de que desea eliminar?", + "confirmOffline": "Confirmar sin conexión", "create": "Crear", + "createSubscription": "Crear suscripción", "createSuccess": "Creación exitosa", "createUser": "Crear usuario", "createdAt": "Fecha de registro", "delete": "eliminar", "deleteDescription": "Después de eliminar, los datos no se podrán recuperar. Proceda con precaución.", + "deleteSubscriptionDescription": "¿Está seguro de que desea eliminar esta suscripción?", "deleteSuccess": "Eliminación exitosa", "detail": "Detalle", + "deviceLimit": "Límite de Dispositivos", + "download": "Descargar", + "downloadTraffic": "Descargar Tráfico", "edit": "editar", + "editSubscription": "Editar suscripción", "editUser": "Editar usuario", "email": "correo electrónico", + "emailNotifications": "Notificaciones por correo electrónico", "enable": "Habilitar", + "expireTime": "Tiempo de Expiración", + "expiredAt": "Fecha de vencimiento", + "failed": "Fallido", "giftAmount": "Monto del Regalo", "giftAmountPlaceholder": "Ingrese el monto del regalo", "invalidEmailFormat": "Formato de correo electrónico no válido", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Introduce el código de invitación (déjalo en blanco para generar uno)", "loading": "Cargando...", "loginIp": "IP de inicio de sesión", + "loginNotifications": "Notificaciones de inicio de sesión", + "loginStatus": "Estado de inicio de sesión", "loginTime": "Hora de inicio de sesión", "manager": "Gerente", + "notifySettingsTitle": "Configuración de Notificaciones", + "onlineDevices": "Dispositivos en línea", "password": "Contraseña", "passwordPlaceholder": "Ingrese nueva contraseña (opcional)", + "permanent": "Permanente", + "pleaseEnterEmail": "Por favor, introduce el correo electrónico", "referer": "Recomendador", "refererId": "ID del Referente", "refererIdPlaceholder": "Ingrese el ID del referente", + "referralCode": "Código de Referencia", + "referrerUserId": "Referente (ID de usuario)", + "remove": "Eliminar", + "resetTime": "Restablecer Tiempo", + "save": "Guardar", "searchIp": "Buscar dirección IP", "selectAuthType": "Seleccionar tipo de autenticación", + "speedLimit": "Límite de Velocidad", + "subscription": "Suscripción", + "subscriptionDetails": "Detalles de la suscripción", + "subscriptionList": "Lista de Suscripción", + "subscriptionLogs": "Registros de Suscripción", + "subscriptionName": "Nombre de la Suscripción", + "subscriptionNotifications": "Notificaciones de suscripción", + "success": "Éxito", + "telegramNotifications": "Notificaciones de Telegram", "telephone": "Número de Teléfono", "telephonePlaceholder": "Ingrese número de teléfono", + "totalTraffic": "Tráfico Total", + "tradeNotifications": "Notificaciones de Comercio", + "trafficLimit": "Límite de Tráfico", + "trafficLogs": "Registros de Tráfico", + "unlimited": "Ilimitado", + "unverified": "No verificado", + "update": "Actualizar", "updateSuccess": "Actualización exitosa", + "upload": "Subir", + "uploadTraffic": "Subir Tráfico", "userAgent": "Agente de Usuario", "userEmail": "Correo Electrónico del Usuario", "userEmailPlaceholder": "Introduce el correo electrónico del usuario", diff --git a/apps/admin/locales/es-MX/common.json b/apps/admin/locales/es-MX/common.json index 5a3ac66..e18b738 100644 --- a/apps/admin/locales/es-MX/common.json +++ b/apps/admin/locales/es-MX/common.json @@ -45,6 +45,7 @@ "60002": "No se puede usar la suscripción por el momento, por favor intenta más tarde.", "60003": "Se ha detectado una suscripción existente. Por favor, cancélala antes de continuar.", "60004": "No se puede eliminar en este momento ya que la suscripción tiene usuarios activos.", + "60005": "El modo de suscripción única ha excedido el límite de usuarios", "70001": "El código de verificación es incorrecto, por favor ingrésalo de nuevo.", "80001": "La tarea no se agregó exitosamente a la cola, por favor intenta de nuevo más tarde.", "90001": "Por favor desactiva el modo DEBUG e intenta de nuevo.", diff --git a/apps/admin/locales/es-MX/user.json b/apps/admin/locales/es-MX/user.json index 34d9964..28b0c16 100644 --- a/apps/admin/locales/es-MX/user.json +++ b/apps/admin/locales/es-MX/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Habilitar Cuenta", "actions": "acciones", + "add": "Agregar", + "administrator": "Administrador", "areaCode": "Código de Área", "areaCodePlaceholder": "Código de área", "auth": "Autenticación", "authIdentifier": "Identificador de Autenticación", "authIdentifierPlaceholder": "Ingrese identificador de autenticación", + "authMethodsTitle": "Configuración de Autenticación", "authType": "Tipo de Autenticación", "authUser": "Usuario Autenticado", + "avatar": "Avatar", "balance": "Saldo", + "balanceNotifications": "Notificaciones de Cambio de Saldo", "balancePlaceholder": "Saldo", + "basicInfoTitle": "Información Básica", "cancel": "Cancelar", "commission": "Comisión", "commissionPlaceholder": "Ingrese comisión", "confirm": "Confirmar", "confirmDelete": "¿Está seguro de que desea eliminar?", + "confirmOffline": "Confirmar sin conexión", "create": "Crear", + "createSubscription": "Crear Suscripción", "createSuccess": "Creación exitosa", "createUser": "Crear usuario", "createdAt": "Fecha de registro", "delete": "Eliminar", "deleteDescription": "Después de eliminar, los datos no se pueden recuperar. Proceda con precaución.", + "deleteSubscriptionDescription": "¿Está seguro de que desea eliminar esta suscripción?", "deleteSuccess": "Eliminación exitosa", "detail": "Detalle", + "deviceLimit": "Límite de Dispositivos", + "download": "Descargar", + "downloadTraffic": "Descargar Tráfico", "edit": "editar", + "editSubscription": "Editar Suscripción", "editUser": "Editar usuario", "email": "correo electrónico", + "emailNotifications": "Notificaciones por Correo Electrónico", "enable": "Habilitar", + "expireTime": "Tiempo de Expiración", + "expiredAt": "Fecha de vencimiento", + "failed": "Fallido", "giftAmount": "Monto del Regalo", "giftAmountPlaceholder": "Ingrese el monto del regalo", "invalidEmailFormat": "Formato de correo electrónico no válido", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Ingresa el código de invitación (déjalo en blanco para generar uno)", "loading": "Cargando...", "loginIp": "IP de inicio de sesión", + "loginNotifications": "Notificaciones de inicio de sesión", + "loginStatus": "Estado de Inicio de Sesión", "loginTime": "Hora de Inicio de Sesión", "manager": "Gerente", + "notifySettingsTitle": "Configuración de Notificaciones", + "onlineDevices": "Dispositivos en línea", "password": "Contraseña", "passwordPlaceholder": "Ingresa nueva contraseña (opcional)", + "permanent": "Permanente", + "pleaseEnterEmail": "Por favor, ingresa el correo electrónico", "referer": "Recomendador", "refererId": "ID del Referente", "refererIdPlaceholder": "Ingrese ID del referente", + "referralCode": "Código de Referencia", + "referrerUserId": "Referente (ID de Usuario)", + "remove": "Eliminar", + "resetTime": "Restablecer Tiempo", + "save": "Guardar", "searchIp": "Buscar dirección IP", "selectAuthType": "Seleccionar tipo de autenticación", + "speedLimit": "Límite de Velocidad", + "subscription": "Suscripción", + "subscriptionDetails": "Detalles de la Suscripción", + "subscriptionList": "Lista de Suscripción", + "subscriptionLogs": "Registros de Suscripción", + "subscriptionName": "Nombre de la Suscripción", + "subscriptionNotifications": "Notificaciones de Suscripción", + "success": "Éxito", + "telegramNotifications": "Notificaciones de Telegram", "telephone": "Número de Teléfono", "telephonePlaceholder": "Ingrese número de teléfono", + "totalTraffic": "Tráfico Total", + "tradeNotifications": "Notificaciones de Comercio", + "trafficLimit": "Límite de Tráfico", + "trafficLogs": "Registros de Tráfico", + "unlimited": "Ilimitado", + "unverified": "No verificado", + "update": "Actualizar", "updateSuccess": "Actualización exitosa", + "upload": "Subir", + "uploadTraffic": "Subir Tráfico", "userAgent": "Agente de Usuario", "userEmail": "Correo Electrónico del Usuario", "userEmailPlaceholder": "Ingresa el correo electrónico del usuario", diff --git a/apps/admin/locales/fa-IR/common.json b/apps/admin/locales/fa-IR/common.json index 4dee74d..c70a435 100644 --- a/apps/admin/locales/fa-IR/common.json +++ b/apps/admin/locales/fa-IR/common.json @@ -45,6 +45,7 @@ "60002": "در حال حاضر نمی‌توان از اشتراک استفاده کرد، لطفاً بعداً دوباره تلاش کنید.", "60003": "یک اشتراک موجود شناسایی شد. لطفاً قبل از ادامه آن را لغو کنید.", "60004": "در حال حاضر امکان حذف وجود ندارد زیرا اشتراک دارای کاربران فعال است.", + "60005": "حالت اشتراک تک از حد مجاز کاربران عبور کرده است", "70001": "کد تأیید نادرست است، لطفاً دوباره وارد کنید.", "80001": "وظیفه به‌طور موفقیت‌آمیز در صف قرار نگرفت، لطفاً بعداً دوباره تلاش کنید.", "90001": "لطفاً حالت DEBUG را غیرفعال کرده و دوباره تلاش کنید.", diff --git a/apps/admin/locales/fa-IR/user.json b/apps/admin/locales/fa-IR/user.json index 1d08068..351250c 100644 --- a/apps/admin/locales/fa-IR/user.json +++ b/apps/admin/locales/fa-IR/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "فعال‌سازی حساب", "actions": "اقدامات", + "add": "افزودن", + "administrator": "مدیر", "areaCode": "کد منطقه", "areaCodePlaceholder": "کد منطقه", "auth": "احراز هویت", "authIdentifier": "شناسه احراز هویت", "authIdentifierPlaceholder": "شناسه احراز هویت را وارد کنید", + "authMethodsTitle": "تنظیمات احراز هویت", "authType": "نوع احراز هویت", "authUser": "کاربر تأیید شده", + "avatar": "آواتار", "balance": "تعادل", + "balanceNotifications": "اعلان‌های تغییر موجودی", "balancePlaceholder": "موجودی", + "basicInfoTitle": "اطلاعات پایه", "cancel": "لغو", "commission": "کمیسیون", "commissionPlaceholder": "کمیسیون را وارد کنید", "confirm": "تأیید", "confirmDelete": "آیا مطمئن هستید که می‌خواهید حذف کنید؟", + "confirmOffline": "تأیید آفلاین", "create": "ایجاد", + "createSubscription": "ایجاد اشتراک", "createSuccess": "ایجاد با موفقیت انجام شد", "createUser": "ایجاد کاربر", "createdAt": "ایجاد شده در", "delete": "حذف", "deleteDescription": "پس از حذف، داده‌ها قابل بازیابی نیستند، لطفاً با احتیاط ادامه دهید.", + "deleteSubscriptionDescription": "آیا مطمئن هستید که می‌خواهید این اشتراک را حذف کنید؟", "deleteSuccess": "حذف با موفقیت انجام شد", "detail": "جزئیات", + "deviceLimit": "محدودیت دستگاه", + "download": "دانلود", + "downloadTraffic": "ترافیک دانلود", "edit": "ویرایش", + "editSubscription": "ویرایش اشتراک", "editUser": "ویرایش کاربر", "email": "ایمیل", + "emailNotifications": "اعلان‌های ایمیل", "enable": "فعال کردن", + "expireTime": "زمان انقضا", + "expiredAt": "منقضی شده در", + "failed": "ناموفق", "giftAmount": "مقدار هدیه", "giftAmountPlaceholder": "مبلغ هدیه را وارد کنید", "invalidEmailFormat": "فرمت ایمیل نامعتبر است", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "کد دعوت را وارد کنید (برای تولید خالی بگذارید)", "loading": "در حال بارگذاری...", "loginIp": "آی‌پی ورود", + "loginNotifications": "اعلان‌های ورود", + "loginStatus": "وضعیت ورود", "loginTime": "زمان ورود", "manager": "مدیر", + "notifySettingsTitle": "تنظیمات اعلان‌ها", + "onlineDevices": "دستگاه‌های آنلاین", "password": "رمز عبور", "passwordPlaceholder": "رمز عبور جدید را وارد کنید (اختیاری)", + "permanent": "دائمی", + "pleaseEnterEmail": "لطفاً ایمیل خود را وارد کنید", "referer": "ارجاع‌دهنده", "refererId": "شناسه معرف", "refererIdPlaceholder": "شناسه معرف را وارد کنید", + "referralCode": "کد ارجاع", + "referrerUserId": "ارجاع‌دهنده (شناسه کاربر)", + "remove": "حذف", + "resetTime": "زمان بازنشانی", + "save": "ذخیره", "searchIp": "جستجوی آدرس IP", "selectAuthType": "نوع احراز هویت را انتخاب کنید", + "speedLimit": "محدودیت سرعت", + "subscription": "اشتراک", + "subscriptionDetails": "جزئیات اشتراک", + "subscriptionList": "لیست اشتراک", + "subscriptionLogs": "گزارش‌های اشتراک", + "subscriptionName": "نام اشتراک", + "subscriptionNotifications": "اعلان‌های اشتراک", + "success": "موفقیت", + "telegramNotifications": "اعلان‌های تلگرام", "telephone": "شماره تلفن", "telephonePlaceholder": "شماره تلفن را وارد کنید", + "totalTraffic": "کل ترافیک", + "tradeNotifications": "اعلان‌های تجارت", + "trafficLimit": "محدودیت ترافیک", + "trafficLogs": "گزارش‌های ترافیک", + "unlimited": "نامحدود", + "unverified": "تأیید نشده", + "update": "به‌روزرسانی", "updateSuccess": "به‌روزرسانی با موفقیت انجام شد", + "upload": "بارگذاری", + "uploadTraffic": "بارگذاری ترافیک", "userAgent": "عامل کاربر", "userEmail": "ایمیل کاربر", "userEmailPlaceholder": "ایمیل کاربر را وارد کنید", diff --git a/apps/admin/locales/fi-FI/common.json b/apps/admin/locales/fi-FI/common.json index 7b9804e..966a95f 100644 --- a/apps/admin/locales/fi-FI/common.json +++ b/apps/admin/locales/fi-FI/common.json @@ -45,6 +45,7 @@ "60002": "Tilausta ei voi käyttää tällä hetkellä, yritä myöhemmin uudelleen.", "60003": "Olemassa oleva tilaus havaittu. Peruuta se ennen jatkamista.", "60004": "Ei voi poistaa tällä hetkellä, koska tilauksella on aktiivisia käyttäjiä.", + "60005": "Yksittäisen tilauksen tila on ylittänyt käyttäjärajan", "70001": "Vahvistuskoodi on virheellinen, syötä se uudelleen.", "80001": "Tehtävää ei lisätty jonoon, yritä myöhemmin uudelleen.", "90001": "Sulje DEBUG-tila ja yritä uudelleen.", diff --git a/apps/admin/locales/fi-FI/user.json b/apps/admin/locales/fi-FI/user.json index 984623d..7d940cf 100644 --- a/apps/admin/locales/fi-FI/user.json +++ b/apps/admin/locales/fi-FI/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Tilin aktivointi", "actions": "toiminnot", + "add": "Lisää", + "administrator": "Ylläpitäjä", "areaCode": "Alueen koodi", "areaCodePlaceholder": "Alueen koodi", "auth": "Tunnistus", "authIdentifier": "Tunnistautumistunnus", "authIdentifierPlaceholder": "Syötä tunnistautumistunnus", + "authMethodsTitle": "Todennusasetukset", "authType": "Todennustyyppi", "authUser": "Todennus Käyttäjä", + "avatar": "Avatar", "balance": "Saldo", + "balanceNotifications": "Saldon muutosilmoitukset", "balancePlaceholder": "Saldo", + "basicInfoTitle": "Perustiedot", "cancel": "Peruuta", "commission": "Komissio", "commissionPlaceholder": "Syötä komissio", "confirm": "Vahvista", "confirmDelete": "Oletko varma, että haluat poistaa?", + "confirmOffline": "Vahvista offline-tila", "create": "Luo", + "createSubscription": "Luo tilaus", "createSuccess": "Luonti onnistui", "createUser": "Luo käyttäjä", "createdAt": "Rekisteröitymisaika", "delete": "poista", "deleteDescription": "Poistamisen jälkeen tietoja ei voi palauttaa, ole varovainen.", + "deleteSubscriptionDescription": "Haluatko varmasti poistaa tämän tilauksen?", "deleteSuccess": "Poisto onnistui", "detail": "Yksityiskohta", + "deviceLimit": "Laiterajoitus", + "download": "Lataa", + "downloadTraffic": "Lataa liikenne", "edit": "muokkaa", + "editSubscription": "Muokkaa tilausta", "editUser": "Muokkaa käyttäjää", "email": "sähköposti", + "emailNotifications": "Sähköposti-ilmoitukset", "enable": "Ota käyttöön", + "expireTime": "Vanhentumisaika", + "expiredAt": "Vanhentunut", + "failed": "Epäonnistui", "giftAmount": "Lahjan määrä", "giftAmountPlaceholder": "Syötä lahjan määrä", "invalidEmailFormat": "Virheellinen sähköpostimuoto", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Syötä kutsukoodi (jätä tyhjäksi luodaksesi uuden)", "loading": "Ladataan...", "loginIp": "Kirjautumis-IP", + "loginNotifications": "Kirjautumisilmoitukset", + "loginStatus": "Kirjautumistila", "loginTime": "Kirjautumisaika", "manager": "Johtaja", + "notifySettingsTitle": "Ilmoitusasetukset", + "onlineDevices": "Verkossa olevat laitteet", "password": "Salasana", "passwordPlaceholder": "Syötä uusi salasana (valinnainen)", + "permanent": "Pysyvä", + "pleaseEnterEmail": "Ole hyvä ja syötä sähköpostiosoite", "referer": "Suosittelija", "refererId": "Viittaajan ID", "refererIdPlaceholder": "Syötä suosittelijan ID", + "referralCode": "Suosituskoodi", + "referrerUserId": "Viittaaja (Käyttäjän ID)", + "remove": "Poista", + "resetTime": "Nollaa aika", + "save": "Tallenna", "searchIp": "Etsi IP-osoite", "selectAuthType": "Valitse todennustyyppi", + "speedLimit": "Nopeusrajoitus", + "subscription": "Tilaus", + "subscriptionDetails": "Tilaustiedot", + "subscriptionList": "Tilauksen lista", + "subscriptionLogs": "Tilaushistoria", + "subscriptionName": "Tilauksen nimi", + "subscriptionNotifications": "Tilausilmoitukset", + "success": "Onnistuminen", + "telegramNotifications": "Telegram-ilmoitukset", "telephone": "Puhelinnumero", "telephonePlaceholder": "Syötä puhelinnumero", + "totalTraffic": "Kokonaisliikenne", + "tradeNotifications": "Kauppailmoitukset", + "trafficLimit": "Liikenteen rajoitus", + "trafficLogs": "Liikennelokit", + "unlimited": "Rajoittamaton", + "unverified": "Vahvistamaton", + "update": "Päivitä", "updateSuccess": "Päivitys onnistui", + "upload": "Lataa", + "uploadTraffic": "Lähetä liikenne", "userAgent": "Käyttäjäagentti", "userEmail": "Käyttäjän sähköposti", "userEmailPlaceholder": "Syötä käyttäjän sähköpostiosoite", diff --git a/apps/admin/locales/fr-FR/common.json b/apps/admin/locales/fr-FR/common.json index bb28d4a..2f3e0ed 100644 --- a/apps/admin/locales/fr-FR/common.json +++ b/apps/admin/locales/fr-FR/common.json @@ -45,6 +45,7 @@ "60002": "Impossible d'utiliser cet abonnement pour le moment, veuillez réessayer plus tard.", "60003": "Un abonnement existant a été détecté. Veuillez l'annuler avant de continuer.", "60004": "Impossible de supprimer pour le moment car l'abonnement a des utilisateurs actifs.", + "60005": "Le mode d'abonnement unique a dépassé la limite d'utilisateurs", "70001": "Le code de vérification est incorrect, veuillez le ressaisir.", "80001": "La tâche n'a pas été ajoutée avec succès à la file d'attente, veuillez réessayer plus tard.", "90001": "Veuillez désactiver le mode DEBUG et réessayer.", diff --git a/apps/admin/locales/fr-FR/user.json b/apps/admin/locales/fr-FR/user.json index f65114b..1f4c862 100644 --- a/apps/admin/locales/fr-FR/user.json +++ b/apps/admin/locales/fr-FR/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Activation du compte", "actions": "actions", + "add": "Ajouter", + "administrator": "Administrateur", "areaCode": "Indicatif régional", "areaCodePlaceholder": "Indicatif régional", "auth": "Auth", "authIdentifier": "Identifiant d'authentification", "authIdentifierPlaceholder": "Entrez l'identifiant d'authentification", + "authMethodsTitle": "Paramètres d'authentification", "authType": "Type d'authentification", "authUser": "Utilisateur Auth", + "avatar": "Avatar", "balance": "Solde", + "balanceNotifications": "Notifications de changement de solde", "balancePlaceholder": "Solde", + "basicInfoTitle": "Informations de base", "cancel": "Annuler", "commission": "Commission", "commissionPlaceholder": "Entrez la commission", "confirm": "Confirmer", "confirmDelete": "Êtes-vous sûr de vouloir supprimer ?", + "confirmOffline": "Confirmer hors ligne", "create": "Créer", + "createSubscription": "Créer un abonnement", "createSuccess": "Création réussie", "createUser": "Créer un utilisateur", "createdAt": "Date d'inscription", "delete": "Supprimer", "deleteDescription": "Une fois supprimées, les données ne peuvent pas être récupérées. Veuillez procéder avec prudence.", + "deleteSubscriptionDescription": "Êtes-vous sûr de vouloir supprimer cet abonnement ?", "deleteSuccess": "Suppression réussie", "detail": "Détail", + "deviceLimit": "Limite d'appareil", + "download": "Télécharger", + "downloadTraffic": "Télécharger le trafic", "edit": "Éditer", + "editSubscription": "Modifier l'abonnement", "editUser": "Modifier l'utilisateur", "email": "e-mail", + "emailNotifications": "Notifications par e-mail", "enable": "Activer", + "expireTime": "Date d'expiration", + "expiredAt": "Expiré le", + "failed": "Échoué", "giftAmount": "Montant du cadeau", "giftAmountPlaceholder": "Entrez le montant du cadeau", "invalidEmailFormat": "Format d'email invalide", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Entrez le code d'invitation (laissez vide pour générer)", "loading": "Chargement...", "loginIp": "IP de connexion", + "loginNotifications": "Notifications de connexion", + "loginStatus": "Statut de connexion", "loginTime": "Heure de connexion", "manager": "Gestionnaire", + "notifySettingsTitle": "Paramètres de notification", + "onlineDevices": "Appareils en ligne", "password": "Mot de passe", "passwordPlaceholder": "Entrez un nouveau mot de passe (facultatif)", + "permanent": "Permanent", + "pleaseEnterEmail": "Veuillez entrer votre adresse e-mail", "referer": "Référent", "refererId": "ID du référent", "refererIdPlaceholder": "Entrez l'ID du référent", + "referralCode": "Code de parrainage", + "referrerUserId": "Référent (ID utilisateur)", + "remove": "Supprimer", + "resetTime": "Réinitialiser l'heure", + "save": "Enregistrer", "searchIp": "Rechercher une adresse IP", "selectAuthType": "Sélectionner le type d'authentification", + "speedLimit": "Limite de vitesse", + "subscription": "Abonnement", + "subscriptionDetails": "Détails de l'abonnement", + "subscriptionList": "Liste des abonnements", + "subscriptionLogs": "Journaux d'abonnement", + "subscriptionName": "Nom de l'abonnement", + "subscriptionNotifications": "Notifications d'abonnement", + "success": "Succès", + "telegramNotifications": "Notifications Telegram", "telephone": "Numéro de téléphone", "telephonePlaceholder": "Entrez le numéro de téléphone", + "totalTraffic": "Trafic Total", + "tradeNotifications": "Notifications de commerce", + "trafficLimit": "Limite de trafic", + "trafficLogs": "Journaux de trafic", + "unlimited": "Illimité", + "unverified": "Non vérifié", + "update": "Mettre à jour", "updateSuccess": "Mise à jour réussie", + "upload": "Téléverser", + "uploadTraffic": "Télécharger le trafic", "userAgent": "Agent utilisateur", "userEmail": "E-mail de l'utilisateur", "userEmailPlaceholder": "Entrez l'email de l'utilisateur", diff --git a/apps/admin/locales/hi-IN/common.json b/apps/admin/locales/hi-IN/common.json index e914cab..30a2e1d 100644 --- a/apps/admin/locales/hi-IN/common.json +++ b/apps/admin/locales/hi-IN/common.json @@ -45,6 +45,7 @@ "60002": "अस्थायी रूप से इस सदस्यता का उपयोग नहीं किया जा सकता, कृपया थोड़ी देर बाद पुनः प्रयास करें।", "60003": "एक मौजूदा सदस्यता का पता चला है। कृपया आगे बढ़ने से पहले इसे रद्द करें।", "60004": "वर्तमान में हटाने में असमर्थ क्योंकि सदस्यता में सक्रिय उपयोगकर्ता हैं।", + "60005": "एकल सदस्यता मोड ने उपयोगकर्ता सीमा से अधिक कर दिया है", "70001": "सत्यापन कोड गलत है, कृपया पुनः दर्ज करें।", "80001": "कार्य सफलतापूर्वक कतार में नहीं जोड़ा गया, कृपया थोड़ी देर बाद पुनः प्रयास करें।", "90001": "कृपया DEBUG मोड बंद करें और फिर पुनः प्रयास करें।", diff --git a/apps/admin/locales/hi-IN/user.json b/apps/admin/locales/hi-IN/user.json index 3a0c05f..adbad3c 100644 --- a/apps/admin/locales/hi-IN/user.json +++ b/apps/admin/locales/hi-IN/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "खाता सक्षम करें", "actions": "क्रियाएँ", + "add": "जोड़ें", + "administrator": "प्रशासक", "areaCode": "क्षेत्र कोड", "areaCodePlaceholder": "क्षेत्र कोड", "auth": "प्रमाणीकरण", "authIdentifier": "प्रमाणीकरण पहचानकर्ता", "authIdentifierPlaceholder": "प्रमाणिक पहचानकर्ता दर्ज करें", + "authMethodsTitle": "प्रमाणीकरण सेटिंग्स", "authType": "प्रमाणीकरण प्रकार", "authUser": "प्रमाणित उपयोगकर्ता", + "avatar": "अवतार", "balance": "शेष", + "balanceNotifications": "बैलेंस परिवर्तन सूचनाएं", "balancePlaceholder": "शेष", + "basicInfoTitle": "मूल जानकारी", "cancel": "रद्द करें", "commission": "आयोग", "commissionPlaceholder": "कमीशन दर्ज करें", "confirm": "पुष्टि करें", "confirmDelete": "क्या आप वाकई हटाना चाहते हैं?", + "confirmOffline": "ऑफ़लाइन की पुष्टि करें", "create": "सृजन", + "createSubscription": "सदस्यता बनाएं", "createSuccess": "सृजन सफल", "createUser": "उपयोगकर्ता बनाएं", "createdAt": "पंजीकरण समय", "delete": "हटाएं", "deleteDescription": "हटाने के बाद डेटा पुनर्प्राप्त नहीं किया जा सकता है, कृपया सावधानीपूर्वक कार्य करें।", + "deleteSubscriptionDescription": "क्या आप वाकई इस सदस्यता को हटाना चाहते हैं?", "deleteSuccess": "हटाने में सफलता", "detail": "विवरण", + "deviceLimit": "डिवाइस सीमा", + "download": "डाउनलोड", + "downloadTraffic": "डाउनलोड ट्रैफिक", "edit": "संपादित करें", + "editSubscription": "सदस्यता संपादित करें", "editUser": "उपयोगकर्ता संपादित करें", "email": "ईमेल", + "emailNotifications": "ईमेल सूचनाएं", "enable": "सक्षम करें", + "expireTime": "समाप्ति समय", + "expiredAt": "समाप्ति तिथि", + "failed": "असफल", "giftAmount": "उपहार राशि", "giftAmountPlaceholder": "उपहार राशि दर्ज करें", "invalidEmailFormat": "अमान्य ईमेल प्रारूप", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "आमंत्रण कोड दर्ज करें (उत्पन्न करने के लिए खाली छोड़ें)", "loading": "लोड हो रहा है...", "loginIp": "लॉगिन आईपी", + "loginNotifications": "लॉगिन सूचनाएं", + "loginStatus": "लॉगिन स्थिति", "loginTime": "लॉगिन समय", "manager": "प्रबंधक", + "notifySettingsTitle": "सूचना सेटिंग्स", + "onlineDevices": "ऑनलाइन डिवाइस", "password": "पासवर्ड", "passwordPlaceholder": "नया पासवर्ड दर्ज करें (वैकल्पिक)", + "permanent": "स्थायी", + "pleaseEnterEmail": "कृपया ईमेल दर्ज करें", "referer": "सिफारिशकर्ता", "refererId": "रेफरर आईडी", "refererIdPlaceholder": "रेफरर आईडी दर्ज करें", + "referralCode": "रेफरल कोड", + "referrerUserId": "रेफरर (उपयोगकर्ता आईडी)", + "remove": "हटाएं", + "resetTime": "समय रीसेट करें", + "save": "सहेजें", "searchIp": "आईपी पता खोजें", "selectAuthType": "प्रमाणीकरण प्रकार चुनें", + "speedLimit": "गति सीमा", + "subscription": "सदस्यता", + "subscriptionDetails": "सदस्यता विवरण", + "subscriptionList": "सदस्यता सूची", + "subscriptionLogs": "सदस्यता लॉग्स", + "subscriptionName": "सदस्यता नाम", + "subscriptionNotifications": "सदस्यता सूचनाएं", + "success": "सफलता", + "telegramNotifications": "टेलीग्राम सूचनाएं", "telephone": "फ़ोन नंबर", "telephonePlaceholder": "फ़ोन नंबर दर्ज करें", + "totalTraffic": "कुल ट्रैफ़िक", + "tradeNotifications": "व्यापार सूचनाएं", + "trafficLimit": "ट्रैफिक सीमा", + "trafficLogs": "ट्रैफिक लॉग्स", + "unlimited": "असीमित", + "unverified": "असत्यापित", + "update": "अपडेट", "updateSuccess": "अपडेट सफल", + "upload": "अपलोड करें", + "uploadTraffic": "अपलोड ट्रैफिक", "userAgent": "उपयोगकर्ता एजेंट", "userEmail": "उपयोगकर्ता ईमेल", "userEmailPlaceholder": "उपयोगकर्ता ईमेल दर्ज करें", diff --git a/apps/admin/locales/hu-HU/common.json b/apps/admin/locales/hu-HU/common.json index 5eb2c9b..c082d4a 100644 --- a/apps/admin/locales/hu-HU/common.json +++ b/apps/admin/locales/hu-HU/common.json @@ -45,6 +45,7 @@ "60002": "Az előfizetés jelenleg nem használható, kérjük, próbálja meg később újra.", "60003": "Létező előfizetés észlelve. Kérjük, törölje azt a folytatás előtt.", "60004": "Jelenleg nem törölhető, mivel az előfizetésnek aktív felhasználói vannak.", + "60005": "Az egyszeres előfizetési módban túllépték a felhasználói limitet", "70001": "A megerősítő kód hibás, kérjük, írja be újra.", "80001": "A feladat nem került sikeresen a sorba, kérjük, próbálja meg később újra.", "90001": "Kérjük, kapcsolja ki a DEBUG módot, majd próbálja újra.", diff --git a/apps/admin/locales/hu-HU/user.json b/apps/admin/locales/hu-HU/user.json index 81357b4..0ce5369 100644 --- a/apps/admin/locales/hu-HU/user.json +++ b/apps/admin/locales/hu-HU/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Fiók engedélyezése", "actions": "műveletek", + "add": "Hozzáadás", + "administrator": "Rendszergazda", "areaCode": "Körzetszám", "areaCodePlaceholder": "Körzetszám", "auth": "Hitelesítés", "authIdentifier": "Hitelesítési azonosító", "authIdentifierPlaceholder": "Adja meg az azonosítót", + "authMethodsTitle": "Hitelesítési beállítások", "authType": "Hitelesítési típus", "authUser": "Hitelesített felhasználó", + "avatar": "Avatar", "balance": "Egyenleg", + "balanceNotifications": "Egyenlegváltozás Értesítések", "balancePlaceholder": "Egyenleg", + "basicInfoTitle": "Alapvető információk", "cancel": "Mégse", "commission": "Jutalék", "commissionPlaceholder": "Adja meg a jutalékot", "confirm": "Megerősítés", "confirmDelete": "Biztosan törölni szeretné?", + "confirmOffline": "Megerősítés offline", "create": "Létrehozás", + "createSubscription": "Előfizetés létrehozása", "createSuccess": "Sikeres létrehozás", "createUser": "Felhasználó létrehozása", "createdAt": "Regisztráció ideje", "delete": "törlés", "deleteDescription": "A törlés után az adatok nem állíthatók vissza, kérjük, járjon el körültekintően.", + "deleteSubscriptionDescription": "Biztosan törölni szeretné ezt az előfizetést?", "deleteSuccess": "Sikeres törlés", "detail": "Részlet", + "deviceLimit": "Eszközkorlát", + "download": "Letöltés", + "downloadTraffic": "Forgalmi adatok letöltése", "edit": "szerkesztés", + "editSubscription": "Előfizetés szerkesztése", "editUser": "Felhasználó szerkesztése", "email": "e-mail", + "emailNotifications": "Email értesítések", "enable": "Engedélyezés", + "expireTime": "Lejárati idő", + "expiredAt": "Lejárati dátum", + "failed": "Sikertelen", "giftAmount": "Ajándék Összeg", "giftAmountPlaceholder": "Adja meg az ajándék összegét", "invalidEmailFormat": "Érvénytelen e-mail formátum", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Adja meg a meghívó kódot (hagyja üresen a generáláshoz)", "loading": "Betöltés...", "loginIp": "Bejelentkezési IP", + "loginNotifications": "Bejelentkezési értesítések", + "loginStatus": "Bejelentkezési állapot", "loginTime": "Bejelentkezési idő", "manager": "Menedzser", + "notifySettingsTitle": "Értesítési beállítások", + "onlineDevices": "Online eszközök", "password": "Jelszó", "passwordPlaceholder": "Adjon meg új jelszót (opcionális)", + "permanent": "Állandó", + "pleaseEnterEmail": "Kérjük, adja meg az e-mail címet", "referer": "Ajánló", "refererId": "Hivatkozó azonosító", "refererIdPlaceholder": "Adja meg az ajánló azonosítóját", + "referralCode": "Ajánlókód", + "referrerUserId": "Ajánló (Felhasználói azonosító)", + "remove": "Eltávolítás", + "resetTime": "Visszaállítási idő", + "save": "Mentés", "searchIp": "IP-cím keresése", "selectAuthType": "Válassza ki az azonosítás típusát", + "speedLimit": "Sebességhatár", + "subscription": "Előfizetés", + "subscriptionDetails": "Előfizetési részletek", + "subscriptionList": "Előfizetési lista", + "subscriptionLogs": "Előfizetési naplók", + "subscriptionName": "Előfizetés neve", + "subscriptionNotifications": "Előfizetési értesítések", + "success": "Siker", + "telegramNotifications": "Telegram értesítések", "telephone": "Telefonszám", "telephonePlaceholder": "Adja meg a telefonszámot", + "totalTraffic": "Összes forgalom", + "tradeNotifications": "Kereskedelmi értesítések", + "trafficLimit": "Forgalmi korlát", + "trafficLogs": "Forgalmi naplók", + "unlimited": "Korlátlan", + "unverified": "Nem ellenőrzött", + "update": "Frissítés", "updateSuccess": "Sikeres frissítés", + "upload": "Feltöltés", + "uploadTraffic": "Forgalom feltöltése", "userAgent": "Felhasználói ügynök", "userEmail": "Felhasználó e-mail", "userEmailPlaceholder": "Adja meg a felhasználó e-mail címét", diff --git a/apps/admin/locales/ja-JP/common.json b/apps/admin/locales/ja-JP/common.json index c5b00ed..24aabdb 100644 --- a/apps/admin/locales/ja-JP/common.json +++ b/apps/admin/locales/ja-JP/common.json @@ -45,6 +45,7 @@ "60002": "このサブスクリプションは現在使用できません。しばらくしてから再試行してください。", "60003": "既存のサブスクリプションが検出されました。続行する前にキャンセルしてください。", "60004": "サブスクリプションにアクティブなユーザーがいるため、現在削除できません。", + "60005": "シングルサブスクリプションモードでは、ユーザー制限を超えました", "70001": "認証コードが間違っています。再入力してください。", "80001": "タスクがキューに正常に追加されませんでした。しばらくしてから再試行してください。", "90001": "DEBUGモードをオフにしてから再試行してください。", diff --git a/apps/admin/locales/ja-JP/user.json b/apps/admin/locales/ja-JP/user.json index 8b1d151..7cf82c8 100644 --- a/apps/admin/locales/ja-JP/user.json +++ b/apps/admin/locales/ja-JP/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "アカウント有効化", "actions": "アクション", + "add": "追加", + "administrator": "管理者", "areaCode": "市外局番", "areaCodePlaceholder": "市外局番", "auth": "認証", "authIdentifier": "認証識別子", "authIdentifierPlaceholder": "認証IDを入力してください", + "authMethodsTitle": "認証設定", "authType": "認証タイプ", "authUser": "認証ユーザー", + "avatar": "アバター", "balance": "残高", + "balanceNotifications": "残高変更通知", "balancePlaceholder": "残高", + "basicInfoTitle": "基本情報", "cancel": "キャンセル", "commission": "手数料", "commissionPlaceholder": "手数料を入力してください", "confirm": "確認", "confirmDelete": "削除してもよろしいですか?", + "confirmOffline": "オフラインを確認", "create": "作成", + "createSubscription": "サブスクリプションを作成", "createSuccess": "作成成功", "createUser": "ユーザーを作成", "createdAt": "登録日時", "delete": "削除", "deleteDescription": "削除後はデータを復元できませんので、慎重に操作してください。", + "deleteSubscriptionDescription": "このサブスクリプションを削除してもよろしいですか?", "deleteSuccess": "削除に成功しました", "detail": "詳細", + "deviceLimit": "デバイス制限", + "download": "ダウンロード", + "downloadTraffic": "ダウンロードトラフィック", "edit": "編集", + "editSubscription": "サブスクリプションを編集", "editUser": "ユーザー編集", "email": "メールアドレス", + "emailNotifications": "メール通知", "enable": "有効", + "expireTime": "有効期限", + "expiredAt": "有効期限", + "failed": "失敗しました", "giftAmount": "ギフト金額", "giftAmountPlaceholder": "ギフト金額を入力してください", "invalidEmailFormat": "無効なメール形式です", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "招待コードを入力してください(生成するには空白のままにしてください)", "loading": "読み込み中...", "loginIp": "ログインIP", + "loginNotifications": "ログイン通知", + "loginStatus": "ログイン状況", "loginTime": "ログイン時間", "manager": "マネージャー", + "notifySettingsTitle": "通知設定", + "onlineDevices": "オンラインデバイス", "password": "パスワード", "passwordPlaceholder": "新しいパスワードを入力してください(任意)", + "permanent": "永久", + "pleaseEnterEmail": "メールアドレスを入力してください", "referer": "推薦者", "refererId": "リファラーID", "refererIdPlaceholder": "紹介者IDを入力してください", + "referralCode": "紹介コード", + "referrerUserId": "紹介者(ユーザーID)", + "remove": "削除", + "resetTime": "リセット時間", + "save": "保存", "searchIp": "IPアドレスを検索", "selectAuthType": "認証タイプを選択", + "speedLimit": "速度制限", + "subscription": "サブスクリプション", + "subscriptionDetails": "サブスクリプションの詳細", + "subscriptionList": "購読リスト", + "subscriptionLogs": "サブスクリプションログ", + "subscriptionName": "サブスクリプション名", + "subscriptionNotifications": "サブスクリプション通知", + "success": "成功", + "telegramNotifications": "Telegram通知", "telephone": "電話番号", "telephonePlaceholder": "電話番号を入力してください", + "totalTraffic": "総トラフィック", + "tradeNotifications": "取引通知", + "trafficLimit": "トラフィック制限", + "trafficLogs": "トラフィックログ", + "unlimited": "無制限", + "unverified": "未確認", + "update": "更新", "updateSuccess": "更新が成功しました", + "upload": "アップロード", + "uploadTraffic": "アップロードトラフィック", "userAgent": "ユーザーエージェント", "userEmail": "ユーザーのメール", "userEmailPlaceholder": "ユーザーのメールアドレスを入力してください", diff --git a/apps/admin/locales/ko-KR/common.json b/apps/admin/locales/ko-KR/common.json index 07390f9..ff51bd2 100644 --- a/apps/admin/locales/ko-KR/common.json +++ b/apps/admin/locales/ko-KR/common.json @@ -45,6 +45,7 @@ "60002": "현재 구독을 사용할 수 없습니다. 잠시 후 다시 시도해 주세요.", "60003": "기존 구독이 감지되었습니다. 계속하기 전에 취소해 주세요.", "60004": "구독에 활성 사용자가 있어 현재 삭제할 수 없습니다.", + "60005": "단일 구독 모드가 사용자 한도를 초과했습니다", "70001": "인증 코드가 잘못되었습니다. 다시 입력해 주세요.", "80001": "작업이 큐에 성공적으로 추가되지 않았습니다. 잠시 후 다시 시도해 주세요.", "90001": "DEBUG 모드를 끈 후 다시 시도해 주세요.", diff --git a/apps/admin/locales/ko-KR/user.json b/apps/admin/locales/ko-KR/user.json index d99c1a2..8e35176 100644 --- a/apps/admin/locales/ko-KR/user.json +++ b/apps/admin/locales/ko-KR/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "계정 활성화", "actions": "작업", + "add": "추가", + "administrator": "관리자", "areaCode": "지역 코드", "areaCodePlaceholder": "지역 코드", "auth": "인증", "authIdentifier": "인증 식별자", "authIdentifierPlaceholder": "인증 식별자를 입력하세요", + "authMethodsTitle": "인증 설정", "authType": "인증 유형", "authUser": "인증 사용자", + "avatar": "아바타", "balance": "잔액", + "balanceNotifications": "잔액 변경 알림", "balancePlaceholder": "잔액", + "basicInfoTitle": "기본 정보", "cancel": "취소", "commission": "커미션", "commissionPlaceholder": "수수료 입력", "confirm": "확인", "confirmDelete": "삭제하시겠습니까?", + "confirmOffline": "오프라인 확인", "create": "생성", + "createSubscription": "구독 생성", "createSuccess": "생성 성공", "createUser": "사용자 생성", "createdAt": "가입 시간", "delete": "삭제", "deleteDescription": "삭제 후 데이터는 복구할 수 없으니 신중하게 진행하세요.", + "deleteSubscriptionDescription": "이 구독을 삭제하시겠습니까?", "deleteSuccess": "삭제 성공", "detail": "세부사항", + "deviceLimit": "기기 제한", + "download": "다운로드", + "downloadTraffic": "트래픽 다운로드", "edit": "편집", + "editSubscription": "구독 수정", "editUser": "사용자 편집", "email": "이메일", + "emailNotifications": "이메일 알림", "enable": "사용", + "expireTime": "만료 시간", + "expiredAt": "만료일", + "failed": "실패", "giftAmount": "선물 금액", "giftAmountPlaceholder": "선물 금액 입력", "invalidEmailFormat": "잘못된 이메일 형식입니다", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "초대 코드를 입력하세요 (생성을 원하시면 비워두세요)", "loading": "로딩 중...", "loginIp": "로그인 IP", + "loginNotifications": "로그인 알림", + "loginStatus": "로그인 상태", "loginTime": "로그인 시간", "manager": "매니저", + "notifySettingsTitle": "알림 설정", + "onlineDevices": "온라인 기기", "password": "비밀번호", "passwordPlaceholder": "새 비밀번호 입력 (선택 사항)", + "permanent": "영구적인", + "pleaseEnterEmail": "이메일을 입력하세요", "referer": "추천인", "refererId": "추천인 ID", "refererIdPlaceholder": "추천인 ID를 입력하세요", + "referralCode": "추천 코드", + "referrerUserId": "추천인 (사용자 ID)", + "remove": "제거", + "resetTime": "재설정 시간", + "save": "저장", "searchIp": "IP 주소 검색", "selectAuthType": "인증 유형 선택", + "speedLimit": "속도 제한", + "subscription": "구독", + "subscriptionDetails": "구독 세부 정보", + "subscriptionList": "구독 목록", + "subscriptionLogs": "구독 로그", + "subscriptionName": "구독 이름", + "subscriptionNotifications": "구독 알림", + "success": "성공", + "telegramNotifications": "텔레그램 알림", "telephone": "전화번호", "telephonePlaceholder": "전화번호 입력", + "totalTraffic": "총 트래픽", + "tradeNotifications": "거래 알림", + "trafficLimit": "트래픽 제한", + "trafficLogs": "트래픽 로그", + "unlimited": "무제한", + "unverified": "확인되지 않음", + "update": "업데이트", "updateSuccess": "업데이트 성공", + "upload": "업로드", + "uploadTraffic": "업로드 트래픽", "userAgent": "사용자 에이전트", "userEmail": "사용자 이메일", "userEmailPlaceholder": "사용자 이메일 입력", diff --git a/apps/admin/locales/no-NO/common.json b/apps/admin/locales/no-NO/common.json index 40f2920..664fe1b 100644 --- a/apps/admin/locales/no-NO/common.json +++ b/apps/admin/locales/no-NO/common.json @@ -45,6 +45,7 @@ "60002": "Kan for øyeblikket ikke bruke abonnementet, vennligst prøv igjen senere.", "60003": "Et eksisterende abonnement er oppdaget. Vennligst avbryt det før du fortsetter.", "60004": "Kan ikke slettes for øyeblikket da abonnementet har aktive brukere.", + "60005": "Enkel abonnementsmodus har overskredet brukergrensen", "70001": "Verifikasjonskoden er feil, vennligst skriv den inn på nytt.", "80001": "Oppgaven ble ikke vellykket lagt til i køen, vennligst prøv igjen senere.", "90001": "Vennligst deaktiver DEBUG-modus og prøv igjen.", diff --git a/apps/admin/locales/no-NO/user.json b/apps/admin/locales/no-NO/user.json index bc615eb..0325b99 100644 --- a/apps/admin/locales/no-NO/user.json +++ b/apps/admin/locales/no-NO/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Aktiver konto", "actions": "handlinger", + "add": "Legg til", + "administrator": "Administrator", "areaCode": "Retningsnummer", "areaCodePlaceholder": "Retningsnummer", "auth": "Autentisering", "authIdentifier": "Autentiseringsidentifikator", "authIdentifierPlaceholder": "Skriv inn autentiseringsidentifikator", + "authMethodsTitle": "Autentiseringsinnstillinger", "authType": "Autentiseringstype", "authUser": "Autentisert Bruker", + "avatar": "Avatar", "balance": "Balanse", + "balanceNotifications": "Varsler om saldoendringer", "balancePlaceholder": "Balanse", + "basicInfoTitle": "Grunnleggende Informasjon", "cancel": "Avbryt", "commission": "Kommisjon", "commissionPlaceholder": "Skriv inn provisjon", "confirm": "bekreft", "confirmDelete": "Er du sikker på at du vil slette?", + "confirmOffline": "Bekreft frakoblet", "create": "opprett", + "createSubscription": "Opprett abonnement", "createSuccess": "Opprettelse vellykket", "createUser": "Opprett bruker", "createdAt": "Registreringstidspunkt", "delete": "slett", "deleteDescription": "Data kan ikke gjenopprettes etter sletting, vær forsiktig.", + "deleteSubscriptionDescription": "Er du sikker på at du vil slette dette abonnementet?", "deleteSuccess": "Sletting vellykket", "detail": "Detalj", + "deviceLimit": "Enhetsgrense", + "download": "Last ned", + "downloadTraffic": "Last ned trafikk", "edit": "rediger", + "editSubscription": "Rediger abonnement", "editUser": "Rediger bruker", "email": "e-post", + "emailNotifications": "E-postvarsler", "enable": "Aktiver", + "expireTime": "Utløpstid", + "expiredAt": "Utløpt Dato", + "failed": "Mislyktes", "giftAmount": "Gavebeløp", "giftAmountPlaceholder": "Skriv inn gavebeløp", "invalidEmailFormat": "Ugyldig e-postformat", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Skriv inn invitasjonskode (la stå tom for å generere)", "loading": "Laster inn...", "loginIp": "Innloggings-IP", + "loginNotifications": "Påloggingsvarsler", + "loginStatus": "Innloggingsstatus", "loginTime": "Innloggingstid", "manager": "Leder", + "notifySettingsTitle": "Varslingsinnstillinger", + "onlineDevices": "Tilkoblede enheter", "password": "Passord", "passwordPlaceholder": "Skriv inn nytt passord (valgfritt)", + "permanent": "Permanent", + "pleaseEnterEmail": "Vennligst skriv inn e-post", "referer": "Henviser", "refererId": "Henvisnings-ID", "refererIdPlaceholder": "Skriv inn referanse-ID", + "referralCode": "Henvisningskode", + "referrerUserId": "Henviser (Bruker-ID)", + "remove": "Fjern", + "resetTime": "Tilbakestill tid", + "save": "Lagre", "searchIp": "Søk IP-adresse", "selectAuthType": "Velg autentiseringstype", + "speedLimit": "Fartsgrense", + "subscription": "Abonnement", + "subscriptionDetails": "Abonnementsdetaljer", + "subscriptionList": "Abonnementsliste", + "subscriptionLogs": "Abonnementslogger", + "subscriptionName": "Abonnementsnavn", + "subscriptionNotifications": "Abonnementsvarsler", + "success": "Suksess", + "telegramNotifications": "Telegramvarsler", "telephone": "Telefonnummer", "telephonePlaceholder": "Skriv inn telefonnummer", + "totalTraffic": "Total trafikk", + "tradeNotifications": "Handelsvarsler", + "trafficLimit": "Trafikkgrense", + "trafficLogs": "Trafikklogger", + "unlimited": "Ubegrenset", + "unverified": "Ubekreftet", + "update": "Oppdater", "updateSuccess": "Oppdatering vellykket", + "upload": "Last opp", + "uploadTraffic": "Last opp trafikk", "userAgent": "Brukeragent", "userEmail": "Brukerens e-post", "userEmailPlaceholder": "Skriv inn brukers e-post", diff --git a/apps/admin/locales/pl-PL/common.json b/apps/admin/locales/pl-PL/common.json index 6187fe7..1005104 100644 --- a/apps/admin/locales/pl-PL/common.json +++ b/apps/admin/locales/pl-PL/common.json @@ -45,6 +45,7 @@ "60002": "Nie można tymczasowo użyć tej subskrypcji, spróbuj ponownie później.", "60003": "Wykryto istniejącą subskrypcję. Proszę ją anulować przed kontynuacją.", "60004": "Nie można usunąć w tej chwili, ponieważ subskrypcja ma aktywnych użytkowników.", + "60005": "Tryb pojedynczej subskrypcji przekroczył limit użytkowników", "70001": "Kod weryfikacyjny jest nieprawidłowy, wprowadź ponownie.", "80001": "Zadanie nie zostało pomyślnie dodane do kolejki, spróbuj ponownie później.", "90001": "Wyłącz tryb DEBUG i spróbuj ponownie.", diff --git a/apps/admin/locales/pl-PL/user.json b/apps/admin/locales/pl-PL/user.json index d107684..5b8c6d9 100644 --- a/apps/admin/locales/pl-PL/user.json +++ b/apps/admin/locales/pl-PL/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Aktywacja konta", "actions": "działania", + "add": "Dodaj", + "administrator": "Administrator", "areaCode": "Kod obszaru", "areaCodePlaceholder": "Kod obszaru", "auth": "Autoryzacja", "authIdentifier": "Identyfikator uwierzytelniania", "authIdentifierPlaceholder": "Wprowadź identyfikator uwierzytelniający", + "authMethodsTitle": "Ustawienia uwierzytelniania", "authType": "Typ uwierzytelniania", "authUser": "Użytkownik uwierzytelniony", + "avatar": "Awatar", "balance": "saldo", + "balanceNotifications": "Powiadomienia o zmianie salda", "balancePlaceholder": "Saldo", + "basicInfoTitle": "Podstawowe informacje", "cancel": "Anuluj", "commission": "Prowizja", "commissionPlaceholder": "Wprowadź prowizję", "confirm": "Potwierdź", "confirmDelete": "Czy na pewno chcesz usunąć?", + "confirmOffline": "Potwierdź tryb offline", "create": "Utwórz", + "createSubscription": "Utwórz subskrypcję", "createSuccess": "Utworzono pomyślnie", "createUser": "Utwórz użytkownika", "createdAt": "Czas rejestracji", "delete": "usuń", "deleteDescription": "Po usunięciu danych nie można ich odzyskać, prosimy o ostrożność.", + "deleteSubscriptionDescription": "Czy na pewno chcesz usunąć tę subskrypcję?", "deleteSuccess": "Usunięto pomyślnie", "detail": "Szczegóły", + "deviceLimit": "Limit urządzeń", + "download": "Pobierz", + "downloadTraffic": "Pobierz Ruch", "edit": "edytuj", + "editSubscription": "Edytuj subskrypcję", "editUser": "Edytuj użytkownika", "email": "e-mail", + "emailNotifications": "Powiadomienia e-mailowe", "enable": "Włącz", + "expireTime": "Czas wygaśnięcia", + "expiredAt": "Data wygaśnięcia", + "failed": "Niepowodzenie", "giftAmount": "Kwota Prezentu", "giftAmountPlaceholder": "Wprowadź kwotę prezentu", "invalidEmailFormat": "Nieprawidłowy format adresu e-mail", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Wprowadź kod zaproszenia (pozostaw puste, aby wygenerować)", "loading": "Ładowanie...", "loginIp": "IP logowania", + "loginNotifications": "Powiadomienia o logowaniu", + "loginStatus": "Status logowania", "loginTime": "Czas logowania", "manager": "Menedżer", + "notifySettingsTitle": "Ustawienia powiadomień", + "onlineDevices": "Urządzenia online", "password": "Hasło", "passwordPlaceholder": "Wprowadź nowe hasło (opcjonalnie)", + "permanent": "Stały", + "pleaseEnterEmail": "Proszę wprowadzić adres e-mail", "referer": "Polecający", "refererId": "Identyfikator polecającego", "refererIdPlaceholder": "Wprowadź identyfikator polecającego", + "referralCode": "Kod polecający", + "referrerUserId": "Polecający (ID użytkownika)", + "remove": "Usuń", + "resetTime": "Zresetuj czas", + "save": "Zapisz", "searchIp": "Wyszukaj adres IP", "selectAuthType": "Wybierz typ uwierzytelniania", + "speedLimit": "Ograniczenie prędkości", + "subscription": "Subskrypcja", + "subscriptionDetails": "Szczegóły subskrypcji", + "subscriptionList": "Lista subskrypcji", + "subscriptionLogs": "Dzienniki subskrypcji", + "subscriptionName": "Nazwa subskrypcji", + "subscriptionNotifications": "Powiadomienia o subskrypcji", + "success": "Sukces", + "telegramNotifications": "Powiadomienia Telegram", "telephone": "Numer telefonu", "telephonePlaceholder": "Wprowadź numer telefonu", + "totalTraffic": "Całkowity Ruch", + "tradeNotifications": "Powiadomienia o transakcjach", + "trafficLimit": "Limit ruchu", + "trafficLogs": "Dzienniki Ruchu", + "unlimited": "Nieograniczony", + "unverified": "Niezweryfikowane", + "update": "Aktualizuj", "updateSuccess": "Aktualizacja zakończona pomyślnie", + "upload": "Prześlij", + "uploadTraffic": "Przesyłanie Ruchu", "userAgent": "Agent użytkownika", "userEmail": "Email użytkownika", "userEmailPlaceholder": "Wprowadź adres e-mail użytkownika", diff --git a/apps/admin/locales/pt-BR/common.json b/apps/admin/locales/pt-BR/common.json index a4558e0..de1accd 100644 --- a/apps/admin/locales/pt-BR/common.json +++ b/apps/admin/locales/pt-BR/common.json @@ -45,6 +45,7 @@ "60002": "Não é possível usar a assinatura no momento, por favor, tente novamente mais tarde.", "60003": "Uma assinatura existente foi detectada. Cancele-a antes de prosseguir.", "60004": "Não é possível excluir no momento, pois a assinatura possui usuários ativos.", + "60005": "O modo de assinatura única excedeu o limite de usuários", "70001": "Código de verificação incorreto, por favor, digite novamente.", "80001": "A tarefa não foi adicionada à fila com sucesso, por favor, tente novamente mais tarde.", "90001": "Por favor, desative o modo DEBUG e tente novamente.", diff --git a/apps/admin/locales/pt-BR/user.json b/apps/admin/locales/pt-BR/user.json index 9a2bb5b..923cb88 100644 --- a/apps/admin/locales/pt-BR/user.json +++ b/apps/admin/locales/pt-BR/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Habilitar Conta", "actions": "ações", + "add": "Adicionar", + "administrator": "Administrador", "areaCode": "Código de Área", "areaCodePlaceholder": "Código de área", "auth": "Autenticação", "authIdentifier": "Identificador de Autenticação", "authIdentifierPlaceholder": "Digite o identificador de autenticação", + "authMethodsTitle": "Configurações de Autenticação", "authType": "Tipo de Autenticação", "authUser": "Usuário Autenticado", + "avatar": "Avatar", "balance": "Saldo", + "balanceNotifications": "Notificações de Alteração de Saldo", "balancePlaceholder": "Saldo", + "basicInfoTitle": "Informações Básicas", "cancel": "Cancelar", "commission": "Comissão", "commissionPlaceholder": "Insira a comissão", "confirm": "confirmar", "confirmDelete": "Você tem certeza de que deseja excluir?", + "confirmOffline": "Confirmar Offline", "create": "Criar", + "createSubscription": "Criar Assinatura", "createSuccess": "Criação bem-sucedida", "createUser": "Criar Usuário", "createdAt": "Data de Registro", "delete": "Excluir", "deleteDescription": "Após a exclusão, os dados não poderão ser recuperados. Proceda com cautela.", + "deleteSubscriptionDescription": "Tem certeza de que deseja excluir esta assinatura?", "deleteSuccess": "Exclusão bem-sucedida", "detail": "Detalhe", + "deviceLimit": "Limite de Dispositivos", + "download": "Baixar", + "downloadTraffic": "Baixar Tráfego", "edit": "editar", + "editSubscription": "Editar Assinatura", "editUser": "Editar Usuário", "email": "e-mail", + "emailNotifications": "Notificações por Email", "enable": "Habilitar", + "expireTime": "Tempo de Expiração", + "expiredAt": "Expirado Em", + "failed": "Falhou", "giftAmount": "Valor do Presente", "giftAmountPlaceholder": "Insira o valor do presente", "invalidEmailFormat": "Formato de e-mail inválido", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Digite o código de convite (deixe em branco para gerar)", "loading": "Carregando...", "loginIp": "IP de Login", + "loginNotifications": "Notificações de Login", + "loginStatus": "Status de Login", "loginTime": "Hora de Login", "manager": "Gerente", + "notifySettingsTitle": "Configurações de Notificação", + "onlineDevices": "Dispositivos Online", "password": "Senha", "passwordPlaceholder": "Digite a nova senha (opcional)", + "permanent": "Permanente", + "pleaseEnterEmail": "Por favor, insira o e-mail", "referer": "Referente", "refererId": "ID do Referente", "refererIdPlaceholder": "Digite o ID do referenciador", + "referralCode": "Código de Indicação", + "referrerUserId": "Referente (ID do Usuário)", + "remove": "Remover", + "resetTime": "Redefinir Tempo", + "save": "Salvar", "searchIp": "Pesquisar endereço IP", "selectAuthType": "Selecione o tipo de autenticação", + "speedLimit": "Limite de Velocidade", + "subscription": "Assinatura", + "subscriptionDetails": "Detalhes da Assinatura", + "subscriptionList": "Lista de Assinaturas", + "subscriptionLogs": "Registros de Assinatura", + "subscriptionName": "Nome da Assinatura", + "subscriptionNotifications": "Notificações de Assinatura", + "success": "Sucesso", + "telegramNotifications": "Notificações do Telegram", "telephone": "Número de Telefone", "telephonePlaceholder": "Digite o número de telefone", + "totalTraffic": "Tráfego Total", + "tradeNotifications": "Notificações de Comércio", + "trafficLimit": "Limite de Tráfego", + "trafficLogs": "Registros de Tráfego", + "unlimited": "Ilimitado", + "unverified": "Não verificado", + "update": "Atualizar", "updateSuccess": "Atualização bem-sucedida", + "upload": "Enviar", + "uploadTraffic": "Carregar Tráfego", "userAgent": "Agente do Usuário", "userEmail": "E-mail do Usuário", "userEmailPlaceholder": "Digite o e-mail do usuário", diff --git a/apps/admin/locales/ro-RO/common.json b/apps/admin/locales/ro-RO/common.json index a6cc7fc..9b9f372 100644 --- a/apps/admin/locales/ro-RO/common.json +++ b/apps/admin/locales/ro-RO/common.json @@ -45,6 +45,7 @@ "60002": "Nu se poate utiliza momentan acest abonament, vă rugăm să încercați din nou mai târziu.", "60003": "A fost detectat un abonament existent. Vă rugăm să-l anulați înainte de a continua.", "60004": "Nu se poate șterge în acest moment, deoarece abonamentul are utilizatori activi.", + "60005": "Modul de abonament unic a depășit limita de utilizatori", "70001": "Codul de verificare este incorect, vă rugăm să îl introduceți din nou.", "80001": "Sarcina nu a fost adăugată cu succes în coadă, vă rugăm să încercați din nou mai târziu.", "90001": "Vă rugăm să dezactivați modul DEBUG și să încercați din nou.", diff --git a/apps/admin/locales/ro-RO/user.json b/apps/admin/locales/ro-RO/user.json index 330cf7f..3bab5f0 100644 --- a/apps/admin/locales/ro-RO/user.json +++ b/apps/admin/locales/ro-RO/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Activare Cont", "actions": "acțiuni", + "add": "Adaugă", + "administrator": "Administrator", "areaCode": "Prefix telefonic", "areaCodePlaceholder": "Prefix telefonic", "auth": "Autentificare", "authIdentifier": "Identificator de autentificare", "authIdentifierPlaceholder": "Introduceți identificatorul de autentificare", + "authMethodsTitle": "Setări de Autentificare", "authType": "Tip de autentificare", "authUser": "Utilizator Autentificat", + "avatar": "Avatar", "balance": "Sold", + "balanceNotifications": "Notificări de Schimbare a Soldului", "balancePlaceholder": "Sold", + "basicInfoTitle": "Informații de bază", "cancel": "Anulare", "commission": "Comision", "commissionPlaceholder": "Introduceți comisionul", "confirm": "Confirmare", "confirmDelete": "Sunteți sigur că doriți să ștergeți?", + "confirmOffline": "Confirmare Offline", "create": "crea", + "createSubscription": "Creează Abonament", "createSuccess": "Creat cu succes", "createUser": "Creează utilizator", "createdAt": "Data înregistrării", "delete": "șterge", "deleteDescription": "După ștergere, datele nu pot fi recuperate, vă rugăm să acționați cu prudență.", + "deleteSubscriptionDescription": "Sigur doriți să ștergeți acest abonament?", "deleteSuccess": "Ștergere reușită", "detail": "Detaliu", + "deviceLimit": "Limită dispozitiv", + "download": "Descarcă", + "downloadTraffic": "Descărcare Trafic", "edit": "editează", + "editSubscription": "Editează Abonamentul", "editUser": "Editare utilizator", "email": "e-mail", + "emailNotifications": "Notificări prin email", "enable": "Activare", + "expireTime": "Timp de expirare", + "expiredAt": "Expiră la", + "failed": "Eșuat", "giftAmount": "Sumă Cadou", "giftAmountPlaceholder": "Introduceți suma cadoului", "invalidEmailFormat": "Format de email invalid", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Introduceți codul de invitație (lăsați necompletat pentru a genera)", "loading": "Se încarcă...", "loginIp": "IP de autentificare", + "loginNotifications": "Notificări de autentificare", + "loginStatus": "Stare autentificare", "loginTime": "Ora de autentificare", "manager": "Manager", + "notifySettingsTitle": "Setări notificări", + "onlineDevices": "Dispozitive Online", "password": "Parolă", "passwordPlaceholder": "Introduceți o parolă nouă (opțional)", + "permanent": "Permanent", + "pleaseEnterEmail": "Vă rugăm să introduceți adresa de email", "referer": "Referent", "refererId": "ID Referent", "refererIdPlaceholder": "Introduceți ID-ul referentului", + "referralCode": "Cod de recomandare", + "referrerUserId": "Referent (ID Utilizator)", + "remove": "Elimină", + "resetTime": "Resetează Timpul", + "save": "Salvează", "searchIp": "Caută adresa IP", "selectAuthType": "Selectați tipul de autentificare", + "speedLimit": "Limită de viteză", + "subscription": "Abonament", + "subscriptionDetails": "Detalii abonament", + "subscriptionList": "Listă de abonamente", + "subscriptionLogs": "Jurnale de abonament", + "subscriptionName": "Numele Abonamentului", + "subscriptionNotifications": "Notificări de abonament", + "success": "Succes", + "telegramNotifications": "Notificări Telegram", "telephone": "Număr de telefon", "telephonePlaceholder": "Introduceți numărul de telefon", + "totalTraffic": "Trafic Total", + "tradeNotifications": "Notificări de tranzacționare", + "trafficLimit": "Limită de trafic", + "trafficLogs": "Jurnale de trafic", + "unlimited": "Nelimitat", + "unverified": "Neverificat", + "update": "Actualizare", "updateSuccess": "Actualizare reușită", + "upload": "Încărcare", + "uploadTraffic": "Încărcare Trafic", "userAgent": "Agent Utilizator", "userEmail": "Email utilizator", "userEmailPlaceholder": "Introduceți emailul utilizatorului", diff --git a/apps/admin/locales/ru-RU/common.json b/apps/admin/locales/ru-RU/common.json index 3e24b7a..4311d04 100644 --- a/apps/admin/locales/ru-RU/common.json +++ b/apps/admin/locales/ru-RU/common.json @@ -45,6 +45,7 @@ "60002": "Подписка временно недоступна, пожалуйста, попробуйте позже.", "60003": "Обнаружена существующая подписка. Пожалуйста, отмените ее перед продолжением.", "60004": "Невозможно удалить в данный момент, так как у подписки есть активные пользователи.", + "60005": "Режим одиночной подписки превысил лимит пользователей.", "70001": "Код подтверждения неверен, пожалуйста, введите его снова.", "80001": "Задача не была успешно добавлена в очередь, пожалуйста, попробуйте позже.", "90001": "Пожалуйста, отключите режим DEBUG и попробуйте снова.", diff --git a/apps/admin/locales/ru-RU/user.json b/apps/admin/locales/ru-RU/user.json index 7b2bd47..520a631 100644 --- a/apps/admin/locales/ru-RU/user.json +++ b/apps/admin/locales/ru-RU/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Включение аккаунта", "actions": "действия", + "add": "Добавить", + "administrator": "Администратор", "areaCode": "Код региона", "areaCodePlaceholder": "Код региона", "auth": "Авторизация", "authIdentifier": "Идентификатор аутентификации", "authIdentifierPlaceholder": "Введите идентификатор аутентификации", + "authMethodsTitle": "Настройки аутентификации", "authType": "Тип аутентификации", "authUser": "Авторизованный пользователь", + "avatar": "Аватар", "balance": "Баланс", + "balanceNotifications": "Уведомления об изменении баланса", "balancePlaceholder": "Баланс", + "basicInfoTitle": "Основная информация", "cancel": "Отмена", "commission": "Комиссия", "commissionPlaceholder": "Введите комиссию", "confirm": "Подтвердить", "confirmDelete": "Вы уверены, что хотите удалить?", + "confirmOffline": "Подтвердить офлайн", "create": "Создать", + "createSubscription": "Создать подписку", "createSuccess": "Создание успешно", "createUser": "Создать пользователя", "createdAt": "Время регистрации", "delete": "Удалить", "deleteDescription": "После удаления данные не могут быть восстановлены, пожалуйста, действуйте осторожно.", + "deleteSubscriptionDescription": "Вы уверены, что хотите удалить эту подписку?", "deleteSuccess": "Удаление успешно", "detail": "Детали", + "deviceLimit": "Лимит устройств", + "download": "Скачать", + "downloadTraffic": "Скачать трафик", "edit": "редактировать", + "editSubscription": "Редактировать подписку", "editUser": "Редактировать пользователя", "email": "Электронная почта", + "emailNotifications": "Уведомления по электронной почте", "enable": "Включить", + "expireTime": "Время истечения", + "expiredAt": "Срок действия истек", + "failed": "Не удалось", "giftAmount": "Сумма подарка", "giftAmountPlaceholder": "Введите сумму подарка", "invalidEmailFormat": "Неверный формат электронной почты", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Введите код приглашения (оставьте пустым для генерации)", "loading": "Загрузка...", "loginIp": "IP-адрес входа", + "loginNotifications": "Уведомления о входе", + "loginStatus": "Статус входа", "loginTime": "Время входа", "manager": "Менеджер", + "notifySettingsTitle": "Настройки уведомлений", + "onlineDevices": "Подключенные устройства", "password": "Пароль", "passwordPlaceholder": "Введите новый пароль (необязательно)", + "permanent": "Постоянный", + "pleaseEnterEmail": "Пожалуйста, введите адрес электронной почты", "referer": "Реферер", "refererId": "ID реферера", "refererIdPlaceholder": "Введите ID реферера", + "referralCode": "Реферальный код", + "referrerUserId": "Реферер (ID пользователя)", + "remove": "Удалить", + "resetTime": "Сброс времени", + "save": "Сохранить", "searchIp": "Поиск IP-адреса", "selectAuthType": "Выберите тип аутентификации", + "speedLimit": "Ограничение скорости", + "subscription": "Подписка", + "subscriptionDetails": "Детали подписки", + "subscriptionList": "Список подписок", + "subscriptionLogs": "Журналы подписки", + "subscriptionName": "Название подписки", + "subscriptionNotifications": "Уведомления о подписке", + "success": "Успех", + "telegramNotifications": "Уведомления Telegram", "telephone": "Номер телефона", "telephonePlaceholder": "Введите номер телефона", + "totalTraffic": "Общий трафик", + "tradeNotifications": "Уведомления о торговле", + "trafficLimit": "Лимит трафика", + "trafficLogs": "Журналы трафика", + "unlimited": "Неограниченный", + "unverified": "Неподтверждено", + "update": "Обновить", "updateSuccess": "Обновление успешно", + "upload": "Загрузить", + "uploadTraffic": "Загрузка трафика", "userAgent": "Пользовательский агент", "userEmail": "Электронная почта пользователя", "userEmailPlaceholder": "Введите электронную почту пользователя", diff --git a/apps/admin/locales/th-TH/common.json b/apps/admin/locales/th-TH/common.json index 9e36296..d1e7705 100644 --- a/apps/admin/locales/th-TH/common.json +++ b/apps/admin/locales/th-TH/common.json @@ -45,6 +45,7 @@ "60002": "ไม่สามารถใช้การสมัครสมาชิกนี้ได้ในขณะนี้ กรุณาลองใหม่อีกครั้งในภายหลัง", "60003": "ตรวจพบการสมัครสมาชิกที่มีอยู่ กรุณายกเลิกก่อนดำเนินการต่อ", "60004": "ไม่สามารถลบได้ในขณะนี้เนื่องจากการสมัครมีผู้ใช้ที่ใช้งานอยู่", + "60005": "โหมดการสมัครสมาชิกรายเดียวได้เกินขีดจำกัดของผู้ใช้", "70001": "รหัสยืนยันไม่ถูกต้อง กรุณาป้อนใหม่อีกครั้ง", "80001": "งานไม่สำเร็จในการเข้าคิว กรุณาลองใหม่อีกครั้งในภายหลัง", "90001": "กรุณาปิดโหมด DEBUG ก่อนลองใหม่อีกครั้ง", diff --git a/apps/admin/locales/th-TH/user.json b/apps/admin/locales/th-TH/user.json index 7f663fe..1c45d01 100644 --- a/apps/admin/locales/th-TH/user.json +++ b/apps/admin/locales/th-TH/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "เปิดใช้งานบัญชี", "actions": "การดำเนินการ", + "add": "เพิ่ม", + "administrator": "ผู้ดูแลระบบ", "areaCode": "รหัสพื้นที่", "areaCodePlaceholder": "รหัสพื้นที่", "auth": "การยืนยันตัวตน", "authIdentifier": "ตัวระบุการยืนยันตัวตน", "authIdentifierPlaceholder": "กรอกตัวระบุการยืนยันตัวตน", + "authMethodsTitle": "การตั้งค่าการยืนยันตัวตน", "authType": "ประเภทการยืนยันตัวตน", "authUser": "ผู้ใช้ที่ได้รับอนุญาต", + "avatar": "อวตาร", "balance": "ยอดคงเหลือ", + "balanceNotifications": "การแจ้งเตือนการเปลี่ยนแปลงยอดเงิน", "balancePlaceholder": "ยอดคงเหลือ", + "basicInfoTitle": "ข้อมูลพื้นฐาน", "cancel": "ยกเลิก", "commission": "คอมมิชชั่น", "commissionPlaceholder": "กรอกค่าคอมมิชชั่น", "confirm": "ยืนยัน", "confirmDelete": "คุณแน่ใจหรือว่าต้องการลบ?", + "confirmOffline": "ยืนยันออฟไลน์", "create": "สร้าง", + "createSubscription": "สร้างการสมัครสมาชิก", "createSuccess": "สร้างสำเร็จ", "createUser": "สร้างผู้ใช้", "createdAt": "เวลาที่ลงทะเบียน", "delete": "ลบ", "deleteDescription": "หลังจากลบแล้วจะไม่สามารถกู้คืนข้อมูลได้ โปรดดำเนินการด้วยความระมัดระวัง", + "deleteSubscriptionDescription": "คุณแน่ใจหรือไม่ว่าต้องการลบการสมัครสมาชิกนี้?", "deleteSuccess": "ลบสำเร็จ", "detail": "รายละเอียด", + "deviceLimit": "จำกัดอุปกรณ์", + "download": "ดาวน์โหลด", + "downloadTraffic": "ดาวน์โหลดการจราจร", "edit": "แก้ไข", + "editSubscription": "แก้ไขการสมัครสมาชิก", "editUser": "แก้ไขผู้ใช้", "email": "อีเมล", + "emailNotifications": "การแจ้งเตือนทางอีเมล", "enable": "เปิดใช้งาน", + "expireTime": "เวลาหมดอายุ", + "expiredAt": "วันหมดอายุ", + "failed": "ล้มเหลว", "giftAmount": "จำนวนเงินของขวัญ", "giftAmountPlaceholder": "กรอกจำนวนเงินของขวัญ", "invalidEmailFormat": "รูปแบบอีเมลไม่ถูกต้อง", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "กรอกรหัสเชิญ (เว้นว่างไว้เพื่อสร้างใหม่)", "loading": "กำลังโหลด...", "loginIp": "ไอพีที่เข้าสู่ระบบ", + "loginNotifications": "การแจ้งเตือนการเข้าสู่ระบบ", + "loginStatus": "สถานะการเข้าสู่ระบบ", "loginTime": "เวลาเข้าสู่ระบบ", "manager": "ผู้จัดการ", + "notifySettingsTitle": "การตั้งค่าการแจ้งเตือน", + "onlineDevices": "อุปกรณ์ที่ออนไลน์", "password": "รหัสผ่าน", "passwordPlaceholder": "กรุณาใส่รหัสผ่านใหม่ (ไม่บังคับ)", + "permanent": "ถาวร", + "pleaseEnterEmail": "กรุณาใส่อีเมล", "referer": "ผู้แนะนำ", "refererId": "รหัสผู้แนะนำ", "refererIdPlaceholder": "กรอก ID ผู้แนะนำ", + "referralCode": "รหัสแนะนำ", + "referrerUserId": "ผู้อ้างอิง (รหัสผู้ใช้)", + "remove": "ลบ", + "resetTime": "รีเซ็ตเวลา", + "save": "บันทึก", "searchIp": "ค้นหาที่อยู่ IP", "selectAuthType": "เลือกประเภทการยืนยันตัวตน", + "speedLimit": "จำกัดความเร็ว", + "subscription": "การสมัครสมาชิก", + "subscriptionDetails": "รายละเอียดการสมัครสมาชิก", + "subscriptionList": "รายการสมัครสมาชิก", + "subscriptionLogs": "บันทึกการสมัครสมาชิก", + "subscriptionName": "ชื่อการสมัครสมาชิก", + "subscriptionNotifications": "การแจ้งเตือนการสมัครสมาชิก", + "success": "สำเร็จ", + "telegramNotifications": "การแจ้งเตือนทาง Telegram", "telephone": "หมายเลขโทรศัพท์", "telephonePlaceholder": "กรอกหมายเลขโทรศัพท์", + "totalTraffic": "การจราจรทั้งหมด", + "tradeNotifications": "การแจ้งเตือนการซื้อขาย", + "trafficLimit": "ขีดจำกัดการจราจร", + "trafficLogs": "บันทึกการจราจร", + "unlimited": "ไม่จำกัด", + "unverified": "ยังไม่ได้รับการยืนยัน", + "update": "อัปเดต", "updateSuccess": "อัปเดตสำเร็จ", + "upload": "อัปโหลด", + "uploadTraffic": "อัปโหลดทราฟฟิก", "userAgent": "ตัวแทนผู้ใช้", "userEmail": "อีเมลผู้ใช้", "userEmailPlaceholder": "กรอกอีเมลผู้ใช้", diff --git a/apps/admin/locales/tr-TR/common.json b/apps/admin/locales/tr-TR/common.json index 5a645e8..e83d931 100644 --- a/apps/admin/locales/tr-TR/common.json +++ b/apps/admin/locales/tr-TR/common.json @@ -45,6 +45,7 @@ "60002": "Bu abonelik şu anda kullanılamıyor, lütfen daha sonra tekrar deneyin.", "60003": "Mevcut bir abonelik tespit edildi. Lütfen devam etmeden önce iptal edin.", "60004": "Aboneliğin aktif kullanıcıları olduğu için şu anda silinemiyor.", + "60005": "Tek abonelik modu kullanıcı sınırını aştı", "70001": "Doğrulama kodu hatalı, lütfen tekrar girin.", "80001": "Görev kuyruğa başarıyla eklenemedi, lütfen daha sonra tekrar deneyin.", "90001": "Lütfen DEBUG modunu kapatıp tekrar deneyin.", diff --git a/apps/admin/locales/tr-TR/user.json b/apps/admin/locales/tr-TR/user.json index 701336e..b8cafb4 100644 --- a/apps/admin/locales/tr-TR/user.json +++ b/apps/admin/locales/tr-TR/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Hesap Etkinleştir", "actions": "eylemler", + "add": "Ekle", + "administrator": "Yönetici", "areaCode": "Alan Kodu", "areaCodePlaceholder": "Alan kodu", "auth": "Kimlik Doğrulama", "authIdentifier": "Kimlik Doğrulama Tanımlayıcısı", "authIdentifierPlaceholder": "Kimlik doğrulama tanımlayıcısını girin", + "authMethodsTitle": "Kimlik Doğrulama Ayarları", "authType": "Kimlik Doğrulama Türü", "authUser": "Yetkili Kullanıcı", + "avatar": "Avatar", "balance": "Bakiye", + "balanceNotifications": "Bakiye Değişiklik Bildirimleri", "balancePlaceholder": "Bakiye", + "basicInfoTitle": "Temel Bilgiler", "cancel": "İptal", "commission": "Komisyon", "commissionPlaceholder": "Komisyonu girin", "confirm": "Onayla", "confirmDelete": "Silmek istediğinizden emin misiniz?", + "confirmOffline": "Çevrimdışı Onayla", "create": "oluştur", + "createSubscription": "Abonelik Oluştur", "createSuccess": "Başarıyla oluşturuldu", "createUser": "Kullanıcı Oluştur", "createdAt": "Kayıt Tarihi", "delete": "sil", "deleteDescription": "Silindikten sonra veriler kurtarılamaz, lütfen dikkatli olun.", + "deleteSubscriptionDescription": "Bu aboneliği silmek istediğinizden emin misiniz?", "deleteSuccess": "Başarıyla silindi", "detail": "Detay", + "deviceLimit": "Cihaz Sınırı", + "download": "İndir", + "downloadTraffic": "Trafiği İndir", "edit": "düzenle", + "editSubscription": "Aboneliği Düzenle", "editUser": "Kullanıcıyı Düzenle", "email": "e-posta", + "emailNotifications": "E-posta Bildirimleri", "enable": "etkinleştir", + "expireTime": "Sona Erme Zamanı", + "expiredAt": "Son Kullanma Tarihi", + "failed": "Başarısız", "giftAmount": "Hediye Miktarı", "giftAmountPlaceholder": "Hediye tutarını girin", "invalidEmailFormat": "Geçersiz e-posta formatı", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Davet kodunu girin (oluşturmak için boş bırakın)", "loading": "Yükleniyor...", "loginIp": "Giriş IP'si", + "loginNotifications": "Giriş Bildirimleri", + "loginStatus": "Giriş Durumu", "loginTime": "Giriş Zamanı", "manager": "Yönetici", + "notifySettingsTitle": "Bildirim Ayarları", + "onlineDevices": "Çevrimiçi Cihazlar", "password": "Şifre", "passwordPlaceholder": "Yeni şifreyi girin (isteğe bağlı)", + "permanent": "Kalıcı", + "pleaseEnterEmail": "Lütfen e-posta adresinizi girin", "referer": "Referans", "refererId": "Referans Kimliği", "refererIdPlaceholder": "Referans kimliğini girin", + "referralCode": "Referans Kodu", + "referrerUserId": "Yönlendiren (Kullanıcı Kimliği)", + "remove": "Kaldır", + "resetTime": "Sıfırlama Zamanı", + "save": "Kaydet", "searchIp": "IP adresi ara", "selectAuthType": "Kimlik doğrulama türünü seçin", + "speedLimit": "Hız Sınırı", + "subscription": "Abonelik", + "subscriptionDetails": "Abonelik Ayrıntıları", + "subscriptionList": "Abonelik Listesi", + "subscriptionLogs": "Abonelik Kayıtları", + "subscriptionName": "Abonelik Adı", + "subscriptionNotifications": "Abonelik Bildirimleri", + "success": "Başarı", + "telegramNotifications": "Telegram Bildirimleri", "telephone": "Telefon Numarası", "telephonePlaceholder": "Telefon numarasını girin", + "totalTraffic": "Toplam Trafik", + "tradeNotifications": "Ticaret Bildirimleri", + "trafficLimit": "Trafik Limiti", + "trafficLogs": "Trafik Günlükleri", + "unlimited": "Sınırsız", + "unverified": "Doğrulanmamış", + "update": "Güncelle", "updateSuccess": "Güncelleme başarılı", + "upload": "Yükle", + "uploadTraffic": "Yükleme Trafiği", "userAgent": "Kullanıcı Aracısı", "userEmail": "Kullanıcı E-postası", "userEmailPlaceholder": "Kullanıcı e-postasını girin", diff --git a/apps/admin/locales/uk-UA/common.json b/apps/admin/locales/uk-UA/common.json index f7a7116..091bfab 100644 --- a/apps/admin/locales/uk-UA/common.json +++ b/apps/admin/locales/uk-UA/common.json @@ -45,6 +45,7 @@ "60002": "Тимчасово неможливо використовувати цю підписку, спробуйте пізніше.", "60003": "Виявлено існуючу підписку. Будь ласка, скасуйте її перед продовженням.", "60004": "Неможливо видалити, оскільки підписка має активних користувачів.", + "60005": "Режим одиночної підписки перевищив ліміт користувачів", "70001": "Код перевірки неправильний, введіть його знову.", "80001": "Завдання не вдалося додати до черги, спробуйте пізніше.", "90001": "Вимкніть режим DEBUG і спробуйте знову.", diff --git a/apps/admin/locales/uk-UA/user.json b/apps/admin/locales/uk-UA/user.json index 4d25f2d..871bb62 100644 --- a/apps/admin/locales/uk-UA/user.json +++ b/apps/admin/locales/uk-UA/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Увімкнення облікового запису", "actions": "дії", + "add": "Додати", + "administrator": "Адміністратор", "areaCode": "Код регіону", "areaCodePlaceholder": "Код області", "auth": "Авторизація", "authIdentifier": "Ідентифікатор автентифікації", "authIdentifierPlaceholder": "Введіть ідентифікатор авторизації", + "authMethodsTitle": "Налаштування автентифікації", "authType": "Тип автентифікації", "authUser": "Авторизований користувач", + "avatar": "Аватар", "balance": "Баланс", + "balanceNotifications": "Сповіщення про зміну балансу", "balancePlaceholder": "Баланс", + "basicInfoTitle": "Основна інформація", "cancel": "Скасувати", "commission": "Комісія", "commissionPlaceholder": "Введіть комісію", "confirm": "Підтвердити", "confirmDelete": "Ви впевнені, що хочете видалити?", + "confirmOffline": "Підтвердити офлайн", "create": "створити", + "createSubscription": "Створити підписку", "createSuccess": "Створено успішно", "createUser": "Створити користувача", "createdAt": "Час реєстрації", "delete": "Видалити", "deleteDescription": "Після видалення дані не можна буде відновити, будь ласка, дійте обережно.", + "deleteSubscriptionDescription": "Ви впевнені, що хочете видалити цю підписку?", "deleteSuccess": "Видалення успішне", "detail": "Деталі", + "deviceLimit": "Ліміт пристроїв", + "download": "Завантажити", + "downloadTraffic": "Завантажити трафік", "edit": "редагувати", + "editSubscription": "Редагувати підписку", "editUser": "Редагувати користувача", "email": "електронна пошта", + "emailNotifications": "Сповіщення електронною поштою", "enable": "Увімкнути", + "expireTime": "Час закінчення", + "expiredAt": "Термін дії закінчився", + "failed": "Не вдалося", "giftAmount": "Сума подарунка", "giftAmountPlaceholder": "Введіть суму подарунка", "invalidEmailFormat": "Неправильний формат електронної пошти", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Введіть код запрошення (залиште порожнім для генерації)", "loading": "Завантаження...", "loginIp": "IP-адреса входу", + "loginNotifications": "Сповіщення про вхід", + "loginStatus": "Статус входу", "loginTime": "Час входу", "manager": "Менеджер", + "notifySettingsTitle": "Налаштування сповіщень", + "onlineDevices": "Пристрої в мережі", "password": "Пароль", "passwordPlaceholder": "Введіть новий пароль (необов'язково)", + "permanent": "Постійний", + "pleaseEnterEmail": "Будь ласка, введіть електронну пошту", "referer": "Реферер", "refererId": "Ідентифікатор реферера", "refererIdPlaceholder": "Введіть ID реферера", + "referralCode": "Реферальний код", + "referrerUserId": "Реферер (ID користувача)", + "remove": "Видалити", + "resetTime": "Скинути час", + "save": "Зберегти", "searchIp": "Пошук IP-адреси", "selectAuthType": "Виберіть тип автентифікації", + "speedLimit": "Обмеження швидкості", + "subscription": "Підписка", + "subscriptionDetails": "Деталі підписки", + "subscriptionList": "Список підписок", + "subscriptionLogs": "Журнали підписки", + "subscriptionName": "Назва підписки", + "subscriptionNotifications": "Сповіщення про підписку", + "success": "Успіх", + "telegramNotifications": "Сповіщення Telegram", "telephone": "Номер телефону", "telephonePlaceholder": "Введіть номер телефону", + "totalTraffic": "Загальний трафік", + "tradeNotifications": "Сповіщення про торгівлю", + "trafficLimit": "Ліміт трафіку", + "trafficLogs": "Журнали трафіку", + "unlimited": "Необмежено", + "unverified": "Непідтверджено", + "update": "Оновити", "updateSuccess": "Оновлення успішне", + "upload": "Завантажити", + "uploadTraffic": "Завантажити трафік", "userAgent": "Агент користувача", "userEmail": "Електронна пошта користувача", "userEmailPlaceholder": "Введіть електронну адресу користувача", diff --git a/apps/admin/locales/vi-VN/common.json b/apps/admin/locales/vi-VN/common.json index b4d2db2..aaf03f9 100644 --- a/apps/admin/locales/vi-VN/common.json +++ b/apps/admin/locales/vi-VN/common.json @@ -45,6 +45,7 @@ "60002": "Tạm thời không thể sử dụng đăng ký này, vui lòng thử lại sau.", "60003": "Phát hiện đăng ký hiện có. Vui lòng hủy trước khi tiếp tục.", "60004": "Không thể xóa vào lúc này vì đăng ký có người dùng đang hoạt động.", + "60005": "Chế độ đăng ký đơn đã vượt quá giới hạn người dùng.", "70001": "Mã xác nhận không chính xác, vui lòng nhập lại.", "80001": "Nhiệm vụ không được thêm vào hàng đợi thành công, vui lòng thử lại sau.", "90001": "Vui lòng tắt chế độ DEBUG trước khi thử lại.", diff --git a/apps/admin/locales/vi-VN/user.json b/apps/admin/locales/vi-VN/user.json index 20f869d..b25562f 100644 --- a/apps/admin/locales/vi-VN/user.json +++ b/apps/admin/locales/vi-VN/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "Kích hoạt tài khoản", "actions": "Hành động", + "add": "Thêm", + "administrator": "Quản trị viên", "areaCode": "Mã Vùng", "areaCodePlaceholder": "Mã vùng", "auth": "Xác thực", "authIdentifier": "Định danh Xác thực", "authIdentifierPlaceholder": "Nhập mã xác thực", + "authMethodsTitle": "Cài Đặt Xác Thực", "authType": "Loại xác thực", "authUser": "Người Dùng Xác Thực", + "avatar": "Hình đại diện", "balance": "Số dư", + "balanceNotifications": "Thông Báo Thay Đổi Số Dư", "balancePlaceholder": "Số dư", + "basicInfoTitle": "Thông Tin Cơ Bản", "cancel": "Hủy", "commission": "Hoa hồng", "commissionPlaceholder": "Nhập hoa hồng", "confirm": "Xác nhận", "confirmDelete": "Bạn có chắc chắn muốn xóa không?", + "confirmOffline": "Xác nhận Ngoại tuyến", "create": "Tạo", + "createSubscription": "Tạo Đăng Ký", "createSuccess": "Tạo thành công", "createUser": "Tạo người dùng", "createdAt": "Thời gian đăng ký", "delete": "Xóa", "deleteDescription": "Sau khi xóa, dữ liệu không thể khôi phục, hãy thao tác cẩn thận.", + "deleteSubscriptionDescription": "Bạn có chắc chắn muốn xóa đăng ký này không?", "deleteSuccess": "Xóa thành công", "detail": "Chi tiết", + "deviceLimit": "Giới hạn thiết bị", + "download": "Tải về", + "downloadTraffic": "Tải xuống Lưu lượng", "edit": "Chỉnh sửa", + "editSubscription": "Chỉnh sửa Đăng ký", "editUser": "Chỉnh sửa người dùng", "email": "Email", + "emailNotifications": "Thông báo qua Email", "enable": "Kích hoạt", + "expireTime": "Thời gian hết hạn", + "expiredAt": "Ngày hết hạn", + "failed": "Thất bại", "giftAmount": "Số tiền quà tặng", "giftAmountPlaceholder": "Nhập số tiền quà tặng", "invalidEmailFormat": "Định dạng email không hợp lệ", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "Nhập mã mời (để trống để tạo mới)", "loading": "Đang tải...", "loginIp": "Địa chỉ IP đăng nhập", + "loginNotifications": "Thông báo Đăng nhập", + "loginStatus": "Trạng thái đăng nhập", "loginTime": "Thời gian đăng nhập", "manager": "Quản lý", + "notifySettingsTitle": "Cài Đặt Thông Báo", + "onlineDevices": "Thiết bị trực tuyến", "password": "Mật khẩu", "passwordPlaceholder": "Nhập mật khẩu mới (không bắt buộc)", + "permanent": "Vĩnh viễn", + "pleaseEnterEmail": "Vui lòng nhập email", "referer": "Người giới thiệu", "refererId": "ID người giới thiệu", "refererIdPlaceholder": "Nhập mã người giới thiệu", + "referralCode": "Mã Giới Thiệu", + "referrerUserId": "Người giới thiệu (ID người dùng)", + "remove": "Xóa", + "resetTime": "Thời Gian Đặt Lại", + "save": "Lưu", "searchIp": "Tìm kiếm địa chỉ IP", "selectAuthType": "Chọn loại xác thực", + "speedLimit": "Giới hạn tốc độ", + "subscription": "Đăng ký", + "subscriptionDetails": "Chi Tiết Đăng Ký", + "subscriptionList": "Danh sách đăng ký", + "subscriptionLogs": "Nhật ký Đăng ký", + "subscriptionName": "Tên Đăng Ký", + "subscriptionNotifications": "Thông báo Đăng ký", + "success": "Thành công", + "telegramNotifications": "Thông báo Telegram", "telephone": "Số điện thoại", "telephonePlaceholder": "Nhập số điện thoại", + "totalTraffic": "Tổng Lưu Lượng", + "tradeNotifications": "Thông báo Giao dịch", + "trafficLimit": "Giới hạn lưu lượng", + "trafficLogs": "Nhật ký lưu lượng", + "unlimited": "Không giới hạn", + "unverified": "Chưa được xác minh", + "update": "Cập nhật", "updateSuccess": "Cập nhật thành công", + "upload": "Tải lên", + "uploadTraffic": "Tải lên Lưu lượng", "userAgent": "Tác nhân người dùng", "userEmail": "Email Người Dùng", "userEmailPlaceholder": "Nhập email người dùng", diff --git a/apps/admin/locales/zh-CN/common.json b/apps/admin/locales/zh-CN/common.json index 6f3e221..78449b9 100644 --- a/apps/admin/locales/zh-CN/common.json +++ b/apps/admin/locales/zh-CN/common.json @@ -45,6 +45,7 @@ "60002": "暂时无法使用该订阅,请稍后再试。", "60003": "检测到已有订阅。请取消后再继续。", "60004": "暂时无法删除,订阅存在正常激活的用户。", + "60005": "单一订阅模式已超过用户限制.", "70001": "验证码有误,请重新输入。", "80001": "任务未成功加入队列,请稍后重试。", "90001": "请关闭 DEBUG 模式后再试。", diff --git a/apps/admin/locales/zh-CN/user.json b/apps/admin/locales/zh-CN/user.json index b841c42..3c83c3a 100644 --- a/apps/admin/locales/zh-CN/user.json +++ b/apps/admin/locales/zh-CN/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "账户启用", "actions": "操作", + "add": "添加", + "administrator": "管理员", "areaCode": "区号", "areaCodePlaceholder": "区号", "auth": "认证", "authIdentifier": "认证标识符", "authIdentifierPlaceholder": "输入认证标识符", + "authMethodsTitle": "身份验证设置", "authType": "认证类型", "authUser": "授权用户", + "avatar": "头像", "balance": "余额", + "balanceNotifications": "余额变动通知", "balancePlaceholder": "余额", + "basicInfoTitle": "基本信息", "cancel": "取消", "commission": "佣金", "commissionPlaceholder": "输入佣金", "confirm": "确认", "confirmDelete": "您确定要删除吗?", + "confirmOffline": "确认离线", "create": "创建", + "createSubscription": "创建订阅", "createSuccess": "创建成功", "createUser": "创建用户", "createdAt": "注册时间", "delete": "删除", "deleteDescription": "删除后无法恢复数据,请谨慎操作。", + "deleteSubscriptionDescription": "您确定要删除此订阅吗?", "deleteSuccess": "删除成功", "detail": "详情", + "deviceLimit": "设备限制", + "download": "下载", + "downloadTraffic": "下载流量", "edit": "编辑", + "editSubscription": "编辑订阅", "editUser": "编辑用户", "email": "邮箱", + "emailNotifications": "电子邮件通知", "enable": "启用", + "expireTime": "过期时间", + "expiredAt": "过期时间", + "failed": "失败", "giftAmount": "礼物金额", "giftAmountPlaceholder": "输入礼品金额", "invalidEmailFormat": "电子邮件格式无效", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "输入邀请码(留空以生成)", "loading": "加载中...", "loginIp": "登录IP", + "loginNotifications": "登录通知", + "loginStatus": "登录状态", "loginTime": "登录时间", "manager": "经理", + "notifySettingsTitle": "通知设置", + "onlineDevices": "在线设备", "password": "密码", "passwordPlaceholder": "输入新密码(可选)", + "permanent": "永久", + "pleaseEnterEmail": "请输入电子邮件", "referer": "推荐人", "refererId": "推荐人ID", "refererIdPlaceholder": "输入推荐人ID", + "referralCode": "推荐码", + "referrerUserId": "推荐人(用户ID)", + "remove": "移除", + "resetTime": "重置时间", + "save": "保存", "searchIp": "搜索IP地址", "selectAuthType": "选择认证类型", + "speedLimit": "限速", + "subscription": "订阅", + "subscriptionDetails": "订阅详情", + "subscriptionList": "订阅列表", + "subscriptionLogs": "订阅日志", + "subscriptionName": "订阅名称", + "subscriptionNotifications": "订阅通知", + "success": "成功", + "telegramNotifications": "Telegram 通知", "telephone": "电话号码", "telephonePlaceholder": "输入电话号码", + "totalTraffic": "总流量", + "tradeNotifications": "交易通知", + "trafficLimit": "流量限制", + "trafficLogs": "流量日志", + "unlimited": "无限", + "unverified": "未验证", + "update": "更新", "updateSuccess": "更新成功", + "upload": "上传", + "uploadTraffic": "上传流量", "userAgent": "用户代理", "userEmail": "用户邮箱", "userEmailPlaceholder": "输入用户邮箱", diff --git a/apps/admin/locales/zh-HK/common.json b/apps/admin/locales/zh-HK/common.json index adec7a7..55a60e8 100644 --- a/apps/admin/locales/zh-HK/common.json +++ b/apps/admin/locales/zh-HK/common.json @@ -45,6 +45,7 @@ "60002": "暫時無法使用該訂閱,請稍後再試。", "60003": "偵測到現有訂閱。請取消後再繼續。", "60004": "暫時無法刪除,訂閱存在正常啟用的用戶。", + "60005": "單一訂閱模式已超過用戶限制.", "70001": "驗證碼有誤,請重新輸入。", "80001": "任務未成功加入隊列,請稍後重試。", "90001": "請關閉 DEBUG 模式後再試。", diff --git a/apps/admin/locales/zh-HK/user.json b/apps/admin/locales/zh-HK/user.json index 597d5f0..05ca212 100644 --- a/apps/admin/locales/zh-HK/user.json +++ b/apps/admin/locales/zh-HK/user.json @@ -1,31 +1,49 @@ { + "accountEnable": "帳戶啟用", "actions": "操作", + "add": "新增", + "administrator": "管理員", "areaCode": "地區代碼", "areaCodePlaceholder": "區號", "auth": "認證", "authIdentifier": "認證識別碼", "authIdentifierPlaceholder": "輸入認證識別碼", + "authMethodsTitle": "身份驗證設定", "authType": "認證類型", "authUser": "授權用戶", + "avatar": "頭像", "balance": "餘額", + "balanceNotifications": "結餘變動通知", "balancePlaceholder": "結餘", + "basicInfoTitle": "基本資料", "cancel": "取消", "commission": "佣金", "commissionPlaceholder": "輸入佣金", "confirm": "確認", "confirmDelete": "您確定要刪除嗎?", + "confirmOffline": "確認離線", "create": "建立", + "createSubscription": "建立訂閱", "createSuccess": "建立成功", "createUser": "建立使用者", "createdAt": "註冊時間", "delete": "刪除", "deleteDescription": "刪除後無法恢復資料,請謹慎操作。", + "deleteSubscriptionDescription": "您確定要刪除此訂閱嗎?", "deleteSuccess": "刪除成功", "detail": "詳情", + "deviceLimit": "裝置限制", + "download": "下載", + "downloadTraffic": "下載流量", "edit": "編輯", + "editSubscription": "編輯訂閱", "editUser": "編輯使用者", "email": "電子郵件", + "emailNotifications": "電郵通知", "enable": "啟用", + "expireTime": "到期時間", + "expiredAt": "到期時間", + "failed": "失敗", "giftAmount": "禮物金額", "giftAmountPlaceholder": "輸入禮物金額", "invalidEmailFormat": "電郵格式無效", @@ -33,18 +51,47 @@ "inviteCodePlaceholder": "輸入邀請碼(留空以生成)", "loading": "載入中...", "loginIp": "登入 IP", + "loginNotifications": "登入通知", + "loginStatus": "登入狀態", "loginTime": "登入時間", "manager": "經理", + "notifySettingsTitle": "通知設定", + "onlineDevices": "在線裝置", "password": "密碼", "passwordPlaceholder": "輸入新密碼(可選)", + "permanent": "永久", + "pleaseEnterEmail": "請輸入電郵地址", "referer": "推薦人", "refererId": "推薦人 ID", "refererIdPlaceholder": "輸入推薦人 ID", + "referralCode": "推薦碼", + "referrerUserId": "推薦人(用戶 ID)", + "remove": "移除", + "resetTime": "重設時間", + "save": "儲存", "searchIp": "搜尋IP地址", "selectAuthType": "選擇認證類型", + "speedLimit": "速度限制", + "subscription": "訂閱", + "subscriptionDetails": "訂閱詳情", + "subscriptionList": "訂閱列表", + "subscriptionLogs": "訂閱日誌", + "subscriptionName": "訂閱名稱", + "subscriptionNotifications": "訂閱通知", + "success": "成功", + "telegramNotifications": "Telegram 通知", "telephone": "電話號碼", "telephonePlaceholder": "輸入電話號碼", + "totalTraffic": "總流量", + "tradeNotifications": "交易通知", + "trafficLimit": "流量限制", + "trafficLogs": "流量日誌", + "unlimited": "無限", + "unverified": "未經驗證", + "update": "更新", "updateSuccess": "更新成功", + "upload": "上載", + "uploadTraffic": "上載流量", "userAgent": "用戶代理", "userEmail": "用戶電郵", "userEmailPlaceholder": "輸入用戶電郵", diff --git a/apps/admin/package.json b/apps/admin/package.json index 1b1eb7b..e19d17f 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -67,7 +67,7 @@ "zh-CN", "zh-HK" ], - "modelName": "gpt-4o", + "modelName": "gpt-4o-mini", "experimental": { "jsonMode": true }, diff --git a/apps/admin/services/admin/authMethod.ts b/apps/admin/services/admin/authMethod.ts new file mode 100644 index 0000000..9aac45c --- /dev/null +++ b/apps/admin/services/admin/authMethod.ts @@ -0,0 +1,93 @@ +// @ts-ignore +/* eslint-disable */ +import request from '@/utils/request'; + +/** Get auth method config GET /v1/admin/auth-method/config */ +export async function getAuthMethodConfig( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.GetAuthMethodConfigParams, + options?: { [key: string]: any }, +) { + return request('/v1/admin/auth-method/config', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} + +/** Update auth method config PUT /v1/admin/auth-method/config */ +export async function updateAuthMethodConfig( + body: API.UpdataAuthMethodConfigRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/auth-method/config', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Get email support platform GET /v1/admin/auth-method/email_platform */ +export async function getEmailPlatform(options?: { [key: string]: any }) { + return request( + '/v1/admin/auth-method/email_platform', + { + method: 'GET', + ...(options || {}), + }, + ); +} + +/** Get auth method list GET /v1/admin/auth-method/list */ +export async function getAuthMethodList(options?: { [key: string]: any }) { + return request( + '/v1/admin/auth-method/list', + { + method: 'GET', + ...(options || {}), + }, + ); +} + +/** Get sms support platform GET /v1/admin/auth-method/sms_platform */ +export async function getSmsPlatform(options?: { [key: string]: any }) { + return request( + '/v1/admin/auth-method/sms_platform', + { + method: 'GET', + ...(options || {}), + }, + ); +} + +/** Test email send POST /v1/admin/auth-method/test_email_send */ +export async function testEmailSend( + body: API.TestEmailSendRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/auth-method/test_email_send', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Test sms send POST /v1/admin/auth-method/test_sms_send */ +export async function testSmsSend(body: API.TestSmsSendRequest, options?: { [key: string]: any }) { + return request('/v1/admin/auth-method/test_sms_send', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} diff --git a/apps/admin/services/admin/index.ts b/apps/admin/services/admin/index.ts index 5cabc85..28e43f1 100644 --- a/apps/admin/services/admin/index.ts +++ b/apps/admin/services/admin/index.ts @@ -3,6 +3,7 @@ // API 更新时间: // API 唯一标识: import * as announcement from './announcement'; +import * as authMethod from './authMethod'; import * as console from './console'; import * as coupon from './coupon'; import * as document from './document'; @@ -17,6 +18,7 @@ import * as tool from './tool'; import * as user from './user'; export default { announcement, + authMethod, console, coupon, document, diff --git a/apps/admin/services/admin/server.ts b/apps/admin/services/admin/server.ts index a84e993..de41938 100644 --- a/apps/admin/services/admin/server.ts +++ b/apps/admin/services/admin/server.ts @@ -154,6 +154,62 @@ export async function getNodeList( }); } +/** Update rule group PUT /v1/admin/server/rule_group */ +export async function updateRuleGroup( + body: API.UpdateRuleGroupRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/server/rule_group', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Create rule group POST /v1/admin/server/rule_group */ +export async function createRuleGroup( + body: API.CreateRuleGroupRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/server/rule_group', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Delete rule group DELETE /v1/admin/server/rule_group */ +export async function deleteRuleGroup( + body: API.DeleteRuleGroupRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/server/rule_group', { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Get rule group list GET /v1/admin/server/rule_group_list */ +export async function getRuleGroupList(options?: { [key: string]: any }) { + return request( + '/v1/admin/server/rule_group_list', + { + method: 'GET', + ...(options || {}), + }, + ); +} + /** Node sort POST /v1/admin/server/sort */ export async function nodeSort(body: API.NodeSortRequest, options?: { [key: string]: any }) { return request('/v1/admin/server/sort', { diff --git a/apps/admin/services/admin/system.ts b/apps/admin/services/admin/system.ts index 61beae7..8e44e1d 100644 --- a/apps/admin/services/admin/system.ts +++ b/apps/admin/services/admin/system.ts @@ -152,29 +152,6 @@ export async function updateCurrencyConfig( }); } -/** Get email smtp config GET /v1/admin/system/email_config */ -export async function getEmailSmtpConfig(options?: { [key: string]: any }) { - return request('/v1/admin/system/email_config', { - method: 'GET', - ...(options || {}), - }); -} - -/** Update email smtp config PUT /v1/admin/system/email_config */ -export async function updateEmailSmtpConfig( - body: API.EmailSmtpConfig, - options?: { [key: string]: any }, -) { - return request('/v1/admin/system/email_config', { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - data: body, - ...(options || {}), - }); -} - /** Get Node Multiplier GET /v1/admin/system/get_node_multiplier */ export async function getNodeMultiplier(options?: { [key: string]: any }) { return request( @@ -226,47 +203,6 @@ export async function updateNodeConfig(body: API.NodeConfig, options?: { [key: s }); } -/** Get oauth config GET /v1/admin/system/oauth_config */ -export async function getOAuthConfig(options?: { [key: string]: any }) { - return request( - '/v1/admin/system/oauth_config', - { - method: 'GET', - ...(options || {}), - }, - ); -} - -/** Update oauth config PUT /v1/admin/system/oauth_config */ -export async function updateOAuthConfig( - body: API.UpdateOAuthConfig, - options?: { [key: string]: any }, -) { - return request('/v1/admin/system/oauth_config', { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - data: body, - ...(options || {}), - }); -} - -/** Get OAuth Config By Platform GET /v1/admin/system/oauth/platform */ -export async function getOAuthByPlatform( - // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) - params: API.GetOAuthByPlatformParams, - options?: { [key: string]: any }, -) { - return request('/v1/admin/system/oauth/platform', { - method: 'GET', - params: { - ...params, - }, - ...(options || {}), - }); -} - /** Get register config GET /v1/admin/system/register_config */ export async function getRegisterConfig(options?: { [key: string]: any }) { return request('/v1/admin/system/register_config', { @@ -333,37 +269,6 @@ export async function updateSiteConfig(body: API.SiteConfig, options?: { [key: s }); } -/** Get sms config GET /v1/admin/system/sms_config */ -export async function getSmsConfig(options?: { [key: string]: any }) { - return request('/v1/admin/system/sms_config', { - method: 'GET', - ...(options || {}), - }); -} - -/** Get sms config PUT /v1/admin/system/sms_config */ -export async function updateSmsConfig(body: API.SmsConfig, options?: { [key: string]: any }) { - return request('/v1/admin/system/sms_config', { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - data: body, - ...(options || {}), - }); -} - -/** Get sms config GET /v1/admin/system/sms_platform */ -export async function getSmsPlatform(options?: { [key: string]: any }) { - return request( - '/v1/admin/system/sms_platform', - { - method: 'GET', - ...(options || {}), - }, - ); -} - /** Get subscribe config GET /v1/admin/system/subscribe_config */ export async function getSubscribeConfig(options?: { [key: string]: any }) { return request( @@ -421,33 +326,6 @@ export async function updateTelegramConfig( }); } -/** Test email smtp POST /v1/admin/system/test_email */ -export async function testEmailSmtp( - body: API.TestEmailSmtpRequest, - options?: { [key: string]: any }, -) { - return request('/v1/admin/system/test_email', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - data: body, - ...(options || {}), - }); -} - -/** Test sms send POST /v1/admin/system/test_sms */ -export async function testSmsSend(body: API.SendSmsRequest, options?: { [key: string]: any }) { - return request('/v1/admin/system/test_sms', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - data: body, - ...(options || {}), - }); -} - /** Get Team of Service Config GET /v1/admin/system/tos_config */ export async function getTosConfig(options?: { [key: string]: any }) { return request('/v1/admin/system/tos_config', { diff --git a/apps/admin/services/admin/typings.d.ts b/apps/admin/services/admin/typings.d.ts index 0e26f8e..c4644c1 100644 --- a/apps/admin/services/admin/typings.d.ts +++ b/apps/admin/services/admin/typings.d.ts @@ -66,15 +66,16 @@ declare namespace API { }; type AuthConfig = { - sms: SmsAuthenticateConfig; + sms: MobileAuthenticateConfig; email: EmailAuthticateConfig; register: RegisterConfig; }; - type AuthMethod = { - auth_type: string; - auth_identifier: string; - verified: boolean; + type AuthMethodConfig = { + id: number; + method: string; + config: Record; + enabled: boolean; }; type BatchDeleteCouponRequest = { @@ -204,6 +205,13 @@ declare namespace API { subscribe_id?: number; }; + type CreateRuleGroupRequest = { + name: string; + icon: string; + description: string; + enable: boolean; + }; + type CreateSubscribeGroupRequest = { name: string; description: string; @@ -260,6 +268,13 @@ declare namespace API { is_admin: boolean; }; + type CreateUserSubscribeRequest = { + user_id: number; + expired_at: number; + traffic: number; + subscribe_id: number; + }; + type CurrencyConfig = { currency_unit: string; currency_symbol: string; @@ -293,6 +308,10 @@ declare namespace API { id: number; }; + type DeleteRuleGroupRequest = { + id: number; + }; + type DeleteSubscribeGroupRequest = { id: number; }; @@ -301,6 +320,11 @@ declare namespace API { id: number; }; + type DeleteUserAuthMethodRequest = { + user_id: number; + auth_type: string; + }; + type DeleteUserDeivceRequest = { id: number; }; @@ -320,26 +344,10 @@ declare namespace API { }; type EmailAuthticateConfig = { - email_enabled: boolean; - email_enable_verify: boolean; - email_enable_domain_suffix: boolean; - email_domain_suffix_list: string; - }; - - type EmailSmtpConfig = { - email_enabled: boolean; - email_smtp_host: string; - email_smtp_port: number; - email_smtp_user: string; - email_smtp_pass: string; - email_smtp_from: string; - email_smtp_ssl: boolean; - verify_email_template: string; - maintenance_email_template: string; - expiration_email_template: string; - email_enable_verify: boolean; - email_enable_domain_suffix: boolean; - email_domain_suffix_list: string; + enable: boolean; + enable_verify: boolean; + enable_domain_suffix: boolean; + domain_suffix_list: string; }; type EpayConfig = { @@ -392,6 +400,18 @@ declare namespace API { id: number; }; + type GetAuthMethodConfigParams = { + method: string; + }; + + type GetAuthMethodConfigRequest = { + method: string; + }; + + type GetAuthMethodListResponse = { + list: AuthMethodConfig[]; + }; + type GetCouponListParams = { page: number; size: number; @@ -476,18 +496,6 @@ declare namespace API { list: Server[]; }; - type GetOAuthByPlatformParams = { - platform: string; - }; - - type GetOAuthByPlatformRequest = { - platform: string; - }; - - type GetOAuthConfigResponse = { - list: OAuthMethod[]; - }; - type GetOrderListParams = { page: number; size: number; @@ -511,6 +519,11 @@ declare namespace API { list: Order[]; }; + type GetRuleGroupResponse = { + total: number; + list: ServerRuleGroup[]; + }; + type GetSmsListParams = { page: number; size: number; @@ -525,7 +538,7 @@ declare namespace API { type GetSmsListResponse = { total: number; - list: Sms[]; + list: SMS[]; }; type GetSubscribeDetailsParams = { @@ -594,7 +607,7 @@ declare namespace API { }; type GetUserAuthMethodResponse = { - auth_methods: AuthMethod[]; + auth_methods: UserAuthMethod[]; }; type GetUserDetailParams = { @@ -618,6 +631,97 @@ declare namespace API { list: User[]; }; + type GetUserLoginLogsParams = { + page: number; + size: number; + user_id: number; + }; + + type GetUserLoginLogsRequest = { + page: number; + size: number; + user_id: number; + }; + + type GetUserLoginLogsResponse = { + list: UserLoginLog[]; + total: number; + }; + + type GetUserSubscribeDevicesParams = { + page: number; + size: number; + user_id: number; + subscribe_id: number; + }; + + type GetUserSubscribeDevicesRequest = { + page: number; + size: number; + user_id: number; + subscribe_id: number; + }; + + type GetUserSubscribeDevicesResponse = { + list: UserDevice[]; + total: number; + }; + + type GetUserSubscribeListRequest = { + page: number; + size: number; + user_id: number; + }; + + type GetUserSubscribeListResponse = { + list: UserSubscribe[]; + total: number; + }; + + type GetUserSubscribeLogsParams = { + page: number; + size: number; + user_id: number; + subscribe_id?: number; + }; + + type GetUserSubscribeLogsRequest = { + page: number; + size: number; + user_id: number; + subscribe_id?: number; + }; + + type GetUserSubscribeLogsResponse = { + list: UserSubscribeLog[]; + total: number; + }; + + type GetUserSubscribeParams = { + page: number; + size: number; + user_id: number; + }; + + type GetUserSubscribeTrafficLogsParams = { + page: number; + size: number; + user_id: number; + subscribe_id: number; + }; + + type GetUserSubscribeTrafficLogsRequest = { + page: number; + size: number; + user_id: number; + subscribe_id: number; + }; + + type GetUserSubscribeTrafficLogsResponse = { + list: TrafficLog[]; + total: number; + }; + type Hysteria2 = { port: number; hop_ports: string; @@ -632,10 +736,21 @@ declare namespace API { only_first_purchase: boolean; }; + type KickOfflineRequest = { + id: number; + }; + type LogResponse = { list: Record; }; + type MobileAuthenticateConfig = { + enable: boolean; + limit: number; + interval: number; + expire_time: number; + }; + type NodeConfig = { node_secret: string; node_pull_interval: number; @@ -658,16 +773,6 @@ declare namespace API { last_at: number; }; - type OAuthMethod = { - id: number; - platform: string; - config: Record; - redirect: string; - enabled: boolean; - created_at: number; - updated_at: number; - }; - type OnlineUser = { uid: number; ip: string; @@ -739,6 +844,16 @@ declare namespace API { enable: boolean; }; + type PlatformInfo = { + platform: string; + platform_url: string; + platform_field_description: Record; + }; + + type PlatformResponse = { + list: PlatformInfo[]; + }; + type RegisterConfig = { stop_register: boolean; enable_trial: boolean; @@ -773,12 +888,6 @@ declare namespace API { reality_short_id: string; }; - type SendSmsRequest = { - content: string; - area_code: string; - telephone: string; - }; - type Server = { id: number; tags: string[]; @@ -808,6 +917,16 @@ declare namespace API { updated_at: number; }; + type ServerRuleGroup = { + id: number; + name: string; + icon: string; + description: string; + enable: boolean; + created_at: number; + updated_at: number; + }; + type ServerStatus = { cpu: number; mem: number; @@ -854,7 +973,7 @@ declare namespace API { site_logo: string; }; - type Sms = { + type SMS = { id: string; content: string; platform: string; @@ -864,36 +983,6 @@ declare namespace API { created_at: number; }; - type SmsAuthenticateConfig = { - sms_enabled: boolean; - sms_limit: number; - sms_interval: number; - sms_expire_time: number; - }; - - type SmsConfig = { - sms_enabled: boolean; - sms_key: string; - sms_secret: string; - sms_template: string; - sms_template_code: string; - sms_template_param: string; - sms_platform: string; - sms_limit: number; - sms_interval: number; - sms_expire_time: number; - }; - - type SmsPlatformInfo = { - platform: string; - platform_url: string; - platform_field_description: Record; - }; - - type SmsPlatformResponse = { - list: SmsPlatformInfo[]; - }; - type SortItem = { id: number; sort: number; @@ -996,10 +1085,15 @@ declare namespace API { telegram_web_hook_domain: string; }; - type TestEmailSmtpRequest = { + type TestEmailSendRequest = { email: string; }; + type TestSmsSendRequest = { + area_code: string; + telephone: string; + }; + type Ticket = { id: number; title: string; @@ -1025,6 +1119,16 @@ declare namespace API { tos_content: string; }; + type TrafficLog = { + id: number; + server_id: number; + user_id: number; + subscribe_id: number; + download: number; + upload: number; + timestamp: number; + }; + type TransportConfig = { path: string; host: string; @@ -1044,6 +1148,13 @@ declare namespace API { security_config: SecurityConfig; }; + type UpdataAuthMethodConfigRequest = { + id: number; + method: string; + config: Record; + enabled: boolean; + }; + type UpdateAlipayF2fRequest = { id: number; name: string; @@ -1150,14 +1261,6 @@ declare namespace API { sort: number; }; - type UpdateOAuthConfig = { - id: number; - platform: string; - config: Record; - redirect: string; - enabled: boolean; - }; - type UpdateOrderStatusRequest = { id: number; status: number; @@ -1165,6 +1268,14 @@ declare namespace API { trade_no?: string; }; + type UpdateRuleGroupRequest = { + id: number; + name: string; + icon: string; + description: string; + enable: boolean; + }; + type UpdateStripeRequest = { id: number; name: string; @@ -1214,8 +1325,14 @@ declare namespace API { status: number; }; - type UpdateUserRequest = { - id: number; + type UpdateUserAuthMethodRequest = { + user_id: number; + auth_type: string; + auth_identifier: string; + }; + + type UpdateUserBasiceInfoRequest = { + user_id: number; password: string; avatar: string; balance: number; @@ -1226,6 +1343,10 @@ declare namespace API { referer_id: number; enable: boolean; is_admin: boolean; + }; + + type UpdateUserNotifySettingRequest = { + user_id: number; enable_email_notify: boolean; enable_telegram_notify: boolean; enable_balance_notify: boolean; @@ -1234,6 +1355,16 @@ declare namespace API { enable_trade_notify: boolean; }; + type UpdateUserSubscribeRequest = { + user_subscribe_id: number; + subscribe_id: number; + traffic: number; + expired_at: number; + upload: number; + download: number; + status: number; + }; + type User = { id: number; avatar: string; @@ -1252,7 +1383,8 @@ declare namespace API { enable_login_notify: boolean; enable_subscribe_notify: boolean; enable_trade_notify: boolean; - auth_methods: AuthMethod[]; + auth_methods: UserAuthMethod[]; + user_devices: UserDevice[]; created_at: number; updated_at: number; deleted_at?: number; @@ -1266,6 +1398,12 @@ declare namespace API { enable: boolean; }; + type UserAuthMethod = { + auth_type: string; + auth_identifier: string; + verified: boolean; + }; + type UserBalanceLog = { id: number; user_id: number; @@ -1278,15 +1416,24 @@ declare namespace API { type UserDevice = { id: number; - user_id: number; - device_number: string; + ip: string; + imei: string; + user_agent: string; online: boolean; - last_online: number; enabled: boolean; created_at: number; updated_at: number; }; + type UserLoginLog = { + id: number; + user_id: number; + login_ip: string; + user_agent: string; + success: boolean; + created_at: number; + }; + type UserStatistics = { date?: string; register: number; @@ -1319,6 +1466,16 @@ declare namespace API { updated_at: number; }; + type UserSubscribeLog = { + id: number; + user_id: number; + user_subscribe_id: number; + token: string; + ip: string; + user_agent: string; + created_at: number; + }; + type UserTrafficData = { user_id: number; email: string; diff --git a/apps/admin/services/admin/user.ts b/apps/admin/services/admin/user.ts index 7197ef3..12270dc 100644 --- a/apps/admin/services/admin/user.ts +++ b/apps/admin/services/admin/user.ts @@ -2,18 +2,6 @@ /* eslint-disable */ import request from '@/utils/request'; -/** Update user PUT /v1/admin/user/ */ -export async function updateUser(body: API.UpdateUserRequest, options?: { [key: string]: any }) { - return request('/v1/admin/user/', { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - data: body, - ...(options || {}), - }); -} - /** Create user POST /v1/admin/user/ */ export async function createUser(body: API.CreateUserRequest, options?: { [key: string]: any }) { return request('/v1/admin/user/', { @@ -52,6 +40,21 @@ export async function getUserAuthMethod(options?: { [key: string]: any }) { ); } +/** Update user auth method PUT /v1/admin/user/auth_method */ +export async function updateUserAuthMethod( + body: API.UpdateUserAuthMethodRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/user/auth_method', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** Create user auth method POST /v1/admin/user/auth_method */ export async function createUserAuthMethod( body: API.CreateUserAuthMethodRequest, @@ -67,6 +70,36 @@ export async function createUserAuthMethod( }); } +/** Delete user auth method DELETE /v1/admin/user/auth_method */ +export async function deleteUserAuthMethod( + body: API.DeleteUserAuthMethodRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/user/auth_method', { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Update user basic info PUT /v1/admin/user/basic */ +export async function updateUserBasicInfo( + body: API.UpdateUserBasiceInfoRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/user/basic', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** Batch delete user DELETE /v1/admin/user/batch */ export async function batchDeleteUser( body: API.BatchDeleteUserRequest, @@ -106,7 +139,7 @@ export async function getUserDetail( } /** User device PUT /v1/admin/user/device */ -export async function updaeUserDevice(body: API.UserDevice, options?: { [key: string]: any }) { +export async function updateUserDevice(body: API.UserDevice, options?: { [key: string]: any }) { return request('/v1/admin/user/device', { method: 'PUT', headers: { @@ -132,6 +165,21 @@ export async function deleteUserDevice( }); } +/** kick offline user device PUT /v1/admin/user/device/kick_offline */ +export async function kickOfflineByUserDevice( + body: API.KickOfflineRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/user/device/kick_offline', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + /** Get user list GET /v1/admin/user/list */ export async function getUserList( // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) @@ -146,3 +194,138 @@ export async function getUserList( ...(options || {}), }); } + +/** Get user login logs GET /v1/admin/user/login/logs */ +export async function getUserLoginLogs( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.GetUserLoginLogsParams, + options?: { [key: string]: any }, +) { + return request( + '/v1/admin/user/login/logs', + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + +/** Update user notify setting PUT /v1/admin/user/notify */ +export async function updateUserNotifySetting( + body: API.UpdateUserNotifySettingRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/user/notify', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Get user subcribe GET /v1/admin/user/subscribe */ +export async function getUserSubscribe( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.GetUserSubscribeParams, + options?: { [key: string]: any }, +) { + return request( + '/v1/admin/user/subscribe', + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + +/** Update user subcribe PUT /v1/admin/user/subscribe */ +export async function updateUserSubscribe( + body: API.UpdateUserSubscribeRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/user/subscribe', { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Create user subcribe POST /v1/admin/user/subscribe */ +export async function createUserSubscribe( + body: API.CreateUserSubscribeRequest, + options?: { [key: string]: any }, +) { + return request('/v1/admin/user/subscribe', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); +} + +/** Get user subcribe devices GET /v1/admin/user/subscribe/device */ +export async function getUserSubscribeDevices( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.GetUserSubscribeDevicesParams, + options?: { [key: string]: any }, +) { + return request( + '/v1/admin/user/subscribe/device', + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + +/** Get user subcribe logs GET /v1/admin/user/subscribe/logs */ +export async function getUserSubscribeLogs( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.GetUserSubscribeLogsParams, + options?: { [key: string]: any }, +) { + return request( + '/v1/admin/user/subscribe/logs', + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + +/** Get user subcribe traffic logs GET /v1/admin/user/subscribe/traffic_logs */ +export async function getUserSubscribeTrafficLogs( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.GetUserSubscribeTrafficLogsParams, + options?: { [key: string]: any }, +) { + return request( + '/v1/admin/user/subscribe/traffic_logs', + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} diff --git a/apps/admin/services/common/typings.d.ts b/apps/admin/services/common/typings.d.ts index 493f3bd..94204c3 100644 --- a/apps/admin/services/common/typings.d.ts +++ b/apps/admin/services/common/typings.d.ts @@ -64,15 +64,16 @@ declare namespace API { }; type AuthConfig = { - sms: SmsAuthenticateConfig; + sms: MobileAuthenticateConfig; email: EmailAuthticateConfig; register: RegisterConfig; }; - type AuthMethod = { - auth_type: string; - auth_identifier: string; - verified: boolean; + type AuthMethodConfig = { + id: number; + method: string; + config: Record; + enabled: boolean; }; type CheckUserParams = { @@ -124,26 +125,10 @@ declare namespace API { }; type EmailAuthticateConfig = { - email_enabled: boolean; - email_enable_verify: boolean; - email_enable_domain_suffix: boolean; - email_domain_suffix_list: string; - }; - - type EmailSmtpConfig = { - email_enabled: boolean; - email_smtp_host: string; - email_smtp_port: number; - email_smtp_user: string; - email_smtp_pass: string; - email_smtp_from: string; - email_smtp_ssl: boolean; - verify_email_template: string; - maintenance_email_template: string; - expiration_email_template: string; - email_enable_verify: boolean; - email_enable_domain_suffix: boolean; - email_domain_suffix_list: string; + enable: boolean; + enable_verify: boolean; + enable_domain_suffix: boolean; + domain_suffix_list: string; }; type Follow = { @@ -213,6 +198,13 @@ declare namespace API { token: string; }; + type MobileAuthenticateConfig = { + enable: boolean; + limit: number; + interval: number; + expire_time: number; + }; + type NodeConfig = { node_secret: string; node_pull_interval: number; @@ -247,16 +239,6 @@ declare namespace API { redirect: string; }; - type OAuthMethod = { - id: number; - platform: string; - config: Record; - redirect: string; - enabled: boolean; - created_at: number; - updated_at: number; - }; - type OnlineUser = { uid: number; ip: string; @@ -399,6 +381,16 @@ declare namespace API { updated_at: number; }; + type ServerRuleGroup = { + id: number; + name: string; + icon: string; + description: string; + enable: boolean; + created_at: number; + updated_at: number; + }; + type ServerStatus = { cpu: number; mem: number; @@ -419,26 +411,6 @@ declare namespace API { site_logo: string; }; - type SmsAuthenticateConfig = { - sms_enabled: boolean; - sms_limit: number; - sms_interval: number; - sms_expire_time: number; - }; - - type SmsConfig = { - sms_enabled: boolean; - sms_key: string; - sms_secret: string; - sms_template: string; - sms_template_code: string; - sms_template_param: string; - sms_platform: string; - sms_limit: number; - sms_interval: number; - sms_expire_time: number; - }; - type SortItem = { id: number; sort: number; @@ -556,6 +528,16 @@ declare namespace API { tos_content: string; }; + type TrafficLog = { + id: number; + server_id: number; + user_id: number; + subscribe_id: number; + download: number; + upload: number; + timestamp: number; + }; + type TransportConfig = { path: string; host: string; @@ -593,7 +575,8 @@ declare namespace API { enable_login_notify: boolean; enable_subscribe_notify: boolean; enable_trade_notify: boolean; - auth_methods: AuthMethod[]; + auth_methods: UserAuthMethod[]; + user_devices: UserDevice[]; created_at: number; updated_at: number; deleted_at?: number; @@ -607,6 +590,12 @@ declare namespace API { enable: boolean; }; + type UserAuthMethod = { + auth_type: string; + auth_identifier: string; + verified: boolean; + }; + type UserBalanceLog = { id: number; user_id: number; @@ -619,15 +608,24 @@ declare namespace API { type UserDevice = { id: number; - user_id: number; - device_number: string; + ip: string; + imei: string; + user_agent: string; online: boolean; - last_online: number; enabled: boolean; created_at: number; updated_at: number; }; + type UserLoginLog = { + id: number; + user_id: number; + login_ip: string; + user_agent: string; + success: boolean; + created_at: number; + }; + type UserLoginRequest = { email: string; password: string; @@ -660,6 +658,16 @@ declare namespace API { updated_at: number; }; + type UserSubscribeLog = { + id: number; + user_id: number; + user_subscribe_id: number; + token: string; + ip: string; + user_agent: string; + created_at: number; + }; + type VeifyConfig = { turnstile_site_key: string; enable_login_verify: boolean; diff --git a/apps/user/locales/cs-CZ/common.json b/apps/user/locales/cs-CZ/common.json index dd04140..b46bb55 100644 --- a/apps/user/locales/cs-CZ/common.json +++ b/apps/user/locales/cs-CZ/common.json @@ -47,6 +47,7 @@ "60002": "Toto předplatné nelze momentálně použít, zkuste to prosím později.", "60003": "Bylo zjištěno existující předplatné. Zrušte ho, než budete pokračovat.", "60004": "Nelze momentálně odstranit, protože předplatné má aktivní uživatele.", + "60005": "Režim jediné předplatné překročil limit uživatelů.", "70001": "Ověřovací kód je nesprávný, zadejte ho prosím znovu.", "80001": "Úkol nebyl úspěšně přidán do fronty, zkuste to prosím později.", "undefined": "Došlo k chybě systému, zkuste to prosím později." diff --git a/apps/user/locales/de-DE/common.json b/apps/user/locales/de-DE/common.json index 0e04bfc..6c2452b 100644 --- a/apps/user/locales/de-DE/common.json +++ b/apps/user/locales/de-DE/common.json @@ -47,6 +47,7 @@ "60002": "Das Abonnement kann derzeit nicht verwendet werden, bitte versuchen Sie es später erneut.", "60003": "Ein bestehendes Abonnement wurde erkannt. Bitte kündigen Sie es, bevor Sie fortfahren.", "60004": "Kann derzeit nicht gelöscht werden, da das Abonnement aktive Benutzer hat.", + "60005": "Im Ein-Abonnement-Modus wurde das Benutzerlimit überschritten.", "70001": "Der Bestätigungscode ist falsch, bitte erneut eingeben.", "80001": "Die Aufgabe konnte nicht erfolgreich in die Warteschlange aufgenommen werden, bitte versuchen Sie es später erneut.", "undefined": "Es ist ein Systemfehler aufgetreten, bitte versuchen Sie es später erneut." diff --git a/apps/user/locales/en-US/common.json b/apps/user/locales/en-US/common.json index daa7cb3..75e237a 100644 --- a/apps/user/locales/en-US/common.json +++ b/apps/user/locales/en-US/common.json @@ -47,6 +47,7 @@ "60002": "Unable to use the subscription at the moment, please try again later.", "60003": "An existing subscription is detected. Please cancel it before proceeding.", "60004": "Unable to delete at the moment as the subscription has active users.", + "60005": "Single subscription mode has exceeded user limit.", "70001": "Incorrect verification code, please re-enter.", "80001": "Task could not be successfully added to the queue, please try again later.", "undefined": "An error occurred in the system, please try again later." diff --git a/apps/user/locales/es-ES/common.json b/apps/user/locales/es-ES/common.json index 9c82d3d..11f7f3f 100644 --- a/apps/user/locales/es-ES/common.json +++ b/apps/user/locales/es-ES/common.json @@ -47,6 +47,7 @@ "60002": "No se puede usar la suscripción por el momento, por favor intente de nuevo más tarde.", "60003": "Se ha detectado una suscripción existente. Por favor, cancélala antes de continuar.", "60004": "No se puede eliminar en este momento ya que la suscripción tiene usuarios activos.", + "60005": "El modo de suscripción única ha excedido el límite de usuarios.", "70001": "El código de verificación es incorrecto, por favor ingréselo de nuevo.", "80001": "La tarea no se agregó exitosamente a la cola, por favor intente de nuevo más tarde.", "undefined": "Ocurrió un error en el sistema, por favor intente de nuevo más tarde." diff --git a/apps/user/locales/es-MX/common.json b/apps/user/locales/es-MX/common.json index 3af38ad..8d8fa1b 100644 --- a/apps/user/locales/es-MX/common.json +++ b/apps/user/locales/es-MX/common.json @@ -47,6 +47,7 @@ "60002": "No se puede usar la suscripción por el momento, por favor intenta más tarde.", "60003": "Se ha detectado una suscripción existente. Por favor, cancélala antes de continuar.", "60004": "No se puede eliminar en este momento ya que la suscripción tiene usuarios activos.", + "60005": "El modo de suscripción única ha excedido el límite de usuarios.", "70001": "El código de verificación es incorrecto, por favor ingrésalo de nuevo.", "80001": "La tarea no se agregó exitosamente a la cola, por favor intenta de nuevo más tarde.", "undefined": "Ocurrió un error en el sistema, por favor intenta de nuevo más tarde." diff --git a/apps/user/locales/fa-IR/common.json b/apps/user/locales/fa-IR/common.json index 8f2d459..698cbb9 100644 --- a/apps/user/locales/fa-IR/common.json +++ b/apps/user/locales/fa-IR/common.json @@ -47,6 +47,7 @@ "60002": "در حال حاضر نمی‌توان از اشتراک استفاده کرد، لطفاً بعداً دوباره تلاش کنید.", "60003": "یک اشتراک موجود شناسایی شد. لطفاً قبل از ادامه آن را لغو کنید.", "60004": "در حال حاضر امکان حذف وجود ندارد زیرا اشتراک دارای کاربران فعال است.", + "60005": "حالت اشتراک تک کاربر از حد مجاز کاربران فراتر رفته است.", "70001": "کد تأیید نادرست است، لطفاً دوباره وارد کنید.", "80001": "وظیفه نتوانست به‌طور موفقیت‌آمیز به صف اضافه شود، لطفاً بعداً دوباره تلاش کنید.", "undefined": "خطایی در سیستم رخ داده است، لطفاً بعداً دوباره تلاش کنید." diff --git a/apps/user/locales/fi-FI/common.json b/apps/user/locales/fi-FI/common.json index ca6fc4e..6a924be 100644 --- a/apps/user/locales/fi-FI/common.json +++ b/apps/user/locales/fi-FI/common.json @@ -47,6 +47,7 @@ "60002": "Tilausta ei voi käyttää tällä hetkellä, yritä myöhemmin uudelleen.", "60003": "Olemassa oleva tilaus havaittu. Peruuta se ennen jatkamista.", "60004": "Ei voi poistaa tällä hetkellä, koska tilauksella on aktiivisia käyttäjiä.", + "60005": "Yksittäisen tilauksen tila on ylittänyt käyttäjämäärän rajan.", "70001": "Vahvistuskoodi on virheellinen, syötä se uudelleen.", "80001": "Tehtävää ei lisätty jonoon, yritä myöhemmin uudelleen.", "undefined": "Järjestelmässä tapahtui virhe, yritä myöhemmin uudelleen." diff --git a/apps/user/locales/fr-FR/common.json b/apps/user/locales/fr-FR/common.json index 6b4fde6..d380867 100644 --- a/apps/user/locales/fr-FR/common.json +++ b/apps/user/locales/fr-FR/common.json @@ -47,6 +47,7 @@ "60002": "Impossible d'utiliser cet abonnement pour le moment, veuillez réessayer plus tard.", "60003": "Un abonnement existant a été détecté. Veuillez l'annuler avant de continuer.", "60004": "Impossible de supprimer pour le moment car l'abonnement a des utilisateurs actifs.", + "60005": "Le mode d'abonnement unique a dépassé la limite d'utilisateurs.", "70001": "Le code de vérification est incorrect, veuillez le ressaisir.", "80001": "La tâche n'a pas été ajoutée avec succès à la file d'attente, veuillez réessayer plus tard.", "undefined": "Une erreur système s'est produite, veuillez réessayer plus tard." diff --git a/apps/user/locales/hi-IN/common.json b/apps/user/locales/hi-IN/common.json index dab86e8..05fe7b1 100644 --- a/apps/user/locales/hi-IN/common.json +++ b/apps/user/locales/hi-IN/common.json @@ -47,6 +47,7 @@ "60002": "अभी के लिए इस सदस्यता का उपयोग नहीं किया जा सकता, कृपया थोड़ी देर बाद पुनः प्रयास करें।", "60003": "एक मौजूदा सदस्यता का पता चला है। कृपया आगे बढ़ने से पहले इसे रद्द करें।", "60004": "वर्तमान में हटाने में असमर्थ क्योंकि सदस्यता में सक्रिय उपयोगकर्ता हैं।", + "60005": "सिंगल सब्सक्रिप्शन मोड में उपयोगकर्ता सीमा पार हो गई है।", "70001": "सत्यापन कोड गलत है, कृपया पुनः दर्ज करें।", "80001": "कार्य सफलतापूर्वक कतार में नहीं जोड़ा गया, कृपया थोड़ी देर बाद पुनः प्रयास करें।", "undefined": "सिस्टम में त्रुटि हुई है, कृपया थोड़ी देर बाद पुनः प्रयास करें।" diff --git a/apps/user/locales/hu-HU/common.json b/apps/user/locales/hu-HU/common.json index fc4d065..f95ecc4 100644 --- a/apps/user/locales/hu-HU/common.json +++ b/apps/user/locales/hu-HU/common.json @@ -47,6 +47,7 @@ "60002": "Az előfizetés jelenleg nem használható, kérjük, próbálja meg később újra.", "60003": "Létező előfizetés észlelve. Kérjük, törölje azt a folytatás előtt.", "60004": "Jelenleg nem törölhető, mivel az előfizetésnek aktív felhasználói vannak.", + "60005": "Az egyedi előfizetés mód túllépte a felhasználói limitet.", "70001": "A megerősítő kód hibás, kérjük, írja be újra.", "80001": "A feladat nem került sikeresen a sorba, kérjük, próbálja meg később újra.", "undefined": "Rendszerhiba történt, kérjük, próbálja meg később újra." diff --git a/apps/user/locales/ja-JP/common.json b/apps/user/locales/ja-JP/common.json index 329050c..fd7dee7 100644 --- a/apps/user/locales/ja-JP/common.json +++ b/apps/user/locales/ja-JP/common.json @@ -47,6 +47,7 @@ "60002": "このサブスクリプションは一時的に使用できません。しばらくしてから再試行してください。", "60003": "既存のサブスクリプションが検出されました。続行する前にキャンセルしてください。", "60004": "サブスクリプションにアクティブなユーザーがいるため、現在削除できません。", + "60005": "シングルサブスクリプションモードではユーザー数の上限を超えました。", "70001": "認証コードが間違っています。再入力してください。", "80001": "タスクがキューに正常に追加されませんでした。しばらくしてから再試行してください。", "undefined": "システムエラーが発生しました。しばらくしてから再試行してください。" diff --git a/apps/user/locales/ko-KR/common.json b/apps/user/locales/ko-KR/common.json index 41ece1b..1c58a5a 100644 --- a/apps/user/locales/ko-KR/common.json +++ b/apps/user/locales/ko-KR/common.json @@ -47,6 +47,7 @@ "60002": "현재 구독을 사용할 수 없습니다. 잠시 후 다시 시도해 주세요.", "60003": "기존 구독이 감지되었습니다. 계속하기 전에 취소해 주세요.", "60004": "구독에 활성 사용자가 있어 현재 삭제할 수 없습니다.", + "60005": "단일 구독 모드가 사용자 한도를 초과했습니다.", "70001": "인증 코드가 잘못되었습니다. 다시 입력해 주세요.", "80001": "작업이 큐에 성공적으로 추가되지 않았습니다. 잠시 후 다시 시도해 주세요.", "undefined": "시스템에 오류가 발생했습니다. 잠시 후 다시 시도해 주세요." diff --git a/apps/user/locales/no-NO/common.json b/apps/user/locales/no-NO/common.json index 9b30e63..84ce6d9 100644 --- a/apps/user/locales/no-NO/common.json +++ b/apps/user/locales/no-NO/common.json @@ -47,6 +47,8 @@ "60002": "Kan for øyeblikket ikke bruke abonnementet, vennligst prøv igjen senere.", "60003": "Et eksisterende abonnement er oppdaget. Vennligst avbryt det før du fortsetter.", "60004": "Kan ikke slettes for øyeblikket da abonnementet har aktive brukere.", + "60005": "Abonnementet har nådd maks antall brukere.", + "60005": "Enkelt abonnementsmodus har overskredet brukergrensen.", "70001": "Verifikasjonskoden er feil, vennligst skriv inn på nytt.", "80001": "Oppgaven ble ikke vellykket lagt til i køen, vennligst prøv igjen senere.", "undefined": "Det oppstod en systemfeil, vennligst prøv igjen senere." diff --git a/apps/user/locales/pl-PL/common.json b/apps/user/locales/pl-PL/common.json index 21061bd..9743e87 100644 --- a/apps/user/locales/pl-PL/common.json +++ b/apps/user/locales/pl-PL/common.json @@ -47,6 +47,7 @@ "60002": "Nie można tymczasowo użyć tej subskrypcji, spróbuj ponownie później.", "60003": "Wykryto istniejącą subskrypcję. Proszę ją anulować przed kontynuacją.", "60004": "Nie można usunąć w tej chwili, ponieważ subskrypcja ma aktywnych użytkowników.", + "60005": "Tryb pojedynczej subskrypcji przekroczył limit użytkowników.", "70001": "Kod weryfikacyjny jest nieprawidłowy, wprowadź go ponownie.", "80001": "Zadanie nie zostało pomyślnie dodane do kolejki, spróbuj ponownie później.", "undefined": "Wystąpił błąd systemu, spróbuj ponownie później." diff --git a/apps/user/locales/pt-BR/common.json b/apps/user/locales/pt-BR/common.json index 06da511..1e3ba40 100644 --- a/apps/user/locales/pt-BR/common.json +++ b/apps/user/locales/pt-BR/common.json @@ -47,6 +47,8 @@ "60002": "Não é possível usar a assinatura no momento, por favor, tente novamente mais tarde.", "60003": "Uma assinatura existente foi detectada. Cancele-a antes de prosseguir.", "60004": "Não é possível excluir no momento, pois a assinatura possui usuários ativos.", + "60005": "A assinatura atingiu o número máximo de usuários.", + "60005": "O modo de assinatura única excedeu o limite de usuários.", "70001": "O código de verificação está incorreto, por favor, digite novamente.", "80001": "A tarefa não foi adicionada à fila com sucesso, por favor, tente novamente mais tarde.", "undefined": "Ocorreu um erro no sistema, por favor, tente novamente mais tarde." diff --git a/apps/user/locales/ro-RO/common.json b/apps/user/locales/ro-RO/common.json index 4206f14..668c86e 100644 --- a/apps/user/locales/ro-RO/common.json +++ b/apps/user/locales/ro-RO/common.json @@ -47,6 +47,7 @@ "60002": "Nu se poate utiliza momentan acest abonament, vă rugăm să încercați din nou mai târziu.", "60003": "A fost detectat un abonament existent. Vă rugăm să-l anulați înainte de a continua.", "60004": "Nu se poate șterge în acest moment, deoarece abonamentul are utilizatori activi.", + "60005": "Modul de abonament unic a depășit limita de utilizatori.", "70001": "Codul de verificare este incorect, vă rugăm să îl introduceți din nou.", "80001": "Sarcina nu a fost adăugată cu succes în coadă, vă rugăm să încercați din nou mai târziu.", "undefined": "A apărut o eroare în sistem, vă rugăm să încercați din nou mai târziu." diff --git a/apps/user/locales/ru-RU/common.json b/apps/user/locales/ru-RU/common.json index f2e77ca..d0a6571 100644 --- a/apps/user/locales/ru-RU/common.json +++ b/apps/user/locales/ru-RU/common.json @@ -47,6 +47,7 @@ "60002": "Подписка временно недоступна, пожалуйста, попробуйте позже.", "60003": "Обнаружена существующая подписка. Пожалуйста, отмените ее перед продолжением.", "60004": "Невозможно удалить в данный момент, так как у подписки есть активные пользователи.", + "60005": "Одиночный режим подписки превысил лимит пользователей.", "70001": "Код подтверждения неверен, пожалуйста, введите его снова.", "80001": "Задача не была успешно добавлена в очередь, пожалуйста, попробуйте позже.", "undefined": "Произошла ошибка в системе, пожалуйста, попробуйте позже." diff --git a/apps/user/locales/th-TH/common.json b/apps/user/locales/th-TH/common.json index 8356706..d93434d 100644 --- a/apps/user/locales/th-TH/common.json +++ b/apps/user/locales/th-TH/common.json @@ -47,6 +47,7 @@ "60002": "ไม่สามารถใช้การสมัครสมาชิกนี้ได้ในขณะนี้ กรุณาลองใหม่อีกครั้งในภายหลัง", "60003": "ตรวจพบการสมัครสมาชิกที่มีอยู่ กรุณายกเลิกก่อนดำเนินการต่อ", "60004": "ไม่สามารถลบได้ในขณะนี้เนื่องจากการสมัครมีผู้ใช้ที่ใช้งานอยู่", + "60005": "โหมดการสมัครสมาชิกเดี่ยวเกินขีดจำกัดจำนวนผู้ใช้แล้ว.", "70001": "รหัสยืนยันไม่ถูกต้อง กรุณาใส่ใหม่อีกครั้ง", "80001": "งานไม่สำเร็จในการเข้าคิว กรุณาลองใหม่อีกครั้งในภายหลัง", "undefined": "ระบบเกิดข้อผิดพลาด กรุณาลองใหม่อีกครั้งในภายหลัง" diff --git a/apps/user/locales/tr-TR/common.json b/apps/user/locales/tr-TR/common.json index 95034a8..1d8a460 100644 --- a/apps/user/locales/tr-TR/common.json +++ b/apps/user/locales/tr-TR/common.json @@ -47,6 +47,7 @@ "60002": "Bu abonelik şu anda kullanılamıyor, lütfen daha sonra tekrar deneyin.", "60003": "Mevcut bir abonelik tespit edildi. Lütfen devam etmeden önce iptal edin.", "60004": "Aboneliğin aktif kullanıcıları olduğu için şu anda silinemiyor.", + "60005": "Tekli abonelik moduğu kullanıcı sınırını aştı.", "70001": "Doğrulama kodu hatalı, lütfen tekrar girin.", "80001": "Görev sıraya başarıyla eklenemedi, lütfen daha sonra tekrar deneyin.", "undefined": "Sistem hatası oluştu, lütfen daha sonra tekrar deneyin." diff --git a/apps/user/locales/uk-UA/common.json b/apps/user/locales/uk-UA/common.json index 51418db..2b877fd 100644 --- a/apps/user/locales/uk-UA/common.json +++ b/apps/user/locales/uk-UA/common.json @@ -47,6 +47,7 @@ "60002": "Тимчасово неможливо використовувати цю підписку, будь ласка, спробуйте пізніше.", "60003": "Виявлено існуючу підписку. Будь ласка, скасуйте її перед продовженням.", "60004": "Неможливо видалити, оскільки підписка має активних користувачів.", + "60005": "Режим однієї підписки перевищив ліміт користувачів.", "70001": "Код перевірки неправильний, будь ласка, введіть знову.", "80001": "Завдання не вдалося додати до черги, будь ласка, спробуйте пізніше.", "undefined": "Сталася системна помилка, будь ласка, спробуйте пізніше." diff --git a/apps/user/locales/vi-VN/common.json b/apps/user/locales/vi-VN/common.json index 32a736e..23fc776 100644 --- a/apps/user/locales/vi-VN/common.json +++ b/apps/user/locales/vi-VN/common.json @@ -47,6 +47,7 @@ "60002": "Tạm thời không thể sử dụng đăng ký này, vui lòng thử lại sau.", "60003": "Phát hiện đăng ký hiện có. Vui lòng hủy trước khi tiếp tục.", "60004": "Không thể xóa vào lúc này vì đăng ký có người dùng đang hoạt động.", + "60005": "Chế độ đăng ký đơn đã vượt quá giới hạn người dùng.", "70001": "Mã xác nhận không chính xác, vui lòng nhập lại.", "80001": "Nhiệm vụ không được thêm vào hàng đợi thành công, vui lòng thử lại sau.", "undefined": "Hệ thống xảy ra lỗi, vui lòng thử lại sau." diff --git a/apps/user/locales/zh-CN/common.json b/apps/user/locales/zh-CN/common.json index abc066d..a3ccc4c 100644 --- a/apps/user/locales/zh-CN/common.json +++ b/apps/user/locales/zh-CN/common.json @@ -47,6 +47,7 @@ "60002": "暂时无法使用该订阅,请稍后再试。", "60003": "检测到已有订阅。请取消后再继续。", "60004": "暂时无法删除,订阅存在正常激活的用户。", + "60005": "单一订阅模式已超出用户上限。", "70001": "验证码有误,请重新输入。", "80001": "任务未成功加入队列,请稍后重试。", "undefined": "系统发生错误,请稍后重试" diff --git a/apps/user/locales/zh-HK/common.json b/apps/user/locales/zh-HK/common.json index 185e561..c6d0942 100644 --- a/apps/user/locales/zh-HK/common.json +++ b/apps/user/locales/zh-HK/common.json @@ -47,6 +47,7 @@ "60002": "暫時無法使用該訂閱,請稍後再試。", "60003": "偵測到現有訂閱。請取消後再繼續。", "60004": "暫時無法刪除,訂閱存在正常啟用的用戶。", + "60005": "單一訂閱模式已超出用戶上限。", "70001": "驗證碼有誤,請重新輸入。", "80001": "任務未成功加入隊列,請稍後重試。", "undefined": "系統發生錯誤,請稍後重試" diff --git a/apps/user/package.json b/apps/user/package.json index e4983ef..171f5a6 100644 --- a/apps/user/package.json +++ b/apps/user/package.json @@ -74,7 +74,7 @@ "zh-CN", "zh-HK" ], - "modelName": "gpt-4o", + "modelName": "gpt-4o-mini", "experimental": { "jsonMode": true }, diff --git a/apps/user/services/common/oauth.ts b/apps/user/services/common/oauth.ts index e4151da..a298049 100644 --- a/apps/user/services/common/oauth.ts +++ b/apps/user/services/common/oauth.ts @@ -32,6 +32,7 @@ export async function appleLoginCallback( return request('/v1/auth/oauth/callback/apple', { method: 'POST', data: formData, + requestType: 'form', ...(options || {}), }); } diff --git a/apps/user/services/common/typings.d.ts b/apps/user/services/common/typings.d.ts index 493f3bd..94204c3 100644 --- a/apps/user/services/common/typings.d.ts +++ b/apps/user/services/common/typings.d.ts @@ -64,15 +64,16 @@ declare namespace API { }; type AuthConfig = { - sms: SmsAuthenticateConfig; + sms: MobileAuthenticateConfig; email: EmailAuthticateConfig; register: RegisterConfig; }; - type AuthMethod = { - auth_type: string; - auth_identifier: string; - verified: boolean; + type AuthMethodConfig = { + id: number; + method: string; + config: Record; + enabled: boolean; }; type CheckUserParams = { @@ -124,26 +125,10 @@ declare namespace API { }; type EmailAuthticateConfig = { - email_enabled: boolean; - email_enable_verify: boolean; - email_enable_domain_suffix: boolean; - email_domain_suffix_list: string; - }; - - type EmailSmtpConfig = { - email_enabled: boolean; - email_smtp_host: string; - email_smtp_port: number; - email_smtp_user: string; - email_smtp_pass: string; - email_smtp_from: string; - email_smtp_ssl: boolean; - verify_email_template: string; - maintenance_email_template: string; - expiration_email_template: string; - email_enable_verify: boolean; - email_enable_domain_suffix: boolean; - email_domain_suffix_list: string; + enable: boolean; + enable_verify: boolean; + enable_domain_suffix: boolean; + domain_suffix_list: string; }; type Follow = { @@ -213,6 +198,13 @@ declare namespace API { token: string; }; + type MobileAuthenticateConfig = { + enable: boolean; + limit: number; + interval: number; + expire_time: number; + }; + type NodeConfig = { node_secret: string; node_pull_interval: number; @@ -247,16 +239,6 @@ declare namespace API { redirect: string; }; - type OAuthMethod = { - id: number; - platform: string; - config: Record; - redirect: string; - enabled: boolean; - created_at: number; - updated_at: number; - }; - type OnlineUser = { uid: number; ip: string; @@ -399,6 +381,16 @@ declare namespace API { updated_at: number; }; + type ServerRuleGroup = { + id: number; + name: string; + icon: string; + description: string; + enable: boolean; + created_at: number; + updated_at: number; + }; + type ServerStatus = { cpu: number; mem: number; @@ -419,26 +411,6 @@ declare namespace API { site_logo: string; }; - type SmsAuthenticateConfig = { - sms_enabled: boolean; - sms_limit: number; - sms_interval: number; - sms_expire_time: number; - }; - - type SmsConfig = { - sms_enabled: boolean; - sms_key: string; - sms_secret: string; - sms_template: string; - sms_template_code: string; - sms_template_param: string; - sms_platform: string; - sms_limit: number; - sms_interval: number; - sms_expire_time: number; - }; - type SortItem = { id: number; sort: number; @@ -556,6 +528,16 @@ declare namespace API { tos_content: string; }; + type TrafficLog = { + id: number; + server_id: number; + user_id: number; + subscribe_id: number; + download: number; + upload: number; + timestamp: number; + }; + type TransportConfig = { path: string; host: string; @@ -593,7 +575,8 @@ declare namespace API { enable_login_notify: boolean; enable_subscribe_notify: boolean; enable_trade_notify: boolean; - auth_methods: AuthMethod[]; + auth_methods: UserAuthMethod[]; + user_devices: UserDevice[]; created_at: number; updated_at: number; deleted_at?: number; @@ -607,6 +590,12 @@ declare namespace API { enable: boolean; }; + type UserAuthMethod = { + auth_type: string; + auth_identifier: string; + verified: boolean; + }; + type UserBalanceLog = { id: number; user_id: number; @@ -619,15 +608,24 @@ declare namespace API { type UserDevice = { id: number; - user_id: number; - device_number: string; + ip: string; + imei: string; + user_agent: string; online: boolean; - last_online: number; enabled: boolean; created_at: number; updated_at: number; }; + type UserLoginLog = { + id: number; + user_id: number; + login_ip: string; + user_agent: string; + success: boolean; + created_at: number; + }; + type UserLoginRequest = { email: string; password: string; @@ -660,6 +658,16 @@ declare namespace API { updated_at: number; }; + type UserSubscribeLog = { + id: number; + user_id: number; + user_subscribe_id: number; + token: string; + ip: string; + user_agent: string; + created_at: number; + }; + type VeifyConfig = { turnstile_site_key: string; enable_login_verify: boolean; diff --git a/apps/user/services/user/typings.d.ts b/apps/user/services/user/typings.d.ts index 74bacd2..3a3f33c 100644 --- a/apps/user/services/user/typings.d.ts +++ b/apps/user/services/user/typings.d.ts @@ -58,15 +58,16 @@ declare namespace API { }; type AuthConfig = { - sms: SmsAuthenticateConfig; + sms: MobileAuthenticateConfig; email: EmailAuthticateConfig; register: RegisterConfig; }; - type AuthMethod = { - auth_type: string; - auth_identifier: string; - verified: boolean; + type AuthMethodConfig = { + id: number; + method: string; + config: Record; + enabled: boolean; }; type BindOAuthCallbackRequest = { @@ -155,26 +156,10 @@ declare namespace API { }; type EmailAuthticateConfig = { - email_enabled: boolean; - email_enable_verify: boolean; - email_enable_domain_suffix: boolean; - email_domain_suffix_list: string; - }; - - type EmailSmtpConfig = { - email_enabled: boolean; - email_smtp_host: string; - email_smtp_port: number; - email_smtp_user: string; - email_smtp_pass: string; - email_smtp_from: string; - email_smtp_ssl: boolean; - verify_email_template: string; - maintenance_email_template: string; - expiration_email_template: string; - email_enable_verify: boolean; - email_enable_domain_suffix: boolean; - email_domain_suffix_list: string; + enable: boolean; + enable_verify: boolean; + enable_domain_suffix: boolean; + domain_suffix_list: string; }; type Follow = { @@ -190,8 +175,38 @@ declare namespace API { list: PaymentConfig[]; }; + type GetLoginLogParams = { + page: number; + size: number; + }; + + type GetLoginLogRequest = { + page: number; + size: number; + }; + + type GetLoginLogResponse = { + list: UserLoginLog[]; + total: number; + }; + type GetOAuthMethodsResponse = { - methods: AuthMethod[]; + methods: UserAuthMethod[]; + }; + + type GetSubscribeLogParams = { + page: number; + size: number; + }; + + type GetSubscribeLogRequest = { + page: number; + size: number; + }; + + type GetSubscribeLogResponse = { + list: UserSubscribeLog[]; + total: number; }; type GetUserTicketDetailRequest = { @@ -235,6 +250,13 @@ declare namespace API { only_first_purchase: boolean; }; + type MobileAuthenticateConfig = { + enable: boolean; + limit: number; + interval: number; + expire_time: number; + }; + type NodeConfig = { node_secret: string; node_pull_interval: number; @@ -253,16 +275,6 @@ declare namespace API { last_at: number; }; - type OAuthMethod = { - id: number; - platform: string; - config: Record; - redirect: string; - enabled: boolean; - created_at: number; - updated_at: number; - }; - type OnlineUser = { uid: number; ip: string; @@ -559,6 +571,16 @@ declare namespace API { updated_at: number; }; + type ServerRuleGroup = { + id: number; + name: string; + icon: string; + description: string; + enable: boolean; + created_at: number; + updated_at: number; + }; + type ServerStatus = { cpu: number; mem: number; @@ -579,26 +601,6 @@ declare namespace API { site_logo: string; }; - type SmsAuthenticateConfig = { - sms_enabled: boolean; - sms_limit: number; - sms_interval: number; - sms_expire_time: number; - }; - - type SmsConfig = { - sms_enabled: boolean; - sms_key: string; - sms_secret: string; - sms_template: string; - sms_template_code: string; - sms_template_param: string; - sms_platform: string; - sms_limit: number; - sms_interval: number; - sms_expire_time: number; - }; - type SortItem = { id: number; sort: number; @@ -689,6 +691,16 @@ declare namespace API { tos_content: string; }; + type TrafficLog = { + id: number; + server_id: number; + user_id: number; + subscribe_id: number; + download: number; + upload: number; + timestamp: number; + }; + type TransportConfig = { path: string; host: string; @@ -717,18 +729,14 @@ declare namespace API { }; type UpdateUserNotifyRequest = { + enable_email_notify: boolean; + enable_telegram_notify: boolean; enable_balance_notify: boolean; enable_login_notify: boolean; enable_subscribe_notify: boolean; enable_trade_notify: boolean; }; - type UpdateUserNotifySettingRequet = { - telegram: number; - enable_email_notify: boolean; - enable_telegram_notify: boolean; - }; - type UpdateUserPasswordRequest = { password: string; }; @@ -756,7 +764,8 @@ declare namespace API { enable_login_notify: boolean; enable_subscribe_notify: boolean; enable_trade_notify: boolean; - auth_methods: AuthMethod[]; + auth_methods: UserAuthMethod[]; + user_devices: UserDevice[]; created_at: number; updated_at: number; deleted_at?: number; @@ -770,6 +779,12 @@ declare namespace API { enable: boolean; }; + type UserAuthMethod = { + auth_type: string; + auth_identifier: string; + verified: boolean; + }; + type UserBalanceLog = { id: number; user_id: number; @@ -782,15 +797,24 @@ declare namespace API { type UserDevice = { id: number; - user_id: number; - device_number: string; + ip: string; + imei: string; + user_agent: string; online: boolean; - last_online: number; enabled: boolean; created_at: number; updated_at: number; }; + type UserLoginLog = { + id: number; + user_id: number; + login_ip: string; + user_agent: string; + success: boolean; + created_at: number; + }; + type UserSubscribe = { id: number; user_id: number; @@ -809,6 +833,16 @@ declare namespace API { updated_at: number; }; + type UserSubscribeLog = { + id: number; + user_id: number; + user_subscribe_id: number; + token: string; + ip: string; + user_agent: string; + created_at: number; + }; + type VerifyConfig = { turnstile_site_key: string; turnstile_secret: string; diff --git a/apps/user/services/user/user.ts b/apps/user/services/user/user.ts index c794aca..059da83 100644 --- a/apps/user/services/user/user.ts +++ b/apps/user/services/user/user.ts @@ -106,6 +106,21 @@ export async function queryUserInfo(options?: { [key: string]: any }) { }); } +/** Get Login Log GET /v1/public/user/login_log */ +export async function getLoginLog( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.GetLoginLogParams, + options?: { [key: string]: any }, +) { + return request('/v1/public/user/login_log', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); +} + /** Update User Notify PUT /v1/public/user/notify */ export async function updateUserNotify( body: API.UpdateUserNotifyRequest, @@ -121,21 +136,6 @@ export async function updateUserNotify( }); } -/** Update User Notify Setting PUT /v1/public/user/notify_setting */ -export async function updateUserNotifySetting( - body: API.UpdateUserNotifySettingRequet, - options?: { [key: string]: any }, -) { - return request('/v1/public/user/notify_setting', { - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - }, - data: body, - ...(options || {}), - }); -} - /** Get OAuth Methods GET /v1/public/user/oauth_methods */ export async function getOAuthMethods(options?: { [key: string]: any }) { return request( @@ -173,6 +173,24 @@ export async function queryUserSubscribe(options?: { [key: string]: any }) { ); } +/** Get Subscribe Log GET /v1/public/user/subscribe_log */ +export async function getSubscribeLog( + // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) + params: API.GetSubscribeLogParams, + options?: { [key: string]: any }, +) { + return request( + '/v1/public/user/subscribe_log', + { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }, + ); +} + /** Reset User Subscribe Token PUT /v1/public/user/subscribe_token */ export async function resetUserSubscribeToken( body: API.ResetUserSubscribeTokenRequest, diff --git a/packages/ui/src/custom-components/date-picker.tsx b/packages/ui/src/custom-components/date-picker.tsx index 841cc25..6ed2479 100644 --- a/packages/ui/src/custom-components/date-picker.tsx +++ b/packages/ui/src/custom-components/date-picker.tsx @@ -23,7 +23,7 @@ export function DatePicker({ const handleSelect = (selectedDate: Date | undefined) => { setDate(selectedDate); if (onChange) { - onChange(selectedDate?.getTime()); + onChange(selectedDate?.getTime() || 0); } };