🐛 fix: Add localization updates and new utility functions

This commit is contained in:
web 2025-09-04 22:30:33 -07:00
parent e4fbd5c754
commit 4da59609b4
54 changed files with 424 additions and 112 deletions

View File

@ -2,11 +2,11 @@
import { ProTable, ProTableActions } from '@/components/pro-table'; import { ProTable, ProTableActions } from '@/components/pro-table';
import { createAds, deleteAds, getAdsList, updateAds } from '@/services/admin/ads'; import { createAds, deleteAds, getAdsList, updateAds } from '@/services/admin/ads';
import { formatDate } from '@/utils/common';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useRef, useState } from 'react'; import { useRef, useState } from 'react';
import { toast } from 'sonner'; import { toast } from 'sonner';

View File

@ -10,12 +10,12 @@ import {
updateCoupon, updateCoupon,
} from '@/services/admin/coupon'; } from '@/services/admin/coupon';
import { getSubscribeList } from '@/services/admin/subscribe'; import { getSubscribeList } from '@/services/admin/subscribe';
import { formatDate } from '@/utils/common';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useRef, useState } from 'react'; import { useRef, useState } from 'react';
import { toast } from 'sonner'; import { toast } from 'sonner';

View File

@ -8,10 +8,10 @@ import {
getDocumentList, getDocumentList,
updateDocument, updateDocument,
} from '@/services/admin/document'; } from '@/services/admin/document';
import { formatDate } from '@/utils/common';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useRef, useState } from 'react'; import { useRef, useState } from 'react';
import { toast } from 'sonner'; import { toast } from 'sonner';

View File

@ -3,7 +3,7 @@
import { UserDetail } from '@/app/dashboard/user/user-detail'; import { UserDetail } from '@/app/dashboard/user/user-detail';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterBalanceLog } from '@/services/admin/log'; import { filterBalanceLog } from '@/services/admin/log';
import { formatDate } from '@workspace/ui/utils'; import { formatDate } from '@/utils/common';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -3,7 +3,7 @@
import { UserDetail } from '@/app/dashboard/user/user-detail'; import { UserDetail } from '@/app/dashboard/user/user-detail';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterCommissionLog } from '@/services/admin/log'; import { filterCommissionLog } from '@/services/admin/log';
import { formatDate } from '@workspace/ui/utils'; import { formatDate } from '@/utils/common';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -2,8 +2,8 @@
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterEmailLog } from '@/services/admin/log'; import { filterEmailLog } from '@/services/admin/log';
import { formatDate } from '@/utils/common';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -3,7 +3,7 @@
import { UserDetail } from '@/app/dashboard/user/user-detail'; import { UserDetail } from '@/app/dashboard/user/user-detail';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterGiftLog } from '@/services/admin/log'; import { filterGiftLog } from '@/services/admin/log';
import { formatDate } from '@workspace/ui/utils'; import { formatDate } from '@/utils/common';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -4,8 +4,8 @@ import { UserDetail } from '@/app/dashboard/user/user-detail';
import { IpLink } from '@/components/ip-link'; import { IpLink } from '@/components/ip-link';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterLoginLog } from '@/services/admin/log'; import { filterLoginLog } from '@/services/admin/log';
import { formatDate } from '@/utils/common';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -2,8 +2,8 @@
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterMobileLog } from '@/services/admin/log'; import { filterMobileLog } from '@/services/admin/log';
import { formatDate } from '@/utils/common';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';
export default function MobileLogPage() { export default function MobileLogPage() {

View File

@ -4,7 +4,7 @@ import { UserDetail } from '@/app/dashboard/user/user-detail';
import { IpLink } from '@/components/ip-link'; import { IpLink } from '@/components/ip-link';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterRegisterLog } from '@/services/admin/log'; import { filterRegisterLog } from '@/services/admin/log';
import { formatDate } from '@workspace/ui/utils'; import { formatDate } from '@/utils/common';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -3,7 +3,7 @@
import { UserDetail } from '@/app/dashboard/user/user-detail'; import { UserDetail } from '@/app/dashboard/user/user-detail';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterResetSubscribeLog } from '@/services/admin/log'; import { filterResetSubscribeLog } from '@/services/admin/log';
import { formatDate } from '@workspace/ui/utils'; import { formatDate } from '@/utils/common';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -4,7 +4,7 @@ import { UserDetail } from '@/app/dashboard/user/user-detail';
import { IpLink } from '@/components/ip-link'; import { IpLink } from '@/components/ip-link';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterSubscribeLog } from '@/services/admin/log'; import { filterSubscribeLog } from '@/services/admin/log';
import { formatDate } from '@workspace/ui/utils'; import { formatDate } from '@/utils/common';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -3,7 +3,8 @@
import { UserDetail } from '@/app/dashboard/user/user-detail'; import { UserDetail } from '@/app/dashboard/user/user-detail';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { filterTrafficLogDetails } from '@/services/admin/log'; import { filterTrafficLogDetails } from '@/services/admin/log';
import { formatBytes, formatDate } from '@workspace/ui/utils'; import { formatDate } from '@/utils/common';
import { formatBytes } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -6,6 +6,7 @@ import {
getBatchSendEmailTaskStatus, getBatchSendEmailTaskStatus,
stopBatchSendEmailTask, stopBatchSendEmailTask,
} from '@/services/admin/marketing'; } from '@/services/admin/marketing';
import { formatDate } from '@/utils/common';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { import {
@ -24,7 +25,6 @@ import {
SheetTrigger, SheetTrigger,
} from '@workspace/ui/components/sheet'; } from '@workspace/ui/components/sheet';
import { Icon } from '@workspace/ui/custom-components/icon'; import { Icon } from '@workspace/ui/custom-components/icon';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useState } from 'react'; import { useState } from 'react';
import { toast } from 'sonner'; import { toast } from 'sonner';

View File

@ -9,13 +9,13 @@ import { Display } from '@/components/display';
import { ProTable, ProTableActions } from '@/components/pro-table'; import { ProTable, ProTableActions } from '@/components/pro-table';
import { getOrderList, updateOrderStatus } from '@/services/admin/order'; import { getOrderList, updateOrderStatus } from '@/services/admin/order';
import { getSubscribeList } from '@/services/admin/subscribe'; import { getSubscribeList } from '@/services/admin/subscribe';
import { formatDate } from '@/utils/common';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { HoverCard, HoverCardContent, HoverCardTrigger } from '@workspace/ui/components/hover-card'; import { HoverCard, HoverCardContent, HoverCardTrigger } from '@workspace/ui/components/hover-card';
import { Separator } from '@workspace/ui/components/separator'; import { Separator } from '@workspace/ui/components/separator';
import { Combobox } from '@workspace/ui/custom-components/combobox'; import { Combobox } from '@workspace/ui/custom-components/combobox';
import { cn } from '@workspace/ui/lib/utils'; import { cn } from '@workspace/ui/lib/utils';
import { formatDate } from '@workspace/ui/utils';
import { UserDetail } from '../user/user-detail'; import { UserDetail } from '../user/user-detail';
export default function Page() { export default function Page() {

View File

@ -4,6 +4,7 @@ import { UserDetail } from '@/app/dashboard/user/user-detail';
import { IpLink } from '@/components/ip-link'; import { IpLink } from '@/components/ip-link';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { getUserSubscribeById } from '@/services/admin/user'; import { getUserSubscribeById } from '@/services/admin/user';
import { formatDate } from '@/utils/common';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { import {
@ -13,7 +14,7 @@ import {
SheetTitle, SheetTitle,
SheetTrigger, SheetTrigger,
} from '@workspace/ui/components/sheet'; } from '@workspace/ui/components/sheet';
import { formatBytes, formatDate } from '@workspace/ui/utils'; import { formatBytes } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useState } from 'react'; import { useState } from 'react';
@ -113,7 +114,7 @@ export default function OnlineUsersCell({ status }: { status?: API.ServerStatus
{ips.map((item, i) => ( {ips.map((item, i) => (
<div className='whitespace-nowrap text-sm' key={i}> <div className='whitespace-nowrap text-sm' key={i}>
<Badge>{item.protocol}</Badge> <Badge>{item.protocol}</Badge>
<IpLink ip={item.ip} className='font-medium' /> <IpLink ip={item.ip} className='ml-1 font-medium' />
</div> </div>
))} ))}
</div> </div>

View File

@ -7,6 +7,7 @@ import {
getTicketList, getTicketList,
updateTicketStatus, updateTicketStatus,
} from '@/services/admin/ticket'; } from '@/services/admin/ticket';
import { formatDate } from '@/utils/common';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { import {
@ -23,7 +24,6 @@ import { ScrollArea } from '@workspace/ui/components/scroll-area';
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
import { Icon } from '@workspace/ui/custom-components/icon'; import { Icon } from '@workspace/ui/custom-components/icon';
import { cn } from '@workspace/ui/lib/utils'; import { cn } from '@workspace/ui/lib/utils';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useEffect, useRef, useState } from 'react'; import { useEffect, useRef, useState } from 'react';
import { toast } from 'sonner'; import { toast } from 'sonner';

View File

@ -1,6 +1,7 @@
'use client'; 'use client';
import { getSystemLog, getVersion, restartSystem } from '@/services/admin/tool'; import { getSystemLog, getVersion, restartSystem } from '@/services/admin/tool';
import { formatDate } from '@/utils/common';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { import {
Accordion, Accordion,
@ -29,7 +30,6 @@ import {
} from '@workspace/ui/components/card'; } from '@workspace/ui/components/card';
import { ScrollArea } from '@workspace/ui/components/scroll-area'; import { ScrollArea } from '@workspace/ui/components/scroll-area';
import { Icon } from '@workspace/ui/custom-components/icon'; import { Icon } from '@workspace/ui/custom-components/icon';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useState } from 'react'; import { useState } from 'react';
import packageJson from '../../../../../package.json'; import packageJson from '../../../../../package.json';

View File

@ -10,6 +10,7 @@ import {
getUserList, getUserList,
updateUserBasicInfo, updateUserBasicInfo,
} from '@/services/admin/user'; } from '@/services/admin/user';
import { formatDate } from '@/utils/common';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
@ -30,7 +31,6 @@ import {
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import Link from 'next/link'; import Link from 'next/link';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';

View File

@ -2,10 +2,11 @@
import { Display } from '@/components/display'; import { Display } from '@/components/display';
import { getUserDetail, getUserSubscribeById } from '@/services/admin/user'; import { getUserDetail, getUserSubscribeById } from '@/services/admin/user';
import { formatDate } from '@/utils/common';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { HoverCard, HoverCardContent, HoverCardTrigger } from '@workspace/ui/components/hover-card'; import { HoverCard, HoverCardContent, HoverCardTrigger } from '@workspace/ui/components/hover-card';
import { formatBytes, formatDate } from '@workspace/ui/utils'; import { formatBytes } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import Link from 'next/link'; import Link from 'next/link';

View File

@ -8,6 +8,7 @@ import {
getUserSubscribe, getUserSubscribe,
updateUserSubscribe, updateUserSubscribe,
} from '@/services/admin/user'; } from '@/services/admin/user';
import { formatDate } from '@/utils/common';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { import {
DropdownMenu, DropdownMenu,
@ -16,7 +17,6 @@ import {
DropdownMenuTrigger, DropdownMenuTrigger,
} from '@workspace/ui/components/dropdown-menu'; } from '@workspace/ui/components/dropdown-menu';
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import Link from 'next/link'; import Link from 'next/link';
import { useRef, useState } from 'react'; import { useRef, useState } from 'react';

View File

@ -3,6 +3,7 @@
import { IpLink } from '@/components/ip-link'; import { IpLink } from '@/components/ip-link';
import { ProTable } from '@/components/pro-table'; import { ProTable } from '@/components/pro-table';
import { getUserSubscribeDevices, kickOfflineByUserDevice } from '@/services/admin/user'; import { getUserSubscribeDevices, kickOfflineByUserDevice } from '@/services/admin/user';
import { formatDate } from '@/utils/common';
import { Badge } from '@workspace/ui/components/badge'; import { Badge } from '@workspace/ui/components/badge';
import { Button } from '@workspace/ui/components/button'; import { Button } from '@workspace/ui/components/button';
import { import {
@ -14,7 +15,6 @@ import {
} from '@workspace/ui/components/sheet'; } from '@workspace/ui/components/sheet';
import { Switch } from '@workspace/ui/components/switch'; import { Switch } from '@workspace/ui/components/switch';
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button'; import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
import { formatDate } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { ReactNode, useState } from 'react'; import { ReactNode, useState } from 'react';
import { toast } from 'sonner'; import { toast } from 'sonner';

View File

@ -27,14 +27,14 @@ import { UserStatisticsCard } from './user-statistics-card';
export default function Statistics() { export default function Statistics() {
const t = useTranslations('index'); const t = useTranslations('index');
const { data: TicketTotal } = useQuery({ const { data: TicketTotal, isLoading: ticketLoading } = useQuery({
queryKey: ['queryTicketWaitReply'], queryKey: ['queryTicketWaitReply'],
queryFn: async () => { queryFn: async () => {
const { data } = await queryTicketWaitReply(); const { data } = await queryTicketWaitReply();
return data.data?.count; return data.data?.count;
}, },
}); });
const { data: ServerTotal } = useQuery({ const { data: ServerTotal, isLoading: serverLoading } = useQuery({
queryKey: ['queryServerTotalData'], queryKey: ['queryServerTotalData'],
queryFn: async () => { queryFn: async () => {
const { data } = await queryServerTotalData(); const { data } = await queryServerTotalData();
@ -42,6 +42,8 @@ export default function Statistics() {
}, },
}); });
const isLoading = ticketLoading || serverLoading;
const [dataType, setDataType] = useState<string | 'nodes' | 'users'>('nodes'); const [dataType, setDataType] = useState<string | 'nodes' | 'users'>('nodes');
const [timeFrame, setTimeFrame] = useState<string | 'today' | 'yesterday'>('today'); const [timeFrame, setTimeFrame] = useState<string | 'today' | 'yesterday'>('today');
@ -76,61 +78,75 @@ export default function Statistics() {
return ( return (
<> <>
<div className='grid grid-cols-2 gap-2 md:grid-cols-4'> <div className='grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-5'>
{[ {[
{ {
title: t('onlineUsersCount'), title: t('onlineUsersCount'),
value: ServerTotal?.online_users || 0, value: ServerTotal?.online_users || 0,
subtitle: t('currentlyOnline'),
icon: 'uil:users-alt', icon: 'uil:users-alt',
href: '/dashboard/servers', href: '/dashboard/servers',
color: 'text-blue-600 dark:text-blue-400',
iconBg: 'bg-blue-100 dark:bg-blue-900/30',
}, },
{ {
title: t('onlineNodeCount'), title: t('totalServers'),
value: ServerTotal?.online_servers || 0, value: (ServerTotal?.online_servers || 0) + (ServerTotal?.offline_servers || 0),
subtitle: `${t('online')} ${ServerTotal?.online_servers || 0} ${t('offline')} ${ServerTotal?.offline_servers || 0}`,
icon: 'uil:server-network', icon: 'uil:server-network',
href: '/dashboard/servers', href: '/dashboard/servers',
color: 'text-green-600 dark:text-green-400',
iconBg: 'bg-green-100 dark:bg-green-900/30',
}, },
{ {
title: t('offlineNodeCount'), title: t('todayTraffic'),
value: ServerTotal?.offline_servers || 0, value: formatBytes(
icon: 'uil:server-network-alt', (ServerTotal?.today_upload || 0) + (ServerTotal?.today_download || 0),
href: '/dashboard/servers', ),
subtitle: `${formatBytes(ServerTotal?.today_upload || 0)}${formatBytes(ServerTotal?.today_download || 0)}`,
icon: 'uil:exchange-alt',
color: 'text-purple-600 dark:text-purple-400',
iconBg: 'bg-purple-100 dark:bg-purple-900/30',
},
{
title: t('monthTraffic'),
value: formatBytes(
(ServerTotal?.monthly_upload || 0) + (ServerTotal?.monthly_download || 0),
),
subtitle: `${formatBytes(ServerTotal?.monthly_upload || 0)}${formatBytes(ServerTotal?.monthly_download || 0)}`,
icon: 'uil:cloud-data-connection',
color: 'text-orange-600 dark:text-orange-400',
iconBg: 'bg-orange-100 dark:bg-orange-900/30',
}, },
{ {
title: t('pendingTickets'), title: t('pendingTickets'),
value: TicketTotal || 0, value: TicketTotal || 0,
subtitle: t('pending'),
icon: 'uil:clipboard-notes', icon: 'uil:clipboard-notes',
href: '/dashboard/ticket', href: '/dashboard/ticket',
}, color: 'text-red-600 dark:text-red-400',
{ iconBg: 'bg-red-100 dark:bg-red-900/30',
title: t('todayUploadTraffic'),
value: formatBytes(ServerTotal?.today_upload || 0),
icon: 'uil:arrow-up',
},
{
title: t('todayDownloadTraffic'),
value: formatBytes(ServerTotal?.today_download || 0),
icon: 'uil:arrow-down',
},
{
title: t('monthUploadTraffic'),
value: formatBytes(ServerTotal?.monthly_upload || 0),
icon: 'uil:cloud-upload',
},
{
title: t('monthDownloadTraffic'),
value: formatBytes(ServerTotal?.monthly_download || 0),
icon: 'uil:cloud-download',
}, },
].map((item, index) => ( ].map((item, index) => (
<Link href={item.href || '#'} key={index}> <Link
<Card className='cursor-pointer'> href={item.href || '#'}
<CardHeader className='p-4'> key={index}
<CardTitle>{item.title}</CardTitle> className={!item.href ? 'pointer-events-none' : ''}
</CardHeader> >
<CardContent className='flex justify-between p-4 text-xl'> <Card className={`group ${item.href ? 'cursor-pointer' : ''}`}>
<Icon icon={item.icon} className='text-muted-foreground' /> <CardContent className='p-6'>
<div className='text-xl font-bold tabular-nums leading-none'>{item.value}</div> <div className='flex items-center justify-between'>
<div className='flex-1'>
<p className='text-muted-foreground mb-2 text-sm font-medium'>{item.title}</p>
<div className={`text-2xl font-bold ${item.color} mb-1`}>{item.value}</div>
<div className={`text-muted-foreground h-4 text-xs`}>{item.subtitle}</div>
</div>
<div
className={`rounded-full p-3 ${item.iconBg} transition-transform duration-300 group-hover:scale-110`}
>
<Icon icon={item.icon} className={`h-6 w-6 ${item.color}`} />
</div>
</div>
</CardContent> </CardContent>
</Card> </Card>
</Link> </Link>

View File

@ -192,8 +192,8 @@ export function UserStatisticsCard() {
tickMargin={10} tickMargin={10}
axisLine={false} axisLine={false}
tickFormatter={(value) => { tickFormatter={(value) => {
// value format: "YYYY-MM-DD" const [year, month, day] = value.split('-');
return new Date(value).toLocaleDateString(locale, { return new Date(year, month - 1, day).toLocaleDateString(locale, {
month: 'short', month: 'short',
day: 'numeric', day: 'numeric',
}); });

View File

@ -15,6 +15,7 @@ import { usePathname } from 'next/navigation';
import { Fragment, useMemo } from 'react'; import { Fragment, useMemo } from 'react';
import LanguageSwitch from './language-switch'; import LanguageSwitch from './language-switch';
import ThemeSwitch from './theme-switch'; import ThemeSwitch from './theme-switch';
import TimezoneSwitch from './timezone-switch';
import { UserNav } from './user-nav'; import { UserNav } from './user-nav';
export function Header() { export function Header() {
@ -48,6 +49,7 @@ export function Header() {
</div> </div>
<div className='flex items-center gap-2 px-3'> <div className='flex items-center gap-2 px-3'>
<LanguageSwitch /> <LanguageSwitch />
<TimezoneSwitch />
<ThemeSwitch /> <ThemeSwitch />
<UserNav /> <UserNav />
</div> </div>

View File

@ -0,0 +1,129 @@
'use client';
import { Button } from '@workspace/ui/components/button';
import { Command, CommandInput, CommandItem, CommandList } from '@workspace/ui/components/command';
import { Popover, PopoverContent, PopoverTrigger } from '@workspace/ui/components/popover';
import { Icon } from '@workspace/ui/custom-components/icon';
import { cn } from '@workspace/ui/lib/utils';
import { useMemo, useState } from 'react';
interface TimezoneOption {
value: string;
label: string;
offset: string;
}
function getAllTimezones(): TimezoneOption[] {
try {
const timeZones = Intl.supportedValuesOf('timeZone');
return [
{
value: 'UTC',
label: 'UTC',
offset: '+00:00',
},
].concat(
timeZones
.map((tz) => {
const parts = tz.split('/');
let label = tz;
if (parts.length >= 2) {
const region = parts[0];
const city = parts[1]?.replace(/_/g, ' ') || '';
label = `${city} (${region})`;
}
return {
value: tz,
label: label,
offset: getTimezoneOffset(tz),
};
})
.sort((a, b) => a.label.localeCompare(b.label)),
);
} catch {
return [
{
value: 'UTC',
label: 'UTC',
offset: '+00:00',
},
];
}
}
function getTimezoneOffset(timezone: string): string {
try {
const now = new Date();
const utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);
const targetTime = new Date(utc.toLocaleString('en-US', { timeZone: timezone }));
const offset = (targetTime.getTime() - utc.getTime()) / (1000 * 60 * 60);
const sign = offset >= 0 ? '+' : '-';
const hours = Math.floor(Math.abs(offset));
const minutes = Math.floor((Math.abs(offset) - hours) * 60);
return `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
} catch {
return '+00:00';
}
}
export default function TimezoneSwitch() {
const [timezone, setTimezone] = useState<string>('UTC');
const [open, setOpen] = useState(false);
const timezoneOptions = useMemo(() => getAllTimezones(), []);
const handleTimezoneChange = (newTimezone: string) => {
setTimezone(newTimezone);
localStorage.setItem('timezone', newTimezone);
setOpen(false);
window.dispatchEvent(
new CustomEvent('timezoneChanged', {
detail: { timezone: newTimezone },
}),
);
};
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button variant='ghost' size='icon' className='p-0'>
<Icon icon='flat-color-icons:overtime' className='!size-6' />
</Button>
</PopoverTrigger>
<PopoverContent className='w-80 p-0' align='end'>
<Command>
<CommandInput placeholder='Search...' />
<CommandList>
{timezoneOptions.map((option) => (
<CommandItem
key={option.value}
value={`${option.label} ${option.value}`}
onSelect={() => handleTimezoneChange(option.value)}
>
<div className='flex w-full items-center gap-3'>
<div className='flex flex-1 flex-col'>
<span className='font-medium'>{option.label}</span>
<span className='text-muted-foreground text-xs'>
{option.value} {option.offset}
</span>
</div>
<Icon
icon='uil:check'
className={cn(
'h-4 w-4',
timezone === option.value ? 'opacity-100' : 'opacity-0',
)}
/>
</div>
</CommandItem>
))}
</CommandList>
</Command>
</PopoverContent>
</Popover>
);
}

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Aktuálně online",
"email": "e-mail", "email": "e-mail",
"month": "Tento měsíc", "month": "Tento měsíc",
"monthDownloadTraffic": "Měsíční objem stažených dat", "monthDownloadTraffic": "Měsíční objem stažených dat",
"monthTraffic": "Trafik tohoto měsíce",
"monthUploadTraffic": "Tento měsíc nahraný provoz", "monthUploadTraffic": "Tento měsíc nahraný provoz",
"newPurchase": "Nový nákup", "newPurchase": "Nový nákup",
"nodeTraffic": "Provoz uzlu", "nodeTraffic": "Provoz uzlu",
"nodes": "uzly", "nodes": "uzly",
"offlineNodeCount": "Počet offline uzlů", "offline": "Offline",
"onlineNodeCount": "Počet online uzlů", "online": "Online",
"onlineServers": "Online servery",
"onlineUsersCount": "Uživatelé online", "onlineUsersCount": "Uživatelé online",
"pending": "Čekající",
"pendingTickets": "Čekající lístky", "pendingTickets": "Čekající lístky",
"register": "Registrovat se", "register": "Registrovat se",
"repurchase": "opětovný nákup", "repurchase": "opětovný nákup",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Vyberte typ", "selectTypePlaceholder": "Vyberte typ",
"today": "Dnes", "today": "Dnes",
"todayDownloadTraffic": "Dnešní stahovací provoz", "todayDownloadTraffic": "Dnešní stahovací provoz",
"todayTraffic": "Dnešní trafik",
"todayUploadTraffic": "Dnešní nahraný provoz", "todayUploadTraffic": "Dnešní nahraný provoz",
"total": "Celkem", "total": "Celkem",
"totalIncome": "Celkový příjem", "totalIncome": "Celkový příjem",
"totalServers": "Celkový počet serverů",
"traffic": "provoz", "traffic": "provoz",
"trafficRank": "Pořadí návštěvnosti", "trafficRank": "Pořadí návštěvnosti",
"type": "Typ", "type": "Typ",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Derzeit Online",
"email": "E-Mail", "email": "E-Mail",
"month": "Diesen Monat", "month": "Diesen Monat",
"monthDownloadTraffic": "Monatlicher Download-Traffic", "monthDownloadTraffic": "Monatlicher Download-Traffic",
"monthTraffic": "Traffic in diesem Monat",
"monthUploadTraffic": "Diesen Monat hochgeladener Datenverkehr", "monthUploadTraffic": "Diesen Monat hochgeladener Datenverkehr",
"newPurchase": "Neukauf", "newPurchase": "Neukauf",
"nodeTraffic": "Knotenverkehr", "nodeTraffic": "Knotenverkehr",
"nodes": "Knoten", "nodes": "Knoten",
"offlineNodeCount": "Anzahl der Offline-Knoten", "offline": "Offline",
"onlineNodeCount": "Anzahl der Online-Knoten", "online": "Online",
"onlineServers": "Online-Server",
"onlineUsersCount": "Online-Benutzer", "onlineUsersCount": "Online-Benutzer",
"pending": "Ausstehend",
"pendingTickets": "Ausstehende Tickets", "pendingTickets": "Ausstehende Tickets",
"register": "Registrieren", "register": "Registrieren",
"repurchase": "Wiederkauf", "repurchase": "Wiederkauf",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Typ auswählen", "selectTypePlaceholder": "Typ auswählen",
"today": "Heute", "today": "Heute",
"todayDownloadTraffic": "Heutiger Download-Traffic", "todayDownloadTraffic": "Heutiger Download-Traffic",
"todayTraffic": "Traffic heute",
"todayUploadTraffic": "Heutiger Upload-Verkehr", "todayUploadTraffic": "Heutiger Upload-Verkehr",
"total": "Gesamt", "total": "Gesamt",
"totalIncome": "Gesamteinkommen", "totalIncome": "Gesamteinkommen",
"totalServers": "Gesamtanzahl der Server",
"traffic": "Verkehr", "traffic": "Verkehr",
"trafficRank": "Verkehrsrangliste", "trafficRank": "Verkehrsrangliste",
"type": "Typ", "type": "Typ",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Currently Online",
"email": "Email", "email": "Email",
"month": "Month", "month": "Month",
"monthDownloadTraffic": "This Month's Download Traffic", "monthDownloadTraffic": "This Month's Download Traffic",
"monthTraffic": "This Month's Traffic",
"monthUploadTraffic": "This Month's Upload Traffic", "monthUploadTraffic": "This Month's Upload Traffic",
"newPurchase": "New Purchase", "newPurchase": "New Purchase",
"nodeTraffic": "Node Traffic", "nodeTraffic": "Node Traffic",
"nodes": "Nodes", "nodes": "Nodes",
"offlineNodeCount": "Offline Nodes", "offline": "Offline",
"onlineNodeCount": "Online Nodes", "online": "Online",
"onlineServers": "Online Servers",
"onlineUsersCount": "Online Users", "onlineUsersCount": "Online Users",
"pending": "Pending",
"pendingTickets": "Pending Tickets", "pendingTickets": "Pending Tickets",
"register": "Register", "register": "Register",
"repurchase": "Repurchase", "repurchase": "Repurchase",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Select Type", "selectTypePlaceholder": "Select Type",
"today": "Today", "today": "Today",
"todayDownloadTraffic": "Today's Download Traffic", "todayDownloadTraffic": "Today's Download Traffic",
"todayTraffic": "Today's Traffic",
"todayUploadTraffic": "Today's Upload Traffic", "todayUploadTraffic": "Today's Upload Traffic",
"total": "Total", "total": "Total",
"totalIncome": "Total Income", "totalIncome": "Total Income",
"totalServers": "Total Servers",
"traffic": "Traffic", "traffic": "Traffic",
"trafficRank": "Traffic Ranking", "trafficRank": "Traffic Ranking",
"type": "Type", "type": "Type",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Actualmente en línea",
"email": "correo electrónico", "email": "correo electrónico",
"month": "Este mes", "month": "Este mes",
"monthDownloadTraffic": "Tráfico de descarga del mes", "monthDownloadTraffic": "Tráfico de descarga del mes",
"monthTraffic": "Tráfico de este mes",
"monthUploadTraffic": "Tráfico de subida del mes", "monthUploadTraffic": "Tráfico de subida del mes",
"newPurchase": "Nueva compra", "newPurchase": "Nueva compra",
"nodeTraffic": "Tráfico de nodo", "nodeTraffic": "Tráfico de nodo",
"nodes": "nodos", "nodes": "nodos",
"offlineNodeCount": "Número de nodos fuera de línea", "offline": "Desconectado",
"onlineNodeCount": "Número de nodos en línea", "online": "En línea",
"onlineServers": "Servidores en línea",
"onlineUsersCount": "Usuarios en línea", "onlineUsersCount": "Usuarios en línea",
"pending": "Pendiente",
"pendingTickets": "Tickets pendientes", "pendingTickets": "Tickets pendientes",
"register": "registrar", "register": "registrar",
"repurchase": "recompra", "repurchase": "recompra",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Seleccionar tipo", "selectTypePlaceholder": "Seleccionar tipo",
"today": "hoy", "today": "hoy",
"todayDownloadTraffic": "Tráfico de descarga de hoy", "todayDownloadTraffic": "Tráfico de descarga de hoy",
"todayTraffic": "Tráfico de hoy",
"todayUploadTraffic": "Tráfico de subida de hoy", "todayUploadTraffic": "Tráfico de subida de hoy",
"total": "Total", "total": "Total",
"totalIncome": "Ingresos totales", "totalIncome": "Ingresos totales",
"totalServers": "Total de servidores",
"traffic": "tráfico", "traffic": "tráfico",
"trafficRank": "Clasificación de tráfico", "trafficRank": "Clasificación de tráfico",
"type": "tipo", "type": "tipo",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Actualmente en línea",
"email": "correo electrónico", "email": "correo electrónico",
"month": "Este mes", "month": "Este mes",
"monthDownloadTraffic": "Tráfico de descarga del mes", "monthDownloadTraffic": "Tráfico de descarga del mes",
"monthTraffic": "Tráfico de este mes",
"monthUploadTraffic": "Tráfico de carga de este mes", "monthUploadTraffic": "Tráfico de carga de este mes",
"newPurchase": "Nueva compra", "newPurchase": "Nueva compra",
"nodeTraffic": "Tráfico de nodo", "nodeTraffic": "Tráfico de nodo",
"nodes": "nodos", "nodes": "nodos",
"offlineNodeCount": "Número de nodos fuera de línea", "offline": "Desconectado",
"onlineNodeCount": "Número de nodos en línea", "online": "En línea",
"onlineServers": "Servidores en línea",
"onlineUsersCount": "Usuarios en línea", "onlineUsersCount": "Usuarios en línea",
"pending": "Pendiente",
"pendingTickets": "Tickets pendientes", "pendingTickets": "Tickets pendientes",
"register": "Registrarse", "register": "Registrarse",
"repurchase": "recompra", "repurchase": "recompra",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Seleccionar tipo", "selectTypePlaceholder": "Seleccionar tipo",
"today": "hoy", "today": "hoy",
"todayDownloadTraffic": "Tráfico de descarga de hoy", "todayDownloadTraffic": "Tráfico de descarga de hoy",
"todayTraffic": "Tráfico de hoy",
"todayUploadTraffic": "Tráfico de carga de hoy", "todayUploadTraffic": "Tráfico de carga de hoy",
"total": "Total", "total": "Total",
"totalIncome": "Ingreso total", "totalIncome": "Ingreso total",
"totalServers": "Total de servidores",
"traffic": "tráfico", "traffic": "tráfico",
"trafficRank": "Clasificación de tráfico", "trafficRank": "Clasificación de tráfico",
"type": "tipo", "type": "tipo",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "در حال حاضر آنلاین",
"email": "ایمیل", "email": "ایمیل",
"month": "ماه", "month": "ماه",
"monthDownloadTraffic": "ترافیک دانلود این ماه", "monthDownloadTraffic": "ترافیک دانلود این ماه",
"monthTraffic": "ترافیک این ماه",
"monthUploadTraffic": "ترافیک آپلود این ماه", "monthUploadTraffic": "ترافیک آپلود این ماه",
"newPurchase": "خرید جدید", "newPurchase": "خرید جدید",
"nodeTraffic": "ترافیک نود", "nodeTraffic": "ترافیک نود",
"nodes": "گره‌ها", "nodes": "گره‌ها",
"offlineNodeCount": "گره‌های آفلاین", "offline": "آفلاین",
"onlineNodeCount": "گره‌های آنلاین", "online": "آنلاین",
"onlineServers": "سرورهای آنلاین",
"onlineUsersCount": "کاربران آنلاین", "onlineUsersCount": "کاربران آنلاین",
"pending": "در حال انتظار",
"pendingTickets": "بلیط‌های در انتظار", "pendingTickets": "بلیط‌های در انتظار",
"register": "ثبت نام", "register": "ثبت نام",
"repurchase": "بازخرید", "repurchase": "بازخرید",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "نوع را انتخاب کنید", "selectTypePlaceholder": "نوع را انتخاب کنید",
"today": "امروز", "today": "امروز",
"todayDownloadTraffic": "ترافیک دانلود امروز", "todayDownloadTraffic": "ترافیک دانلود امروز",
"todayTraffic": "ترافیک امروز",
"todayUploadTraffic": "ترافیک بارگذاری امروز", "todayUploadTraffic": "ترافیک بارگذاری امروز",
"total": "جمع کل", "total": "جمع کل",
"totalIncome": "کل درآمد", "totalIncome": "کل درآمد",
"totalServers": "کل سرورها",
"traffic": "ترافیک", "traffic": "ترافیک",
"trafficRank": "رتبه ترافیک", "trafficRank": "رتبه ترافیک",
"type": "نوع", "type": "نوع",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Tällä hetkellä verkossa",
"email": "sähköposti", "email": "sähköposti",
"month": "Tämä kuukausi", "month": "Tämä kuukausi",
"monthDownloadTraffic": "Tämän kuukauden latausliikenne", "monthDownloadTraffic": "Tämän kuukauden latausliikenne",
"monthTraffic": "Tämän kuun liikenne",
"monthUploadTraffic": "Tämän kuukauden lähetysliikenne", "monthUploadTraffic": "Tämän kuukauden lähetysliikenne",
"newPurchase": "Uusi osto", "newPurchase": "Uusi osto",
"nodeTraffic": "Solmun liikenne", "nodeTraffic": "Solmun liikenne",
"nodes": "solmut", "nodes": "solmut",
"offlineNodeCount": "Offline-solmujen määrä", "offline": "Poissa käytöstä",
"onlineNodeCount": "Verkossa olevien solmujen määrä", "online": "Verkossa",
"onlineServers": "Verkossa olevat palvelimet",
"onlineUsersCount": "Verkkokäyttäjät", "onlineUsersCount": "Verkkokäyttäjät",
"pending": "Odottaa",
"pendingTickets": "Odottavat liput", "pendingTickets": "Odottavat liput",
"register": "Rekisteröidy", "register": "Rekisteröidy",
"repurchase": "uudelleenosto", "repurchase": "uudelleenosto",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Valitse tyyppi", "selectTypePlaceholder": "Valitse tyyppi",
"today": "tänään", "today": "tänään",
"todayDownloadTraffic": "Tämän päivän latausliikenne", "todayDownloadTraffic": "Tämän päivän latausliikenne",
"todayTraffic": "Tänään liikenne",
"todayUploadTraffic": "Tämän päivän lähetysliikenne", "todayUploadTraffic": "Tämän päivän lähetysliikenne",
"total": "Yhteensä", "total": "Yhteensä",
"totalIncome": "Kokonaistulot", "totalIncome": "Kokonaistulot",
"totalServers": "Yhteensä palvelimia",
"traffic": "liikenne", "traffic": "liikenne",
"trafficRank": "Liikenteen sijoitus", "trafficRank": "Liikenteen sijoitus",
"type": "tyyppi", "type": "tyyppi",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Actuellement en ligne",
"email": "e-mail", "email": "e-mail",
"month": "Ce mois-ci", "month": "Ce mois-ci",
"monthDownloadTraffic": "Trafic de téléchargement ce mois-ci", "monthDownloadTraffic": "Trafic de téléchargement ce mois-ci",
"monthTraffic": "Trafic de ce mois",
"monthUploadTraffic": "Trafic de téléchargement ce mois-ci", "monthUploadTraffic": "Trafic de téléchargement ce mois-ci",
"newPurchase": "Nouvel achat", "newPurchase": "Nouvel achat",
"nodeTraffic": "Trafic du nœud", "nodeTraffic": "Trafic du nœud",
"nodes": "nœuds", "nodes": "nœuds",
"offlineNodeCount": "Nombre de nœuds hors ligne", "offline": "Hors ligne",
"onlineNodeCount": "Nombre de nœuds en ligne", "online": "En ligne",
"onlineServers": "Serveurs en ligne",
"onlineUsersCount": "Utilisateurs en ligne", "onlineUsersCount": "Utilisateurs en ligne",
"pending": "En attente",
"pendingTickets": "Tickets en attente", "pendingTickets": "Tickets en attente",
"register": "S'inscrire", "register": "S'inscrire",
"repurchase": "Rachat", "repurchase": "Rachat",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Sélectionner le type", "selectTypePlaceholder": "Sélectionner le type",
"today": "aujourd'hui", "today": "aujourd'hui",
"todayDownloadTraffic": "Trafic de téléchargement d'aujourd'hui", "todayDownloadTraffic": "Trafic de téléchargement d'aujourd'hui",
"todayTraffic": "Trafic d'aujourd'hui",
"todayUploadTraffic": "Trafic de téléchargement d'aujourd'hui", "todayUploadTraffic": "Trafic de téléchargement d'aujourd'hui",
"total": "Total", "total": "Total",
"totalIncome": "Revenu total", "totalIncome": "Revenu total",
"totalServers": "Total des serveurs",
"traffic": "trafic", "traffic": "trafic",
"trafficRank": "Classement du trafic", "trafficRank": "Classement du trafic",
"type": "Type", "type": "Type",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "वर्तमान में ऑनलाइन",
"email": "ईमेल", "email": "ईमेल",
"month": "इस माह", "month": "इस माह",
"monthDownloadTraffic": "इस महीने की डाउनलोड ट्रैफिक", "monthDownloadTraffic": "इस महीने की डाउनलोड ट्रैफिक",
"monthTraffic": "इस महीने का ट्रैफ़िक",
"monthUploadTraffic": "इस महीने का अपलोड ट्रैफिक", "monthUploadTraffic": "इस महीने का अपलोड ट्रैफिक",
"newPurchase": "नई खरीद", "newPurchase": "नई खरीद",
"nodeTraffic": "नोड ट्रैफिक", "nodeTraffic": "नोड ट्रैफिक",
"nodes": "नोड्स", "nodes": "नोड्स",
"offlineNodeCount": "ऑफ़लाइन नोड की संख्या", "offline": "ऑफ़लाइन",
"onlineNodeCount": "ऑनलाइन नोड की संख्या", "online": "ऑनलाइन",
"onlineServers": "ऑनलाइन सर्वर",
"onlineUsersCount": "ऑनलाइन उपयोगकर्ता", "onlineUsersCount": "ऑनलाइन उपयोगकर्ता",
"pending": "लंबित",
"pendingTickets": "लंबित टिकट", "pendingTickets": "लंबित टिकट",
"register": "पंजीकरण", "register": "पंजीकरण",
"repurchase": "पुनः खरीद", "repurchase": "पुनः खरीद",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "प्रकार चुनें", "selectTypePlaceholder": "प्रकार चुनें",
"today": "आज", "today": "आज",
"todayDownloadTraffic": "आज का डाउनलोड ट्रैफिक", "todayDownloadTraffic": "आज का डाउनलोड ट्रैफिक",
"todayTraffic": "आज का ट्रैफ़िक",
"todayUploadTraffic": "आज का अपलोड ट्रैफिक", "todayUploadTraffic": "आज का अपलोड ट्रैफिक",
"total": "कुल", "total": "कुल",
"totalIncome": "कुल आय", "totalIncome": "कुल आय",
"totalServers": "कुल सर्वर",
"traffic": "ट्रैफिक", "traffic": "ट्रैफिक",
"trafficRank": "ट्रैफिक रैंक", "trafficRank": "ट्रैफिक रैंक",
"type": "प्रकार", "type": "प्रकार",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Jelenleg Online",
"email": "e-mail", "email": "e-mail",
"month": "Ez a hónap", "month": "Ez a hónap",
"monthDownloadTraffic": "Havi letöltési forgalom", "monthDownloadTraffic": "Havi letöltési forgalom",
"monthTraffic": "A hónap forgalma",
"monthUploadTraffic": "Havi feltöltési forgalom", "monthUploadTraffic": "Havi feltöltési forgalom",
"newPurchase": "Új vásárlás", "newPurchase": "Új vásárlás",
"nodeTraffic": "Csomópont forgalom", "nodeTraffic": "Csomópont forgalom",
"nodes": "csomópontok", "nodes": "csomópontok",
"offlineNodeCount": "Offline csomópontok száma", "offline": "Offline",
"onlineNodeCount": "Online csomópontok száma", "online": "Online",
"onlineServers": "Online szerverek",
"onlineUsersCount": "Online Felhasználók", "onlineUsersCount": "Online Felhasználók",
"pending": "Függőben",
"pendingTickets": "Függőben lévő jegyek", "pendingTickets": "Függőben lévő jegyek",
"register": "Regisztráció", "register": "Regisztráció",
"repurchase": "újravásárlás", "repurchase": "újravásárlás",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Válasszon típust", "selectTypePlaceholder": "Válasszon típust",
"today": "ma", "today": "ma",
"todayDownloadTraffic": "Mai letöltési forgalom", "todayDownloadTraffic": "Mai letöltési forgalom",
"todayTraffic": "A mai forgalom",
"todayUploadTraffic": "Mai feltöltési forgalom", "todayUploadTraffic": "Mai feltöltési forgalom",
"total": "Összesen", "total": "Összesen",
"totalIncome": "Összes bevétel", "totalIncome": "Összes bevétel",
"totalServers": "Összes szerver",
"traffic": "forgalom", "traffic": "forgalom",
"trafficRank": "Forgalmi rangsor", "trafficRank": "Forgalmi rangsor",
"type": "típus", "type": "típus",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "現在オンライン",
"email": "メールアドレス", "email": "メールアドレス",
"month": "今月", "month": "今月",
"monthDownloadTraffic": "今月のダウンロードトラフィック", "monthDownloadTraffic": "今月のダウンロードトラフィック",
"monthTraffic": "今月のトラフィック",
"monthUploadTraffic": "今月のアップロードトラフィック", "monthUploadTraffic": "今月のアップロードトラフィック",
"newPurchase": "新規購入", "newPurchase": "新規購入",
"nodeTraffic": "ノードトラフィック", "nodeTraffic": "ノードトラフィック",
"nodes": "ノード", "nodes": "ノード",
"offlineNodeCount": "オフラインノード数", "offline": "オフライン",
"onlineNodeCount": "オンラインノード数", "online": "オンライン",
"onlineServers": "オンラインサーバー",
"onlineUsersCount": "オンラインユーザー", "onlineUsersCount": "オンラインユーザー",
"pending": "保留中",
"pendingTickets": "保留中のチケット", "pendingTickets": "保留中のチケット",
"register": "登録", "register": "登録",
"repurchase": "再購入", "repurchase": "再購入",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "タイプを選択", "selectTypePlaceholder": "タイプを選択",
"today": "今日", "today": "今日",
"todayDownloadTraffic": "本日のダウンロードトラフィック", "todayDownloadTraffic": "本日のダウンロードトラフィック",
"todayTraffic": "今日のトラフィック",
"todayUploadTraffic": "本日のアップロードトラフィック", "todayUploadTraffic": "本日のアップロードトラフィック",
"total": "合計", "total": "合計",
"totalIncome": "総収入", "totalIncome": "総収入",
"totalServers": "総サーバー数",
"traffic": "トラフィック", "traffic": "トラフィック",
"trafficRank": "トラフィックランキング", "trafficRank": "トラフィックランキング",
"type": "タイプ", "type": "タイプ",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "현재 온라인",
"email": "이메일", "email": "이메일",
"month": "이번 달", "month": "이번 달",
"monthDownloadTraffic": "이번 달 다운로드 트래픽", "monthDownloadTraffic": "이번 달 다운로드 트래픽",
"monthTraffic": "이번 달 트래픽",
"monthUploadTraffic": "이번 달 업로드 트래픽", "monthUploadTraffic": "이번 달 업로드 트래픽",
"newPurchase": "신규 구매", "newPurchase": "신규 구매",
"nodeTraffic": "노드 트래픽", "nodeTraffic": "노드 트래픽",
"nodes": "노드", "nodes": "노드",
"offlineNodeCount": "오프라인 노드 수", "offline": "오프라인",
"onlineNodeCount": "온라인 노드 수", "online": "온라인",
"onlineServers": "온라인 서버",
"onlineUsersCount": "온라인 사용자", "onlineUsersCount": "온라인 사용자",
"pending": "대기 중",
"pendingTickets": "처리 대기 중인 티켓", "pendingTickets": "처리 대기 중인 티켓",
"register": "등록", "register": "등록",
"repurchase": "재구매", "repurchase": "재구매",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "유형 선택", "selectTypePlaceholder": "유형 선택",
"today": "오늘", "today": "오늘",
"todayDownloadTraffic": "오늘 다운로드 트래픽", "todayDownloadTraffic": "오늘 다운로드 트래픽",
"todayTraffic": "오늘의 트래픽",
"todayUploadTraffic": "오늘 업로드 트래픽", "todayUploadTraffic": "오늘 업로드 트래픽",
"total": "총계", "total": "총계",
"totalIncome": "총수입", "totalIncome": "총수입",
"totalServers": "총 서버",
"traffic": "트래픽", "traffic": "트래픽",
"trafficRank": "트래픽 순위", "trafficRank": "트래픽 순위",
"type": "유형", "type": "유형",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "For øyeblikket på nett",
"email": "e-post", "email": "e-post",
"month": "Denne måneden", "month": "Denne måneden",
"monthDownloadTraffic": "Nedlastingstrafikk denne måneden", "monthDownloadTraffic": "Nedlastingstrafikk denne måneden",
"monthTraffic": "Månedens trafikk",
"monthUploadTraffic": "Månedens opplastningstrafikk", "monthUploadTraffic": "Månedens opplastningstrafikk",
"newPurchase": "Nytt kjøp", "newPurchase": "Nytt kjøp",
"nodeTraffic": "Nodetrafikk", "nodeTraffic": "Nodetrafikk",
"nodes": "noder", "nodes": "noder",
"offlineNodeCount": "Antall frakoblede noder", "offline": "Av",
"onlineNodeCount": "Antall noder på nett", "online": "På nett",
"onlineServers": "Nettservere",
"onlineUsersCount": "Nettbrukere", "onlineUsersCount": "Nettbrukere",
"pending": "Venter",
"pendingTickets": "Ventende billetter", "pendingTickets": "Ventende billetter",
"register": "Registrer", "register": "Registrer",
"repurchase": "gjenkjøp", "repurchase": "gjenkjøp",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Velg type", "selectTypePlaceholder": "Velg type",
"today": "i dag", "today": "i dag",
"todayDownloadTraffic": "Dagens nedlastningstrafikk", "todayDownloadTraffic": "Dagens nedlastningstrafikk",
"todayTraffic": "Dagens trafikk",
"todayUploadTraffic": "Dagens opplastningstrafikk", "todayUploadTraffic": "Dagens opplastningstrafikk",
"total": "Totalt", "total": "Totalt",
"totalIncome": "Totalinntekt", "totalIncome": "Totalinntekt",
"totalServers": "Totale servere",
"traffic": "trafikk", "traffic": "trafikk",
"trafficRank": "Trafikkrangering", "trafficRank": "Trafikkrangering",
"type": "Type", "type": "Type",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Obecnie online",
"email": "e-mail", "email": "e-mail",
"month": "Ten miesiąc", "month": "Ten miesiąc",
"monthDownloadTraffic": "Miesięczny ruch pobierania", "monthDownloadTraffic": "Miesięczny ruch pobierania",
"monthTraffic": "Ruch w tym miesiącu",
"monthUploadTraffic": "Miesięczny przesył danych", "monthUploadTraffic": "Miesięczny przesył danych",
"newPurchase": "Nowy zakup", "newPurchase": "Nowy zakup",
"nodeTraffic": "Ruch węzła", "nodeTraffic": "Ruch węzła",
"nodes": "węzły", "nodes": "węzły",
"offlineNodeCount": "Liczba węzłów offline", "offline": "Offline",
"onlineNodeCount": "Liczba węzłów online", "online": "Online",
"onlineServers": "Serwery online",
"onlineUsersCount": "Użytkownicy online", "onlineUsersCount": "Użytkownicy online",
"pending": "Oczekujące",
"pendingTickets": "Oczekujące zgłoszenia", "pendingTickets": "Oczekujące zgłoszenia",
"register": "Rejestracja", "register": "Rejestracja",
"repurchase": "ponowny zakup", "repurchase": "ponowny zakup",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Wybierz typ", "selectTypePlaceholder": "Wybierz typ",
"today": "Dziś", "today": "Dziś",
"todayDownloadTraffic": "Dzisiejszy ruch pobierania", "todayDownloadTraffic": "Dzisiejszy ruch pobierania",
"todayTraffic": "Ruch dzisiaj",
"todayUploadTraffic": "Dzisiejszy przesył danych", "todayUploadTraffic": "Dzisiejszy przesył danych",
"total": "Razem", "total": "Razem",
"totalIncome": "Całkowity dochód", "totalIncome": "Całkowity dochód",
"totalServers": "Łączna liczba serwerów",
"traffic": "ruch", "traffic": "ruch",
"trafficRank": "Ranking ruchu", "trafficRank": "Ranking ruchu",
"type": "typ", "type": "typ",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Atualmente Online",
"email": "e-mail", "email": "e-mail",
"month": "Este mês", "month": "Este mês",
"monthDownloadTraffic": "Tráfego de download do mês", "monthDownloadTraffic": "Tráfego de download do mês",
"monthTraffic": "Tráfego deste Mês",
"monthUploadTraffic": "Tráfego de upload deste mês", "monthUploadTraffic": "Tráfego de upload deste mês",
"newPurchase": "Nova Compra", "newPurchase": "Nova Compra",
"nodeTraffic": "Tráfego do Nó", "nodeTraffic": "Tráfego do Nó",
"nodes": "nós", "nodes": "nós",
"offlineNodeCount": "Contagem de nós offline", "offline": "Offline",
"onlineNodeCount": "Contagem de nós online", "online": "Online",
"onlineServers": "Servidores Online",
"onlineUsersCount": "Usuários Online", "onlineUsersCount": "Usuários Online",
"pending": "Pendente",
"pendingTickets": "Tickets pendentes", "pendingTickets": "Tickets pendentes",
"register": "Registrar", "register": "Registrar",
"repurchase": "recompra", "repurchase": "recompra",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Selecione o tipo", "selectTypePlaceholder": "Selecione o tipo",
"today": "hoje", "today": "hoje",
"todayDownloadTraffic": "Tráfego de download de hoje", "todayDownloadTraffic": "Tráfego de download de hoje",
"todayTraffic": "Tráfego de Hoje",
"todayUploadTraffic": "Tráfego de upload de hoje", "todayUploadTraffic": "Tráfego de upload de hoje",
"total": "Total", "total": "Total",
"totalIncome": "Renda Total", "totalIncome": "Renda Total",
"totalServers": "Total de Servidores",
"traffic": "tráfego", "traffic": "tráfego",
"trafficRank": "Classificação de Tráfego", "trafficRank": "Classificação de Tráfego",
"type": "tipo", "type": "tipo",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "În prezent online",
"email": "e-mail", "email": "e-mail",
"month": "Luna aceasta", "month": "Luna aceasta",
"monthDownloadTraffic": "Traficul de descărcare din această lună", "monthDownloadTraffic": "Traficul de descărcare din această lună",
"monthTraffic": "Traficul din această lună",
"monthUploadTraffic": "Traficul de încărcare din această lună", "monthUploadTraffic": "Traficul de încărcare din această lună",
"newPurchase": "Achiziție nouă", "newPurchase": "Achiziție nouă",
"nodeTraffic": "Traficul nodului", "nodeTraffic": "Traficul nodului",
"nodes": "noduri", "nodes": "noduri",
"offlineNodeCount": "Număr de noduri offline", "offline": "Offline",
"onlineNodeCount": "Număr de noduri online", "online": "Online",
"onlineServers": "Servere online",
"onlineUsersCount": "Utilizatori online", "onlineUsersCount": "Utilizatori online",
"pending": "În așteptare",
"pendingTickets": "Tichete în așteptare", "pendingTickets": "Tichete în așteptare",
"register": "Înregistrare", "register": "Înregistrare",
"repurchase": "recomandare", "repurchase": "recomandare",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Selectați tipul", "selectTypePlaceholder": "Selectați tipul",
"today": "astăzi", "today": "astăzi",
"todayDownloadTraffic": "Traficul de descărcare de astăzi", "todayDownloadTraffic": "Traficul de descărcare de astăzi",
"todayTraffic": "Traficul de astăzi",
"todayUploadTraffic": "Traficul de încărcare de astăzi", "todayUploadTraffic": "Traficul de încărcare de astăzi",
"total": "Total", "total": "Total",
"totalIncome": "Venit total", "totalIncome": "Venit total",
"totalServers": "Total servere",
"traffic": "trafic", "traffic": "trafic",
"trafficRank": "Clasament trafic", "trafficRank": "Clasament trafic",
"type": "tip", "type": "tip",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "В данный момент онлайн",
"email": "Электронная почта", "email": "Электронная почта",
"month": "Этот месяц", "month": "Этот месяц",
"monthDownloadTraffic": "Трафик загрузки за месяц", "monthDownloadTraffic": "Трафик загрузки за месяц",
"monthTraffic": "Трафик за этот месяц",
"monthUploadTraffic": "Трафик загрузки за этот месяц", "monthUploadTraffic": "Трафик загрузки за этот месяц",
"newPurchase": "Новая покупка", "newPurchase": "Новая покупка",
"nodeTraffic": "Трафик узла", "nodeTraffic": "Трафик узла",
"nodes": "узлы", "nodes": "узлы",
"offlineNodeCount": "Количество офлайн-узлов", "offline": "Офлайн",
"onlineNodeCount": "Количество онлайн-узлов", "online": "Онлайн",
"onlineServers": "Онлайн-серверы",
"onlineUsersCount": "Пользователи онлайн", "onlineUsersCount": "Пользователи онлайн",
"pending": "В ожидании",
"pendingTickets": "Ожидающие заявки", "pendingTickets": "Ожидающие заявки",
"register": "Регистрация", "register": "Регистрация",
"repurchase": "повторная покупка", "repurchase": "повторная покупка",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Выберите тип", "selectTypePlaceholder": "Выберите тип",
"today": "Сегодня", "today": "Сегодня",
"todayDownloadTraffic": "Сегодняшний трафик загрузки", "todayDownloadTraffic": "Сегодняшний трафик загрузки",
"todayTraffic": "Трафик сегодня",
"todayUploadTraffic": "Сегодняшний объем загруженного трафика", "todayUploadTraffic": "Сегодняшний объем загруженного трафика",
"total": "Итого", "total": "Итого",
"totalIncome": "Общий доход", "totalIncome": "Общий доход",
"totalServers": "Всего серверов",
"traffic": "трафик", "traffic": "трафик",
"trafficRank": "Рейтинг трафика", "trafficRank": "Рейтинг трафика",
"type": "Тип", "type": "Тип",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "ออนไลน์อยู่ในขณะนี้",
"email": "อีเมล", "email": "อีเมล",
"month": "เดือนนี้", "month": "เดือนนี้",
"monthDownloadTraffic": "ปริมาณการดาวน์โหลดในเดือนนี้", "monthDownloadTraffic": "ปริมาณการดาวน์โหลดในเดือนนี้",
"monthTraffic": "การเข้าชมในเดือนนี้",
"monthUploadTraffic": "ปริมาณการอัปโหลดในเดือนนี้", "monthUploadTraffic": "ปริมาณการอัปโหลดในเดือนนี้",
"newPurchase": "ซื้อใหม่", "newPurchase": "ซื้อใหม่",
"nodeTraffic": "ปริมาณการใช้งานของโหนด", "nodeTraffic": "ปริมาณการใช้งานของโหนด",
"nodes": "โหนด", "nodes": "โหนด",
"offlineNodeCount": "จำนวนโหนดออฟไลน์", "offline": "ออฟไลน์",
"onlineNodeCount": "จำนวนโหนดออนไลน์", "online": "ออนไลน์",
"onlineServers": "เซิร์ฟเวอร์ออนไลน์",
"onlineUsersCount": "ผู้ใช้งานออนไลน์", "onlineUsersCount": "ผู้ใช้งานออนไลน์",
"pending": "รอดำเนินการ",
"pendingTickets": "บัตรงานที่รอดำเนินการ", "pendingTickets": "บัตรงานที่รอดำเนินการ",
"register": "ลงทะเบียน", "register": "ลงทะเบียน",
"repurchase": "ซื้อซ้ำ", "repurchase": "ซื้อซ้ำ",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "เลือกประเภท", "selectTypePlaceholder": "เลือกประเภท",
"today": "วันนี้", "today": "วันนี้",
"todayDownloadTraffic": "ปริมาณการดาวน์โหลดวันนี้", "todayDownloadTraffic": "ปริมาณการดาวน์โหลดวันนี้",
"todayTraffic": "การเข้าชมวันนี้",
"todayUploadTraffic": "ปริมาณการอัปโหลดวันนี้", "todayUploadTraffic": "ปริมาณการอัปโหลดวันนี้",
"total": "รวมทั้งหมด", "total": "รวมทั้งหมด",
"totalIncome": "รายได้รวม", "totalIncome": "รายได้รวม",
"totalServers": "จำนวนเซิร์ฟเวอร์ทั้งหมด",
"traffic": "การจราจร", "traffic": "การจราจร",
"trafficRank": "อันดับการเข้าชม", "trafficRank": "อันดับการเข้าชม",
"type": "ประเภท", "type": "ประเภท",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Şu Anda Çevrimiçi",
"email": "e-posta", "email": "e-posta",
"month": "Bu Ay", "month": "Bu Ay",
"monthDownloadTraffic": "Bu ayki indirme trafiği", "monthDownloadTraffic": "Bu ayki indirme trafiği",
"monthTraffic": "Bu Ayki Trafik",
"monthUploadTraffic": "Bu ayki yükleme trafiği", "monthUploadTraffic": "Bu ayki yükleme trafiği",
"newPurchase": "Yeni Satın Alma", "newPurchase": "Yeni Satın Alma",
"nodeTraffic": "Düğüm Trafiği", "nodeTraffic": "Düğüm Trafiği",
"nodes": "düğümler", "nodes": "düğümler",
"offlineNodeCount": "Çevrimdışı Düğüm Sayısı", "offline": "Çevrimdışı",
"onlineNodeCount": "Çevrimiçi Düğüm Sayısı", "online": "Çevrimiçi",
"onlineServers": "Çevrimiçi Sunucular",
"onlineUsersCount": "Çevrimiçi Kullanıcılar", "onlineUsersCount": "Çevrimiçi Kullanıcılar",
"pending": "Beklemede",
"pendingTickets": "Bekleyen Biletler", "pendingTickets": "Bekleyen Biletler",
"register": "Kayıt Ol", "register": "Kayıt Ol",
"repurchase": "yeniden satın alma", "repurchase": "yeniden satın alma",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Tür seçin", "selectTypePlaceholder": "Tür seçin",
"today": "bugün", "today": "bugün",
"todayDownloadTraffic": "Bugünkü indirme trafiği", "todayDownloadTraffic": "Bugünkü indirme trafiği",
"todayTraffic": "Bugünkü Trafik",
"todayUploadTraffic": "Bugün Yükleme Trafiği", "todayUploadTraffic": "Bugün Yükleme Trafiği",
"total": "Toplam", "total": "Toplam",
"totalIncome": "Toplam Gelir", "totalIncome": "Toplam Gelir",
"totalServers": "Toplam Sunucular",
"traffic": "trafik", "traffic": "trafik",
"trafficRank": "Trafik Sıralaması", "trafficRank": "Trafik Sıralaması",
"type": "Tür", "type": "Tür",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "В даний час в мережі",
"email": "електронна пошта", "email": "електронна пошта",
"month": "Цього місяця", "month": "Цього місяця",
"monthDownloadTraffic": "Трафік завантажень за цей місяць", "monthDownloadTraffic": "Трафік завантажень за цей місяць",
"monthTraffic": "Трафік цього місяця",
"monthUploadTraffic": "Цього місяця завантажено трафіку", "monthUploadTraffic": "Цього місяця завантажено трафіку",
"newPurchase": "Нова покупка", "newPurchase": "Нова покупка",
"nodeTraffic": "Трафік вузла", "nodeTraffic": "Трафік вузла",
"nodes": "вузли", "nodes": "вузли",
"offlineNodeCount": "Кількість офлайн-вузлів", "offline": "Вимкнено",
"onlineNodeCount": "Кількість онлайн-вузлів", "online": "В мережі",
"onlineServers": "Сервери в мережі",
"onlineUsersCount": "Користувачі онлайн", "onlineUsersCount": "Користувачі онлайн",
"pending": "В очікуванні",
"pendingTickets": "Невирішені заявки", "pendingTickets": "Невирішені заявки",
"register": "Реєстрація", "register": "Реєстрація",
"repurchase": "повторна покупка", "repurchase": "повторна покупка",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Виберіть тип", "selectTypePlaceholder": "Виберіть тип",
"today": "сьогодні", "today": "сьогодні",
"todayDownloadTraffic": "Сьогоднішній трафік завантажень", "todayDownloadTraffic": "Сьогоднішній трафік завантажень",
"todayTraffic": "Трафік сьогодні",
"todayUploadTraffic": "Сьогоднішній обсяг завантаження", "todayUploadTraffic": "Сьогоднішній обсяг завантаження",
"total": "Загалом", "total": "Загалом",
"totalIncome": "Загальний дохід", "totalIncome": "Загальний дохід",
"totalServers": "Всього серверів",
"traffic": "трафік", "traffic": "трафік",
"trafficRank": "Рейтинг трафіку", "trafficRank": "Рейтинг трафіку",
"type": "Тип", "type": "Тип",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "Đang Trực Tuyến",
"email": "Email", "email": "Email",
"month": "Tháng này", "month": "Tháng này",
"monthDownloadTraffic": "Lưu lượng tải xuống tháng này", "monthDownloadTraffic": "Lưu lượng tải xuống tháng này",
"monthTraffic": "Lưu Lượng Tháng Này",
"monthUploadTraffic": "Lưu lượng tải lên trong tháng này", "monthUploadTraffic": "Lưu lượng tải lên trong tháng này",
"newPurchase": "Mua mới", "newPurchase": "Mua mới",
"nodeTraffic": "Lưu lượng nút", "nodeTraffic": "Lưu lượng nút",
"nodes": "nút", "nodes": "nút",
"offlineNodeCount": "Số lượng nút ngoại tuyến", "offline": "Ngoại Tuyến",
"onlineNodeCount": "Số lượng nút trực tuyến", "online": "Trực Tuyến",
"onlineServers": "Máy Chủ Đang Trực Tuyến",
"onlineUsersCount": "Người dùng trực tuyến", "onlineUsersCount": "Người dùng trực tuyến",
"pending": "Đang Chờ",
"pendingTickets": "Phiếu hỗ trợ đang chờ xử lý", "pendingTickets": "Phiếu hỗ trợ đang chờ xử lý",
"register": "Đăng ký", "register": "Đăng ký",
"repurchase": "mua lại", "repurchase": "mua lại",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "Chọn loại", "selectTypePlaceholder": "Chọn loại",
"today": "Hôm nay", "today": "Hôm nay",
"todayDownloadTraffic": "Lưu lượng tải xuống hôm nay", "todayDownloadTraffic": "Lưu lượng tải xuống hôm nay",
"todayTraffic": "Lưu Lượng Hôm Nay",
"todayUploadTraffic": "Lưu lượng tải lên hôm nay", "todayUploadTraffic": "Lưu lượng tải lên hôm nay",
"total": "Tổng cộng", "total": "Tổng cộng",
"totalIncome": "Tổng thu nhập", "totalIncome": "Tổng thu nhập",
"totalServers": "Tổng Số Máy Chủ",
"traffic": "lưu lượng", "traffic": "lưu lượng",
"trafficRank": "Xếp hạng lưu lượng", "trafficRank": "Xếp hạng lưu lượng",
"type": "Loại", "type": "Loại",

View File

@ -1,14 +1,23 @@
{ {
"currentlyOnline": "当前在线",
"currentlyOnline": "当前在线",
"download": "↓",
"email": "邮箱", "email": "邮箱",
"month": "本月", "month": "本月",
"monthDownloadTraffic": "本月下载流量", "monthDownloadTraffic": "本月下载流量",
"monthTraffic": "本月流量",
"monthUploadTraffic": "本月上传流量", "monthUploadTraffic": "本月上传流量",
"newPurchase": "新购", "newPurchase": "新购",
"nodeTraffic": "节点流量", "nodeTraffic": "节点流量",
"nodes": "节点", "nodes": "节点",
"offlineNodeCount": "离线节点数", "offline": "离线",
"onlineNodeCount": "在线节点数", "online": "在线",
"onlineServers": "在线服务器",
"onlineTotal": "在线/总数",
"onlineTotal": "在线/总数",
"onlineUsersCount": "在线用户数", "onlineUsersCount": "在线用户数",
"pending": "待处理",
"pending": "待处理",
"pendingTickets": "待处理工单", "pendingTickets": "待处理工单",
"register": "注册", "register": "注册",
"repurchase": "复购", "repurchase": "复购",
@ -16,12 +25,15 @@
"selectTypePlaceholder": "选择类型", "selectTypePlaceholder": "选择类型",
"today": "今日", "today": "今日",
"todayDownloadTraffic": "今日下载流量", "todayDownloadTraffic": "今日下载流量",
"todayTraffic": "今日流量",
"todayUploadTraffic": "今日上传流量", "todayUploadTraffic": "今日上传流量",
"total": "总计", "total": "总计",
"totalIncome": "总收入", "totalIncome": "总收入",
"totalServers": "总服务器",
"traffic": "流量", "traffic": "流量",
"trafficRank": "流量排行", "trafficRank": "流量排行",
"type": "类型", "type": "类型",
"upload": "↑",
"userTitle": "用户统计", "userTitle": "用户统计",
"userTraffic": "用户流量", "userTraffic": "用户流量",
"users": "用户", "users": "用户",

View File

@ -1,14 +1,18 @@
{ {
"currentlyOnline": "目前在線",
"email": "電子郵件", "email": "電子郵件",
"month": "本月", "month": "本月",
"monthDownloadTraffic": "本月下載流量", "monthDownloadTraffic": "本月下載流量",
"monthTraffic": "本月流量",
"monthUploadTraffic": "本月上傳流量", "monthUploadTraffic": "本月上傳流量",
"newPurchase": "新購", "newPurchase": "新購",
"nodeTraffic": "節點流量", "nodeTraffic": "節點流量",
"nodes": "節點", "nodes": "節點",
"offlineNodeCount": "離線節點數", "offline": "離線",
"onlineNodeCount": "線上節點數", "online": "在線",
"onlineServers": "在線伺服器",
"onlineUsersCount": "線上用戶數", "onlineUsersCount": "線上用戶數",
"pending": "待處理",
"pendingTickets": "待處理工單", "pendingTickets": "待處理工單",
"register": "註冊", "register": "註冊",
"repurchase": "回購", "repurchase": "回購",
@ -16,9 +20,11 @@
"selectTypePlaceholder": "選擇類型", "selectTypePlaceholder": "選擇類型",
"today": "今天", "today": "今天",
"todayDownloadTraffic": "今日下載流量", "todayDownloadTraffic": "今日下載流量",
"todayTraffic": "今日流量",
"todayUploadTraffic": "今日上傳流量", "todayUploadTraffic": "今日上傳流量",
"total": "總計", "total": "總計",
"totalIncome": "總收入", "totalIncome": "總收入",
"totalServers": "伺服器總數",
"traffic": "流量", "traffic": "流量",
"trafficRank": "流量排行", "trafficRank": "流量排行",
"type": "類型", "type": "類型",

View File

@ -1,5 +1,5 @@
// @ts-ignore // @ts-ignore
// API 更新时间: // API 更新时间:
// API 唯一标识: // API 唯一标识:
import * as ads from './ads'; import * as ads from './ads';

View File

@ -1,5 +1,5 @@
// @ts-ignore // @ts-ignore
// API 更新时间: // API 更新时间:
// API 唯一标识: // API 唯一标识:
import * as auth from './auth'; import * as auth from './auth';

View File

@ -1,5 +1,6 @@
import { locales, NEXT_PUBLIC_DEFAULT_LANGUAGE } from '@/config/constants'; import { locales, NEXT_PUBLIC_DEFAULT_LANGUAGE } from '@/config/constants';
import { isBrowser } from '@workspace/ui/utils'; import { isBrowser } from '@workspace/ui/utils';
import { intlFormat } from 'date-fns';
import Cookies from 'universal-cookie'; import Cookies from 'universal-cookie';
const cookies = new Cookies(null, { const cookies = new Cookies(null, {
@ -49,3 +50,20 @@ export function Logout() {
location.href = `/`; location.href = `/`;
} }
} }
export function formatDate(date?: Date | number, showTime: boolean = true) {
if (!date) return;
const timeZone = localStorage.getItem('timezone') || 'UTC';
return intlFormat(date, {
year: 'numeric',
month: 'numeric',
day: 'numeric',
...(showTime && {
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
}),
hour12: false,
timeZone,
});
}

View File

@ -1,5 +1,5 @@
// @ts-ignore // @ts-ignore
// API 更新时间: // API 更新时间:
// API 唯一标识: // API 唯一标识:
import * as auth from './auth'; import * as auth from './auth';

View File

@ -1,5 +1,5 @@
// @ts-ignore // @ts-ignore
// API 更新时间: // API 更新时间:
// API 唯一标识: // API 唯一标识:
import * as announcement from './announcement'; import * as announcement from './announcement';