feat(subscribe): Move subscription configuration and application to subscription module

This commit is contained in:
web@ppanel 2025-01-14 14:12:26 +07:00
parent 18b07c750d
commit f90d4d2ce6
51 changed files with 1284 additions and 943 deletions

View File

@ -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>
);
}

View 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')}
/>,
],
}}
/>
);
}

View 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>
);
}

View File

@ -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>

View File

@ -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>
</>
);
}

View File

@ -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",

View File

@ -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"

View File

@ -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",

View File

@ -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"

View File

@ -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",

View File

@ -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"

View File

@ -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",

View File

@ -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"

View File

@ -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",

View File

@ -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"

View File

@ -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": "ترافیک",

View File

@ -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": "تأیید"

View File

@ -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",

View File

@ -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"

View File

@ -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",

View File

@ -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"

View File

@ -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": "ट्रैफिक",

View File

@ -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": "सत्यापन"

View File

@ -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",

View File

@ -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"

View File

@ -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": "トラフィック",

View File

@ -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": "確認"

View File

@ -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": "트래픽",

View File

@ -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": "검증"

View File

@ -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",

View File

@ -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"

View File

@ -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",

View File

@ -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"

View File

@ -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",

View File

@ -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"

View File

@ -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",

View File

@ -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"

View File

@ -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": "трафик",

View File

@ -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": "Проверка"

View File

@ -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": "การจราจร",

View File

@ -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": "ยืนยัน"

View File

@ -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",

View File

@ -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"

View File

@ -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": "Трафік",

View File

@ -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": "Перевірка"

View File

@ -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",

View File

@ -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"

View File

@ -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": "流量",

View File

@ -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": "验证"

View File

@ -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": "流量",

View File

@ -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": "驗證"