✨ feat(subscribe): Move subscription configuration and application to subscription module
This commit is contained in:
parent
18b07c750d
commit
f90d4d2ce6
@ -3,6 +3,8 @@ import { getTranslations } from 'next-intl/server';
|
||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
||||
|
||||
import GroupTable from './group-table';
|
||||
import SubscribeApp from './subscribe-app';
|
||||
import SubscribeConfig from './subscribe-config';
|
||||
import SubscribeTable from './subscribe-table';
|
||||
|
||||
export default async function Page() {
|
||||
@ -13,6 +15,8 @@ export default async function Page() {
|
||||
<TabsList>
|
||||
<TabsTrigger value='subscribe'>{t('tabs.subscribe')}</TabsTrigger>
|
||||
<TabsTrigger value='group'>{t('tabs.subscribeGroup')}</TabsTrigger>
|
||||
<TabsTrigger value='config'>{t('tabs.subscribeConfig')}</TabsTrigger>
|
||||
<TabsTrigger value='app'>{t('tabs.subscribeApp')}</TabsTrigger>
|
||||
</TabsList>
|
||||
<TabsContent value='subscribe'>
|
||||
<SubscribeTable />
|
||||
@ -20,6 +24,12 @@ export default async function Page() {
|
||||
<TabsContent value='group'>
|
||||
<GroupTable />
|
||||
</TabsContent>
|
||||
<TabsContent value='config'>
|
||||
<SubscribeConfig />
|
||||
</TabsContent>
|
||||
<TabsContent value='app'>
|
||||
<SubscribeApp />
|
||||
</TabsContent>
|
||||
</Tabs>
|
||||
);
|
||||
}
|
||||
|
||||
386
apps/admin/app/dashboard/subscribe/subscribe-app.tsx
Normal file
386
apps/admin/app/dashboard/subscribe/subscribe-app.tsx
Normal file
@ -0,0 +1,386 @@
|
||||
'use client';
|
||||
|
||||
import { ProTable, ProTableActions } from '@/components/pro-table';
|
||||
import {
|
||||
createApplication,
|
||||
deleteApplication,
|
||||
getApplication,
|
||||
getSubscribeType,
|
||||
updateApplication,
|
||||
} from '@/services/admin/system';
|
||||
import { zodResolver } from '@hookform/resolvers/zod';
|
||||
import { Icon } from '@iconify/react';
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { Button } from '@workspace/ui/components/button';
|
||||
import {
|
||||
Form,
|
||||
FormControl,
|
||||
FormField,
|
||||
FormItem,
|
||||
FormLabel,
|
||||
FormMessage,
|
||||
} from '@workspace/ui/components/form';
|
||||
import { ScrollArea } from '@workspace/ui/components/scroll-area';
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from '@workspace/ui/components/select';
|
||||
import {
|
||||
Sheet,
|
||||
SheetContent,
|
||||
SheetFooter,
|
||||
SheetHeader,
|
||||
SheetTitle,
|
||||
SheetTrigger,
|
||||
} from '@workspace/ui/components/sheet';
|
||||
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
|
||||
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import Image from 'next/legacy/image';
|
||||
import { assign, shake } from 'radash';
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { toast } from 'sonner';
|
||||
import { z } from 'zod';
|
||||
|
||||
const defaultValues = {
|
||||
platform: 'windows',
|
||||
subscribe_type: 'Clash',
|
||||
name: '',
|
||||
icon: '',
|
||||
url: '',
|
||||
};
|
||||
|
||||
interface FormProps<T> {
|
||||
trigger: React.ReactNode | string;
|
||||
title: string;
|
||||
initialValues?: Partial<T>;
|
||||
onSubmit: (values: T) => Promise<boolean>;
|
||||
loading?: boolean;
|
||||
}
|
||||
|
||||
function SubscribeAppForm<T extends API.CreateApplicationRequest | API.UpdateApplicationRequest>({
|
||||
trigger,
|
||||
title,
|
||||
loading,
|
||||
initialValues,
|
||||
onSubmit,
|
||||
}: FormProps<T>) {
|
||||
const t = useTranslations('subscribe.app');
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const formSchema = z.object({
|
||||
platform: z.enum(['windows', 'macos', 'linux', 'android', 'ios']),
|
||||
name: z.string(),
|
||||
subscribe_type: z.string(),
|
||||
icon: z.string(),
|
||||
url: z.string(),
|
||||
});
|
||||
|
||||
type FormSchema = z.infer<typeof formSchema>;
|
||||
|
||||
const form = useForm<FormSchema>({
|
||||
resolver: zodResolver(formSchema),
|
||||
defaultValues: assign(
|
||||
defaultValues,
|
||||
shake(initialValues, (value) => value === null),
|
||||
),
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
form.reset(
|
||||
assign(
|
||||
defaultValues,
|
||||
shake(initialValues, (value) => value === null),
|
||||
),
|
||||
);
|
||||
}, [form, initialValues]);
|
||||
|
||||
const { data: subscribe_types } = useQuery<string[]>({
|
||||
queryKey: ['getSubscribeType'],
|
||||
queryFn: async () => {
|
||||
const { data } = await getSubscribeType();
|
||||
return data.data?.subscribe_types || [];
|
||||
},
|
||||
});
|
||||
|
||||
return (
|
||||
<Sheet open={open} onOpenChange={setOpen}>
|
||||
<SheetTrigger asChild>
|
||||
{typeof trigger === 'string' ? <Button>{trigger}</Button> : trigger}
|
||||
</SheetTrigger>
|
||||
<SheetContent className='w-[600px] max-w-full'>
|
||||
<SheetHeader>
|
||||
<SheetTitle>{title}</SheetTitle>
|
||||
</SheetHeader>
|
||||
<ScrollArea className='h-[calc(100dvh-48px-36px-36px)]'>
|
||||
<Form {...form}>
|
||||
<form className='space-y-4 py-4'>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='platform'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('platform')}</FormLabel>
|
||||
<FormControl>
|
||||
<Select value={field.value} onValueChange={field.onChange}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={t('platform')} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{['windows', 'macos', 'linux', 'android', 'ios'].map((platform) => (
|
||||
<SelectItem key={platform} value={platform}>
|
||||
{platform.toUpperCase()}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='subscribe_type'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('subscriptionProtocol')}</FormLabel>
|
||||
<FormControl>
|
||||
<Select value={field.value} onValueChange={field.onChange}>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={t('subscriptionProtocol')} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{subscribe_types?.map((type) => (
|
||||
<SelectItem key={type} value={type}>
|
||||
{type}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='name'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('appName')}</FormLabel>
|
||||
<FormControl>
|
||||
<EnhancedInput {...field} required />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='icon'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('appIcon')}</FormLabel>
|
||||
<FormControl>
|
||||
<EnhancedInput {...field} required />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='url'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('appDownloadURL')}</FormLabel>
|
||||
<FormControl>
|
||||
<EnhancedInput {...field} required />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
</form>
|
||||
</Form>
|
||||
</ScrollArea>
|
||||
<SheetFooter className='flex-row justify-end gap-2 pt-3'>
|
||||
<Button variant='outline' onClick={() => setOpen(false)}>
|
||||
{t('cancel')}
|
||||
</Button>
|
||||
<Button
|
||||
onClick={form.handleSubmit(async (values) => {
|
||||
const success = await onSubmit(values as T);
|
||||
if (success) setOpen(false);
|
||||
})}
|
||||
disabled={loading}
|
||||
>
|
||||
{loading && <Icon icon='mdi:loading' className='mr-2 animate-spin' />}
|
||||
{t('confirm')}
|
||||
</Button>
|
||||
</SheetFooter>
|
||||
</SheetContent>
|
||||
</Sheet>
|
||||
);
|
||||
}
|
||||
|
||||
export default function SubscribeApp() {
|
||||
const t = useTranslations('subscribe.app');
|
||||
const [loading, setLoading] = useState(false);
|
||||
const ref = useRef<ProTableActions>(null);
|
||||
|
||||
return (
|
||||
<ProTable<API.Application, { platform: string }>
|
||||
action={ref}
|
||||
header={{
|
||||
toolbar: (
|
||||
<SubscribeAppForm<API.CreateApplicationRequest>
|
||||
trigger={t('add')}
|
||||
title={t('createApp')}
|
||||
loading={loading}
|
||||
onSubmit={async (values) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
await createApplication(values);
|
||||
toast.success(t('createSuccess'));
|
||||
ref.current?.refresh();
|
||||
setLoading(false);
|
||||
return true;
|
||||
} catch (error) {
|
||||
setLoading(false);
|
||||
return false;
|
||||
}
|
||||
}}
|
||||
/>
|
||||
),
|
||||
}}
|
||||
params={[
|
||||
{
|
||||
key: 'platform',
|
||||
placeholder: t('platform'),
|
||||
options: [
|
||||
{ label: 'Windows', value: 'windows' },
|
||||
{ label: 'MacOS', value: 'mac' },
|
||||
{ label: 'Linux', value: 'linux' },
|
||||
{ label: 'Android', value: 'android' },
|
||||
{ label: 'iOS', value: 'ios' },
|
||||
],
|
||||
},
|
||||
]}
|
||||
request={async (_pagination, filters) => {
|
||||
const { data } = await getApplication();
|
||||
const flatApps = Object.entries(data.data || {}).flatMap(([platform, apps]) =>
|
||||
(apps as API.Application[]).map((app) => ({
|
||||
...app,
|
||||
platform,
|
||||
})),
|
||||
);
|
||||
return {
|
||||
list: filters.platform
|
||||
? flatApps.filter((app) => app.platform === filters.platform)
|
||||
: flatApps,
|
||||
total: 0,
|
||||
};
|
||||
}}
|
||||
columns={[
|
||||
{
|
||||
accessorKey: 'platform',
|
||||
header: t('platform'),
|
||||
cell: ({ row }) => row.getValue('platform'),
|
||||
},
|
||||
{
|
||||
accessorKey: 'subscribe_type',
|
||||
header: t('subscriptionProtocol'),
|
||||
cell: ({ row }) => row.getValue('subscribe_type'),
|
||||
},
|
||||
{
|
||||
accessorKey: 'name',
|
||||
header: t('appName'),
|
||||
},
|
||||
{
|
||||
accessorKey: 'icon',
|
||||
header: t('appIcon'),
|
||||
cell: ({ row }) => (
|
||||
<Image
|
||||
src={row.getValue('icon')}
|
||||
alt={row.getValue('name')}
|
||||
className='h-8 w-8 rounded-md'
|
||||
width={32}
|
||||
height={32}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessorKey: 'url',
|
||||
header: t('appDownloadURL'),
|
||||
},
|
||||
]}
|
||||
actions={{
|
||||
render: (row) => [
|
||||
<SubscribeAppForm<API.UpdateApplicationRequest>
|
||||
key='edit'
|
||||
trigger={<Button>{t('edit')}</Button>}
|
||||
title={t('editApp')}
|
||||
loading={loading}
|
||||
initialValues={{
|
||||
...row,
|
||||
}}
|
||||
onSubmit={async (values) => {
|
||||
setLoading(true);
|
||||
try {
|
||||
await updateApplication({
|
||||
...values,
|
||||
id: row.id,
|
||||
});
|
||||
toast.success(t('updateSuccess'));
|
||||
ref.current?.refresh();
|
||||
setLoading(false);
|
||||
return true;
|
||||
} catch (error) {
|
||||
setLoading(false);
|
||||
return false;
|
||||
}
|
||||
}}
|
||||
/>,
|
||||
<ConfirmButton
|
||||
key='delete'
|
||||
trigger={<Button variant='destructive'>{t('delete')}</Button>}
|
||||
title={t('confirmDelete')}
|
||||
description={t('deleteWarning')}
|
||||
onConfirm={async () => {
|
||||
await deleteApplication({ id: row.id! });
|
||||
toast.success(t('deleteSuccess'));
|
||||
ref.current?.refresh();
|
||||
}}
|
||||
cancelText={t('cancel')}
|
||||
confirmText={t('confirm')}
|
||||
/>,
|
||||
],
|
||||
batchRender: (rows) => [
|
||||
<ConfirmButton
|
||||
key='delete'
|
||||
trigger={<Button variant='destructive'>{t('batchDelete')}</Button>}
|
||||
title={t('confirmDelete')}
|
||||
description={t('deleteWarning')}
|
||||
onConfirm={async () => {
|
||||
await Promise.all(rows.map((row) => deleteApplication({ id: row.id! })));
|
||||
toast.success(t('deleteSuccess'));
|
||||
ref.current?.reset();
|
||||
}}
|
||||
cancelText={t('cancel')}
|
||||
confirmText={t('confirm')}
|
||||
/>,
|
||||
],
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
106
apps/admin/app/dashboard/subscribe/subscribe-config.tsx
Normal file
106
apps/admin/app/dashboard/subscribe/subscribe-config.tsx
Normal file
@ -0,0 +1,106 @@
|
||||
'use client';
|
||||
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { toast } from 'sonner';
|
||||
|
||||
import { getSubscribeConfig, updateSubscribeConfig } from '@/services/admin/system';
|
||||
import { Label } from '@workspace/ui/components/label';
|
||||
import { Switch } from '@workspace/ui/components/switch';
|
||||
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
|
||||
import { Textarea } from '@workspace/ui/components/textarea';
|
||||
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||
|
||||
export default function SubscribeConfig() {
|
||||
const t = useTranslations('subscribe.config');
|
||||
|
||||
const { data, refetch } = useQuery({
|
||||
queryKey: ['getSubscribeConfig'],
|
||||
queryFn: async () => {
|
||||
const { data } = await getSubscribeConfig();
|
||||
|
||||
return data.data;
|
||||
},
|
||||
});
|
||||
|
||||
async function updateConfig(key: string, value: unknown) {
|
||||
if (data?.[key] === value) return;
|
||||
try {
|
||||
await updateSubscribeConfig({
|
||||
...data,
|
||||
[key]: value,
|
||||
} as API.SubscribeConfig);
|
||||
toast.success(t('saveSuccess'));
|
||||
refetch();
|
||||
} catch (error) {
|
||||
/* empty */
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Table>
|
||||
<TableBody>
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
<Label>{t('singleSubscriptionMode')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>
|
||||
{t('singleSubscriptionModeDescription')}
|
||||
</p>
|
||||
</TableCell>
|
||||
<TableCell className='text-right'>
|
||||
<Switch
|
||||
checked={data?.single_model}
|
||||
onCheckedChange={(checked) => {
|
||||
updateConfig('single_model', checked);
|
||||
}}
|
||||
/>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
<Label>{t('wildcardResolution')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>{t('wildcardResolutionDescription')}</p>
|
||||
</TableCell>
|
||||
<TableCell className='text-right'>
|
||||
<Switch
|
||||
checked={data?.pan_domain}
|
||||
onCheckedChange={(checked) => {
|
||||
updateConfig('pan_domain', checked);
|
||||
}}
|
||||
/>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
<Label>{t('subscriptionPath')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>{t('subscriptionPathDescription')}</p>
|
||||
</TableCell>
|
||||
<TableCell className='flex items-center gap-2 text-right'>
|
||||
<EnhancedInput
|
||||
placeholder={t('subscriptionPathPlaceholder')}
|
||||
value={data?.subscribe_path}
|
||||
onValueBlur={(value) => updateConfig('subscribe_path', value)}
|
||||
/>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className='align-top'>
|
||||
<Label>{t('subscriptionDomain')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>{t('subscriptionDomainDescription')}</p>
|
||||
</TableCell>
|
||||
<TableCell className='text-right'>
|
||||
<Textarea
|
||||
className='h-52'
|
||||
placeholder={t('subscriptionDomainPlaceholder')}
|
||||
defaultValue={data?.subscribe_domain}
|
||||
onBlur={(e) => {
|
||||
updateConfig('subscribe_domain', e.target.value);
|
||||
}}
|
||||
/>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
</TableBody>
|
||||
</Table>
|
||||
);
|
||||
}
|
||||
@ -5,7 +5,6 @@ import Currency from './currency';
|
||||
import Invite from './invite';
|
||||
import Node from './node';
|
||||
import Site from './site';
|
||||
import Subscription from './subscription';
|
||||
import Telegram from './telegram';
|
||||
import Tos from './tos';
|
||||
import Verify from './verify';
|
||||
@ -18,7 +17,6 @@ export default async function Page() {
|
||||
<TabsList className='h-full flex-wrap'>
|
||||
<TabsTrigger value='site'>{t('tabs.site')}</TabsTrigger>
|
||||
<TabsTrigger value='currency'>{t('tabs.currency')}</TabsTrigger>
|
||||
<TabsTrigger value='subscription'>{t('tabs.subscription')}</TabsTrigger>
|
||||
<TabsTrigger value='verify'>{t('tabs.verify')}</TabsTrigger>
|
||||
<TabsTrigger value='node'>{t('tabs.node')}</TabsTrigger>
|
||||
<TabsTrigger value='invite'>{t('tabs.invite')}</TabsTrigger>
|
||||
@ -31,9 +29,6 @@ export default async function Page() {
|
||||
<TabsContent value='currency'>
|
||||
<Currency />
|
||||
</TabsContent>
|
||||
<TabsContent value='subscription'>
|
||||
<Subscription />
|
||||
</TabsContent>
|
||||
<TabsContent value='verify'>
|
||||
<Verify />
|
||||
</TabsContent>
|
||||
|
||||
@ -1,340 +0,0 @@
|
||||
'use client';
|
||||
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { toast } from 'sonner';
|
||||
|
||||
import {
|
||||
createApplication,
|
||||
deleteApplication,
|
||||
getApplication,
|
||||
getSubscribeConfig,
|
||||
getSubscribeType,
|
||||
updateApplication,
|
||||
updateSubscribeConfig,
|
||||
} from '@/services/admin/system';
|
||||
import { Button } from '@workspace/ui/components/button';
|
||||
import { Label } from '@workspace/ui/components/label';
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from '@workspace/ui/components/select';
|
||||
import { Switch } from '@workspace/ui/components/switch';
|
||||
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
|
||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
||||
import { Textarea } from '@workspace/ui/components/textarea';
|
||||
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||
|
||||
function compareData(
|
||||
originalData: API.ApplicationResponse,
|
||||
modifiedData: API.ApplicationResponse,
|
||||
): {
|
||||
added: API.Application[];
|
||||
deleted: API.Application[];
|
||||
updated: API.Application[];
|
||||
} {
|
||||
const added: API.Application[] = [];
|
||||
const deleted: API.Application[] = [];
|
||||
const updated: API.Application[] = [];
|
||||
|
||||
const findById = (array: API.Application[], id: number): API.Application | undefined => {
|
||||
return array.find((item) => item.id === id);
|
||||
};
|
||||
|
||||
const isUpdated = (original: API.Application, modified: API.Application): boolean => {
|
||||
return (
|
||||
original.name !== modified.name ||
|
||||
original.platform !== modified.platform ||
|
||||
original.subscribe_type !== modified.subscribe_type ||
|
||||
original.url !== modified.url ||
|
||||
original.icon !== modified.icon
|
||||
);
|
||||
};
|
||||
|
||||
Object.values(originalData).forEach((platformData) => {
|
||||
platformData.forEach((originalApp) => {
|
||||
const modifiedApp = findById(
|
||||
modifiedData[originalApp.platform as API.CreateApplicationRequest['platform']],
|
||||
originalApp.id,
|
||||
);
|
||||
|
||||
if (!modifiedApp) {
|
||||
deleted.push(originalApp);
|
||||
} else if (isUpdated(originalApp, modifiedApp)) {
|
||||
updated.push(modifiedApp);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Object.values(modifiedData).forEach((platformData) => {
|
||||
platformData.forEach((modifiedApp) => {
|
||||
if (
|
||||
!findById(
|
||||
originalData[modifiedApp.platform as API.CreateApplicationRequest['platform']],
|
||||
modifiedApp.id,
|
||||
)
|
||||
) {
|
||||
added.push(modifiedApp);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return { added, deleted, updated };
|
||||
}
|
||||
|
||||
export default function Subscription() {
|
||||
const t = useTranslations('system.subscription');
|
||||
|
||||
const { data, refetch } = useQuery({
|
||||
queryKey: ['getSubscribeConfig'],
|
||||
queryFn: async () => {
|
||||
const { data } = await getSubscribeConfig();
|
||||
|
||||
return data.data;
|
||||
},
|
||||
});
|
||||
|
||||
const { data: apps, refetch: appsRefetch } = useQuery({
|
||||
queryKey: ['getApplication'],
|
||||
queryFn: async () => {
|
||||
const { data } = await getApplication();
|
||||
|
||||
return data.data;
|
||||
},
|
||||
});
|
||||
|
||||
async function updateConfig(key: string, value: unknown) {
|
||||
if (data?.[key] === value) return;
|
||||
try {
|
||||
await updateSubscribeConfig({
|
||||
...data,
|
||||
[key]: value,
|
||||
} as API.SubscribeConfig);
|
||||
toast.success(t('saveSuccess'));
|
||||
refetch();
|
||||
} catch (error) {
|
||||
/* empty */
|
||||
}
|
||||
}
|
||||
|
||||
const { data: subscribe_types } = useQuery<string[]>({
|
||||
queryKey: ['getSubscribeType'],
|
||||
queryFn: async () => {
|
||||
const { data } = await getSubscribeType();
|
||||
|
||||
return data.data?.subscribe_types || [];
|
||||
},
|
||||
});
|
||||
const [app, setApp] = useState<API.ApplicationResponse>();
|
||||
const appTypes = Object.keys(apps || {}) as (keyof API.ApplicationResponse)[];
|
||||
|
||||
useEffect(() => {
|
||||
if (!app) setApp(apps);
|
||||
}, [app, apps]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Table>
|
||||
<TableBody>
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
<Label>{t('singleSubscriptionMode')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>
|
||||
{t('singleSubscriptionModeDescription')}
|
||||
</p>
|
||||
</TableCell>
|
||||
<TableCell className='text-right'>
|
||||
<Switch
|
||||
checked={data?.single_model}
|
||||
onCheckedChange={(checked) => {
|
||||
updateConfig('single_model', checked);
|
||||
}}
|
||||
/>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
<Label>{t('wildcardResolution')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>{t('wildcardResolutionDescription')}</p>
|
||||
</TableCell>
|
||||
<TableCell className='text-right'>
|
||||
<Switch
|
||||
checked={data?.pan_domain}
|
||||
onCheckedChange={(checked) => {
|
||||
updateConfig('pan_domain', checked);
|
||||
}}
|
||||
/>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
<Label>{t('subscriptionPath')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>{t('subscriptionPathDescription')}</p>
|
||||
</TableCell>
|
||||
<TableCell className='flex items-center gap-2 text-right'>
|
||||
<EnhancedInput
|
||||
placeholder={t('subscriptionPathPlaceholder')}
|
||||
value={data?.subscribe_path}
|
||||
onValueBlur={(value) => updateConfig('subscribe_path', value)}
|
||||
/>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className='align-top'>
|
||||
<Label>{t('subscriptionDomain')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>{t('subscriptionDomainDescription')}</p>
|
||||
</TableCell>
|
||||
<TableCell className='text-right'>
|
||||
<Textarea
|
||||
className='h-52'
|
||||
placeholder={t('subscriptionDomainPlaceholder')}
|
||||
defaultValue={data?.subscribe_domain}
|
||||
onBlur={(e) => {
|
||||
updateConfig('subscribe_domain', e.target.value);
|
||||
}}
|
||||
/>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
<Label>{t('app')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>{t('appDescription')}</p>
|
||||
</TableCell>
|
||||
<TableCell className='flex justify-end gap-2'>
|
||||
<Button
|
||||
size='sm'
|
||||
variant='outline'
|
||||
onClick={() => {
|
||||
setApp(apps);
|
||||
}}
|
||||
>
|
||||
{t('reset')}
|
||||
</Button>
|
||||
<Button
|
||||
size='sm'
|
||||
onClick={() => {
|
||||
const { added, deleted, updated } = compareData(apps!, app!);
|
||||
|
||||
added.forEach(async (item) => {
|
||||
await createApplication(item as API.CreateApplicationRequest);
|
||||
});
|
||||
deleted.forEach(async (item) => {
|
||||
await deleteApplication({
|
||||
id: item.id,
|
||||
});
|
||||
});
|
||||
updated.forEach(async (item) => {
|
||||
await updateApplication(item);
|
||||
});
|
||||
toast.success(t('saveSuccess'));
|
||||
appsRefetch();
|
||||
}}
|
||||
>
|
||||
{t('save')}
|
||||
</Button>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
</TableBody>
|
||||
</Table>
|
||||
<Tabs defaultValue='windows'>
|
||||
<TabsList className='h-full flex-wrap'>
|
||||
{appTypes.map((type) => {
|
||||
return (
|
||||
<TabsTrigger value={type} key={type} className='uppercase'>
|
||||
{type}
|
||||
</TabsTrigger>
|
||||
);
|
||||
})}
|
||||
</TabsList>
|
||||
{appTypes.map((type) => {
|
||||
const list = (app?.[type] || []) as API.Application[];
|
||||
const updatedList = (key: string, value: string, index: number) => {
|
||||
const newList = list.map((item, i) => (i === index ? { ...item, [key]: value } : item));
|
||||
|
||||
setApp({
|
||||
...app,
|
||||
[type]: newList,
|
||||
} as API.ApplicationResponse);
|
||||
};
|
||||
|
||||
return (
|
||||
<TabsContent value={type} key={type} className='mt-4 space-y-4'>
|
||||
{list.map((item, index) => {
|
||||
return (
|
||||
<div className='flex flex-col items-center gap-2 lg:flex-row' key={index}>
|
||||
<Select
|
||||
value={item.subscribe_type}
|
||||
onValueChange={(value) => {
|
||||
updatedList('subscribe_type', value, index);
|
||||
}}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={t('subscriptionProtocol')} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{subscribe_types?.map((item) => (
|
||||
<SelectItem key={item} value={item}>
|
||||
{item}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<EnhancedInput
|
||||
placeholder={t('appName')}
|
||||
value={item.name}
|
||||
onValueChange={(value) => updatedList('name', value as string, index)}
|
||||
/>
|
||||
<EnhancedInput
|
||||
placeholder={t('appIcon')}
|
||||
value={item.icon}
|
||||
onValueChange={(value) => updatedList('icon', value as string, index)}
|
||||
/>
|
||||
<EnhancedInput
|
||||
placeholder={t('appDownloadURL')}
|
||||
value={item.url}
|
||||
onValueChange={(value) => updatedList('url', value as string, index)}
|
||||
/>
|
||||
<Button
|
||||
variant='destructive'
|
||||
size='sm'
|
||||
onClick={() => {
|
||||
setApp({
|
||||
...app,
|
||||
[type]: list.filter((l, i) => i !== index),
|
||||
} as API.ApplicationResponse);
|
||||
}}
|
||||
>
|
||||
{t('delete')}
|
||||
</Button>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
<Button
|
||||
className='w-full'
|
||||
variant='outline'
|
||||
onClick={() => {
|
||||
setApp({
|
||||
...app,
|
||||
[type]: [
|
||||
...list,
|
||||
{
|
||||
platform: type,
|
||||
},
|
||||
],
|
||||
} as API.ApplicationResponse);
|
||||
}}
|
||||
>
|
||||
{t('add')}
|
||||
</Button>
|
||||
</TabsContent>
|
||||
);
|
||||
})}
|
||||
</Tabs>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "akce",
|
||||
"app": {
|
||||
"add": "Přidat",
|
||||
"appDownloadURL": "URL pro stažení aplikace",
|
||||
"appIcon": "Ikona aplikace",
|
||||
"appName": "Název aplikace",
|
||||
"batchDelete": "Hromadné smazání",
|
||||
"cancel": "Zrušit",
|
||||
"confirm": "Potvrdit",
|
||||
"confirmDelete": "Potvrdit smazání",
|
||||
"createApp": "Vytvořit aplikaci",
|
||||
"createSuccess": "Úspěšně vytvořeno",
|
||||
"delete": "Smazat",
|
||||
"deleteSuccess": "Úspěšně smazáno",
|
||||
"deleteWarning": "Tuto akci nelze vrátit zpět",
|
||||
"edit": "Upravit",
|
||||
"editApp": "Upravit aplikaci",
|
||||
"platform": "Platforma",
|
||||
"subscriptionProtocol": "Protokol předplatného",
|
||||
"updateSuccess": "Úspěšně aktualizováno"
|
||||
},
|
||||
"cancel": "Zrušit",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Režim jednorázového předplatného",
|
||||
"singleSubscriptionModeDescription": "Když je povoleno, všechna uživatelská předplatná budou převedena na zůstatek",
|
||||
"subscriptionDomain": "Doména předplatného",
|
||||
"subscriptionDomainDescription": "Používá se pro předplatné; nechte prázdné pro použití domény webu",
|
||||
"subscriptionDomainPlaceholder": "Zadejte doménu předplatného, jednu na řádek",
|
||||
"subscriptionPath": "Cesta předplatného",
|
||||
"subscriptionPathDescription": "Používá se pro předplatné; po úpravě nezapomeňte restartovat systém pro optimální výkon",
|
||||
"subscriptionPathPlaceholder": "Zadejte",
|
||||
"wildcardResolution": "Řešení zástupných znaků",
|
||||
"wildcardResolutionDescription": "Používá se pro předplatné"
|
||||
},
|
||||
"confirm": "Potvrdit",
|
||||
"confirmDelete": "Opravdu chcete smazat?",
|
||||
"copy": "Kopírovat",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Přihlásit se ke skupině",
|
||||
"tabs": {
|
||||
"subscribe": "Předplatit",
|
||||
"subscribeApp": "Konfigurace aplikace",
|
||||
"subscribeConfig": "Konfigurace předplatného",
|
||||
"subscribeGroup": "Skupina předplatných"
|
||||
},
|
||||
"traffic": "provoz",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Používá se k zobrazení místa, kde je potřeba zobrazit název webu",
|
||||
"siteNamePlaceholder": "Zadejte název webu"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Přidat",
|
||||
"app": "Aplikace",
|
||||
"appDescription": "Nastavte adresu pro stažení aplikace a pravidla importu, nezapomeňte po úpravách uložit",
|
||||
"appDownloadURL": "Adresa pro stažení aplikace",
|
||||
"appIcon": "Ikona aplikace",
|
||||
"appName": "Název aplikace",
|
||||
"delete": "Smazat",
|
||||
"reset": "Resetovat",
|
||||
"save": "Uložit",
|
||||
"saveSuccess": "Úspěšně uloženo",
|
||||
"singleSubscriptionMode": "Režim jednorázového předplatného",
|
||||
"singleSubscriptionModeDescription": "Po aktivaci se všechny uživatelské balíčky převedou na zůstatek",
|
||||
"subscriptionDomain": "Doména předplatného",
|
||||
"subscriptionDomainDescription": "Používá se pro předplatné, pokud je prázdné, použije se doména webu",
|
||||
"subscriptionDomainPlaceholder": "Zadejte doménu předplatného, pro více domén použijte jeden řádek pro každou",
|
||||
"subscriptionPath": "Cesta předplatného",
|
||||
"subscriptionPathDescription": "Používá se pro předplatné, po úpravě je nutné restartovat systém pro zajištění nejlepšího výkonu",
|
||||
"subscriptionPathPlaceholder": "Zadejte",
|
||||
"subscriptionProtocol": "Protokol předplatného",
|
||||
"wildcardResolution": "Řešení zástupných znaků",
|
||||
"wildcardResolutionDescription": "Používá se pro předplatné"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Měna",
|
||||
"email": "E-mail",
|
||||
"invite": "Pozvat",
|
||||
"node": "Uzlový bod",
|
||||
"register": "Registrace",
|
||||
"site": "Stránka",
|
||||
"subscription": "Předplatné",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Podmínky služby",
|
||||
"verify": "Ověřit"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "Aktionen",
|
||||
"app": {
|
||||
"add": "Hinzufügen",
|
||||
"appDownloadURL": "App-Download-URL",
|
||||
"appIcon": "App-Symbol",
|
||||
"appName": "App-Name",
|
||||
"batchDelete": "Stapel löschen",
|
||||
"cancel": "Abbrechen",
|
||||
"confirm": "Bestätigen",
|
||||
"confirmDelete": "Löschen bestätigen",
|
||||
"createApp": "App erstellen",
|
||||
"createSuccess": "Erfolgreich erstellt",
|
||||
"delete": "Löschen",
|
||||
"deleteSuccess": "Erfolgreich gelöscht",
|
||||
"deleteWarning": "Diese Aktion kann nicht rückgängig gemacht werden",
|
||||
"edit": "Bearbeiten",
|
||||
"editApp": "App bearbeiten",
|
||||
"platform": "Plattform",
|
||||
"subscriptionProtocol": "Abonnementprotokoll",
|
||||
"updateSuccess": "Erfolgreich aktualisiert"
|
||||
},
|
||||
"cancel": "Abbrechen",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Einzelabonnement-Modus",
|
||||
"singleSubscriptionModeDescription": "Wenn aktiviert, werden alle Benutzerabonnements in Guthaben umgewandelt",
|
||||
"subscriptionDomain": "Abonnement-Domain",
|
||||
"subscriptionDomainDescription": "Wird für Abonnements verwendet; leer lassen, um die Site-Domain zu verwenden",
|
||||
"subscriptionDomainPlaceholder": "Abonnement-Domain eingeben, eine pro Zeile",
|
||||
"subscriptionPath": "Abonnement-Pfad",
|
||||
"subscriptionPathDescription": "Wird für Abonnements verwendet; starten Sie das System nach der Änderung neu, um die optimale Leistung zu gewährleisten",
|
||||
"subscriptionPathPlaceholder": "Eingeben",
|
||||
"wildcardResolution": "Wildcard-Auflösung",
|
||||
"wildcardResolutionDescription": "Wird für Abonnements verwendet"
|
||||
},
|
||||
"confirm": "Bestätigen",
|
||||
"confirmDelete": "Möchten Sie wirklich löschen?",
|
||||
"copy": "Kopieren",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Gruppe abonnieren",
|
||||
"tabs": {
|
||||
"subscribe": "Abonnieren",
|
||||
"subscribeApp": "App-Konfiguration",
|
||||
"subscribeConfig": "Abonnement-Konfiguration",
|
||||
"subscribeGroup": "Abonnieren Gruppe"
|
||||
},
|
||||
"traffic": "Verkehr",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Position zur Anzeige des Seitennamens",
|
||||
"siteNamePlaceholder": "Bitte geben Sie den Seitennamen ein"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Hinzufügen",
|
||||
"app": "Anwendung",
|
||||
"appDescription": "Konfigurieren Sie die Download-Adresse und Importregeln der App. Vergessen Sie nicht, nach Änderungen zu speichern.",
|
||||
"appDownloadURL": "App-Download-Adresse",
|
||||
"appIcon": "App-Symbol",
|
||||
"appName": "App-Name",
|
||||
"delete": "Löschen",
|
||||
"reset": "Zurücksetzen",
|
||||
"save": "Speichern",
|
||||
"saveSuccess": "Erfolgreich gespeichert",
|
||||
"singleSubscriptionMode": "Einzelabonnement-Modus",
|
||||
"singleSubscriptionModeDescription": "Wenn aktiviert, werden alle Benutzerpakete in Guthaben umgewandelt.",
|
||||
"subscriptionDomain": "Abonnement-Domain",
|
||||
"subscriptionDomainDescription": "Für Abonnements, leer lassen, um die Site-Domain zu verwenden",
|
||||
"subscriptionDomainPlaceholder": "Bitte geben Sie die Abonnement-Domain ein, bei mehreren Domains bitte eine pro Zeile",
|
||||
"subscriptionPath": "Abonnement-Pfad",
|
||||
"subscriptionPathDescription": "Für Abonnements, bitte starten Sie das System nach Änderungen neu, um die beste Leistung zu gewährleisten",
|
||||
"subscriptionPathPlaceholder": "Bitte eingeben",
|
||||
"subscriptionProtocol": "Abonnement-Protokoll",
|
||||
"wildcardResolution": "Wildcard-Auflösung",
|
||||
"wildcardResolutionDescription": "Für Abonnements"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Währung",
|
||||
"email": "E-Mail",
|
||||
"invite": "Einladen",
|
||||
"node": "Knoten",
|
||||
"register": "Registrieren",
|
||||
"site": "Seite",
|
||||
"subscription": "Abonnement",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Nutzungsbedingungen",
|
||||
"verify": "Verifizieren"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "Actions",
|
||||
"app": {
|
||||
"add": "Add",
|
||||
"appDownloadURL": "App Download URL",
|
||||
"appIcon": "App Icon",
|
||||
"appName": "App Name",
|
||||
"batchDelete": "Batch Delete",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Confirm",
|
||||
"confirmDelete": "Confirm Delete",
|
||||
"createApp": "Create App",
|
||||
"createSuccess": "Created successfully",
|
||||
"delete": "Delete",
|
||||
"deleteSuccess": "Deleted successfully",
|
||||
"deleteWarning": "This action cannot be undone",
|
||||
"edit": "Edit",
|
||||
"editApp": "Edit App",
|
||||
"platform": "Platform",
|
||||
"subscriptionProtocol": "Subscription Protocol",
|
||||
"updateSuccess": "Updated successfully"
|
||||
},
|
||||
"cancel": "Cancel",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Single Subscription Mode",
|
||||
"singleSubscriptionModeDescription": "When enabled, all user subscriptions will be converted to balance",
|
||||
"subscriptionDomain": "Subscription Domain",
|
||||
"subscriptionDomainDescription": "Used for subscription; leave blank to use site domain",
|
||||
"subscriptionDomainPlaceholder": "Enter subscription domain, one per line",
|
||||
"subscriptionPath": "Subscription Path",
|
||||
"subscriptionPathDescription": "Used for subscription; be sure to restart the system after modification for optimal performance",
|
||||
"subscriptionPathPlaceholder": "Enter",
|
||||
"wildcardResolution": "Wildcard Resolution",
|
||||
"wildcardResolutionDescription": "Used for subscription"
|
||||
},
|
||||
"confirm": "Confirm",
|
||||
"confirmDelete": "Are you sure you want to delete?",
|
||||
"copy": "Copy",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Subscription Group",
|
||||
"tabs": {
|
||||
"subscribe": "Subscribe",
|
||||
"subscribeApp": "App Configuration",
|
||||
"subscribeConfig": "Subscription Configuration",
|
||||
"subscribeGroup": "Subscription Group"
|
||||
},
|
||||
"traffic": "Traffic",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Used for displaying the site name in designated locations",
|
||||
"siteNamePlaceholder": "Enter site name"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Add",
|
||||
"app": "App",
|
||||
"appDescription": "Configure app download URL and import rules; remember to save after modification",
|
||||
"appDownloadURL": "App Download URL",
|
||||
"appIcon": "App Icon",
|
||||
"appName": "App Name",
|
||||
"delete": "Delete",
|
||||
"reset": "Reset",
|
||||
"save": "Save",
|
||||
"saveSuccess": "Save Successful",
|
||||
"singleSubscriptionMode": "Single Subscription Mode",
|
||||
"singleSubscriptionModeDescription": "When enabled, all user subscriptions will be converted to balance",
|
||||
"subscriptionDomain": "Subscription Domain",
|
||||
"subscriptionDomainDescription": "Used for subscription; leave blank to use site domain",
|
||||
"subscriptionDomainPlaceholder": "Enter subscription domain, one per line",
|
||||
"subscriptionPath": "Subscription Path",
|
||||
"subscriptionPathDescription": "Used for subscription; be sure to restart the system after modification for optimal performance",
|
||||
"subscriptionPathPlaceholder": "Enter",
|
||||
"subscriptionProtocol": "Subscription Protocol",
|
||||
"wildcardResolution": "Wildcard Resolution",
|
||||
"wildcardResolutionDescription": "Used for subscription"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Currency",
|
||||
"email": "Email",
|
||||
"invite": "Invite",
|
||||
"node": "Node",
|
||||
"register": "Register",
|
||||
"site": "Site",
|
||||
"subscription": "Subscription",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Terms of Service",
|
||||
"verify": "Verify"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "acciones",
|
||||
"app": {
|
||||
"add": "Agregar",
|
||||
"appDownloadURL": "URL de Descarga de la App",
|
||||
"appIcon": "Icono de la App",
|
||||
"appName": "Nombre de la App",
|
||||
"batchDelete": "Eliminar en Lote",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Confirmar",
|
||||
"confirmDelete": "Confirmar Eliminación",
|
||||
"createApp": "Crear App",
|
||||
"createSuccess": "Creado con éxito",
|
||||
"delete": "Eliminar",
|
||||
"deleteSuccess": "Eliminado con éxito",
|
||||
"deleteWarning": "Esta acción no se puede deshacer",
|
||||
"edit": "Editar",
|
||||
"editApp": "Editar App",
|
||||
"platform": "Plataforma",
|
||||
"subscriptionProtocol": "Protocolo de Suscripción",
|
||||
"updateSuccess": "Actualizado con éxito"
|
||||
},
|
||||
"cancel": "Cancelar",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Modo de Suscripción Única",
|
||||
"singleSubscriptionModeDescription": "Cuando está habilitado, todas las suscripciones de usuario se convertirán en saldo",
|
||||
"subscriptionDomain": "Dominio de Suscripción",
|
||||
"subscriptionDomainDescription": "Usado para suscripción; dejar en blanco para usar el dominio del sitio",
|
||||
"subscriptionDomainPlaceholder": "Ingrese el dominio de suscripción, uno por línea",
|
||||
"subscriptionPath": "Ruta de Suscripción",
|
||||
"subscriptionPathDescription": "Usado para suscripción; asegúrese de reiniciar el sistema después de la modificación para un rendimiento óptimo",
|
||||
"subscriptionPathPlaceholder": "Ingrese",
|
||||
"wildcardResolution": "Resolución de Comodín",
|
||||
"wildcardResolutionDescription": "Usado para suscripción"
|
||||
},
|
||||
"confirm": "Confirmar",
|
||||
"confirmDelete": "¿Estás seguro de que deseas eliminar?",
|
||||
"copy": "Copiar",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Suscribirse al grupo",
|
||||
"tabs": {
|
||||
"subscribe": "Suscribirse",
|
||||
"subscribeApp": "Configuración de la aplicación",
|
||||
"subscribeConfig": "Configuración de suscripción",
|
||||
"subscribeGroup": "Grupo de suscripción"
|
||||
},
|
||||
"traffic": "tráfico",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Se utiliza para mostrar la ubicación donde se debe mostrar el nombre del sitio",
|
||||
"siteNamePlaceholder": "Por favor, introduce el nombre del sitio"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Agregar",
|
||||
"app": "Aplicación",
|
||||
"appDescription": "Configura la dirección de descarga de la APP y las reglas de importación, recuerda guardar después de modificar",
|
||||
"appDownloadURL": "Dirección de descarga de la aplicación",
|
||||
"appIcon": "Ícono de la aplicación",
|
||||
"appName": "Nombre de la aplicación",
|
||||
"delete": "Eliminar",
|
||||
"reset": "Restablecer",
|
||||
"save": "Guardar",
|
||||
"saveSuccess": "Guardado exitoso",
|
||||
"singleSubscriptionMode": "Modo de suscripción única",
|
||||
"singleSubscriptionModeDescription": "Al activarlo, todos los planes de los usuarios se convertirán en saldo",
|
||||
"subscriptionDomain": "Dominio de suscripción",
|
||||
"subscriptionDomainDescription": "Usado para suscripción, si se deja en blanco se usará el dominio del sitio",
|
||||
"subscriptionDomainPlaceholder": "Por favor, introduce el dominio de suscripción, varios dominios deben estar en líneas separadas",
|
||||
"subscriptionPath": "Ruta de suscripción",
|
||||
"subscriptionPathDescription": "Usado para suscripción, después de modificar asegúrate de reiniciar el sistema para garantizar el mejor rendimiento",
|
||||
"subscriptionPathPlaceholder": "Por favor, introduce",
|
||||
"subscriptionProtocol": "Protocolo de suscripción",
|
||||
"wildcardResolution": "Resolución de comodines",
|
||||
"wildcardResolutionDescription": "Usado para suscripción"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Moneda",
|
||||
"email": "Correo electrónico",
|
||||
"invite": "Invitar",
|
||||
"node": "Nodo",
|
||||
"register": "Registrar",
|
||||
"site": "Sitio",
|
||||
"subscription": "Suscripción",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Términos de servicio",
|
||||
"verify": "Verificar"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "acciones",
|
||||
"app": {
|
||||
"add": "Agregar",
|
||||
"appDownloadURL": "URL de Descarga de la App",
|
||||
"appIcon": "Ícono de la App",
|
||||
"appName": "Nombre de la App",
|
||||
"batchDelete": "Eliminar en Lote",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Confirmar",
|
||||
"confirmDelete": "Confirmar Eliminación",
|
||||
"createApp": "Crear App",
|
||||
"createSuccess": "Creado exitosamente",
|
||||
"delete": "Eliminar",
|
||||
"deleteSuccess": "Eliminado exitosamente",
|
||||
"deleteWarning": "Esta acción no se puede deshacer",
|
||||
"edit": "Editar",
|
||||
"editApp": "Editar App",
|
||||
"platform": "Plataforma",
|
||||
"subscriptionProtocol": "Protocolo de Suscripción",
|
||||
"updateSuccess": "Actualizado exitosamente"
|
||||
},
|
||||
"cancel": "Cancelar",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Modo de Suscripción Única",
|
||||
"singleSubscriptionModeDescription": "Cuando está habilitado, todas las suscripciones de usuarios se convertirán en saldo",
|
||||
"subscriptionDomain": "Dominio de Suscripción",
|
||||
"subscriptionDomainDescription": "Usado para suscripción; deje en blanco para usar el dominio del sitio",
|
||||
"subscriptionDomainPlaceholder": "Ingrese el dominio de suscripción, uno por línea",
|
||||
"subscriptionPath": "Ruta de Suscripción",
|
||||
"subscriptionPathDescription": "Usado para suscripción; asegúrese de reiniciar el sistema después de la modificación para un rendimiento óptimo",
|
||||
"subscriptionPathPlaceholder": "Ingrese",
|
||||
"wildcardResolution": "Resolución de Comodín",
|
||||
"wildcardResolutionDescription": "Usado para suscripción"
|
||||
},
|
||||
"confirm": "Confirmar",
|
||||
"confirmDelete": "¿Estás seguro de que deseas eliminar?",
|
||||
"copy": "Copiar",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Suscribirse al grupo",
|
||||
"tabs": {
|
||||
"subscribe": "Suscribirse",
|
||||
"subscribeApp": "Configuración de la App",
|
||||
"subscribeConfig": "Configuración de Suscripción",
|
||||
"subscribeGroup": "Grupo de suscripción"
|
||||
},
|
||||
"traffic": "tráfico",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Usado para mostrar la ubicación donde se debe exhibir el nombre del sitio",
|
||||
"siteNamePlaceholder": "Por favor, ingresa el nombre del sitio"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Agregar",
|
||||
"app": "Aplicación",
|
||||
"appDescription": "Configura la dirección de descarga de la APP y las reglas de importación, recuerda guardar después de modificar",
|
||||
"appDownloadURL": "Dirección de descarga de la aplicación",
|
||||
"appIcon": "Ícono de la aplicación",
|
||||
"appName": "Nombre de la aplicación",
|
||||
"delete": "Eliminar",
|
||||
"reset": "Restablecer",
|
||||
"save": "Guardar",
|
||||
"saveSuccess": "Guardado exitosamente",
|
||||
"singleSubscriptionMode": "Modo de suscripción única",
|
||||
"singleSubscriptionModeDescription": "Al activarlo, todos los planes de los usuarios se convertirán en saldo",
|
||||
"subscriptionDomain": "Dominio de suscripción",
|
||||
"subscriptionDomainDescription": "Usado para suscripción, si se deja en blanco se usará el dominio del sitio",
|
||||
"subscriptionDomainPlaceholder": "Por favor ingresa el dominio de suscripción, múltiples dominios deben estar en líneas separadas",
|
||||
"subscriptionPath": "Ruta de suscripción",
|
||||
"subscriptionPathDescription": "Usado para suscripción, después de modificar asegúrate de reiniciar el sistema para garantizar el mejor rendimiento",
|
||||
"subscriptionPathPlaceholder": "Por favor ingresa",
|
||||
"subscriptionProtocol": "Protocolo de suscripción",
|
||||
"wildcardResolution": "Resolución de comodines",
|
||||
"wildcardResolutionDescription": "Usado para suscripción"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Moneda",
|
||||
"email": "Correo electrónico",
|
||||
"invite": "Invitar",
|
||||
"node": "Nodo",
|
||||
"register": "Registrar",
|
||||
"site": "Sitio",
|
||||
"subscription": "Suscripción",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Términos del servicio",
|
||||
"verify": "Verificar"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "اقدامات",
|
||||
"app": {
|
||||
"add": "افزودن",
|
||||
"appDownloadURL": "آدرس دانلود اپلیکیشن",
|
||||
"appIcon": "آیکون اپلیکیشن",
|
||||
"appName": "نام اپلیکیشن",
|
||||
"batchDelete": "حذف گروهی",
|
||||
"cancel": "لغو",
|
||||
"confirm": "تأیید",
|
||||
"confirmDelete": "تأیید حذف",
|
||||
"createApp": "ایجاد اپلیکیشن",
|
||||
"createSuccess": "با موفقیت ایجاد شد",
|
||||
"delete": "حذف",
|
||||
"deleteSuccess": "با موفقیت حذف شد",
|
||||
"deleteWarning": "این عمل قابل بازگشت نیست",
|
||||
"edit": "ویرایش",
|
||||
"editApp": "ویرایش اپلیکیشن",
|
||||
"platform": "پلتفرم",
|
||||
"subscriptionProtocol": "پروتکل اشتراک",
|
||||
"updateSuccess": "با موفقیت بهروزرسانی شد"
|
||||
},
|
||||
"cancel": "لغو",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "حالت اشتراک تکی",
|
||||
"singleSubscriptionModeDescription": "هنگامی که فعال شود، تمام اشتراکهای کاربر به موجودی تبدیل میشوند",
|
||||
"subscriptionDomain": "دامنه اشتراک",
|
||||
"subscriptionDomainDescription": "برای اشتراک استفاده میشود؛ برای استفاده از دامنه سایت، خالی بگذارید",
|
||||
"subscriptionDomainPlaceholder": "دامنه اشتراک را وارد کنید، هر خط یک دامنه",
|
||||
"subscriptionPath": "مسیر اشتراک",
|
||||
"subscriptionPathDescription": "برای اشتراک استفاده میشود؛ حتماً پس از تغییر، سیستم را برای عملکرد بهینه راهاندازی مجدد کنید",
|
||||
"subscriptionPathPlaceholder": "وارد کنید",
|
||||
"wildcardResolution": "حل و فصل کاراکترهای جایگزین",
|
||||
"wildcardResolutionDescription": "برای اشتراک استفاده میشود"
|
||||
},
|
||||
"confirm": "تأیید",
|
||||
"confirmDelete": "آیا مطمئن هستید که میخواهید حذف کنید؟",
|
||||
"copy": "کپی",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "گروه اشتراک",
|
||||
"tabs": {
|
||||
"subscribe": "اشتراک",
|
||||
"subscribeApp": "پیکربندی اپلیکیشن",
|
||||
"subscribeConfig": "پیکربندی اشتراک",
|
||||
"subscribeGroup": "گروه اشتراک"
|
||||
},
|
||||
"traffic": "ترافیک",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "برای نمایش نام سایت در مکانهای تعیینشده استفاده میشود",
|
||||
"siteNamePlaceholder": "نام سایت را وارد کنید"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "افزودن",
|
||||
"app": "اپلیکیشن",
|
||||
"appDescription": "پیکربندی URL دانلود اپلیکیشن و قوانین واردات؛ پس از تغییرات، ذخیره را فراموش نکنید",
|
||||
"appDownloadURL": "URL دانلود اپلیکیشن",
|
||||
"appIcon": "آیکون اپلیکیشن",
|
||||
"appName": "نام اپلیکیشن",
|
||||
"delete": "حذف",
|
||||
"reset": "بازنشانی",
|
||||
"save": "ذخیره",
|
||||
"saveSuccess": "ذخیره با موفقیت انجام شد",
|
||||
"singleSubscriptionMode": "حالت اشتراک تک",
|
||||
"singleSubscriptionModeDescription": "هنگامی که فعال شود، تمام اشتراکهای کاربر به موجودی تبدیل میشوند",
|
||||
"subscriptionDomain": "دامنه اشتراک",
|
||||
"subscriptionDomainDescription": "برای اشتراک استفاده میشود؛ برای استفاده از دامنه سایت، این قسمت را خالی بگذارید",
|
||||
"subscriptionDomainPlaceholder": "دامنه اشتراک را وارد کنید، هر خط یک دامنه",
|
||||
"subscriptionPath": "مسیر اشتراک",
|
||||
"subscriptionPathDescription": "برای اشتراک استفاده میشود؛ حتماً پس از تغییر، سیستم را برای عملکرد بهینه راهاندازی مجدد کنید",
|
||||
"subscriptionPathPlaceholder": "وارد کنید",
|
||||
"subscriptionProtocol": "پروتکل اشتراک",
|
||||
"wildcardResolution": "حل و فصل کاراکترهای جایگزین",
|
||||
"wildcardResolutionDescription": "برای اشتراک استفاده میشود"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "ارز",
|
||||
"email": "ایمیل",
|
||||
"invite": "دعوت",
|
||||
"node": "گره",
|
||||
"register": "ثبتنام",
|
||||
"site": "سایت",
|
||||
"subscription": "اشتراک",
|
||||
"telegram": "تلگرام",
|
||||
"tos": "شرایط خدمات",
|
||||
"verify": "تأیید"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "toiminnot",
|
||||
"app": {
|
||||
"add": "Lisää",
|
||||
"appDownloadURL": "Sovelluksen lataus-URL",
|
||||
"appIcon": "Sovelluksen kuvake",
|
||||
"appName": "Sovelluksen nimi",
|
||||
"batchDelete": "Poista erä",
|
||||
"cancel": "Peruuta",
|
||||
"confirm": "Vahvista",
|
||||
"confirmDelete": "Vahvista poisto",
|
||||
"createApp": "Luo sovellus",
|
||||
"createSuccess": "Luotu onnistuneesti",
|
||||
"delete": "Poista",
|
||||
"deleteSuccess": "Poistettu onnistuneesti",
|
||||
"deleteWarning": "Tätä toimintoa ei voi peruuttaa",
|
||||
"edit": "Muokkaa",
|
||||
"editApp": "Muokkaa sovellusta",
|
||||
"platform": "Alusta",
|
||||
"subscriptionProtocol": "Tilausprotokolla",
|
||||
"updateSuccess": "Päivitetty onnistuneesti"
|
||||
},
|
||||
"cancel": "Peruuta",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Yhden tilauksen tila",
|
||||
"singleSubscriptionModeDescription": "Kun tämä on käytössä, kaikki käyttäjätilaukset muunnetaan saldoksi",
|
||||
"subscriptionDomain": "Tilausalue",
|
||||
"subscriptionDomainDescription": "Käytetään tilaukseen; jätä tyhjäksi käyttääksesi sivuston verkkotunnusta",
|
||||
"subscriptionDomainPlaceholder": "Syötä tilausalue, yksi per rivi",
|
||||
"subscriptionPath": "Tilauspolku",
|
||||
"subscriptionPathDescription": "Käytetään tilaukseen; varmista, että käynnistät järjestelmän uudelleen muutoksen jälkeen parhaan suorituskyvyn saavuttamiseksi",
|
||||
"subscriptionPathPlaceholder": "Syötä",
|
||||
"wildcardResolution": "Yleismerkkien ratkaisu",
|
||||
"wildcardResolutionDescription": "Käytetään tilaukseen"
|
||||
},
|
||||
"confirm": "Vahvista",
|
||||
"confirmDelete": "Haluatko varmasti poistaa?",
|
||||
"copy": "Kopioi",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Tilaa ryhmä",
|
||||
"tabs": {
|
||||
"subscribe": "Tilaa",
|
||||
"subscribeApp": "Sovelluksen asetukset",
|
||||
"subscribeConfig": "Tilausasetukset",
|
||||
"subscribeGroup": "Tilaa ryhmä"
|
||||
},
|
||||
"traffic": "liikenne",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Näyttääksesi paikan, jossa sivuston nimi tulee näkyä",
|
||||
"siteNamePlaceholder": "Syötä sivuston nimi"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Lisää",
|
||||
"app": "Sovellus",
|
||||
"appDescription": "Määritä sovelluksen latausosoite ja tuontisäännöt, muista tallentaa muutosten jälkeen",
|
||||
"appDownloadURL": "Sovelluksen latausosoite",
|
||||
"appIcon": "Sovelluksen kuvake",
|
||||
"appName": "Sovelluksen nimi",
|
||||
"delete": "Poista",
|
||||
"reset": "Nollaa",
|
||||
"save": "Tallenna",
|
||||
"saveSuccess": "Tallennus onnistui",
|
||||
"singleSubscriptionMode": "Yksittäinen tilausmalli",
|
||||
"singleSubscriptionModeDescription": "Kun tämä on käytössä, kaikkien käyttäjien paketit muunnetaan saldoksi",
|
||||
"subscriptionDomain": "Tilausverkkotunnus",
|
||||
"subscriptionDomainDescription": "Käytetään tilaukseen, jätä tyhjäksi käyttääksesi sivuston verkkotunnusta",
|
||||
"subscriptionDomainPlaceholder": "Anna tilausverkkotunnus, useita verkkotunnuksia varten yksi per rivi",
|
||||
"subscriptionPath": "Tilauspolku",
|
||||
"subscriptionPathDescription": "Käytetään tilaukseen, muista käynnistää järjestelmä uudelleen muutosten jälkeen parhaan suorituskyvyn varmistamiseksi",
|
||||
"subscriptionPathPlaceholder": "Anna",
|
||||
"subscriptionProtocol": "Tilausprotokolla",
|
||||
"wildcardResolution": "Yleismerkkien ratkaisu",
|
||||
"wildcardResolutionDescription": "Käytetään tilaukseen"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Valuutta",
|
||||
"email": "Sähköposti",
|
||||
"invite": "Kutsu",
|
||||
"node": "Solmu",
|
||||
"register": "Rekisteröidy",
|
||||
"site": "Sivusto",
|
||||
"subscription": "Tilaus",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Käyttöehdot",
|
||||
"verify": "Vahvista"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "actions",
|
||||
"app": {
|
||||
"add": "Ajouter",
|
||||
"appDownloadURL": "URL de téléchargement de l'application",
|
||||
"appIcon": "Icône de l'application",
|
||||
"appName": "Nom de l'application",
|
||||
"batchDelete": "Suppression par lot",
|
||||
"cancel": "Annuler",
|
||||
"confirm": "Confirmer",
|
||||
"confirmDelete": "Confirmer la suppression",
|
||||
"createApp": "Créer une application",
|
||||
"createSuccess": "Créé avec succès",
|
||||
"delete": "Supprimer",
|
||||
"deleteSuccess": "Supprimé avec succès",
|
||||
"deleteWarning": "Cette action est irréversible",
|
||||
"edit": "Modifier",
|
||||
"editApp": "Modifier l'application",
|
||||
"platform": "Plateforme",
|
||||
"subscriptionProtocol": "Protocole d'abonnement",
|
||||
"updateSuccess": "Mis à jour avec succès"
|
||||
},
|
||||
"cancel": "Annuler",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Mode d'abonnement unique",
|
||||
"singleSubscriptionModeDescription": "Lorsqu'il est activé, tous les abonnements des utilisateurs seront convertis en solde",
|
||||
"subscriptionDomain": "Domaine d'abonnement",
|
||||
"subscriptionDomainDescription": "Utilisé pour l'abonnement ; laissez vide pour utiliser le domaine du site",
|
||||
"subscriptionDomainPlaceholder": "Entrez le domaine d'abonnement, un par ligne",
|
||||
"subscriptionPath": "Chemin d'abonnement",
|
||||
"subscriptionPathDescription": "Utilisé pour l'abonnement ; assurez-vous de redémarrer le système après modification pour des performances optimales",
|
||||
"subscriptionPathPlaceholder": "Entrez",
|
||||
"wildcardResolution": "Résolution générique",
|
||||
"wildcardResolutionDescription": "Utilisé pour l'abonnement"
|
||||
},
|
||||
"confirm": "Confirmer",
|
||||
"confirmDelete": "Êtes-vous sûr de vouloir supprimer ?",
|
||||
"copy": "Copier",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "S'abonner au groupe",
|
||||
"tabs": {
|
||||
"subscribe": "S'abonner",
|
||||
"subscribeApp": "Configuration de l'application",
|
||||
"subscribeConfig": "Configuration de l'abonnement",
|
||||
"subscribeGroup": "Groupe d'abonnement"
|
||||
},
|
||||
"traffic": "trafic",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Utilisé pour afficher l'emplacement où le nom du site doit être montré",
|
||||
"siteNamePlaceholder": "Veuillez entrer le nom du site"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Ajouter",
|
||||
"app": "Application",
|
||||
"appDescription": "Configurez l'adresse de téléchargement de l'application et les règles d'importation, n'oubliez pas de sauvegarder après modification",
|
||||
"appDownloadURL": "Adresse de téléchargement de l'application",
|
||||
"appIcon": "Icône de l'application",
|
||||
"appName": "Nom de l'application",
|
||||
"delete": "Supprimer",
|
||||
"reset": "Réinitialiser",
|
||||
"save": "Enregistrer",
|
||||
"saveSuccess": "Enregistrement réussi",
|
||||
"singleSubscriptionMode": "Mode d'abonnement unique",
|
||||
"singleSubscriptionModeDescription": "Une fois activé, tous les forfaits des utilisateurs seront convertis en solde",
|
||||
"subscriptionDomain": "Domaine d'abonnement",
|
||||
"subscriptionDomainDescription": "Utilisé pour l'abonnement, laissez vide pour utiliser le domaine du site",
|
||||
"subscriptionDomainPlaceholder": "Veuillez entrer le domaine d'abonnement, un domaine par ligne",
|
||||
"subscriptionPath": "Chemin d'abonnement",
|
||||
"subscriptionPathDescription": "Utilisé pour l'abonnement, veuillez redémarrer le système après modification pour garantir une performance optimale",
|
||||
"subscriptionPathPlaceholder": "Veuillez entrer",
|
||||
"subscriptionProtocol": "Protocole d'abonnement",
|
||||
"wildcardResolution": "Résolution de joker",
|
||||
"wildcardResolutionDescription": "Utilisé pour l'abonnement"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Devise",
|
||||
"email": "E-mail",
|
||||
"invite": "Inviter",
|
||||
"node": "Nœud",
|
||||
"register": "S'inscrire",
|
||||
"site": "Site",
|
||||
"subscription": "Abonnement",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Conditions de service",
|
||||
"verify": "Vérifier"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "क्रियाएँ",
|
||||
"app": {
|
||||
"add": "जोड़ें",
|
||||
"appDownloadURL": "ऐप डाउनलोड URL",
|
||||
"appIcon": "ऐप आइकन",
|
||||
"appName": "ऐप का नाम",
|
||||
"batchDelete": "बैच हटाएं",
|
||||
"cancel": "रद्द करें",
|
||||
"confirm": "पुष्टि करें",
|
||||
"confirmDelete": "हटाने की पुष्टि करें",
|
||||
"createApp": "ऐप बनाएं",
|
||||
"createSuccess": "सफलतापूर्वक बनाया गया",
|
||||
"delete": "हटाएं",
|
||||
"deleteSuccess": "सफलतापूर्वक हटाया गया",
|
||||
"deleteWarning": "यह क्रिया पूर्ववत नहीं की जा सकती",
|
||||
"edit": "संपादित करें",
|
||||
"editApp": "ऐप संपादित करें",
|
||||
"platform": "प्लेटफ़ॉर्म",
|
||||
"subscriptionProtocol": "सदस्यता प्रोटोकॉल",
|
||||
"updateSuccess": "सफलतापूर्वक अपडेट किया गया"
|
||||
},
|
||||
"cancel": "रद्द करें",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "एकल सदस्यता मोड",
|
||||
"singleSubscriptionModeDescription": "सक्रिय होने पर, सभी उपयोगकर्ता सदस्यताएँ शेष में परिवर्तित हो जाएँगी",
|
||||
"subscriptionDomain": "सदस्यता डोमेन",
|
||||
"subscriptionDomainDescription": "सदस्यता के लिए उपयोग किया जाता है; साइट डोमेन का उपयोग करने के लिए खाली छोड़ दें",
|
||||
"subscriptionDomainPlaceholder": "सदस्यता डोमेन दर्ज करें, एक प्रति पंक्ति",
|
||||
"subscriptionPath": "सदस्यता पथ",
|
||||
"subscriptionPathDescription": "सदस्यता के लिए उपयोग किया जाता है; इष्टतम प्रदर्शन के लिए संशोधन के बाद सिस्टम को पुनः आरंभ करना सुनिश्चित करें",
|
||||
"subscriptionPathPlaceholder": "दर्ज करें",
|
||||
"wildcardResolution": "वाइल्डकार्ड समाधान",
|
||||
"wildcardResolutionDescription": "सदस्यता के लिए उपयोग किया जाता है"
|
||||
},
|
||||
"confirm": "पुष्टि करें",
|
||||
"confirmDelete": "क्या आप वाकई हटाना चाहते हैं?",
|
||||
"copy": "कॉपी",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "सदस्यता समूह",
|
||||
"tabs": {
|
||||
"subscribe": "सदस्यता लें",
|
||||
"subscribeApp": "ऐप कॉन्फ़िगरेशन",
|
||||
"subscribeConfig": "सदस्यता कॉन्फ़िगरेशन",
|
||||
"subscribeGroup": "समूह सदस्यता"
|
||||
},
|
||||
"traffic": "ट्रैफिक",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "साइट का नाम प्रदर्शित करने के लिए आवश्यक स्थान",
|
||||
"siteNamePlaceholder": "कृपया साइट का नाम दर्ज करें"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "जोड़ें",
|
||||
"app": "एप्लिकेशन",
|
||||
"appDescription": "एप्लिकेशन के डाउनलोड पते और आयात नियमों को कॉन्फ़िगर करें, संशोधन के बाद सहेजना न भूलें",
|
||||
"appDownloadURL": "एप्लिकेशन डाउनलोड पता",
|
||||
"appIcon": "एप्लिकेशन आइकन",
|
||||
"appName": "एप्लिकेशन नाम",
|
||||
"delete": "हटाएं",
|
||||
"reset": "रीसेट",
|
||||
"save": "सहेजें",
|
||||
"saveSuccess": "सहेजा गया",
|
||||
"singleSubscriptionMode": "एकल सदस्यता मोड",
|
||||
"singleSubscriptionModeDescription": "सक्रिय करने पर, सभी उपयोगकर्ताओं की योजनाएं शेष राशि में परिवर्तित हो जाएंगी",
|
||||
"subscriptionDomain": "सदस्यता डोमेन",
|
||||
"subscriptionDomainDescription": "सदस्यता के लिए, खाली छोड़ने पर साइट डोमेन का उपयोग किया जाएगा",
|
||||
"subscriptionDomainPlaceholder": "कृपया सदस्यता डोमेन दर्ज करें, कई डोमेन के लिए प्रत्येक पंक्ति में एक दर्ज करें",
|
||||
"subscriptionPath": "सदस्यता पथ",
|
||||
"subscriptionPathDescription": "सदस्यता के लिए, संशोधन के बाद सर्वोत्तम प्रदर्शन अनुभव सुनिश्चित करने के लिए सिस्टम को पुनरारंभ करना न भूलें",
|
||||
"subscriptionPathPlaceholder": "कृपया दर्ज करें",
|
||||
"subscriptionProtocol": "सदस्यता प्रोटोकॉल",
|
||||
"wildcardResolution": "वाइल्डकार्ड समाधान",
|
||||
"wildcardResolutionDescription": "सदस्यता के लिए"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "मुद्रा",
|
||||
"email": "ईमेल",
|
||||
"invite": "आमंत्रण",
|
||||
"node": "नोड",
|
||||
"register": "पंजीकरण",
|
||||
"site": "साइट",
|
||||
"subscription": "सदस्यता",
|
||||
"telegram": "टेलीग्राम",
|
||||
"tos": "सेवा की शर्तें",
|
||||
"verify": "सत्यापन"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "műveletek",
|
||||
"app": {
|
||||
"add": "Hozzáadás",
|
||||
"appDownloadURL": "Alkalmazás letöltési URL",
|
||||
"appIcon": "Alkalmazás ikon",
|
||||
"appName": "Alkalmazás neve",
|
||||
"batchDelete": "Csoportos törlés",
|
||||
"cancel": "Mégse",
|
||||
"confirm": "Megerősítés",
|
||||
"confirmDelete": "Törlés megerősítése",
|
||||
"createApp": "Alkalmazás létrehozása",
|
||||
"createSuccess": "Sikeresen létrehozva",
|
||||
"delete": "Törlés",
|
||||
"deleteSuccess": "Sikeresen törölve",
|
||||
"deleteWarning": "Ez a művelet nem vonható vissza",
|
||||
"edit": "Szerkesztés",
|
||||
"editApp": "Alkalmazás szerkesztése",
|
||||
"platform": "Platform",
|
||||
"subscriptionProtocol": "Előfizetési protokoll",
|
||||
"updateSuccess": "Sikeresen frissítve"
|
||||
},
|
||||
"cancel": "Mégse",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Egyszeri Előfizetési Mód",
|
||||
"singleSubscriptionModeDescription": "Ha engedélyezve van, az összes felhasználói előfizetés egyenlegre lesz átváltva",
|
||||
"subscriptionDomain": "Előfizetési Tartomány",
|
||||
"subscriptionDomainDescription": "Előfizetéshez használatos; hagyja üresen a webhely tartományának használatához",
|
||||
"subscriptionDomainPlaceholder": "Adja meg az előfizetési tartományt, soronként egyet",
|
||||
"subscriptionPath": "Előfizetési Útvonal",
|
||||
"subscriptionPathDescription": "Előfizetéshez használatos; a módosítás után feltétlenül indítsa újra a rendszert az optimális teljesítmény érdekében",
|
||||
"subscriptionPathPlaceholder": "Adja meg",
|
||||
"wildcardResolution": "Joker Feloldás",
|
||||
"wildcardResolutionDescription": "Előfizetéshez használatos"
|
||||
},
|
||||
"confirm": "Megerősítés",
|
||||
"confirmDelete": "Biztosan törölni szeretné?",
|
||||
"copy": "Másolás",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Feliratkozási csoport",
|
||||
"tabs": {
|
||||
"subscribe": "Feliratkozás",
|
||||
"subscribeApp": "Alkalmazás konfiguráció",
|
||||
"subscribeConfig": "Előfizetés konfiguráció",
|
||||
"subscribeGroup": "Feliratkozási csoport"
|
||||
},
|
||||
"traffic": "forgalom",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "A webhely nevének megjelenítésére szolgáló hely",
|
||||
"siteNamePlaceholder": "Kérjük, adja meg a webhely nevét"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Hozzáadás",
|
||||
"app": "Alkalmazás",
|
||||
"appDescription": "Konfigurálja az alkalmazás letöltési címét és importálási szabályait, ne felejtse el menteni a módosítások után",
|
||||
"appDownloadURL": "Alkalmazás letöltési címe",
|
||||
"appIcon": "Alkalmazás ikonja",
|
||||
"appName": "Alkalmazás neve",
|
||||
"delete": "Törlés",
|
||||
"reset": "Visszaállítás",
|
||||
"save": "Mentés",
|
||||
"saveSuccess": "Sikeres mentés",
|
||||
"singleSubscriptionMode": "Egyszeri előfizetési mód",
|
||||
"singleSubscriptionModeDescription": "Bekapcsolás után minden felhasználó csomagja egyenlegre vált",
|
||||
"subscriptionDomain": "Előfizetési domain",
|
||||
"subscriptionDomainDescription": "Előfizetéshez, hagyja üresen a webhely domainjének használatához",
|
||||
"subscriptionDomainPlaceholder": "Kérjük, adja meg az előfizetési domaint, több domain esetén soronként egyet",
|
||||
"subscriptionPath": "Előfizetési útvonal",
|
||||
"subscriptionPathDescription": "Előfizetéshez, módosítás után feltétlenül indítsa újra a rendszert a legjobb teljesítmény érdekében",
|
||||
"subscriptionPathPlaceholder": "Kérjük, adja meg",
|
||||
"subscriptionProtocol": "Előfizetési protokoll",
|
||||
"wildcardResolution": "Joker karakter feloldása",
|
||||
"wildcardResolutionDescription": "Előfizetéshez"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Pénznem",
|
||||
"email": "E-mail",
|
||||
"invite": "Meghívás",
|
||||
"node": "Csomópont",
|
||||
"register": "Regisztráció",
|
||||
"site": "Webhely",
|
||||
"subscription": "Előfizetés",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Szolgáltatási feltételek",
|
||||
"verify": "Ellenőrzés"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "アクション",
|
||||
"app": {
|
||||
"add": "追加",
|
||||
"appDownloadURL": "アプリダウンロードURL",
|
||||
"appIcon": "アプリアイコン",
|
||||
"appName": "アプリ名",
|
||||
"batchDelete": "一括削除",
|
||||
"cancel": "キャンセル",
|
||||
"confirm": "確認",
|
||||
"confirmDelete": "削除を確認",
|
||||
"createApp": "アプリ作成",
|
||||
"createSuccess": "作成に成功しました",
|
||||
"delete": "削除",
|
||||
"deleteSuccess": "削除に成功しました",
|
||||
"deleteWarning": "この操作は元に戻せません",
|
||||
"edit": "編集",
|
||||
"editApp": "アプリ編集",
|
||||
"platform": "プラットフォーム",
|
||||
"subscriptionProtocol": "サブスクリプションプロトコル",
|
||||
"updateSuccess": "更新に成功しました"
|
||||
},
|
||||
"cancel": "キャンセル",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "シングルサブスクリプションモード",
|
||||
"singleSubscriptionModeDescription": "有効にすると、すべてのユーザーサブスクリプションがバランスに変換されます",
|
||||
"subscriptionDomain": "サブスクリプションドメイン",
|
||||
"subscriptionDomainDescription": "サブスクリプションに使用します。サイトドメインを使用する場合は空白のままにしてください",
|
||||
"subscriptionDomainPlaceholder": "サブスクリプションドメインを入力してください。1行に1つずつ",
|
||||
"subscriptionPath": "サブスクリプションパス",
|
||||
"subscriptionPathDescription": "サブスクリプションに使用します。最適なパフォーマンスのために、変更後は必ずシステムを再起動してください",
|
||||
"subscriptionPathPlaceholder": "入力してください",
|
||||
"wildcardResolution": "ワイルドカード解決",
|
||||
"wildcardResolutionDescription": "サブスクリプションに使用します"
|
||||
},
|
||||
"confirm": "確認",
|
||||
"confirmDelete": "削除してもよろしいですか?",
|
||||
"copy": "コピー",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "グループを購読する",
|
||||
"tabs": {
|
||||
"subscribe": "購読",
|
||||
"subscribeApp": "アプリ設定",
|
||||
"subscribeConfig": "サブスクリプション設定",
|
||||
"subscribeGroup": "購読グループ"
|
||||
},
|
||||
"traffic": "トラフィック",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "サイト名を表示する必要がある場所に使用されます",
|
||||
"siteNamePlaceholder": "サイト名を入力してください"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "追加",
|
||||
"app": "アプリ",
|
||||
"appDescription": "アプリのダウンロードURLとインポートルールを設定し、変更後は保存を忘れずに",
|
||||
"appDownloadURL": "アプリダウンロードURL",
|
||||
"appIcon": "アプリアイコン",
|
||||
"appName": "アプリ名",
|
||||
"delete": "削除",
|
||||
"reset": "リセット",
|
||||
"save": "保存",
|
||||
"saveSuccess": "保存成功",
|
||||
"singleSubscriptionMode": "単一サブスクリプションモード",
|
||||
"singleSubscriptionModeDescription": "有効にすると、すべてのユーザーのプランが残高に変換されます",
|
||||
"subscriptionDomain": "サブスクリプションドメイン",
|
||||
"subscriptionDomainDescription": "サブスクリプション用、空白の場合はサイトドメインを使用",
|
||||
"subscriptionDomainPlaceholder": "サブスクリプションドメインを入力してください。複数のドメインは1行に1つずつ入力してください",
|
||||
"subscriptionPath": "サブスクリプションパス",
|
||||
"subscriptionPathDescription": "サブスクリプション用、変更後はシステムを再起動して、最適なパフォーマンスを確保してください",
|
||||
"subscriptionPathPlaceholder": "入力してください",
|
||||
"subscriptionProtocol": "サブスクリプションプロトコル",
|
||||
"wildcardResolution": "ワイルドカード解決",
|
||||
"wildcardResolutionDescription": "サブスクリプション用"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "通貨",
|
||||
"email": "メール",
|
||||
"invite": "招待",
|
||||
"node": "ノード",
|
||||
"register": "登録",
|
||||
"site": "サイト",
|
||||
"subscription": "購読",
|
||||
"telegram": "Telegram",
|
||||
"tos": "利用規約",
|
||||
"verify": "確認"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "작업",
|
||||
"app": {
|
||||
"add": "추가",
|
||||
"appDownloadURL": "앱 다운로드 URL",
|
||||
"appIcon": "앱 아이콘",
|
||||
"appName": "앱 이름",
|
||||
"batchDelete": "일괄 삭제",
|
||||
"cancel": "취소",
|
||||
"confirm": "확인",
|
||||
"confirmDelete": "삭제 확인",
|
||||
"createApp": "앱 생성",
|
||||
"createSuccess": "성공적으로 생성되었습니다",
|
||||
"delete": "삭제",
|
||||
"deleteSuccess": "성공적으로 삭제되었습니다",
|
||||
"deleteWarning": "이 작업은 되돌릴 수 없습니다",
|
||||
"edit": "편집",
|
||||
"editApp": "앱 편집",
|
||||
"platform": "플랫폼",
|
||||
"subscriptionProtocol": "구독 프로토콜",
|
||||
"updateSuccess": "성공적으로 업데이트되었습니다"
|
||||
},
|
||||
"cancel": "취소",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "단일 구독 모드",
|
||||
"singleSubscriptionModeDescription": "활성화되면 모든 사용자 구독이 잔액으로 전환됩니다",
|
||||
"subscriptionDomain": "구독 도메인",
|
||||
"subscriptionDomainDescription": "구독에 사용됩니다; 사이트 도메인을 사용하려면 비워 두세요",
|
||||
"subscriptionDomainPlaceholder": "구독 도메인을 입력하세요, 한 줄에 하나씩",
|
||||
"subscriptionPath": "구독 경로",
|
||||
"subscriptionPathDescription": "구독에 사용됩니다; 최적의 성능을 위해 수정 후 시스템을 재시작하세요",
|
||||
"subscriptionPathPlaceholder": "입력하세요",
|
||||
"wildcardResolution": "와일드카드 해상도",
|
||||
"wildcardResolutionDescription": "구독에 사용됩니다"
|
||||
},
|
||||
"confirm": "확인",
|
||||
"confirmDelete": "삭제하시겠습니까?",
|
||||
"copy": "복사",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "구독 그룹",
|
||||
"tabs": {
|
||||
"subscribe": "구독",
|
||||
"subscribeApp": "앱 구성",
|
||||
"subscribeConfig": "구독 구성",
|
||||
"subscribeGroup": "구독 그룹"
|
||||
},
|
||||
"traffic": "트래픽",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "사이트 이름을 표시해야 하는 위치에 사용됩니다",
|
||||
"siteNamePlaceholder": "사이트 이름을 입력하세요"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "추가",
|
||||
"app": "앱",
|
||||
"appDescription": "앱의 다운로드 주소와 가져오기 규칙을 구성합니다. 수정 후 저장하는 것을 잊지 마세요.",
|
||||
"appDownloadURL": "앱 다운로드 주소",
|
||||
"appIcon": "앱 아이콘",
|
||||
"appName": "앱 이름",
|
||||
"delete": "삭제",
|
||||
"reset": "재설정",
|
||||
"save": "저장",
|
||||
"saveSuccess": "저장 성공",
|
||||
"singleSubscriptionMode": "단일 구독 모드",
|
||||
"singleSubscriptionModeDescription": "활성화하면 모든 사용자의 패키지가 잔액으로 전환됩니다.",
|
||||
"subscriptionDomain": "구독 도메인",
|
||||
"subscriptionDomainDescription": "구독에 사용됩니다. 비워두면 사이트 도메인을 사용합니다.",
|
||||
"subscriptionDomainPlaceholder": "구독 도메인을 입력하세요. 여러 도메인은 각 줄에 하나씩 입력하세요.",
|
||||
"subscriptionPath": "구독 경로",
|
||||
"subscriptionPathDescription": "구독에 사용됩니다. 수정 후 최상의 성능을 위해 시스템을 반드시 재시작하세요.",
|
||||
"subscriptionPathPlaceholder": "입력하세요",
|
||||
"subscriptionProtocol": "구독 프로토콜",
|
||||
"wildcardResolution": "와일드카드 해석",
|
||||
"wildcardResolutionDescription": "구독에 사용됩니다."
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "통화",
|
||||
"email": "이메일",
|
||||
"invite": "초대",
|
||||
"node": "노드",
|
||||
"register": "등록",
|
||||
"site": "사이트",
|
||||
"subscription": "구독",
|
||||
"telegram": "텔레그램",
|
||||
"tos": "서비스 약관",
|
||||
"verify": "검증"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "handlinger",
|
||||
"app": {
|
||||
"add": "Legg til",
|
||||
"appDownloadURL": "App Nedlastings-URL",
|
||||
"appIcon": "App-ikon",
|
||||
"appName": "App-navn",
|
||||
"batchDelete": "Slett i gruppe",
|
||||
"cancel": "Avbryt",
|
||||
"confirm": "Bekreft",
|
||||
"confirmDelete": "Bekreft sletting",
|
||||
"createApp": "Opprett app",
|
||||
"createSuccess": "Opprettet vellykket",
|
||||
"delete": "Slett",
|
||||
"deleteSuccess": "Slettet vellykket",
|
||||
"deleteWarning": "Denne handlingen kan ikke angres",
|
||||
"edit": "Rediger",
|
||||
"editApp": "Rediger app",
|
||||
"platform": "Plattform",
|
||||
"subscriptionProtocol": "Abonnementsprotokoll",
|
||||
"updateSuccess": "Oppdatert vellykket"
|
||||
},
|
||||
"cancel": "Avbryt",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Enkelt Abonnementsmodus",
|
||||
"singleSubscriptionModeDescription": "Når aktivert, vil alle brukerabonnementer bli konvertert til saldo",
|
||||
"subscriptionDomain": "Abonnementsdomene",
|
||||
"subscriptionDomainDescription": "Brukes for abonnement; la stå tomt for å bruke nettstedets domene",
|
||||
"subscriptionDomainPlaceholder": "Skriv inn abonnementsdomene, ett per linje",
|
||||
"subscriptionPath": "Abonnementssti",
|
||||
"subscriptionPathDescription": "Brukes for abonnement; sørg for å starte systemet på nytt etter endring for optimal ytelse",
|
||||
"subscriptionPathPlaceholder": "Skriv inn",
|
||||
"wildcardResolution": "Jokertegnoppløsning",
|
||||
"wildcardResolutionDescription": "Brukes for abonnement"
|
||||
},
|
||||
"confirm": "Bekreft",
|
||||
"confirmDelete": "Er du sikker på at du vil slette?",
|
||||
"copy": "Kopier",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Abonner på gruppe",
|
||||
"tabs": {
|
||||
"subscribe": "Abonner",
|
||||
"subscribeApp": "App-konfigurasjon",
|
||||
"subscribeConfig": "Abonnementskonfigurasjon",
|
||||
"subscribeGroup": "Abonner gruppe"
|
||||
},
|
||||
"traffic": "trafikk",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Brukes til å vise hvor nettstednavnet skal vises",
|
||||
"siteNamePlaceholder": "Vennligst skriv inn nettstednavnet"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Legg til",
|
||||
"app": "App",
|
||||
"appDescription": "Konfigurer nedlastingsadressen og importreglene for appen. Husk å lagre etter endringer",
|
||||
"appDownloadURL": "App-nedlastingsadresse",
|
||||
"appIcon": "App-ikon",
|
||||
"appName": "App-navn",
|
||||
"delete": "Slett",
|
||||
"reset": "Tilbakestill",
|
||||
"save": "Lagre",
|
||||
"saveSuccess": "Lagret vellykket",
|
||||
"singleSubscriptionMode": "Enkeltabonnementsmodus",
|
||||
"singleSubscriptionModeDescription": "Når aktivert, vil alle brukeres pakker bli konvertert til saldo",
|
||||
"subscriptionDomain": "Abonnementsdomene",
|
||||
"subscriptionDomainDescription": "Brukes for abonnement. Hvis tom, brukes nettstedets domene",
|
||||
"subscriptionDomainPlaceholder": "Vennligst skriv inn abonnementsdomenet, flere domener skal være ett per linje",
|
||||
"subscriptionPath": "Abonnementssti",
|
||||
"subscriptionPathDescription": "Brukes for abonnement. Husk å starte systemet på nytt etter endringer for å sikre optimal ytelse",
|
||||
"subscriptionPathPlaceholder": "Vennligst skriv inn",
|
||||
"subscriptionProtocol": "Abonnementsprotokoll",
|
||||
"wildcardResolution": "Jokertegnoppløsning",
|
||||
"wildcardResolutionDescription": "Brukes for abonnement"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Valuta",
|
||||
"email": "E-post",
|
||||
"invite": "Invitasjon",
|
||||
"node": "Node",
|
||||
"register": "Registrer",
|
||||
"site": "Nettsted",
|
||||
"subscription": "Abonnement",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Vilkår for bruk",
|
||||
"verify": "Verifiser"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "działania",
|
||||
"app": {
|
||||
"add": "Dodaj",
|
||||
"appDownloadURL": "URL pobierania aplikacji",
|
||||
"appIcon": "Ikona aplikacji",
|
||||
"appName": "Nazwa aplikacji",
|
||||
"batchDelete": "Usuń zbiorczo",
|
||||
"cancel": "Anuluj",
|
||||
"confirm": "Potwierdź",
|
||||
"confirmDelete": "Potwierdź usunięcie",
|
||||
"createApp": "Utwórz aplikację",
|
||||
"createSuccess": "Utworzono pomyślnie",
|
||||
"delete": "Usuń",
|
||||
"deleteSuccess": "Usunięto pomyślnie",
|
||||
"deleteWarning": "Tej operacji nie można cofnąć",
|
||||
"edit": "Edytuj",
|
||||
"editApp": "Edytuj aplikację",
|
||||
"platform": "Platforma",
|
||||
"subscriptionProtocol": "Protokół subskrypcji",
|
||||
"updateSuccess": "Zaktualizowano pomyślnie"
|
||||
},
|
||||
"cancel": "Anuluj",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Tryb pojedynczej subskrypcji",
|
||||
"singleSubscriptionModeDescription": "Po włączeniu wszystkie subskrypcje użytkowników zostaną przekształcone na saldo",
|
||||
"subscriptionDomain": "Domena subskrypcji",
|
||||
"subscriptionDomainDescription": "Używane do subskrypcji; pozostaw puste, aby użyć domeny witryny",
|
||||
"subscriptionDomainPlaceholder": "Wprowadź domenę subskrypcji, jedna na linię",
|
||||
"subscriptionPath": "Ścieżka subskrypcji",
|
||||
"subscriptionPathDescription": "Używane do subskrypcji; upewnij się, że zrestartujesz system po modyfikacji dla optymalnej wydajności",
|
||||
"subscriptionPathPlaceholder": "Wprowadź",
|
||||
"wildcardResolution": "Rozwiązanie wieloznaczne",
|
||||
"wildcardResolutionDescription": "Używane do subskrypcji"
|
||||
},
|
||||
"confirm": "Potwierdź",
|
||||
"confirmDelete": "Czy na pewno chcesz usunąć?",
|
||||
"copy": "Kopiuj",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Subskrybuj grupę",
|
||||
"tabs": {
|
||||
"subscribe": "Subskrybuj",
|
||||
"subscribeApp": "Konfiguracja aplikacji",
|
||||
"subscribeConfig": "Konfiguracja subskrypcji",
|
||||
"subscribeGroup": "Grupa subskrypcji"
|
||||
},
|
||||
"traffic": "ruch",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Miejsce do wyświetlania nazwy strony",
|
||||
"siteNamePlaceholder": "Wprowadź nazwę strony"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Dodaj",
|
||||
"app": "Aplikacja",
|
||||
"appDescription": "Skonfiguruj adres pobierania aplikacji i zasady importu, pamiętaj o zapisaniu zmian",
|
||||
"appDownloadURL": "Adres pobierania aplikacji",
|
||||
"appIcon": "Ikona aplikacji",
|
||||
"appName": "Nazwa aplikacji",
|
||||
"delete": "Usuń",
|
||||
"reset": "Resetuj",
|
||||
"save": "Zapisz",
|
||||
"saveSuccess": "Zapisano pomyślnie",
|
||||
"singleSubscriptionMode": "Tryb pojedynczej subskrypcji",
|
||||
"singleSubscriptionModeDescription": "Po włączeniu, wszystkie pakiety użytkowników zostaną przekształcone w saldo",
|
||||
"subscriptionDomain": "Domena subskrypcji",
|
||||
"subscriptionDomainDescription": "Używane do subskrypcji, pozostaw puste, aby użyć domeny witryny",
|
||||
"subscriptionDomainPlaceholder": "Wprowadź domenę subskrypcji, wiele domen wpisz w osobnych wierszach",
|
||||
"subscriptionPath": "Ścieżka subskrypcji",
|
||||
"subscriptionPathDescription": "Używane do subskrypcji, po zmianie koniecznie zrestartuj system, aby zapewnić najlepszą wydajność",
|
||||
"subscriptionPathPlaceholder": "Wprowadź",
|
||||
"subscriptionProtocol": "Protokół subskrypcji",
|
||||
"wildcardResolution": "Rozwiązanie z użyciem symboli wieloznacznych",
|
||||
"wildcardResolutionDescription": "Używane do subskrypcji"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Waluta",
|
||||
"email": "E-mail",
|
||||
"invite": "Zaproszenie",
|
||||
"node": "Węzeł",
|
||||
"register": "Rejestracja",
|
||||
"site": "Strona",
|
||||
"subscription": "Subskrypcja",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Warunki usługi",
|
||||
"verify": "Weryfikacja"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "ações",
|
||||
"app": {
|
||||
"add": "Adicionar",
|
||||
"appDownloadURL": "URL de Download do App",
|
||||
"appIcon": "Ícone do App",
|
||||
"appName": "Nome do App",
|
||||
"batchDelete": "Excluir em Lote",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Confirmar",
|
||||
"confirmDelete": "Confirmar Exclusão",
|
||||
"createApp": "Criar App",
|
||||
"createSuccess": "Criado com sucesso",
|
||||
"delete": "Excluir",
|
||||
"deleteSuccess": "Excluído com sucesso",
|
||||
"deleteWarning": "Esta ação não pode ser desfeita",
|
||||
"edit": "Editar",
|
||||
"editApp": "Editar App",
|
||||
"platform": "Plataforma",
|
||||
"subscriptionProtocol": "Protocolo de Assinatura",
|
||||
"updateSuccess": "Atualizado com sucesso"
|
||||
},
|
||||
"cancel": "Cancelar",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Modo de Assinatura Única",
|
||||
"singleSubscriptionModeDescription": "Quando ativado, todas as assinaturas de usuários serão convertidas para saldo",
|
||||
"subscriptionDomain": "Domínio de Assinatura",
|
||||
"subscriptionDomainDescription": "Usado para assinatura; deixe em branco para usar o domínio do site",
|
||||
"subscriptionDomainPlaceholder": "Insira o domínio de assinatura, um por linha",
|
||||
"subscriptionPath": "Caminho de Assinatura",
|
||||
"subscriptionPathDescription": "Usado para assinatura; certifique-se de reiniciar o sistema após a modificação para um desempenho ideal",
|
||||
"subscriptionPathPlaceholder": "Insira",
|
||||
"wildcardResolution": "Resolução de Curinga",
|
||||
"wildcardResolutionDescription": "Usado para assinatura"
|
||||
},
|
||||
"confirm": "confirmar",
|
||||
"confirmDelete": "Tem certeza de que deseja excluir?",
|
||||
"copy": "Copiar",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Inscrever-se no grupo",
|
||||
"tabs": {
|
||||
"subscribe": "Inscrever-se",
|
||||
"subscribeApp": "Configuração do Aplicativo",
|
||||
"subscribeConfig": "Configuração de Assinatura",
|
||||
"subscribeGroup": "Grupo de Inscrição"
|
||||
},
|
||||
"traffic": "tráfego",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Usado para exibir a posição onde o nome do site precisa ser mostrado",
|
||||
"siteNamePlaceholder": "Por favor, insira o nome do site"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Adicionar",
|
||||
"app": "Aplicativo",
|
||||
"appDescription": "Configure o endereço de download e as regras de importação do aplicativo, lembre-se de salvar após modificar",
|
||||
"appDownloadURL": "URL de Download do Aplicativo",
|
||||
"appIcon": "Ícone do Aplicativo",
|
||||
"appName": "Nome do Aplicativo",
|
||||
"delete": "Excluir",
|
||||
"reset": "Redefinir",
|
||||
"save": "Salvar",
|
||||
"saveSuccess": "Salvo com sucesso",
|
||||
"singleSubscriptionMode": "Modo de Assinatura Única",
|
||||
"singleSubscriptionModeDescription": "Ao ativar, todos os pacotes de usuários serão convertidos em saldo",
|
||||
"subscriptionDomain": "Domínio de Assinatura",
|
||||
"subscriptionDomainDescription": "Usado para assinatura, deixe em branco para usar o domínio do site",
|
||||
"subscriptionDomainPlaceholder": "Por favor, insira o domínio de assinatura, múltiplos domínios devem ser separados por linha",
|
||||
"subscriptionPath": "Caminho de Assinatura",
|
||||
"subscriptionPathDescription": "Usado para assinatura, após modificar, reinicie o sistema para garantir a melhor experiência de desempenho",
|
||||
"subscriptionPathPlaceholder": "Por favor, insira",
|
||||
"subscriptionProtocol": "Protocolo de Assinatura",
|
||||
"wildcardResolution": "Resolução de Curinga",
|
||||
"wildcardResolutionDescription": "Usado para assinatura"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Moeda",
|
||||
"email": "E-mail",
|
||||
"invite": "Convite",
|
||||
"node": "Nó",
|
||||
"register": "Registrar",
|
||||
"site": "Site",
|
||||
"subscription": "Assinatura",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Termos de Serviço",
|
||||
"verify": "Verificar"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "acțiuni",
|
||||
"app": {
|
||||
"add": "Adaugă",
|
||||
"appDownloadURL": "URL Descărcare Aplicație",
|
||||
"appIcon": "Iconiță Aplicație",
|
||||
"appName": "Nume Aplicație",
|
||||
"batchDelete": "Ștergere în Lot",
|
||||
"cancel": "Anulează",
|
||||
"confirm": "Confirmă",
|
||||
"confirmDelete": "Confirmă Ștergerea",
|
||||
"createApp": "Creează Aplicație",
|
||||
"createSuccess": "Creat cu succes",
|
||||
"delete": "Șterge",
|
||||
"deleteSuccess": "Șters cu succes",
|
||||
"deleteWarning": "Această acțiune nu poate fi anulată",
|
||||
"edit": "Editează",
|
||||
"editApp": "Editează Aplicație",
|
||||
"platform": "Platformă",
|
||||
"subscriptionProtocol": "Protocol de Abonament",
|
||||
"updateSuccess": "Actualizat cu succes"
|
||||
},
|
||||
"cancel": "Anulează",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Modul Abonament Unic",
|
||||
"singleSubscriptionModeDescription": "Când este activat, toate abonamentele utilizatorilor vor fi convertite în sold",
|
||||
"subscriptionDomain": "Domeniu Abonament",
|
||||
"subscriptionDomainDescription": "Folosit pentru abonament; lăsați necompletat pentru a folosi domeniul site-ului",
|
||||
"subscriptionDomainPlaceholder": "Introduceți domeniul abonamentului, unul pe linie",
|
||||
"subscriptionPath": "Calea Abonamentului",
|
||||
"subscriptionPathDescription": "Folosit pentru abonament; asigurați-vă că reporniți sistemul după modificare pentru performanțe optime",
|
||||
"subscriptionPathPlaceholder": "Introduceți",
|
||||
"wildcardResolution": "Rezoluție Wildcard",
|
||||
"wildcardResolutionDescription": "Folosit pentru abonament"
|
||||
},
|
||||
"confirm": "Confirmare",
|
||||
"confirmDelete": "Sigur doriți să ștergeți?",
|
||||
"copy": "Copiază",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Abonare grup",
|
||||
"tabs": {
|
||||
"subscribe": "Abonare",
|
||||
"subscribeApp": "Configurare Aplicație",
|
||||
"subscribeConfig": "Configurare Abonament",
|
||||
"subscribeGroup": "Grup de abonare"
|
||||
},
|
||||
"traffic": "trafic",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Utilizat pentru a afișa locația unde trebuie să fie prezentat numele site-ului",
|
||||
"siteNamePlaceholder": "Vă rugăm să introduceți numele site-ului"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Adaugă",
|
||||
"app": "Aplicație",
|
||||
"appDescription": "Configurează adresa de descărcare și regulile de import ale aplicației, nu uita să salvezi după modificare",
|
||||
"appDownloadURL": "Adresa de descărcare a aplicației",
|
||||
"appIcon": "Iconița aplicației",
|
||||
"appName": "Numele aplicației",
|
||||
"delete": "Șterge",
|
||||
"reset": "Resetează",
|
||||
"save": "Salvează",
|
||||
"saveSuccess": "Salvare reușită",
|
||||
"singleSubscriptionMode": "Mod abonament unic",
|
||||
"singleSubscriptionModeDescription": "Odată activat, toate pachetele utilizatorilor vor fi convertite în sold",
|
||||
"subscriptionDomain": "Domeniu abonament",
|
||||
"subscriptionDomainDescription": "Folosit pentru abonament, lăsați gol pentru a folosi domeniul site-ului",
|
||||
"subscriptionDomainPlaceholder": "Introduceți domeniul abonamentului, pentru mai multe domenii introduceți câte unul pe linie",
|
||||
"subscriptionPath": "Calea abonamentului",
|
||||
"subscriptionPathDescription": "Folosit pentru abonament, după modificare, asigurați-vă că reporniți sistemul pentru a asigura o experiență optimă",
|
||||
"subscriptionPathPlaceholder": "Introduceți",
|
||||
"subscriptionProtocol": "Protocol abonament",
|
||||
"wildcardResolution": "Rezoluție wildcard",
|
||||
"wildcardResolutionDescription": "Folosit pentru abonament"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Monedă",
|
||||
"email": "E-mail",
|
||||
"invite": "Invitație",
|
||||
"node": "Nod",
|
||||
"register": "Înregistrare",
|
||||
"site": "Site",
|
||||
"subscription": "Abonament",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Termeni de serviciu",
|
||||
"verify": "Verificare"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "действия",
|
||||
"app": {
|
||||
"add": "Добавить",
|
||||
"appDownloadURL": "URL загрузки приложения",
|
||||
"appIcon": "Иконка приложения",
|
||||
"appName": "Название приложения",
|
||||
"batchDelete": "Удалить пакетно",
|
||||
"cancel": "Отмена",
|
||||
"confirm": "Подтвердить",
|
||||
"confirmDelete": "Подтвердить удаление",
|
||||
"createApp": "Создать приложение",
|
||||
"createSuccess": "Успешно создано",
|
||||
"delete": "Удалить",
|
||||
"deleteSuccess": "Успешно удалено",
|
||||
"deleteWarning": "Это действие необратимо",
|
||||
"edit": "Редактировать",
|
||||
"editApp": "Редактировать приложение",
|
||||
"platform": "Платформа",
|
||||
"subscriptionProtocol": "Протокол подписки",
|
||||
"updateSuccess": "Успешно обновлено"
|
||||
},
|
||||
"cancel": "Отмена",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Режим единой подписки",
|
||||
"singleSubscriptionModeDescription": "Когда включено, все пользовательские подписки будут преобразованы в баланс",
|
||||
"subscriptionDomain": "Домен подписки",
|
||||
"subscriptionDomainDescription": "Используется для подписки; оставьте пустым, чтобы использовать домен сайта",
|
||||
"subscriptionDomainPlaceholder": "Введите домен подписки, по одному на строку",
|
||||
"subscriptionPath": "Путь подписки",
|
||||
"subscriptionPathDescription": "Используется для подписки; обязательно перезапустите систему после изменения для оптимальной производительности",
|
||||
"subscriptionPathPlaceholder": "Введите",
|
||||
"wildcardResolution": "Разрешение подстановочных знаков",
|
||||
"wildcardResolutionDescription": "Используется для подписки"
|
||||
},
|
||||
"confirm": "Подтвердить",
|
||||
"confirmDelete": "Вы уверены, что хотите удалить?",
|
||||
"copy": "Копировать",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Подписаться на группу",
|
||||
"tabs": {
|
||||
"subscribe": "Подписаться",
|
||||
"subscribeApp": "Конфигурация приложения",
|
||||
"subscribeConfig": "Конфигурация подписки",
|
||||
"subscribeGroup": "Группа подписок"
|
||||
},
|
||||
"traffic": "трафик",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Используется для отображения места, где необходимо показать название сайта",
|
||||
"siteNamePlaceholder": "Введите название сайта"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Добавить",
|
||||
"app": "Приложение",
|
||||
"appDescription": "Настройте адрес загрузки приложения и правила импорта, не забудьте сохранить изменения",
|
||||
"appDownloadURL": "URL загрузки приложения",
|
||||
"appIcon": "Иконка приложения",
|
||||
"appName": "Название приложения",
|
||||
"delete": "Удалить",
|
||||
"reset": "Сбросить",
|
||||
"save": "Сохранить",
|
||||
"saveSuccess": "Успешно сохранено",
|
||||
"singleSubscriptionMode": "Режим единой подписки",
|
||||
"singleSubscriptionModeDescription": "При включении все пакеты пользователей будут преобразованы в баланс",
|
||||
"subscriptionDomain": "Домен подписки",
|
||||
"subscriptionDomainDescription": "Используется для подписки, если оставить пустым, будет использоваться домен сайта",
|
||||
"subscriptionDomainPlaceholder": "Введите домен подписки, для нескольких доменов используйте новую строку для каждого",
|
||||
"subscriptionPath": "Путь подписки",
|
||||
"subscriptionPathDescription": "Используется для подписки, после изменения обязательно перезапустите систему для обеспечения наилучшей производительности",
|
||||
"subscriptionPathPlaceholder": "Введите",
|
||||
"subscriptionProtocol": "Протокол подписки",
|
||||
"wildcardResolution": "Разрешение подстановочных знаков",
|
||||
"wildcardResolutionDescription": "Используется для подписки"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Валюта",
|
||||
"email": "Электронная почта",
|
||||
"invite": "Пригласить",
|
||||
"node": "Узел",
|
||||
"register": "Регистрация",
|
||||
"site": "Сайт",
|
||||
"subscription": "Подписка",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Условия обслуживания",
|
||||
"verify": "Проверка"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "การดำเนินการ",
|
||||
"app": {
|
||||
"add": "เพิ่ม",
|
||||
"appDownloadURL": "URL ดาวน์โหลดแอป",
|
||||
"appIcon": "ไอคอนแอป",
|
||||
"appName": "ชื่อแอป",
|
||||
"batchDelete": "ลบเป็นกลุ่ม",
|
||||
"cancel": "ยกเลิก",
|
||||
"confirm": "ยืนยัน",
|
||||
"confirmDelete": "ยืนยันการลบ",
|
||||
"createApp": "สร้างแอป",
|
||||
"createSuccess": "สร้างสำเร็จ",
|
||||
"delete": "ลบ",
|
||||
"deleteSuccess": "ลบสำเร็จ",
|
||||
"deleteWarning": "การกระทำนี้ไม่สามารถย้อนกลับได้",
|
||||
"edit": "แก้ไข",
|
||||
"editApp": "แก้ไขแอป",
|
||||
"platform": "แพลตฟอร์ม",
|
||||
"subscriptionProtocol": "โปรโตคอลการสมัครสมาชิก",
|
||||
"updateSuccess": "อัปเดตสำเร็จ"
|
||||
},
|
||||
"cancel": "ยกเลิก",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "โหมดการสมัครสมาชิกเดี่ยว",
|
||||
"singleSubscriptionModeDescription": "เมื่อเปิดใช้งาน การสมัครสมาชิกทั้งหมดของผู้ใช้จะถูกแปลงเป็นยอดคงเหลือ",
|
||||
"subscriptionDomain": "โดเมนการสมัครสมาชิก",
|
||||
"subscriptionDomainDescription": "ใช้สำหรับการสมัครสมาชิก; ปล่อยว่างไว้เพื่อใช้โดเมนของเว็บไซต์",
|
||||
"subscriptionDomainPlaceholder": "กรอกโดเมนการสมัครสมาชิก หนึ่งบรรทัดต่อหนึ่งโดเมน",
|
||||
"subscriptionPath": "เส้นทางการสมัครสมาชิก",
|
||||
"subscriptionPathDescription": "ใช้สำหรับการสมัครสมาชิก; อย่าลืมรีสตาร์ทระบบหลังจากการแก้ไขเพื่อประสิทธิภาพที่ดีที่สุด",
|
||||
"subscriptionPathPlaceholder": "กรอก",
|
||||
"wildcardResolution": "การแก้ไขไวลด์การ์ด",
|
||||
"wildcardResolutionDescription": "ใช้สำหรับการสมัครสมาชิก"
|
||||
},
|
||||
"confirm": "ยืนยัน",
|
||||
"confirmDelete": "คุณแน่ใจหรือว่าต้องการลบ?",
|
||||
"copy": "คัดลอก",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "สมัครกลุ่ม",
|
||||
"tabs": {
|
||||
"subscribe": "สมัครสมาชิก",
|
||||
"subscribeApp": "การกำหนดค่าแอป",
|
||||
"subscribeConfig": "การกำหนดค่าการสมัครสมาชิก",
|
||||
"subscribeGroup": "กลุ่มสมัครสมาชิก"
|
||||
},
|
||||
"traffic": "การจราจร",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "ใช้สำหรับแสดงตำแหน่งที่ต้องการแสดงชื่อเว็บไซต์",
|
||||
"siteNamePlaceholder": "กรุณาใส่ชื่อเว็บไซต์"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "เพิ่ม",
|
||||
"app": "แอปพลิเคชัน",
|
||||
"appDescription": "กำหนดที่อยู่ดาวน์โหลดและกฎการนำเข้าแอปพลิเคชัน อย่าลืมบันทึกหลังจากแก้ไข",
|
||||
"appDownloadURL": "ที่อยู่ดาวน์โหลดแอปพลิเคชัน",
|
||||
"appIcon": "ไอคอนแอปพลิเคชัน",
|
||||
"appName": "ชื่อแอปพลิเคชัน",
|
||||
"delete": "ลบ",
|
||||
"reset": "รีเซ็ต",
|
||||
"save": "บันทึก",
|
||||
"saveSuccess": "บันทึกสำเร็จ",
|
||||
"singleSubscriptionMode": "โหมดการสมัครสมาชิกแบบเดี่ยว",
|
||||
"singleSubscriptionModeDescription": "เมื่อเปิดใช้งาน แพ็คเกจของผู้ใช้ทั้งหมดจะถูกแปลงเป็นยอดคงเหลือ",
|
||||
"subscriptionDomain": "โดเมนการสมัครสมาชิก",
|
||||
"subscriptionDomainDescription": "ใช้สำหรับการสมัครสมาชิก หากเว้นว่างจะใช้โดเมนของเว็บไซต์",
|
||||
"subscriptionDomainPlaceholder": "กรุณาใส่โดเมนการสมัครสมาชิก โดเมนหลายรายการให้ใส่ทีละบรรทัด",
|
||||
"subscriptionPath": "เส้นทางการสมัครสมาชิก",
|
||||
"subscriptionPathDescription": "ใช้สำหรับการสมัครสมาชิก หลังจากแก้ไขกรุณารีสตาร์ทระบบเพื่อให้ได้ประสบการณ์การใช้งานที่ดีที่สุด",
|
||||
"subscriptionPathPlaceholder": "กรุณาใส่",
|
||||
"subscriptionProtocol": "โปรโตคอลการสมัครสมาชิก",
|
||||
"wildcardResolution": "การแก้ไขไวลด์การ์ด",
|
||||
"wildcardResolutionDescription": "ใช้สำหรับการสมัครสมาชิก"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "สกุลเงิน",
|
||||
"email": "อีเมล",
|
||||
"invite": "เชิญ",
|
||||
"node": "โหนด",
|
||||
"register": "ลงทะเบียน",
|
||||
"site": "เว็บไซต์",
|
||||
"subscription": "การสมัครสมาชิก",
|
||||
"telegram": "Telegram",
|
||||
"tos": "ข้อกำหนดการให้บริการ",
|
||||
"verify": "ยืนยัน"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "eylemler",
|
||||
"app": {
|
||||
"add": "Ekle",
|
||||
"appDownloadURL": "Uygulama İndirme URL'si",
|
||||
"appIcon": "Uygulama Simgesi",
|
||||
"appName": "Uygulama Adı",
|
||||
"batchDelete": "Toplu Sil",
|
||||
"cancel": "İptal",
|
||||
"confirm": "Onayla",
|
||||
"confirmDelete": "Silme İşlemini Onayla",
|
||||
"createApp": "Uygulama Oluştur",
|
||||
"createSuccess": "Başarıyla oluşturuldu",
|
||||
"delete": "Sil",
|
||||
"deleteSuccess": "Başarıyla silindi",
|
||||
"deleteWarning": "Bu işlem geri alınamaz",
|
||||
"edit": "Düzenle",
|
||||
"editApp": "Uygulamayı Düzenle",
|
||||
"platform": "Platform",
|
||||
"subscriptionProtocol": "Abonelik Protokolü",
|
||||
"updateSuccess": "Başarıyla güncellendi"
|
||||
},
|
||||
"cancel": "İptal",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Tek Abonelik Modu",
|
||||
"singleSubscriptionModeDescription": "Etkinleştirildiğinde, tüm kullanıcı abonelikleri bakiyeye dönüştürülecektir",
|
||||
"subscriptionDomain": "Abonelik Alanı",
|
||||
"subscriptionDomainDescription": "Abonelik için kullanılır; site alan adını kullanmak için boş bırakın",
|
||||
"subscriptionDomainPlaceholder": "Abonelik alan adını girin, her satıra bir tane",
|
||||
"subscriptionPath": "Abonelik Yolu",
|
||||
"subscriptionPathDescription": "Abonelik için kullanılır; en iyi performans için değişiklikten sonra sistemi yeniden başlattığınızdan emin olun",
|
||||
"subscriptionPathPlaceholder": "Giriniz",
|
||||
"wildcardResolution": "Genel Çözümleme",
|
||||
"wildcardResolutionDescription": "Abonelik için kullanılır"
|
||||
},
|
||||
"confirm": "Onayla",
|
||||
"confirmDelete": "Silmek istediğinizden emin misiniz?",
|
||||
"copy": "Kopyala",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Gruba Abone Ol",
|
||||
"tabs": {
|
||||
"subscribe": "Abone Ol",
|
||||
"subscribeApp": "Uygulama Yapılandırması",
|
||||
"subscribeConfig": "Abonelik Yapılandırması",
|
||||
"subscribeGroup": "Abone Grubu"
|
||||
},
|
||||
"traffic": "trafik",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Site adının gösterilmesi gereken yeri belirtir",
|
||||
"siteNamePlaceholder": "Lütfen site adını girin"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Ekle",
|
||||
"app": "Uygulama",
|
||||
"appDescription": "Uygulamanın indirme adresini ve içe aktarma kurallarını yapılandırın, değişiklikleri kaydetmeyi unutmayın",
|
||||
"appDownloadURL": "Uygulama İndirme Adresi",
|
||||
"appIcon": "Uygulama Simgesi",
|
||||
"appName": "Uygulama Adı",
|
||||
"delete": "Sil",
|
||||
"reset": "Sıfırla",
|
||||
"save": "Kaydet",
|
||||
"saveSuccess": "Başarıyla kaydedildi",
|
||||
"singleSubscriptionMode": "Tekli Abonelik Modu",
|
||||
"singleSubscriptionModeDescription": "Açıldığında, tüm kullanıcıların paketleri bakiyeye dönüştürülecektir",
|
||||
"subscriptionDomain": "Abonelik Alan Adı",
|
||||
"subscriptionDomainDescription": "Abonelik için kullanılır, boş bırakılırsa site alan adı kullanılır",
|
||||
"subscriptionDomainPlaceholder": "Lütfen abonelik alan adını girin, birden fazla alan adı için her satıra bir tane yazın",
|
||||
"subscriptionPath": "Abonelik Yolu",
|
||||
"subscriptionPathDescription": "Abonelik için kullanılır, değiştirdikten sonra en iyi performans deneyimini sağlamak için sistemi yeniden başlatmayı unutmayın",
|
||||
"subscriptionPathPlaceholder": "Lütfen girin",
|
||||
"subscriptionProtocol": "Abonelik Protokolü",
|
||||
"wildcardResolution": "Joker Karakter Çözünürlüğü",
|
||||
"wildcardResolutionDescription": "Abonelik için kullanılır"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Para Birimi",
|
||||
"email": "E-posta",
|
||||
"invite": "Davet Et",
|
||||
"node": "Düğüm",
|
||||
"register": "Kayıt Ol",
|
||||
"site": "Site",
|
||||
"subscription": "Abonelik",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Hizmet Şartları",
|
||||
"verify": "Doğrula"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "дії",
|
||||
"app": {
|
||||
"add": "Додати",
|
||||
"appDownloadURL": "URL завантаження додатку",
|
||||
"appIcon": "Іконка додатку",
|
||||
"appName": "Назва додатку",
|
||||
"batchDelete": "Пакетне видалення",
|
||||
"cancel": "Скасувати",
|
||||
"confirm": "Підтвердити",
|
||||
"confirmDelete": "Підтвердити видалення",
|
||||
"createApp": "Створити додаток",
|
||||
"createSuccess": "Успішно створено",
|
||||
"delete": "Видалити",
|
||||
"deleteSuccess": "Успішно видалено",
|
||||
"deleteWarning": "Цю дію не можна скасувати",
|
||||
"edit": "Редагувати",
|
||||
"editApp": "Редагувати додаток",
|
||||
"platform": "Платформа",
|
||||
"subscriptionProtocol": "Протокол підписки",
|
||||
"updateSuccess": "Успішно оновлено"
|
||||
},
|
||||
"cancel": "Скасувати",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Режим Однієї Підписки",
|
||||
"singleSubscriptionModeDescription": "Коли увімкнено, всі підписки користувачів будуть перетворені на баланс",
|
||||
"subscriptionDomain": "Домен Підписки",
|
||||
"subscriptionDomainDescription": "Використовується для підписки; залиште порожнім, щоб використовувати домен сайту",
|
||||
"subscriptionDomainPlaceholder": "Введіть домен підписки, один на рядок",
|
||||
"subscriptionPath": "Шлях Підписки",
|
||||
"subscriptionPathDescription": "Використовується для підписки; обов'язково перезапустіть систему після зміни для оптимальної продуктивності",
|
||||
"subscriptionPathPlaceholder": "Введіть",
|
||||
"wildcardResolution": "Розв'язання Маски",
|
||||
"wildcardResolutionDescription": "Використовується для підписки"
|
||||
},
|
||||
"confirm": "Підтвердити",
|
||||
"confirmDelete": "Ви впевнені, що хочете видалити?",
|
||||
"copy": "Копіювати",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Підписатися на групу",
|
||||
"tabs": {
|
||||
"subscribe": "Підписатися",
|
||||
"subscribeApp": "Конфігурація додатку",
|
||||
"subscribeConfig": "Конфігурація підписки",
|
||||
"subscribeGroup": "Група підписок"
|
||||
},
|
||||
"traffic": "Трафік",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Використовується для відображення місця, де потрібно показати назву сайту",
|
||||
"siteNamePlaceholder": "Будь ласка, введіть назву сайту"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Додати",
|
||||
"app": "Додаток",
|
||||
"appDescription": "Налаштуйте адресу завантаження додатка та правила імпорту, не забудьте зберегти після змін",
|
||||
"appDownloadURL": "Адреса завантаження додатка",
|
||||
"appIcon": "Іконка додатка",
|
||||
"appName": "Назва додатка",
|
||||
"delete": "Видалити",
|
||||
"reset": "Скинути",
|
||||
"save": "Зберегти",
|
||||
"saveSuccess": "Успішно збережено",
|
||||
"singleSubscriptionMode": "Режим єдиної підписки",
|
||||
"singleSubscriptionModeDescription": "Після увімкнення всі пакети користувачів будуть перетворені на баланс",
|
||||
"subscriptionDomain": "Домен підписки",
|
||||
"subscriptionDomainDescription": "Використовується для підписки, якщо залишити порожнім, буде використовуватися домен сайту",
|
||||
"subscriptionDomainPlaceholder": "Введіть домен підписки, кілька доменів вводьте по одному на рядок",
|
||||
"subscriptionPath": "Шлях підписки",
|
||||
"subscriptionPathDescription": "Використовується для підписки, після зміни обов'язково перезапустіть систему для забезпечення найкращої продуктивності",
|
||||
"subscriptionPathPlaceholder": "Введіть",
|
||||
"subscriptionProtocol": "Протокол підписки",
|
||||
"wildcardResolution": "Розв'язання підстановочних знаків",
|
||||
"wildcardResolutionDescription": "Використовується для підписки"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Валюта",
|
||||
"email": "Електронна пошта",
|
||||
"invite": "Запрошення",
|
||||
"node": "Вузол",
|
||||
"register": "Реєстрація",
|
||||
"site": "Сайт",
|
||||
"subscription": "Підписка",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Умови обслуговування",
|
||||
"verify": "Перевірка"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "Hành động",
|
||||
"app": {
|
||||
"add": "Thêm",
|
||||
"appDownloadURL": "URL Tải Ứng Dụng",
|
||||
"appIcon": "Biểu Tượng Ứng Dụng",
|
||||
"appName": "Tên Ứng Dụng",
|
||||
"batchDelete": "Xóa Hàng Loạt",
|
||||
"cancel": "Hủy",
|
||||
"confirm": "Xác Nhận",
|
||||
"confirmDelete": "Xác Nhận Xóa",
|
||||
"createApp": "Tạo Ứng Dụng",
|
||||
"createSuccess": "Tạo thành công",
|
||||
"delete": "Xóa",
|
||||
"deleteSuccess": "Xóa thành công",
|
||||
"deleteWarning": "Hành động này không thể hoàn tác",
|
||||
"edit": "Chỉnh Sửa",
|
||||
"editApp": "Chỉnh Sửa Ứng Dụng",
|
||||
"platform": "Nền Tảng",
|
||||
"subscriptionProtocol": "Giao Thức Đăng Ký",
|
||||
"updateSuccess": "Cập nhật thành công"
|
||||
},
|
||||
"cancel": "Hủy",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "Chế Độ Đăng Ký Đơn",
|
||||
"singleSubscriptionModeDescription": "Khi được kích hoạt, tất cả các đăng ký của người dùng sẽ được chuyển đổi thành số dư",
|
||||
"subscriptionDomain": "Miền Đăng Ký",
|
||||
"subscriptionDomainDescription": "Dùng cho đăng ký; để trống để sử dụng miền của trang",
|
||||
"subscriptionDomainPlaceholder": "Nhập miền đăng ký, mỗi dòng một miền",
|
||||
"subscriptionPath": "Đường Dẫn Đăng Ký",
|
||||
"subscriptionPathDescription": "Dùng cho đăng ký; hãy chắc chắn khởi động lại hệ thống sau khi sửa đổi để có hiệu suất tối ưu",
|
||||
"subscriptionPathPlaceholder": "Nhập",
|
||||
"wildcardResolution": "Giải Quyết Ký Tự Đại Diện",
|
||||
"wildcardResolutionDescription": "Dùng cho đăng ký"
|
||||
},
|
||||
"confirm": "Xác nhận",
|
||||
"confirmDelete": "Bạn có chắc chắn muốn xóa không?",
|
||||
"copy": "Sao chép",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "Nhóm đăng ký",
|
||||
"tabs": {
|
||||
"subscribe": "Đăng ký",
|
||||
"subscribeApp": "Cấu Hình Ứng Dụng",
|
||||
"subscribeConfig": "Cấu Hình Đăng Ký",
|
||||
"subscribeGroup": "Nhóm đăng ký"
|
||||
},
|
||||
"traffic": "lưu lượng",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "Dùng để hiển thị vị trí cần hiển thị tên trang web",
|
||||
"siteNamePlaceholder": "Vui lòng nhập tên trang web"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "Thêm",
|
||||
"app": "Ứng dụng",
|
||||
"appDescription": "Cấu hình địa chỉ tải xuống và quy tắc nhập của ứng dụng, nhớ lưu sau khi chỉnh sửa",
|
||||
"appDownloadURL": "Địa chỉ tải xuống ứng dụng",
|
||||
"appIcon": "Biểu tượng ứng dụng",
|
||||
"appName": "Tên ứng dụng",
|
||||
"delete": "Xóa",
|
||||
"reset": "Đặt lại",
|
||||
"save": "Lưu",
|
||||
"saveSuccess": "Lưu thành công",
|
||||
"singleSubscriptionMode": "Chế độ đăng ký đơn lẻ",
|
||||
"singleSubscriptionModeDescription": "Khi bật, tất cả gói của người dùng sẽ chuyển thành số dư",
|
||||
"subscriptionDomain": "Tên miền đăng ký",
|
||||
"subscriptionDomainDescription": "Dùng cho đăng ký, để trống sẽ sử dụng tên miền của trang",
|
||||
"subscriptionDomainPlaceholder": "Vui lòng nhập tên miền đăng ký, nhiều tên miền vui lòng nhập mỗi dòng một",
|
||||
"subscriptionPath": "Đường dẫn đăng ký",
|
||||
"subscriptionPathDescription": "Dùng cho đăng ký, sau khi chỉnh sửa vui lòng khởi động lại hệ thống để đảm bảo trải nghiệm hiệu suất tốt nhất",
|
||||
"subscriptionPathPlaceholder": "Vui lòng nhập",
|
||||
"subscriptionProtocol": "Giao thức đăng ký",
|
||||
"wildcardResolution": "Giải quyết ký tự đại diện",
|
||||
"wildcardResolutionDescription": "Dùng cho đăng ký"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "Tiền tệ",
|
||||
"email": "Email",
|
||||
"invite": "Mời",
|
||||
"node": "Nút",
|
||||
"register": "Đăng ký",
|
||||
"site": "Trang web",
|
||||
"subscription": "Đăng ký",
|
||||
"telegram": "Telegram",
|
||||
"tos": "Điều khoản dịch vụ",
|
||||
"verify": "Xác minh"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "操作",
|
||||
"app": {
|
||||
"add": "添加",
|
||||
"appDownloadURL": "应用下载链接",
|
||||
"appIcon": "应用图标",
|
||||
"appName": "应用名称",
|
||||
"batchDelete": "批量删除",
|
||||
"cancel": "取消",
|
||||
"confirm": "确认",
|
||||
"confirmDelete": "确认删除",
|
||||
"createApp": "创建应用",
|
||||
"createSuccess": "创建成功",
|
||||
"delete": "删除",
|
||||
"deleteSuccess": "删除成功",
|
||||
"deleteWarning": "此操作无法撤销",
|
||||
"edit": "编辑",
|
||||
"editApp": "编辑应用",
|
||||
"platform": "平台",
|
||||
"subscriptionProtocol": "订阅协议",
|
||||
"updateSuccess": "更新成功"
|
||||
},
|
||||
"cancel": "取消",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "单一订阅模式",
|
||||
"singleSubscriptionModeDescription": "启用后,所有用户订阅将转换为余额",
|
||||
"subscriptionDomain": "订阅域名",
|
||||
"subscriptionDomainDescription": "用于订阅;留空则使用站点域名",
|
||||
"subscriptionDomainPlaceholder": "输入订阅域名,每行一个",
|
||||
"subscriptionPath": "订阅路径",
|
||||
"subscriptionPathDescription": "用于订阅;修改后请务必重启系统以获得最佳性能",
|
||||
"subscriptionPathPlaceholder": "输入",
|
||||
"wildcardResolution": "通配符解析",
|
||||
"wildcardResolutionDescription": "用于订阅"
|
||||
},
|
||||
"confirm": "确认",
|
||||
"confirmDelete": "确定删除吗?",
|
||||
"copy": "复制",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "订阅组",
|
||||
"tabs": {
|
||||
"subscribe": "订阅",
|
||||
"subscribeApp": "应用配置",
|
||||
"subscribeConfig": "订阅配置",
|
||||
"subscribeGroup": "订阅组"
|
||||
},
|
||||
"traffic": "流量",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "用于显示需要展示站点名称的位置",
|
||||
"siteNamePlaceholder": "请输入站点名称"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "添加",
|
||||
"app": "应用",
|
||||
"appDescription": "配置 APP 的下载地址和导入规则,记得修改后保存",
|
||||
"appDownloadURL": "应用下载地址",
|
||||
"appIcon": "应用图标",
|
||||
"appName": "应用名称",
|
||||
"delete": "删除",
|
||||
"reset": "重置",
|
||||
"save": "保存",
|
||||
"saveSuccess": "保存成功",
|
||||
"singleSubscriptionMode": "单一订阅模式",
|
||||
"singleSubscriptionModeDescription": "开启后,所有用户的套餐将转换为余额",
|
||||
"subscriptionDomain": "订阅域名",
|
||||
"subscriptionDomainDescription": "用于订阅,留空则使用站点域名",
|
||||
"subscriptionDomainPlaceholder": "请输入订阅域名,多个域名请每行一个",
|
||||
"subscriptionPath": "订阅路径",
|
||||
"subscriptionPathDescription": "用于订阅, 修改后请务必重启系统,以确保最佳性能体验",
|
||||
"subscriptionPathPlaceholder": "请输入",
|
||||
"subscriptionProtocol": "订阅协议",
|
||||
"wildcardResolution": "通配符解析",
|
||||
"wildcardResolutionDescription": "用于订阅"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "货币",
|
||||
"email": "电子邮件",
|
||||
"invite": "邀请",
|
||||
"node": "节点",
|
||||
"register": "注册",
|
||||
"site": "站点",
|
||||
"subscription": "订阅",
|
||||
"telegram": "Telegram",
|
||||
"tos": "服务条款",
|
||||
"verify": "验证"
|
||||
|
||||
@ -1,6 +1,38 @@
|
||||
{
|
||||
"actions": "操作",
|
||||
"app": {
|
||||
"add": "新增",
|
||||
"appDownloadURL": "應用程式下載網址",
|
||||
"appIcon": "應用程式圖示",
|
||||
"appName": "應用程式名稱",
|
||||
"batchDelete": "批量刪除",
|
||||
"cancel": "取消",
|
||||
"confirm": "確認",
|
||||
"confirmDelete": "確認刪除",
|
||||
"createApp": "創建應用程式",
|
||||
"createSuccess": "創建成功",
|
||||
"delete": "刪除",
|
||||
"deleteSuccess": "刪除成功",
|
||||
"deleteWarning": "此操作無法撤銷",
|
||||
"edit": "編輯",
|
||||
"editApp": "編輯應用程式",
|
||||
"platform": "平台",
|
||||
"subscriptionProtocol": "訂閱協議",
|
||||
"updateSuccess": "更新成功"
|
||||
},
|
||||
"cancel": "取消",
|
||||
"config": {
|
||||
"singleSubscriptionMode": "單一訂閱模式",
|
||||
"singleSubscriptionModeDescription": "啟用後,所有用戶訂閱將轉換為餘額",
|
||||
"subscriptionDomain": "訂閱域名",
|
||||
"subscriptionDomainDescription": "用於訂閱;留空則使用網站域名",
|
||||
"subscriptionDomainPlaceholder": "輸入訂閱域名,每行一個",
|
||||
"subscriptionPath": "訂閱路徑",
|
||||
"subscriptionPathDescription": "用於訂閱;修改後請務必重啟系統以獲得最佳性能",
|
||||
"subscriptionPathPlaceholder": "輸入",
|
||||
"wildcardResolution": "通配符解析",
|
||||
"wildcardResolutionDescription": "用於訂閱"
|
||||
},
|
||||
"confirm": "確認",
|
||||
"confirmDelete": "確定刪除嗎?",
|
||||
"copy": "複製",
|
||||
@ -97,6 +129,8 @@
|
||||
"subscribeGroup": "訂閱組",
|
||||
"tabs": {
|
||||
"subscribe": "訂閱",
|
||||
"subscribeApp": "應用程式配置",
|
||||
"subscribeConfig": "訂閱配置",
|
||||
"subscribeGroup": "訂閱組"
|
||||
},
|
||||
"traffic": "流量",
|
||||
|
||||
@ -53,37 +53,11 @@
|
||||
"siteNameDescription": "用於顯示需要展示站點名稱的位置",
|
||||
"siteNamePlaceholder": "請輸入站點名稱"
|
||||
},
|
||||
"subscription": {
|
||||
"add": "新增",
|
||||
"app": "應用",
|
||||
"appDescription": "配置 APP 的下載地址和匯入規則,記得修改後儲存",
|
||||
"appDownloadURL": "應用下載地址",
|
||||
"appIcon": "應用圖示",
|
||||
"appName": "應用名稱",
|
||||
"delete": "刪除",
|
||||
"reset": "重設",
|
||||
"save": "儲存",
|
||||
"saveSuccess": "儲存成功",
|
||||
"singleSubscriptionMode": "單一訂閱模式",
|
||||
"singleSubscriptionModeDescription": "開啟後,所有用戶的套餐將轉換為餘額",
|
||||
"subscriptionDomain": "訂閱網域",
|
||||
"subscriptionDomainDescription": "用於訂閱,留空則使用站點網域",
|
||||
"subscriptionDomainPlaceholder": "請輸入訂閱網域,若有多個網域請每行一個",
|
||||
"subscriptionPath": "訂閱路徑",
|
||||
"subscriptionPathDescription": "用於訂閱,修改後請務必重新啟動系統,以確保最佳效能體驗",
|
||||
"subscriptionPathPlaceholder": "請輸入",
|
||||
"subscriptionProtocol": "訂閱協議",
|
||||
"wildcardResolution": "萬用字元解析",
|
||||
"wildcardResolutionDescription": "用於訂閱"
|
||||
},
|
||||
"tabs": {
|
||||
"currency": "貨幣",
|
||||
"email": "電子郵件",
|
||||
"invite": "邀請",
|
||||
"node": "節點",
|
||||
"register": "註冊",
|
||||
"site": "網站",
|
||||
"subscription": "訂閱",
|
||||
"telegram": "Telegram",
|
||||
"tos": "服務條款",
|
||||
"verify": "驗證"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user