Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7023875548 | |||
| a7aa5fee3e | |||
| 64cd842926 | |||
| 8b43e69bfe | |||
| ef153747bd | |||
| 328838d754 | |||
| 423b24077f | |||
| fa2fb2864f | |||
| 8d49daca21 | |||
| cf5c39cfe5 |
+26
-5
@@ -1,20 +1,41 @@
|
|||||||
<a name="readme-top"></a>
|
<a name="readme-top"></a>
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
# [1.0.0-beta.34](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.33...v1.0.0-beta.34) (2025-04-02)
|
||||||
|
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
* **admin**: Add application and rule management entries to localization files ([8b43e69](https://github.com/perfect-panel/ppanel-web/commit/8b43e69))
|
||||||
|
* **api**: Add an interface to obtain user subscription details, update related type definitions and localized text ([cf5c39c](https://github.com/perfect-panel/ppanel-web/commit/cf5c39c))
|
||||||
|
* **user**: Integrate subscription list into user management, update request parameters and types ([8d49dac](https://github.com/perfect-panel/ppanel-web/commit/8d49dac))
|
||||||
|
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* **admin**: Hidden versions and system upgrades ([64cd842](https://github.com/perfect-panel/ppanel-web/commit/64cd842))
|
||||||
|
* **admin**: Modify the label type in the rule form to a string array ([a7aa5fe](https://github.com/perfect-panel/ppanel-web/commit/a7aa5fe))
|
||||||
|
* **node**: Handle potential null value for online users count ([fa2fb28](https://github.com/perfect-panel/ppanel-web/commit/fa2fb28))
|
||||||
|
* **subscribe**: Add value prop to field in subscription form for proper state management ([328838d](https://github.com/perfect-panel/ppanel-web/commit/328838d))
|
||||||
|
* **subscribe**: Refactor discount calculations and default selection logic in subscription forms ([423b240](https://github.com/perfect-panel/ppanel-web/commit/423b240))
|
||||||
|
* **subscribe**: Update default selection logic in subscription form to ensure proper state management ([ef15374](https://github.com/perfect-panel/ppanel-web/commit/ef15374))
|
||||||
|
|
||||||
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
# Changelog
|
||||||
|
|
||||||
# [1.0.0-beta.33](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.32...v1.0.0-beta.33) (2025-03-18)
|
# [1.0.0-beta.33](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.32...v1.0.0-beta.33) (2025-03-18)
|
||||||
|
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
* **subscribe**: Handle optional values in price and discount calculations ([5939763](https://github.com/perfect-panel/ppanel-web/commit/5939763))
|
- **subscribe**: Handle optional values in price and discount calculations ([5939763](https://github.com/perfect-panel/ppanel-web/commit/5939763))
|
||||||
|
|
||||||
# [1.0.0-beta.32](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.31...v1.0.0-beta.32) (2025-03-17)
|
# [1.0.0-beta.32](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.31...v1.0.0-beta.32) (2025-03-17)
|
||||||
|
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
* **forms**: Add step attribute to number inputs for better value control ([b8f4f1e](https://github.com/perfect-panel/ppanel-web/commit/b8f4f1e))
|
- **forms**: Add step attribute to number inputs for better value control ([b8f4f1e](https://github.com/perfect-panel/ppanel-web/commit/b8f4f1e))
|
||||||
* **locales**: Update invite code text to indicate it's optional ([6a34bfb](https://github.com/perfect-panel/ppanel-web/commit/6a34bfb))
|
- **locales**: Update invite code text to indicate it's optional ([6a34bfb](https://github.com/perfect-panel/ppanel-web/commit/6a34bfb))
|
||||||
|
|
||||||
<a name="readme-top"></a>
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
|||||||
+25
-13
@@ -232,16 +232,6 @@ export default function SubscribeAppForm<
|
|||||||
name: 'is_default',
|
name: 'is_default',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
placeholder: t('defaultVersion'),
|
placeholder: t('defaultVersion'),
|
||||||
calculateValue: (value) => {
|
|
||||||
const newField = field.value?.map((item) => {
|
|
||||||
if (item.is_default) {
|
|
||||||
item.is_default = false;
|
|
||||||
}
|
|
||||||
return item;
|
|
||||||
});
|
|
||||||
form.setValue(field.name, newField);
|
|
||||||
return value;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'url',
|
name: 'url',
|
||||||
@@ -252,10 +242,32 @@ export default function SubscribeAppForm<
|
|||||||
]}
|
]}
|
||||||
value={field.value}
|
value={field.value}
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
form.setValue(
|
const filteredValue = value.filter((item) => item.url);
|
||||||
field.name,
|
|
||||||
value.filter((item) => item.url),
|
const newDefaultIndex = value.findIndex(
|
||||||
|
(item, idx) =>
|
||||||
|
item.is_default &&
|
||||||
|
(!field.value?.[idx] || !field.value[idx].is_default),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let finalValue = filteredValue;
|
||||||
|
|
||||||
|
if (newDefaultIndex >= 0 && filteredValue[newDefaultIndex]) {
|
||||||
|
finalValue = filteredValue.map((item, index) => ({
|
||||||
|
...item,
|
||||||
|
is_default: index === newDefaultIndex,
|
||||||
|
}));
|
||||||
|
} else if (
|
||||||
|
!filteredValue.some((item) => item.is_default) &&
|
||||||
|
filteredValue.length > 0
|
||||||
|
) {
|
||||||
|
finalValue = filteredValue.map((item, index) => ({
|
||||||
|
...item,
|
||||||
|
is_default: index === 0,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
form.setValue(field.name, finalValue as any);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
@@ -0,0 +1,215 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { createRuleGroup } from '@/services/admin/server';
|
||||||
|
import { Button } from '@workspace/ui/components/button';
|
||||||
|
import {
|
||||||
|
Dialog,
|
||||||
|
DialogContent,
|
||||||
|
DialogDescription,
|
||||||
|
DialogFooter,
|
||||||
|
DialogHeader,
|
||||||
|
DialogTitle,
|
||||||
|
} from '@workspace/ui/components/dialog';
|
||||||
|
import { Label } from '@workspace/ui/components/label';
|
||||||
|
import { Progress } from '@workspace/ui/components/progress';
|
||||||
|
import { Textarea } from '@workspace/ui/components/textarea';
|
||||||
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
|
import yaml from 'js-yaml';
|
||||||
|
import { useTranslations } from 'next-intl';
|
||||||
|
import { useRef, useState } from 'react';
|
||||||
|
import { toast } from 'sonner';
|
||||||
|
|
||||||
|
interface ImportYamlRulesProps {
|
||||||
|
onImportSuccess?: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RuleGroup {
|
||||||
|
name: string;
|
||||||
|
rules: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function ImportYamlRules({ onImportSuccess }: ImportYamlRulesProps) {
|
||||||
|
const t = useTranslations('rules');
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const [yamlContent, setYamlContent] = useState('');
|
||||||
|
const [importProgress, setImportProgress] = useState(0);
|
||||||
|
const [importTotal, setImportTotal] = useState(0);
|
||||||
|
const [analyzing, setAnalyzing] = useState(false);
|
||||||
|
const fileInputRef = useRef<HTMLInputElement>(null);
|
||||||
|
|
||||||
|
const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
const file = e.target.files?.[0];
|
||||||
|
if (!file) return;
|
||||||
|
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = (event) => {
|
||||||
|
const content = event.target?.result as string;
|
||||||
|
setYamlContent(content);
|
||||||
|
setOpen(true);
|
||||||
|
};
|
||||||
|
reader.readAsText(file);
|
||||||
|
|
||||||
|
e.target.value = '';
|
||||||
|
};
|
||||||
|
|
||||||
|
const processRule = (rule: string): { policyGroup: string; cleanRule: string } | null => {
|
||||||
|
const parts = rule.split(',');
|
||||||
|
|
||||||
|
if (parts.length === 1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let policyGroup = 'default';
|
||||||
|
let cleanRule = rule;
|
||||||
|
|
||||||
|
if (parts.length >= 3) {
|
||||||
|
const thirdPart = parts[2]?.trim();
|
||||||
|
if (thirdPart) {
|
||||||
|
policyGroup = thirdPart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanRule = parts.slice(0, 2).join(',');
|
||||||
|
|
||||||
|
return { policyGroup, cleanRule };
|
||||||
|
};
|
||||||
|
|
||||||
|
const parseRulesIntoGroups = (rules: string[]): Record<string, string[]> => {
|
||||||
|
const groups: Record<string, string[]> = {};
|
||||||
|
|
||||||
|
for (const rule of rules) {
|
||||||
|
if (!rule.trim()) continue;
|
||||||
|
|
||||||
|
const result = processRule(rule);
|
||||||
|
if (result === null) continue;
|
||||||
|
|
||||||
|
const { policyGroup, cleanRule } = result;
|
||||||
|
if (!groups[policyGroup]) {
|
||||||
|
groups[policyGroup] = [];
|
||||||
|
}
|
||||||
|
groups[policyGroup].push(cleanRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
return groups;
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleImport = async () => {
|
||||||
|
if (!yamlContent) {
|
||||||
|
toast.error(t('pleaseUploadFile'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoading(true);
|
||||||
|
setAnalyzing(true);
|
||||||
|
try {
|
||||||
|
const parsedYaml = yaml.load(yamlContent) as any;
|
||||||
|
|
||||||
|
if (!parsedYaml || !parsedYaml.rules) {
|
||||||
|
throw new Error(t('invalidYamlFormat'));
|
||||||
|
}
|
||||||
|
|
||||||
|
let allRules: string[] = [];
|
||||||
|
if (Array.isArray(parsedYaml.rules)) {
|
||||||
|
allRules = parsedYaml.rules.filter((rule: string) => rule.trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allRules.length === 0) {
|
||||||
|
throw new Error(t('noValidRules'));
|
||||||
|
}
|
||||||
|
|
||||||
|
const ruleGroups = parseRulesIntoGroups(allRules);
|
||||||
|
const groups = Object.entries(ruleGroups).map(([name, rules]) => ({
|
||||||
|
name,
|
||||||
|
rules,
|
||||||
|
}));
|
||||||
|
|
||||||
|
setImportTotal(groups.length);
|
||||||
|
setAnalyzing(false);
|
||||||
|
|
||||||
|
for (let i = 0; i < groups.length; i++) {
|
||||||
|
const group = groups[i];
|
||||||
|
if (!group?.name || !group?.rules.length) continue;
|
||||||
|
await createRuleGroup({
|
||||||
|
name: group.name,
|
||||||
|
rules: group?.rules.join('\n'),
|
||||||
|
enable: false,
|
||||||
|
tags: [],
|
||||||
|
icon: '',
|
||||||
|
});
|
||||||
|
setImportProgress(i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
toast.success(t('importSuccess'));
|
||||||
|
setOpen(false);
|
||||||
|
setYamlContent('');
|
||||||
|
setImportProgress(0);
|
||||||
|
setImportTotal(0);
|
||||||
|
onImportSuccess?.();
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Import error:', error);
|
||||||
|
toast.error(error instanceof Error ? error.message : t('importFailed'));
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
setAnalyzing(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<input
|
||||||
|
ref={fileInputRef}
|
||||||
|
type='file'
|
||||||
|
accept='.yml,.yaml'
|
||||||
|
style={{ display: 'none' }}
|
||||||
|
onChange={handleFileUpload}
|
||||||
|
/>
|
||||||
|
<Button variant='default' onClick={() => fileInputRef.current?.click()}>
|
||||||
|
{t('import')}
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Dialog open={open} onOpenChange={setOpen}>
|
||||||
|
<DialogContent className='sm:max-w-[500px]'>
|
||||||
|
<DialogHeader>
|
||||||
|
<DialogTitle>{t('importYamlRules')}</DialogTitle>
|
||||||
|
<DialogDescription>{t('importYamlDescription')}</DialogDescription>
|
||||||
|
</DialogHeader>
|
||||||
|
<div className='grid gap-4 py-4'>
|
||||||
|
{yamlContent && (
|
||||||
|
<div className='grid gap-2'>
|
||||||
|
<Label htmlFor='preview'>{t('preview')}</Label>
|
||||||
|
<Textarea
|
||||||
|
id='preview'
|
||||||
|
value={yamlContent}
|
||||||
|
readOnly
|
||||||
|
rows={10}
|
||||||
|
className='font-mono text-xs'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{importTotal > 0 && (
|
||||||
|
<div className='grid gap-2'>
|
||||||
|
<div className='flex justify-between text-sm'>
|
||||||
|
<span>{analyzing ? t('analyzing') : t('importing')}</span>
|
||||||
|
<span>
|
||||||
|
{importProgress} / {importTotal}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<Progress value={(importProgress / importTotal) * 100} />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<DialogFooter>
|
||||||
|
<Button variant='outline' onClick={() => setOpen(false)} disabled={loading}>
|
||||||
|
{t('cancel')}
|
||||||
|
</Button>
|
||||||
|
<Button onClick={handleImport} disabled={loading || !yamlContent}>
|
||||||
|
{loading && <Icon icon='mdi:loading' className='mr-2 animate-spin' />}
|
||||||
|
{t('import')}
|
||||||
|
</Button>
|
||||||
|
</DialogFooter>
|
||||||
|
</DialogContent>
|
||||||
|
</Dialog>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,212 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { ProTable, ProTableActions } from '@/components/pro-table';
|
||||||
|
import {
|
||||||
|
createRuleGroup,
|
||||||
|
deleteRuleGroup,
|
||||||
|
getRuleGroupList,
|
||||||
|
updateRuleGroup,
|
||||||
|
} from '@/services/admin/server';
|
||||||
|
import { Badge } from '@workspace/ui/components/badge';
|
||||||
|
import { Button } from '@workspace/ui/components/button';
|
||||||
|
import { Switch } from '@workspace/ui/components/switch';
|
||||||
|
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
|
||||||
|
import { formatDate } from '@workspace/ui/utils';
|
||||||
|
import { useTranslations } from 'next-intl';
|
||||||
|
import Image from 'next/legacy/image';
|
||||||
|
import Link from 'next/link';
|
||||||
|
import { useRef, useState } from 'react';
|
||||||
|
import { toast } from 'sonner';
|
||||||
|
import ImportYamlRules from './import-yaml-rules';
|
||||||
|
import RuleForm from './rule-form';
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
const t = useTranslations('rules');
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const ref = useRef<ProTableActions>(null);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ProTable<API.ServerRuleGroup, { query: string }>
|
||||||
|
action={ref}
|
||||||
|
header={{
|
||||||
|
toolbar: (
|
||||||
|
<div className='flex gap-2'>
|
||||||
|
<Button variant='default' asChild>
|
||||||
|
<Link href='/template/rules.yml' target='_blank' download>
|
||||||
|
{t('downloadTemplate')}
|
||||||
|
</Link>
|
||||||
|
</Button>
|
||||||
|
<ImportYamlRules onImportSuccess={() => ref.current?.refresh()} />
|
||||||
|
<RuleForm<API.CreateRuleGroupRequest>
|
||||||
|
trigger={t('create')}
|
||||||
|
title={t('createRule')}
|
||||||
|
loading={loading}
|
||||||
|
onSubmit={async (values) => {
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
await createRuleGroup({
|
||||||
|
name: values.name,
|
||||||
|
rules: values.rules || '',
|
||||||
|
enable: false,
|
||||||
|
tags: values.tags || [],
|
||||||
|
icon: values.icon || '',
|
||||||
|
});
|
||||||
|
toast.success(t('createSuccess'));
|
||||||
|
ref.current?.refresh();
|
||||||
|
setLoading(false);
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
setLoading(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
params={[
|
||||||
|
{
|
||||||
|
key: 'search',
|
||||||
|
placeholder: t('searchRule'),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
request={async (pagination, filters) => {
|
||||||
|
const { data } = await getRuleGroupList({
|
||||||
|
...pagination,
|
||||||
|
...filters,
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
list: data.data?.list || [],
|
||||||
|
total: data.data?.total || 0,
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
accessorKey: 'enable',
|
||||||
|
header: t('enable'),
|
||||||
|
cell: ({ row }) => {
|
||||||
|
return (
|
||||||
|
<Switch
|
||||||
|
defaultChecked={row.getValue('enable')}
|
||||||
|
onCheckedChange={async (checked) => {
|
||||||
|
await updateRuleGroup({
|
||||||
|
...row.original,
|
||||||
|
enable: checked,
|
||||||
|
} as API.UpdateRuleGroupRequest);
|
||||||
|
ref.current?.refresh();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'icon',
|
||||||
|
header: t('appIcon'),
|
||||||
|
cell: ({ row }) =>
|
||||||
|
row.getValue('icon') ? (
|
||||||
|
<Image
|
||||||
|
src={row.getValue('icon')}
|
||||||
|
alt={row.getValue('name')}
|
||||||
|
className='h-8 w-8 rounded-md'
|
||||||
|
width={32}
|
||||||
|
height={32}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<div className='bg-muted flex h-8 w-8 items-center justify-center rounded-md'>
|
||||||
|
{row.original.name?.slice(0, 2)}
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
accessorKey: 'name',
|
||||||
|
header: t('name'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'tags',
|
||||||
|
header: t('tags'),
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const tags = row.original.tags.filter((item) => item) || [];
|
||||||
|
if (!tags.length) return '--';
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{tags.map((tag) => (
|
||||||
|
<Badge key={tag} variant='outline' className='mr-1'>
|
||||||
|
{tag}
|
||||||
|
</Badge>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'created_at',
|
||||||
|
header: t('createdAt'),
|
||||||
|
cell: ({ row }) => formatDate(row.original.created_at),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
actions={{
|
||||||
|
render: (row) => [
|
||||||
|
<RuleForm<API.UpdateRuleGroupRequest>
|
||||||
|
key='edit'
|
||||||
|
trigger={t('edit')}
|
||||||
|
title={t('editRule')}
|
||||||
|
loading={loading}
|
||||||
|
initialValues={row}
|
||||||
|
onSubmit={async (values) => {
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
await updateRuleGroup({
|
||||||
|
id: row.id,
|
||||||
|
name: values.name,
|
||||||
|
tags: values.tags,
|
||||||
|
rules: values.rules,
|
||||||
|
enable: row.enable,
|
||||||
|
icon: values.icon,
|
||||||
|
});
|
||||||
|
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 deleteRuleGroup({ 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('delete')}</Button>}
|
||||||
|
title={t('confirmDelete')}
|
||||||
|
description={t('deleteWarning')}
|
||||||
|
onConfirm={async () => {
|
||||||
|
for (const row of rows) {
|
||||||
|
await deleteRuleGroup({ id: row.id });
|
||||||
|
}
|
||||||
|
toast.success(t('deleteSuccess'));
|
||||||
|
ref.current?.reset();
|
||||||
|
ref.current?.refresh();
|
||||||
|
}}
|
||||||
|
cancelText={t('cancel')}
|
||||||
|
confirmText={t('confirm')}
|
||||||
|
/>,
|
||||||
|
],
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,232 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { getNodeTagList } from '@/services/admin/server';
|
||||||
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
|
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 {
|
||||||
|
Sheet,
|
||||||
|
SheetContent,
|
||||||
|
SheetFooter,
|
||||||
|
SheetHeader,
|
||||||
|
SheetTitle,
|
||||||
|
SheetTrigger,
|
||||||
|
} from '@workspace/ui/components/sheet';
|
||||||
|
import { Textarea } from '@workspace/ui/components/textarea';
|
||||||
|
import { Combobox } from '@workspace/ui/custom-components/combobox';
|
||||||
|
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||||
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
|
import { UploadImage } from '@workspace/ui/custom-components/upload-image';
|
||||||
|
import { useTranslations } from 'next-intl';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { useForm } from 'react-hook-form';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
const formSchema = z.object({
|
||||||
|
name: z.string().min(1, { message: '请输入规则名称' }),
|
||||||
|
tags: z.array(z.string()).default([]),
|
||||||
|
rules: z.string().default(''),
|
||||||
|
icon: z.string().default(''),
|
||||||
|
});
|
||||||
|
|
||||||
|
interface RuleFormProps<T> {
|
||||||
|
onSubmit: (data: T) => Promise<boolean> | boolean;
|
||||||
|
initialValues?: T;
|
||||||
|
loading?: boolean;
|
||||||
|
trigger: string;
|
||||||
|
title: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function RuleForm<T extends Record<string, any>>({
|
||||||
|
onSubmit,
|
||||||
|
initialValues,
|
||||||
|
loading,
|
||||||
|
trigger,
|
||||||
|
title,
|
||||||
|
}: RuleFormProps<T>) {
|
||||||
|
const t = useTranslations('rules');
|
||||||
|
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
const form = useForm({
|
||||||
|
resolver: zodResolver(formSchema),
|
||||||
|
defaultValues: {
|
||||||
|
...initialValues,
|
||||||
|
} as any,
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (initialValues) {
|
||||||
|
form.reset(initialValues);
|
||||||
|
}
|
||||||
|
}, [form, initialValues]);
|
||||||
|
|
||||||
|
async function handleSubmit(data: { [x: string]: any }) {
|
||||||
|
const bool = await onSubmit(data as T);
|
||||||
|
if (bool) setOpen(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: tags } = useQuery({
|
||||||
|
queryKey: ['getNodeTagList'],
|
||||||
|
queryFn: async () => {
|
||||||
|
const { data } = await getNodeTagList();
|
||||||
|
return data.data?.tags || [];
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Sheet open={open} onOpenChange={setOpen}>
|
||||||
|
<SheetTrigger asChild>
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
form.reset();
|
||||||
|
setOpen(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{trigger}
|
||||||
|
</Button>
|
||||||
|
</SheetTrigger>
|
||||||
|
<SheetContent className='w-[500px] max-w-full md:max-w-screen-md'>
|
||||||
|
<SheetHeader>
|
||||||
|
<SheetTitle>{title}</SheetTitle>
|
||||||
|
</SheetHeader>
|
||||||
|
<ScrollArea className='-mx-6 h-[calc(100vh-48px-36px-36px-env(safe-area-inset-top))]'>
|
||||||
|
<Form {...form}>
|
||||||
|
<form onSubmit={form.handleSubmit(handleSubmit)} className='space-y-4 px-6 pt-4'>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='icon'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('appIcon')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<EnhancedInput
|
||||||
|
placeholder={t('enterIconUrl')}
|
||||||
|
value={field.value}
|
||||||
|
suffix={
|
||||||
|
<UploadImage
|
||||||
|
className='bg-muted h-9 rounded-none border-none px-2'
|
||||||
|
onChange={(value) => {
|
||||||
|
form.setValue(field.name, value as string);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
form.setValue(field.name, value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='name'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('name')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<EnhancedInput
|
||||||
|
placeholder={t('enterRuleName')}
|
||||||
|
value={field.value}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
form.setValue(field.name, value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='tags'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('tagsLabel')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Combobox<string, true>
|
||||||
|
multiple
|
||||||
|
placeholder={t('selectTags')}
|
||||||
|
value={field.value}
|
||||||
|
onChange={(value) => {
|
||||||
|
form.setValue(field.name, value);
|
||||||
|
}}
|
||||||
|
options={tags?.map((item: string) => ({
|
||||||
|
value: item,
|
||||||
|
label: item,
|
||||||
|
}))}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='rules'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('rulesLabel')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Textarea
|
||||||
|
placeholder={t('enterRules')}
|
||||||
|
value={field.value}
|
||||||
|
rows={10}
|
||||||
|
onChange={(e) => {
|
||||||
|
form.setValue(field.name, e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<div className='text-muted-foreground mt-1 text-xs'>
|
||||||
|
<pre>{t('rulesFormat')}</pre>
|
||||||
|
<div className='border-muted mt-2 space-y-1 border-l-2 pl-2'>
|
||||||
|
<p className='font-mono'>DOMAIN,example.com</p>
|
||||||
|
<p className='font-mono'>DOMAIN-SUFFIX,google.com,DIRECT</p>
|
||||||
|
<p className='font-mono'>DOMAIN-KEYWORD,amazon,REJECT</p>
|
||||||
|
<p className='font-mono'>IP-CIDR,192.168.0.0/16</p>
|
||||||
|
<p className='font-mono'>IP-CIDR6,2001:db8::/32,REJECT</p>
|
||||||
|
<p className='font-mono'>SRC-IP-CIDR,192.168.1.201/32</p>
|
||||||
|
<p className='font-mono'>GEOIP,CN,DIRECT</p>
|
||||||
|
<p className='font-mono'>GEOIP,US</p>
|
||||||
|
<p className='font-mono'>DST-PORT,80,DIRECT</p>
|
||||||
|
<p className='font-mono'>SRC-PORT,7777,REJECT</p>
|
||||||
|
<p className='font-mono'>PROCESS-NAME,telegram</p>
|
||||||
|
<p className='font-mono'>RULE-SET,netflix</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</form>
|
||||||
|
</Form>
|
||||||
|
</ScrollArea>
|
||||||
|
<SheetFooter className='flex-row justify-end gap-2 pt-3'>
|
||||||
|
<Button
|
||||||
|
variant='outline'
|
||||||
|
disabled={loading}
|
||||||
|
onClick={() => {
|
||||||
|
setOpen(false);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{t('cancel')}
|
||||||
|
</Button>
|
||||||
|
<Button disabled={loading} onClick={form.handleSubmit(handleSubmit)}>
|
||||||
|
{loading && <Icon icon='mdi:loading' className='mr-2 animate-spin' />}
|
||||||
|
{t('confirm')}
|
||||||
|
</Button>
|
||||||
|
</SheetFooter>
|
||||||
|
</SheetContent>
|
||||||
|
</Sheet>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,5 +1,11 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
|
import {
|
||||||
|
Accordion,
|
||||||
|
AccordionContent,
|
||||||
|
AccordionItem,
|
||||||
|
AccordionTrigger,
|
||||||
|
} from '@workspace/ui/components/accordion';
|
||||||
import { Badge } from '@workspace/ui/components/badge';
|
import { Badge } from '@workspace/ui/components/badge';
|
||||||
import { Progress } from '@workspace/ui/components/progress';
|
import { Progress } from '@workspace/ui/components/progress';
|
||||||
import { ScrollArea } from '@workspace/ui/components/scroll-area';
|
import { ScrollArea } from '@workspace/ui/components/scroll-area';
|
||||||
@@ -11,6 +17,8 @@ import {
|
|||||||
} from '@workspace/ui/components/tooltip';
|
} from '@workspace/ui/components/tooltip';
|
||||||
import { formatDate } from '@workspace/ui/utils';
|
import { formatDate } from '@workspace/ui/utils';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
|
import { useState } from 'react';
|
||||||
|
import { UserSubscribeDetail } from '../user/user-detail';
|
||||||
|
|
||||||
export function formatPercentage(value: number): string {
|
export function formatPercentage(value: number): string {
|
||||||
return `${value.toFixed(1)}%`;
|
return `${value.toFixed(1)}%`;
|
||||||
@@ -18,25 +26,19 @@ export function formatPercentage(value: number): string {
|
|||||||
|
|
||||||
export function NodeStatusCell({ status }: { status: API.NodeStatus }) {
|
export function NodeStatusCell({ status }: { status: API.NodeStatus }) {
|
||||||
const t = useTranslations('server.node');
|
const t = useTranslations('server.node');
|
||||||
|
const [openItem, setOpenItem] = useState<string | null>(null);
|
||||||
|
|
||||||
const {
|
const { online, cpu, mem, disk, updated_at } = status || {
|
||||||
last_at,
|
online: {},
|
||||||
online_users,
|
|
||||||
status: serverStatus,
|
|
||||||
} = status || {
|
|
||||||
online_users: [],
|
|
||||||
status: {
|
|
||||||
cpu: 0,
|
cpu: 0,
|
||||||
mem: 0,
|
mem: 0,
|
||||||
disk: 0,
|
disk: 0,
|
||||||
updated_at: 0,
|
updated_at: 0,
|
||||||
},
|
|
||||||
last_at: 0,
|
|
||||||
};
|
};
|
||||||
const isOnline = last_at > 0;
|
const isOnline = updated_at > 0;
|
||||||
const badgeVariant = isOnline ? 'default' : 'destructive';
|
const badgeVariant = isOnline ? 'default' : 'destructive';
|
||||||
const badgeText = isOnline ? t('normal') : t('abnormal');
|
const badgeText = isOnline ? t('normal') : t('abnormal');
|
||||||
const onlineCount = Array.isArray(online_users) ? online_users?.length : 0;
|
const onlineCount = (online && Object.keys(online).length) || 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TooltipProvider>
|
<TooltipProvider>
|
||||||
@@ -52,45 +54,56 @@ export function NodeStatusCell({ status }: { status: API.NodeStatus }) {
|
|||||||
<div className='flex flex-col space-y-1'>
|
<div className='flex flex-col space-y-1'>
|
||||||
<div className='flex justify-between'>
|
<div className='flex justify-between'>
|
||||||
<span>CPU</span>
|
<span>CPU</span>
|
||||||
<span>{formatPercentage(serverStatus?.cpu ?? 0)}</span>
|
<span>{formatPercentage(cpu ?? 0)}</span>
|
||||||
</div>
|
</div>
|
||||||
<Progress value={serverStatus?.cpu ?? 0} className='h-2' max={100} />
|
<Progress value={cpu ?? 0} className='h-2' max={100} />
|
||||||
</div>
|
</div>
|
||||||
<div className='flex flex-col space-y-1'>
|
<div className='flex flex-col space-y-1'>
|
||||||
<div className='flex justify-between'>
|
<div className='flex justify-between'>
|
||||||
<span>{t('memory')}</span>
|
<span>{t('memory')}</span>
|
||||||
<span>{formatPercentage(serverStatus?.mem ?? 0)}</span>
|
<span>{formatPercentage(mem ?? 0)}</span>
|
||||||
</div>
|
</div>
|
||||||
<Progress value={serverStatus?.mem ?? 0} className='h-2' max={100} />
|
<Progress value={mem ?? 0} className='h-2' max={100} />
|
||||||
</div>
|
</div>
|
||||||
<div className='flex flex-col space-y-1'>
|
<div className='flex flex-col space-y-1'>
|
||||||
<div className='flex justify-between'>
|
<div className='flex justify-between'>
|
||||||
<span>{t('disk')}</span>
|
<span>{t('disk')}</span>
|
||||||
<span>{formatPercentage(serverStatus?.disk ?? 0)}</span>
|
<span>{formatPercentage(disk ?? 0)}</span>
|
||||||
</div>
|
</div>
|
||||||
<Progress value={serverStatus?.disk ?? 0} className='h-2' max={100} />
|
<Progress value={disk ?? 0} className='h-2' max={100} />
|
||||||
</div>
|
</div>
|
||||||
{isOnline && (
|
{isOnline && (
|
||||||
<div>
|
<div>
|
||||||
{t('lastUpdated')}: {formatDate(serverStatus?.updated_at ?? 0)}
|
{t('lastUpdated')}: {formatDate(updated_at ?? 0)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</TooltipTrigger>
|
</TooltipTrigger>
|
||||||
{isOnline && onlineCount > 0 && (
|
{isOnline && onlineCount > 0 && (
|
||||||
<TooltipContent className='bg-muted text-foreground w-80'>
|
<TooltipContent className='bg-card text-foreground w-96'>
|
||||||
<div className='space-y-4'>
|
<ScrollArea className='h-[540px] rounded-md border px-4 py-2'>
|
||||||
<div className='space-y-2'>
|
<h4 className='py-1 text-sm font-semibold'>{t('onlineUsers')}</h4>
|
||||||
<h4 className='text-sm font-semibold'>{t('onlineUsers')}</h4>
|
<Accordion
|
||||||
<ScrollArea className='h-[400px] rounded-md border p-2'>
|
type='single'
|
||||||
{online_users.map((user, index) => (
|
collapsible
|
||||||
<div key={user.uid} className='py-1 text-xs'>
|
className='w-full'
|
||||||
{user.ip} (UID: {user.uid})
|
onValueChange={(value) => setOpenItem(value)}
|
||||||
</div>
|
>
|
||||||
|
{Object.entries(online).map(([uid, ips]) => (
|
||||||
|
<AccordionItem key={uid} value={uid}>
|
||||||
|
<AccordionTrigger>{`[UID: ${uid}] - ${ips[0]}`}</AccordionTrigger>
|
||||||
|
<AccordionContent>
|
||||||
|
<ul>
|
||||||
|
{ips.map((ip: string) => (
|
||||||
|
<li key={ip}>{ip}</li>
|
||||||
))}
|
))}
|
||||||
|
</ul>
|
||||||
|
<UserSubscribeDetail id={Number(uid)} enabled={openItem === uid} />
|
||||||
|
</AccordionContent>
|
||||||
|
</AccordionItem>
|
||||||
|
))}
|
||||||
|
</Accordion>
|
||||||
</ScrollArea>
|
</ScrollArea>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</TooltipContent>
|
</TooltipContent>
|
||||||
)}
|
)}
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { getTranslations } from 'next-intl/server';
|
|||||||
|
|
||||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
||||||
|
|
||||||
import SubscribeApp from './app/table';
|
|
||||||
import GroupTable from './group/table';
|
import GroupTable from './group/table';
|
||||||
import SubscribeConfig from './subscribe-config';
|
import SubscribeConfig from './subscribe-config';
|
||||||
import SubscribeTable from './subscribe-table';
|
import SubscribeTable from './subscribe-table';
|
||||||
@@ -16,7 +15,6 @@ export default async function Page() {
|
|||||||
<TabsTrigger value='subscribe'>{t('tabs.subscribe')}</TabsTrigger>
|
<TabsTrigger value='subscribe'>{t('tabs.subscribe')}</TabsTrigger>
|
||||||
<TabsTrigger value='group'>{t('tabs.subscribeGroup')}</TabsTrigger>
|
<TabsTrigger value='group'>{t('tabs.subscribeGroup')}</TabsTrigger>
|
||||||
<TabsTrigger value='config'>{t('tabs.subscribeConfig')}</TabsTrigger>
|
<TabsTrigger value='config'>{t('tabs.subscribeConfig')}</TabsTrigger>
|
||||||
<TabsTrigger value='app'>{t('tabs.subscribeApp')}</TabsTrigger>
|
|
||||||
</TabsList>
|
</TabsList>
|
||||||
<TabsContent value='subscribe'>
|
<TabsContent value='subscribe'>
|
||||||
<SubscribeTable />
|
<SubscribeTable />
|
||||||
@@ -27,9 +25,6 @@ export default async function Page() {
|
|||||||
<TabsContent value='config'>
|
<TabsContent value='config'>
|
||||||
<SubscribeConfig />
|
<SubscribeConfig />
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
<TabsContent value='app'>
|
|
||||||
<SubscribeApp />
|
|
||||||
</TabsContent>
|
|
||||||
</Tabs>
|
</Tabs>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -157,6 +157,32 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const unit_time = form.watch('unit_time');
|
const unit_time = form.watch('unit_time');
|
||||||
|
const unit_price = form.watch('unit_price');
|
||||||
|
const discounts = form.watch('discount');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!discounts?.length || !unit_price) return;
|
||||||
|
|
||||||
|
const calculatedValues = discounts.map((item: any) => {
|
||||||
|
const result = { ...item };
|
||||||
|
|
||||||
|
if (item.quantity && item.discount) {
|
||||||
|
result.price = evaluateWithPrecision(
|
||||||
|
`${unit_price || 0} * ${item.quantity} * ${item.discount} / 100`,
|
||||||
|
);
|
||||||
|
} else if (item.quantity && item.price && !item.discount) {
|
||||||
|
result.discount = evaluateWithPrecision(
|
||||||
|
`${item.price} / ${item.quantity} / ${unit_price} * 100`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (JSON.stringify(calculatedValues) !== JSON.stringify(discounts)) {
|
||||||
|
form.setValue('discount', calculatedValues);
|
||||||
|
}
|
||||||
|
}, [unit_price, discounts, form]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Sheet open={open} onOpenChange={setOpen}>
|
<Sheet open={open} onOpenChange={setOpen}>
|
||||||
@@ -543,7 +569,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
|||||||
<FormItem>
|
<FormItem>
|
||||||
<FormLabel>{t('form.discount')}</FormLabel>
|
<FormLabel>{t('form.discount')}</FormLabel>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<ArrayInput<API.SubscribeDiscount>
|
<ArrayInput<API.SubscribeDiscount & { price?: number }>
|
||||||
fields={[
|
fields={[
|
||||||
{
|
{
|
||||||
name: 'quantity',
|
name: 'quantity',
|
||||||
@@ -559,15 +585,6 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
|||||||
max: 100,
|
max: 100,
|
||||||
placeholder: t('form.discountPercent'),
|
placeholder: t('form.discountPercent'),
|
||||||
suffix: '%',
|
suffix: '%',
|
||||||
calculateValue: function (data) {
|
|
||||||
const { unit_price } = form.getValues();
|
|
||||||
return {
|
|
||||||
...data,
|
|
||||||
price: evaluateWithPrecision(
|
|
||||||
`${unit_price || 0} * ${data.quantity || 0} * ${data.discount || 0} / 100`,
|
|
||||||
),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'price',
|
name: 'price',
|
||||||
@@ -575,21 +592,49 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
|||||||
type: 'number',
|
type: 'number',
|
||||||
formatInput: (value) => unitConversion('centsToDollars', value),
|
formatInput: (value) => unitConversion('centsToDollars', value),
|
||||||
formatOutput: (value) => unitConversion('dollarsToCents', value),
|
formatOutput: (value) => unitConversion('dollarsToCents', value),
|
||||||
internal: true,
|
|
||||||
calculateValue: (data) => {
|
|
||||||
const { unit_price } = form.getValues();
|
|
||||||
return {
|
|
||||||
...data,
|
|
||||||
discount: evaluateWithPrecision(
|
|
||||||
`${data.price || 0} / ${data.quantity || 0} / ${unit_price || 0} * 100`,
|
|
||||||
),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
value={field.value}
|
value={field.value}
|
||||||
onChange={(value) => {
|
onChange={(newValues) => {
|
||||||
form.setValue(field.name, value);
|
const oldValues = field.value || [];
|
||||||
|
const { unit_price } = form.getValues();
|
||||||
|
|
||||||
|
const calculatedValues = newValues.map((newItem, index) => {
|
||||||
|
const oldItem = oldValues[index] || {};
|
||||||
|
|
||||||
|
const result = { ...newItem };
|
||||||
|
|
||||||
|
const quantityChanged = newItem.quantity !== oldItem.quantity;
|
||||||
|
const discountChanged = newItem.discount !== oldItem.discount;
|
||||||
|
const priceChanged = newItem.price !== oldItem.price;
|
||||||
|
|
||||||
|
if (
|
||||||
|
(quantityChanged || discountChanged) &&
|
||||||
|
!priceChanged &&
|
||||||
|
newItem.quantity &&
|
||||||
|
newItem.discount
|
||||||
|
) {
|
||||||
|
result.price = evaluateWithPrecision(
|
||||||
|
`${unit_price || 0} * ${newItem.quantity} * ${newItem.discount} / 100`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
priceChanged &&
|
||||||
|
!discountChanged &&
|
||||||
|
newItem.price &&
|
||||||
|
newItem.quantity &&
|
||||||
|
unit_price
|
||||||
|
) {
|
||||||
|
result.discount = evaluateWithPrecision(
|
||||||
|
`${newItem.price} / ${newItem.quantity} / ${unit_price} * 100`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
|
||||||
|
form.setValue(field.name, calculatedValues);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import {
|
|||||||
} from '@workspace/ui/components/accordion';
|
} from '@workspace/ui/components/accordion';
|
||||||
import {
|
import {
|
||||||
AlertDialog,
|
AlertDialog,
|
||||||
AlertDialogAction,
|
|
||||||
AlertDialogCancel,
|
AlertDialogCancel,
|
||||||
AlertDialogContent,
|
AlertDialogContent,
|
||||||
AlertDialogDescription,
|
AlertDialogDescription,
|
||||||
@@ -67,7 +66,7 @@ export default function Page() {
|
|||||||
<CardDescription>{t('viewLogsAndManage')}</CardDescription>
|
<CardDescription>{t('viewLogsAndManage')}</CardDescription>
|
||||||
</div>
|
</div>
|
||||||
<div className='mt-4 flex flex-col space-y-2 sm:mt-0 sm:flex-row sm:space-x-2 sm:space-y-0'>
|
<div className='mt-4 flex flex-col space-y-2 sm:mt-0 sm:flex-row sm:space-x-2 sm:space-y-0'>
|
||||||
<AlertDialog>
|
{/* <AlertDialog>
|
||||||
<AlertDialogTrigger asChild>
|
<AlertDialogTrigger asChild>
|
||||||
<Button>{t('systemUpgrade')}</Button>
|
<Button>{t('systemUpgrade')}</Button>
|
||||||
</AlertDialogTrigger>
|
</AlertDialogTrigger>
|
||||||
@@ -81,7 +80,7 @@ export default function Page() {
|
|||||||
<AlertDialogAction>{t('confirmUpgrade')}</AlertDialogAction>
|
<AlertDialogAction>{t('confirmUpgrade')}</AlertDialogAction>
|
||||||
</AlertDialogFooter>
|
</AlertDialogFooter>
|
||||||
</AlertDialogContent>
|
</AlertDialogContent>
|
||||||
</AlertDialog>
|
</AlertDialog> */}
|
||||||
<AlertDialog open={openRestart} onOpenChange={setOpenRestart}>
|
<AlertDialog open={openRestart} onOpenChange={setOpenRestart}>
|
||||||
<AlertDialogTrigger asChild>
|
<AlertDialogTrigger asChild>
|
||||||
<Button variant='destructive'>{t('systemReboot')}</Button>
|
<Button variant='destructive'>{t('systemReboot')}</Button>
|
||||||
@@ -113,14 +112,14 @@ export default function Page() {
|
|||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<div className='space-y-6'>
|
<div className='space-y-6'>
|
||||||
<div className='flex items-center justify-between'>
|
{/* <div className='flex items-center justify-between'>
|
||||||
<div className='text-lg font-semibold'>
|
<div className='text-lg font-semibold'>
|
||||||
{t('currentVersion')} <span>V1.0.0</span>
|
{t('currentVersion')} <span>V1.0.0</span>
|
||||||
</div>
|
</div>
|
||||||
<div className='text-muted-foreground text-sm'>
|
<div className='text-muted-foreground text-sm'>
|
||||||
{t('lastUpdated')} <span>2024-12-16 12:00:00</span>
|
{t('lastUpdated')} <span>2024-12-16 12:00:00</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> */}
|
||||||
<Card className='overflow-hidden'>
|
<Card className='overflow-hidden'>
|
||||||
<CardHeader className='bg-secondary py-1'>
|
<CardHeader className='bg-secondary py-1'>
|
||||||
<div className='flex items-center justify-between'>
|
<div className='flex items-center justify-between'>
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
import { Display } from '@/components/display';
|
import { Display } from '@/components/display';
|
||||||
import { ProTable, ProTableActions } from '@/components/pro-table';
|
import { ProTable, ProTableActions } from '@/components/pro-table';
|
||||||
|
import { getSubscribeList } from '@/services/admin/subscribe';
|
||||||
import { createUser, deleteUser, getUserList, updateUserBasicInfo } from '@/services/admin/user';
|
import { createUser, deleteUser, getUserList, updateUserBasicInfo } from '@/services/admin/user';
|
||||||
|
import { useQuery } from '@tanstack/react-query';
|
||||||
import { Badge } from '@workspace/ui/components/badge';
|
import { Badge } from '@workspace/ui/components/badge';
|
||||||
import { Button } from '@workspace/ui/components/button';
|
import { Button } from '@workspace/ui/components/button';
|
||||||
import { Switch } from '@workspace/ui/components/switch';
|
import { Switch } from '@workspace/ui/components/switch';
|
||||||
@@ -20,8 +22,19 @@ export default function Page() {
|
|||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const ref = useRef<ProTableActions>(null);
|
const ref = useRef<ProTableActions>(null);
|
||||||
|
|
||||||
|
const { data: subscribeList } = useQuery({
|
||||||
|
queryKey: ['getSubscribeList', 'all'],
|
||||||
|
queryFn: async () => {
|
||||||
|
const { data } = await getSubscribeList({
|
||||||
|
page: 1,
|
||||||
|
size: 9999,
|
||||||
|
});
|
||||||
|
return data.data?.list as API.SubscribeGroup[];
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ProTable<API.User, Record<string, unknown>>
|
<ProTable<API.User, API.GetUserListParams>
|
||||||
action={ref}
|
action={ref}
|
||||||
header={{
|
header={{
|
||||||
title: t('userList'),
|
title: t('userList'),
|
||||||
@@ -132,13 +145,38 @@ export default function Page() {
|
|||||||
cell: ({ row }) => formatDate(row.getValue('created_at')),
|
cell: ({ row }) => formatDate(row.getValue('created_at')),
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
request={async (pagination) => {
|
request={async (pagination, filter) => {
|
||||||
const { data } = await getUserList(pagination);
|
const { data } = await getUserList({
|
||||||
|
...pagination,
|
||||||
|
...filter,
|
||||||
|
});
|
||||||
return {
|
return {
|
||||||
list: data.data?.list || [],
|
list: data.data?.list || [],
|
||||||
total: data.data?.total || 0,
|
total: data.data?.total || 0,
|
||||||
};
|
};
|
||||||
}}
|
}}
|
||||||
|
params={[
|
||||||
|
{
|
||||||
|
key: 'subscribe_id',
|
||||||
|
placeholder: t('subscription'),
|
||||||
|
options: subscribeList?.map((item) => ({
|
||||||
|
label: item.name,
|
||||||
|
value: String(item.id),
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'search',
|
||||||
|
placeholder: 'Search',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'user_id',
|
||||||
|
placeholder: t('userId'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'user_subscribe_id',
|
||||||
|
placeholder: t('subscriptionId'),
|
||||||
|
},
|
||||||
|
]}
|
||||||
actions={{
|
actions={{
|
||||||
render: (row) => {
|
render: (row) => {
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -1,15 +1,121 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { Display } from '@/components/display';
|
import { Display } from '@/components/display';
|
||||||
import { getUserDetail } from '@/services/admin/user';
|
import { getUserDetail, getUserSubscribeById } from '@/services/admin/user';
|
||||||
import { useQuery } from '@tanstack/react-query';
|
import { useQuery } from '@tanstack/react-query';
|
||||||
import { Button } from '@workspace/ui/components/button';
|
import { Button } from '@workspace/ui/components/button';
|
||||||
import { HoverCard, HoverCardContent, HoverCardTrigger } from '@workspace/ui/components/hover-card';
|
import { HoverCard, HoverCardContent, HoverCardTrigger } from '@workspace/ui/components/hover-card';
|
||||||
import { formatDate } from '@workspace/ui/utils';
|
import { formatBytes, formatDate } from '@workspace/ui/utils';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
|
||||||
|
export function UserSubscribeDetail({ id, enabled }: { id: number; enabled: boolean }) {
|
||||||
|
const t = useTranslations('user');
|
||||||
|
|
||||||
|
const { data } = useQuery({
|
||||||
|
enabled: id !== 0 && enabled,
|
||||||
|
queryKey: ['getUserSubscribeById', id],
|
||||||
|
queryFn: async () => {
|
||||||
|
const { data } = await getUserSubscribeById({ id });
|
||||||
|
return data.data;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!id) return '--';
|
||||||
|
|
||||||
|
const usedTraffic = data ? data.upload + data.download : 0;
|
||||||
|
const totalTraffic = data?.traffic || 0;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='space-y-4'>
|
||||||
|
<div>
|
||||||
|
<h3 className='mb-2 text-sm font-medium'>{t('subscriptionInfo')}</h3>
|
||||||
|
<div className='bg-muted/30 rounded-lg p-3'>
|
||||||
|
<ul className='grid gap-3'>
|
||||||
|
<li className='flex items-center justify-between font-semibold'>
|
||||||
|
<span className='text-muted-foreground'>{t('subscriptionId')}</span>
|
||||||
|
<span>{data?.id || '--'}</span>
|
||||||
|
</li>
|
||||||
|
<li className='flex items-center justify-between'>
|
||||||
|
<span className='text-muted-foreground'>{t('subscriptionName')}</span>
|
||||||
|
<span>{data?.subscribe?.name || '--'}</span>
|
||||||
|
</li>
|
||||||
|
<li className='flex items-center justify-between'>
|
||||||
|
<span className='text-muted-foreground'>{t('token')}</span>
|
||||||
|
<div className='font-mono text-xs' title={data?.token || ''}>
|
||||||
|
{data?.token || '--'}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li className='flex items-center justify-between'>
|
||||||
|
<span className='text-muted-foreground'>{t('trafficUsage')}</span>
|
||||||
|
<span>
|
||||||
|
{data
|
||||||
|
? totalTraffic === 0
|
||||||
|
? `${formatBytes(usedTraffic)} / ${t('unlimited')}`
|
||||||
|
: `${formatBytes(usedTraffic)} / ${formatBytes(totalTraffic)}`
|
||||||
|
: '--'}
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li className='flex items-center justify-between'>
|
||||||
|
<span className='text-muted-foreground'>{t('startTime')}</span>
|
||||||
|
<span>{data?.start_time ? formatDate(data.start_time) : '--'}</span>
|
||||||
|
</li>
|
||||||
|
<li className='flex items-center justify-between'>
|
||||||
|
<span className='text-muted-foreground'>{t('expireTime')}</span>
|
||||||
|
<span>{data?.expire_time ? formatDate(data.expire_time) : '--'}</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h3 className='mb-2 text-sm font-medium'>
|
||||||
|
{t('userInfo')}
|
||||||
|
{data?.user_id && (
|
||||||
|
<Button
|
||||||
|
variant='link'
|
||||||
|
size='sm'
|
||||||
|
className='text-primary ml-2 h-auto p-0 text-xs'
|
||||||
|
asChild
|
||||||
|
>
|
||||||
|
<Link href={`/dashboard/user/${data.user_id}`}>{t('viewDetails')}</Link>
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</h3>
|
||||||
|
<ul className='grid gap-3'>
|
||||||
|
<li className='flex items-center justify-between font-semibold'>
|
||||||
|
<span className='text-muted-foreground'>{t('userId')}</span>
|
||||||
|
<span>{data?.user_id}</span>
|
||||||
|
</li>
|
||||||
|
<li className='flex items-center justify-between font-semibold'>
|
||||||
|
<span className='text-muted-foreground'>{t('balance')}</span>
|
||||||
|
<span>
|
||||||
|
<Display type='currency' value={data?.user.balance} />
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li className='flex items-center justify-between'>
|
||||||
|
<span className='text-muted-foreground'>{t('giftAmount')}</span>
|
||||||
|
<span>
|
||||||
|
<Display type='currency' value={data?.user?.gift_amount} />
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li className='flex items-center justify-between'>
|
||||||
|
<span className='text-muted-foreground'>{t('commission')}</span>
|
||||||
|
<span>
|
||||||
|
<Display type='currency' value={data?.user?.commission} />
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li className='flex items-center justify-between'>
|
||||||
|
<span className='text-muted-foreground'>{t('createdAt')}</span>
|
||||||
|
<span>{data?.user?.created_at && formatDate(data?.user?.created_at)}</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function UserDetail({ id }: { id: number }) {
|
export function UserDetail({ id }: { id: number }) {
|
||||||
const t = useTranslations('user');
|
const t = useTranslations('user');
|
||||||
const [shouldFetch, setShouldFetch] = useState(false);
|
const [shouldFetch, setShouldFetch] = useState(false);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
|
import { UserSubscribeDetail } from '@/app/dashboard/user/user-detail';
|
||||||
import { queryServerTotalData, queryTicketWaitReply } from '@/services/admin/console';
|
import { queryServerTotalData, queryTicketWaitReply } from '@/services/admin/console';
|
||||||
import { useQuery } from '@tanstack/react-query';
|
import { useQuery } from '@tanstack/react-query';
|
||||||
import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card';
|
import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card';
|
||||||
@@ -11,6 +12,7 @@ import {
|
|||||||
SelectTrigger,
|
SelectTrigger,
|
||||||
SelectValue,
|
SelectValue,
|
||||||
} from '@workspace/ui/components/select';
|
} from '@workspace/ui/components/select';
|
||||||
|
import { Separator } from '@workspace/ui/components/separator';
|
||||||
import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { formatBytes } from '@workspace/ui/utils';
|
import { formatBytes } from '@workspace/ui/utils';
|
||||||
@@ -59,15 +61,13 @@ export default function Statistics() {
|
|||||||
users: {
|
users: {
|
||||||
today:
|
today:
|
||||||
ServerTotal?.user_traffic_ranking_today?.map((item) => ({
|
ServerTotal?.user_traffic_ranking_today?.map((item) => ({
|
||||||
name: item.user_id,
|
name: item.sid,
|
||||||
traffic: item.download + item.upload,
|
traffic: item.download + item.upload,
|
||||||
email: item.email,
|
|
||||||
})) || [],
|
})) || [],
|
||||||
yesterday:
|
yesterday:
|
||||||
ServerTotal?.user_traffic_ranking_yesterday?.map((item) => ({
|
ServerTotal?.user_traffic_ranking_yesterday?.map((item) => ({
|
||||||
name: item.user_id,
|
name: item.sid,
|
||||||
traffic: item.download + item.upload,
|
traffic: item.download + item.upload,
|
||||||
email: item.email,
|
|
||||||
})) || [],
|
})) || [],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -175,10 +175,6 @@ export default function Statistics() {
|
|||||||
label: t('type'),
|
label: t('type'),
|
||||||
color: 'hsl(var(--muted))',
|
color: 'hsl(var(--muted))',
|
||||||
},
|
},
|
||||||
email: {
|
|
||||||
label: t('email'),
|
|
||||||
color: 'hsl(var(--muted))',
|
|
||||||
},
|
|
||||||
label: {
|
label: {
|
||||||
color: 'hsl(var(--foreground))',
|
color: 'hsl(var(--foreground))',
|
||||||
},
|
},
|
||||||
@@ -204,13 +200,22 @@ export default function Statistics() {
|
|||||||
tickFormatter={(value, index) => String(index + 1)}
|
tickFormatter={(value, index) => String(index + 1)}
|
||||||
/>
|
/>
|
||||||
<ChartTooltip
|
<ChartTooltip
|
||||||
|
trigger='hover'
|
||||||
content={
|
content={
|
||||||
<ChartTooltipContent
|
<ChartTooltipContent
|
||||||
label={true}
|
label={true}
|
||||||
labelFormatter={(label) =>
|
labelFormatter={(label, [payload]) =>
|
||||||
dataType === 'nodes'
|
dataType === 'nodes' ? (
|
||||||
? `${t('nodes')}: ${label}`
|
`${t('nodes')}: ${label}`
|
||||||
: `${t('users')}: ${label}`
|
) : (
|
||||||
|
<>
|
||||||
|
<div className='w-80'>
|
||||||
|
<UserSubscribeDetail id={payload?.payload.name} enabled={true} />
|
||||||
|
</div>
|
||||||
|
<Separator className='my-2' />
|
||||||
|
<div>{`${t('users')}: ${label}`}</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
}
|
}
|
||||||
formatter={(value) => {
|
formatter={(value) => {
|
||||||
return formatBytes(Number(value) || 0);
|
return formatBytes(Number(value) || 0);
|
||||||
|
|||||||
@@ -81,16 +81,26 @@ export const navs = [
|
|||||||
url: '/dashboard/server',
|
url: '/dashboard/server',
|
||||||
icon: 'flat-color-icons:data-protection',
|
icon: 'flat-color-icons:data-protection',
|
||||||
},
|
},
|
||||||
],
|
{
|
||||||
|
title: 'Application Management',
|
||||||
|
url: '/dashboard/application',
|
||||||
|
icon: 'flat-color-icons:touchscreen-smartphone',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Finance',
|
title: 'Rule Management',
|
||||||
items: [
|
url: '/dashboard/rules',
|
||||||
|
icon: 'flat-color-icons:ruler',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: 'Subscribe Management',
|
title: 'Subscribe Management',
|
||||||
url: '/dashboard/subscribe',
|
url: '/dashboard/subscribe',
|
||||||
icon: 'flat-color-icons:shop',
|
icon: 'flat-color-icons:shop',
|
||||||
},
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Finance',
|
||||||
|
items: [
|
||||||
{
|
{
|
||||||
title: 'Order Management',
|
title: 'Order Management',
|
||||||
url: '/dashboard/order',
|
url: '/dashboard/order',
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Konfigurace ADS",
|
"ADS Config": "Konfigurace ADS",
|
||||||
"Announcement Management": "Správa oznámení",
|
"Announcement Management": "Správa oznámení",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "Správa aplikací",
|
||||||
"Auth Control": "Řízení ověřování",
|
"Auth Control": "Řízení ověřování",
|
||||||
"Coupon Management": "Správa kupónů",
|
"Coupon Management": "Správa kupónů",
|
||||||
"Dashboard": "Přístrojová deska",
|
"Dashboard": "Přístrojová deska",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Správa objednávek",
|
"Order Management": "Správa objednávek",
|
||||||
"Payment Config": "Konfigurace platby",
|
"Payment Config": "Konfigurace platby",
|
||||||
"Phone Number": "Telefonní číslo",
|
"Phone Number": "Telefonní číslo",
|
||||||
|
"Rule Management": "Správa pravidel",
|
||||||
"Server": "Server",
|
"Server": "Server",
|
||||||
"Server Management": "Správa serveru",
|
"Server Management": "Správa serveru",
|
||||||
"Settings": "Nastavení",
|
"Settings": "Nastavení",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analyzuji...",
|
||||||
|
"appIcon": "Ikona pravidla",
|
||||||
|
"cancel": "Zrušit",
|
||||||
|
"confirm": "Potvrdit",
|
||||||
|
"confirmDelete": "Potvrdit smazání",
|
||||||
|
"create": "Přidat pravidlo",
|
||||||
|
"createRule": "Přidat pravidlo",
|
||||||
|
"createSuccess": "Pravidlo bylo úspěšně vytvořeno",
|
||||||
|
"createdAt": "Vytvořeno dne",
|
||||||
|
"delete": "Smazat",
|
||||||
|
"deleteSuccess": "Pravidlo bylo úspěšně smazáno",
|
||||||
|
"deleteWarning": "Opravdu chcete smazat toto pravidlo? Tato akce není vratná.",
|
||||||
|
"description": "Popis pravidla",
|
||||||
|
"downloadTemplate": "Stáhnout šablonu",
|
||||||
|
"edit": "Upravit",
|
||||||
|
"editRule": "Upravit pravidlo",
|
||||||
|
"enable": "Povolit",
|
||||||
|
"enterIconUrl": "Zadejte nebo nahrajte ikonu",
|
||||||
|
"enterRuleName": "Zadejte název pravidla",
|
||||||
|
"enterRules": "Zadejte obsah pravidla, jedno na řádek",
|
||||||
|
"import": "Importovat",
|
||||||
|
"importFailed": "Import se nezdařil",
|
||||||
|
"importSuccess": "Import byl úspěšný",
|
||||||
|
"importYaml": "Importovat YAML",
|
||||||
|
"importYamlDescription": "Importujte pravidla ze souboru YAML, systém automaticky vytvoří skupiny pravidel na základě názvů skupin politiky",
|
||||||
|
"importYamlRules": "Importovat YAML pravidla",
|
||||||
|
"importing": "Importuji...",
|
||||||
|
"invalidYamlFormat": "Neplatný formát YAML, chybí pole pravidel",
|
||||||
|
"name": "Název pravidla",
|
||||||
|
"noValidRules": "Nebyly nalezeny žádné platné pravidla",
|
||||||
|
"pleaseUploadFile": "Prosím, nahrajte soubor YAML",
|
||||||
|
"preview": "Náhled",
|
||||||
|
"rules": "Obsah pravidla",
|
||||||
|
"rulesFormat": "Formát pravidla: typ pravidla, obsah shody, [politika], kde politika je volitelná.\nPokud politika není specifikována, bude automaticky použito aktuální jméno skupiny pravidel. Příklady:",
|
||||||
|
"rulesLabel": "Obsah pravidla",
|
||||||
|
"searchRule": "Hledat název pravidla",
|
||||||
|
"selectFile": "Vybrat soubor",
|
||||||
|
"selectTags": "Vybrat značky uzlu",
|
||||||
|
"tags": "Značky uzlu",
|
||||||
|
"tagsLabel": "Značky uzlu",
|
||||||
|
"updateSuccess": "Pravidlo bylo úspěšně aktualizováno"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Povolení účtu",
|
"accountEnable": "Povolení účtu",
|
||||||
"actions": "akce",
|
"actions": "akce",
|
||||||
|
"active": "Aktivní",
|
||||||
"add": "Přidat",
|
"add": "Přidat",
|
||||||
"administrator": "Administrátor",
|
"administrator": "Administrátor",
|
||||||
"areaCode": "Směrový kód",
|
"areaCode": "Směrový kód",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "e-mail",
|
"email": "e-mail",
|
||||||
"enable": "Povolit",
|
"enable": "Povolit",
|
||||||
"expireTime": "Čas vypršení",
|
"expireTime": "Čas vypršení",
|
||||||
|
"expired": "Vypršelo",
|
||||||
"expiredAt": "Platnost vypršela",
|
"expiredAt": "Platnost vypršela",
|
||||||
"failed": "Neúspěch",
|
"failed": "Neúspěch",
|
||||||
"giftAmount": "Částka dárku",
|
"giftAmount": "Částka dárku",
|
||||||
"giftAmountPlaceholder": "Zadejte částku dárku",
|
"giftAmountPlaceholder": "Zadejte částku dárku",
|
||||||
|
"inactive": "Neaktivní",
|
||||||
"invalidEmailFormat": "Neplatný formát e-mailu",
|
"invalidEmailFormat": "Neplatný formát e-mailu",
|
||||||
"inviteCode": "Pozvánkový kód",
|
"inviteCode": "Pozvánkový kód",
|
||||||
"inviteCodePlaceholder": "Zadejte kód pozvánky (ponechte prázdné pro vygenerování)",
|
"inviteCodePlaceholder": "Zadejte kód pozvánky (ponechte prázdné pro vygenerování)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Zadejte nové heslo (volitelné)",
|
"passwordPlaceholder": "Zadejte nové heslo (volitelné)",
|
||||||
"permanent": "Trvalý",
|
"permanent": "Trvalý",
|
||||||
"pleaseEnterEmail": "Prosím, zadejte e-mail",
|
"pleaseEnterEmail": "Prosím, zadejte e-mail",
|
||||||
|
"price": "Cena",
|
||||||
"referer": "Doporučitel",
|
"referer": "Doporučitel",
|
||||||
"refererId": "ID doporučitele",
|
"refererId": "ID doporučitele",
|
||||||
"refererIdPlaceholder": "Zadejte ID doporučitele",
|
"refererIdPlaceholder": "Zadejte ID doporučitele",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Vyhledat IP adresu",
|
"searchIp": "Vyhledat IP adresu",
|
||||||
"selectAuthType": "Vyberte typ ověření",
|
"selectAuthType": "Vyberte typ ověření",
|
||||||
"speedLimit": "Rychlostní limit",
|
"speedLimit": "Rychlostní limit",
|
||||||
|
"startTime": "Čas zahájení",
|
||||||
|
"status": "Stav",
|
||||||
"subscription": "Předplatné",
|
"subscription": "Předplatné",
|
||||||
"subscriptionDetails": "Podrobnosti o předplatném",
|
"subscriptionDetails": "Podrobnosti o předplatném",
|
||||||
|
"subscriptionId": "ID předplatného",
|
||||||
|
"subscriptionInfo": "Informace o předplatném",
|
||||||
"subscriptionList": "Seznam předplatných",
|
"subscriptionList": "Seznam předplatných",
|
||||||
"subscriptionLogs": "Záznamy o předplatném",
|
"subscriptionLogs": "Záznamy o předplatném",
|
||||||
"subscriptionName": "Název předplatného",
|
"subscriptionName": "Název předplatného",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Obchodní oznámení",
|
"tradeNotifications": "Obchodní oznámení",
|
||||||
"trafficLimit": "Limit provozu",
|
"trafficLimit": "Limit provozu",
|
||||||
"trafficLogs": "Protokoly provozu",
|
"trafficLogs": "Protokoly provozu",
|
||||||
|
"trafficUsage": "Využití dat",
|
||||||
|
"unknown": "Neznámé",
|
||||||
"unlimited": "Neomezený",
|
"unlimited": "Neomezený",
|
||||||
"unverified": "Neověřeno",
|
"unverified": "Neověřeno",
|
||||||
"update": "Aktualizovat",
|
"update": "Aktualizovat",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Uživatelský agent",
|
"userAgent": "Uživatelský agent",
|
||||||
"userEmail": "Uživatelský e-mail",
|
"userEmail": "Uživatelský e-mail",
|
||||||
"userEmailPlaceholder": "Zadejte e-mail uživatele",
|
"userEmailPlaceholder": "Zadejte e-mail uživatele",
|
||||||
|
"userId": "ID uživatele",
|
||||||
|
"userInfo": "Informace o uživateli",
|
||||||
"userList": "Seznam uživatelů",
|
"userList": "Seznam uživatelů",
|
||||||
"userLogs": "Historie přihlášení",
|
"userLogs": "Historie přihlášení",
|
||||||
"userName": "Identifikátor uživatele",
|
"userName": "Identifikátor uživatele",
|
||||||
"userOrders": "Objednávky",
|
"userOrders": "Objednávky",
|
||||||
"userProfile": "Profil",
|
"userProfile": "Profil",
|
||||||
"userSubscriptions": "Předplatné",
|
"userSubscriptions": "Předplatné",
|
||||||
"verified": "Ověřeno"
|
"username": "Uživatelské jméno",
|
||||||
|
"verified": "Ověřeno",
|
||||||
|
"viewDetails": "Zobrazit podrobnosti"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS-Konfiguration",
|
"ADS Config": "ADS-Konfiguration",
|
||||||
"Announcement Management": "Ankündigungsverwaltung",
|
"Announcement Management": "Ankündigungsverwaltung",
|
||||||
"Apple": "Apple-ID",
|
"Apple": "Apple-ID",
|
||||||
|
"Application Management": "Anwendungsverwaltung",
|
||||||
"Auth Control": "Authentifizierungskontrolle",
|
"Auth Control": "Authentifizierungskontrolle",
|
||||||
"Coupon Management": "Gutscheinverwaltung",
|
"Coupon Management": "Gutscheinverwaltung",
|
||||||
"Dashboard": "Armaturenbrett",
|
"Dashboard": "Armaturenbrett",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Bestellverwaltung",
|
"Order Management": "Bestellverwaltung",
|
||||||
"Payment Config": "Zahlungskonfiguration",
|
"Payment Config": "Zahlungskonfiguration",
|
||||||
"Phone Number": "Telefonnummer",
|
"Phone Number": "Telefonnummer",
|
||||||
|
"Rule Management": "Regelverwaltung",
|
||||||
"Server": "Dienst",
|
"Server": "Dienst",
|
||||||
"Server Management": "Serververwaltung",
|
"Server Management": "Serververwaltung",
|
||||||
"Settings": "Einstellungen",
|
"Settings": "Einstellungen",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analysiere...",
|
||||||
|
"appIcon": "Regel-Icon",
|
||||||
|
"cancel": "Abbrechen",
|
||||||
|
"confirm": "Bestätigen",
|
||||||
|
"confirmDelete": "Löschen bestätigen",
|
||||||
|
"create": "Regel hinzufügen",
|
||||||
|
"createRule": "Regel hinzufügen",
|
||||||
|
"createSuccess": "Regel erfolgreich erstellt",
|
||||||
|
"createdAt": "Erstellt am",
|
||||||
|
"delete": "Löschen",
|
||||||
|
"deleteSuccess": "Regel erfolgreich gelöscht",
|
||||||
|
"deleteWarning": "Sind Sie sicher, dass Sie diese Regel löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||||
|
"description": "Regelbeschreibung",
|
||||||
|
"downloadTemplate": "Vorlage herunterladen",
|
||||||
|
"edit": "Bearbeiten",
|
||||||
|
"editRule": "Regel bearbeiten",
|
||||||
|
"enable": "Aktivieren",
|
||||||
|
"enterIconUrl": "Geben Sie eine URL für das Icon ein oder laden Sie es hoch",
|
||||||
|
"enterRuleName": "Geben Sie den Regelname ein",
|
||||||
|
"enterRules": "Geben Sie den Regelinhalt ein, jeweils eine Regel pro Zeile",
|
||||||
|
"import": "Importieren",
|
||||||
|
"importFailed": "Import fehlgeschlagen",
|
||||||
|
"importSuccess": "Import erfolgreich",
|
||||||
|
"importYaml": "YAML importieren",
|
||||||
|
"importYamlDescription": "Regeln aus einer YAML-Datei importieren, das System erstellt automatisch Regelgruppen basierend auf den Namen der Richtliniengruppen",
|
||||||
|
"importYamlRules": "YAML-Regeln importieren",
|
||||||
|
"importing": "Importiere...",
|
||||||
|
"invalidYamlFormat": "Ungültiges YAML-Format, das Feld 'Regeln' fehlt",
|
||||||
|
"name": "Regelname",
|
||||||
|
"noValidRules": "Keine gültigen Regeln gefunden",
|
||||||
|
"pleaseUploadFile": "Bitte laden Sie eine YAML-Datei hoch",
|
||||||
|
"preview": "Vorschau",
|
||||||
|
"rules": "Regelinhalt",
|
||||||
|
"rulesFormat": "Regelformat: Regeltyp, Übereinstimmungsinhalt, [Richtlinie], wobei die Richtlinie optional ist.\nWenn keine Richtlinie angegeben ist, wird automatisch der aktuelle Regelgruppenname verwendet. Beispiele:",
|
||||||
|
"rulesLabel": "Regelinhalt",
|
||||||
|
"searchRule": "Regelname suchen",
|
||||||
|
"selectFile": "Datei auswählen",
|
||||||
|
"selectTags": "Knoten-Tags auswählen",
|
||||||
|
"tags": "Knoten-Tags",
|
||||||
|
"tagsLabel": "Knoten-Tags",
|
||||||
|
"updateSuccess": "Regel erfolgreich aktualisiert"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Konto aktivieren",
|
"accountEnable": "Konto aktivieren",
|
||||||
"actions": "Aktionen",
|
"actions": "Aktionen",
|
||||||
|
"active": "Aktiv",
|
||||||
"add": "Hinzufügen",
|
"add": "Hinzufügen",
|
||||||
"administrator": "Administrator",
|
"administrator": "Administrator",
|
||||||
"areaCode": "Vorwahl",
|
"areaCode": "Vorwahl",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "E-Mail",
|
"email": "E-Mail",
|
||||||
"enable": "Aktivieren",
|
"enable": "Aktivieren",
|
||||||
"expireTime": "Ablaufzeit",
|
"expireTime": "Ablaufzeit",
|
||||||
|
"expired": "Abgelaufen",
|
||||||
"expiredAt": "Abgelaufen am",
|
"expiredAt": "Abgelaufen am",
|
||||||
"failed": "Fehlgeschlagen",
|
"failed": "Fehlgeschlagen",
|
||||||
"giftAmount": "Geschenkbetrag",
|
"giftAmount": "Geschenkbetrag",
|
||||||
"giftAmountPlaceholder": "Geben Sie den Geschenkbetrag ein",
|
"giftAmountPlaceholder": "Geben Sie den Geschenkbetrag ein",
|
||||||
|
"inactive": "Inaktiv",
|
||||||
"invalidEmailFormat": "Ungültiges E-Mail-Format",
|
"invalidEmailFormat": "Ungültiges E-Mail-Format",
|
||||||
"inviteCode": "Einladungscode",
|
"inviteCode": "Einladungscode",
|
||||||
"inviteCodePlaceholder": "Einladungscode eingeben (leer lassen, um zu generieren)",
|
"inviteCodePlaceholder": "Einladungscode eingeben (leer lassen, um zu generieren)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Neues Passwort eingeben (optional)",
|
"passwordPlaceholder": "Neues Passwort eingeben (optional)",
|
||||||
"permanent": "Dauerhaft",
|
"permanent": "Dauerhaft",
|
||||||
"pleaseEnterEmail": "Bitte E-Mail eingeben",
|
"pleaseEnterEmail": "Bitte E-Mail eingeben",
|
||||||
|
"price": "Preis",
|
||||||
"referer": "Empfehler",
|
"referer": "Empfehler",
|
||||||
"refererId": "Referenz-ID",
|
"refererId": "Referenz-ID",
|
||||||
"refererIdPlaceholder": "Geben Sie die Referenz-ID ein",
|
"refererIdPlaceholder": "Geben Sie die Referenz-ID ein",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "IP-Adresse suchen",
|
"searchIp": "IP-Adresse suchen",
|
||||||
"selectAuthType": "Authentifizierungstyp auswählen",
|
"selectAuthType": "Authentifizierungstyp auswählen",
|
||||||
"speedLimit": "Geschwindigkeitsbegrenzung",
|
"speedLimit": "Geschwindigkeitsbegrenzung",
|
||||||
|
"startTime": "Startzeit",
|
||||||
|
"status": "Status",
|
||||||
"subscription": "Abonnement",
|
"subscription": "Abonnement",
|
||||||
"subscriptionDetails": "Abonnementdetails",
|
"subscriptionDetails": "Abonnementdetails",
|
||||||
|
"subscriptionId": "Abonnement-ID",
|
||||||
|
"subscriptionInfo": "Abonnement-Informationen",
|
||||||
"subscriptionList": "Abonnementsliste",
|
"subscriptionList": "Abonnementsliste",
|
||||||
"subscriptionLogs": "Abonnementprotokolle",
|
"subscriptionLogs": "Abonnementprotokolle",
|
||||||
"subscriptionName": "Abonnementname",
|
"subscriptionName": "Abonnementname",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Handelsbenachrichtigungen",
|
"tradeNotifications": "Handelsbenachrichtigungen",
|
||||||
"trafficLimit": "Verkehrslimit",
|
"trafficLimit": "Verkehrslimit",
|
||||||
"trafficLogs": "Verkehrsprotokolle",
|
"trafficLogs": "Verkehrsprotokolle",
|
||||||
|
"trafficUsage": "Datenverbrauch",
|
||||||
|
"unknown": "Unbekannt",
|
||||||
"unlimited": "Unbegrenzt",
|
"unlimited": "Unbegrenzt",
|
||||||
"unverified": "Unbestätigt",
|
"unverified": "Unbestätigt",
|
||||||
"update": "Aktualisieren",
|
"update": "Aktualisieren",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Benutzeragent",
|
"userAgent": "Benutzeragent",
|
||||||
"userEmail": "Benutzer-E-Mail",
|
"userEmail": "Benutzer-E-Mail",
|
||||||
"userEmailPlaceholder": "Benutzer-E-Mail eingeben",
|
"userEmailPlaceholder": "Benutzer-E-Mail eingeben",
|
||||||
|
"userId": "Benutzer-ID",
|
||||||
|
"userInfo": "Benutzerinformationen",
|
||||||
"userList": "Benutzerliste",
|
"userList": "Benutzerliste",
|
||||||
"userLogs": "Anmeldeverlauf",
|
"userLogs": "Anmeldeverlauf",
|
||||||
"userName": "Benutzerkennung",
|
"userName": "Benutzerkennung",
|
||||||
"userOrders": "Bestellungen",
|
"userOrders": "Bestellungen",
|
||||||
"userProfile": "Profil",
|
"userProfile": "Profil",
|
||||||
"userSubscriptions": "Abonnements",
|
"userSubscriptions": "Abonnements",
|
||||||
"verified": "Verifiziert"
|
"username": "Benutzername",
|
||||||
|
"verified": "Verifiziert",
|
||||||
|
"viewDetails": "Details anzeigen"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS Config",
|
"ADS Config": "ADS Config",
|
||||||
"Announcement Management": "Announcement Management",
|
"Announcement Management": "Announcement Management",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "Application Management",
|
||||||
"Auth Control": "Auth Control",
|
"Auth Control": "Auth Control",
|
||||||
"Coupon Management": "Coupon Management",
|
"Coupon Management": "Coupon Management",
|
||||||
"Dashboard": "Dashboard",
|
"Dashboard": "Dashboard",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Order Management",
|
"Order Management": "Order Management",
|
||||||
"Payment Config": "Payment Config",
|
"Payment Config": "Payment Config",
|
||||||
"Phone Number": "Phone Number",
|
"Phone Number": "Phone Number",
|
||||||
|
"Rule Management": "Rule Management",
|
||||||
"Server": "Server",
|
"Server": "Server",
|
||||||
"Server Management": "Server Management",
|
"Server Management": "Server Management",
|
||||||
"Settings": "Settings",
|
"Settings": "Settings",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analyzing...",
|
||||||
|
"appIcon": "Rule Icon",
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"confirm": "Confirm",
|
||||||
|
"confirmDelete": "Confirm Deletion",
|
||||||
|
"create": "Add Rule",
|
||||||
|
"createRule": "Add Rule",
|
||||||
|
"createSuccess": "Rule created successfully",
|
||||||
|
"createdAt": "Created At",
|
||||||
|
"delete": "Delete",
|
||||||
|
"deleteSuccess": "Rule deleted successfully",
|
||||||
|
"deleteWarning": "Are you sure you want to delete this rule? This action cannot be undone.",
|
||||||
|
"description": "Rule Description",
|
||||||
|
"downloadTemplate": "Download Template",
|
||||||
|
"edit": "Edit",
|
||||||
|
"editRule": "Edit Rule",
|
||||||
|
"enable": "Enable",
|
||||||
|
"enterIconUrl": "Enter or upload an icon",
|
||||||
|
"enterRuleName": "Enter rule name",
|
||||||
|
"enterRules": "Enter rule content, one per line",
|
||||||
|
"import": "Import",
|
||||||
|
"importFailed": "Import failed",
|
||||||
|
"importSuccess": "Import successful",
|
||||||
|
"importYaml": "Import YAML",
|
||||||
|
"importYamlDescription": "Import rules from YAML file, the system will automatically create rule groups based on policy group names",
|
||||||
|
"importYamlRules": "Import YAML Rules",
|
||||||
|
"importing": "Importing...",
|
||||||
|
"invalidYamlFormat": "Invalid YAML format, missing rules field",
|
||||||
|
"name": "Rule Name",
|
||||||
|
"noValidRules": "No valid rules found",
|
||||||
|
"pleaseUploadFile": "Please upload a YAML file",
|
||||||
|
"preview": "Preview",
|
||||||
|
"rules": "Rule Content",
|
||||||
|
"rulesFormat": "Rule format: rule type,match content,[policy], where policy is optional.\nIf policy is not specified, the current rule group name will be used automatically. Examples:",
|
||||||
|
"rulesLabel": "Rule Content",
|
||||||
|
"searchRule": "Search rule name",
|
||||||
|
"selectFile": "Select File",
|
||||||
|
"selectTags": "Select node tags",
|
||||||
|
"tags": "Node Tags",
|
||||||
|
"tagsLabel": "Node Tags",
|
||||||
|
"updateSuccess": "Rule updated successfully"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Account Enable",
|
"accountEnable": "Account Enable",
|
||||||
"actions": "Actions",
|
"actions": "Actions",
|
||||||
|
"active": "Active",
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
"administrator": "Administrator",
|
"administrator": "Administrator",
|
||||||
"areaCode": "Area Code",
|
"areaCode": "Area Code",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "Email",
|
"email": "Email",
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
"expireTime": "Expire Time",
|
"expireTime": "Expire Time",
|
||||||
|
"expired": "Expired",
|
||||||
"expiredAt": "Expired At",
|
"expiredAt": "Expired At",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
"giftAmount": "Gift Amount",
|
"giftAmount": "Gift Amount",
|
||||||
"giftAmountPlaceholder": "Enter gift amount",
|
"giftAmountPlaceholder": "Enter gift amount",
|
||||||
|
"inactive": "Inactive",
|
||||||
"invalidEmailFormat": "Invalid email format",
|
"invalidEmailFormat": "Invalid email format",
|
||||||
"inviteCode": "Invite Code",
|
"inviteCode": "Invite Code",
|
||||||
"inviteCodePlaceholder": "Enter invite code (leave blank to generate)",
|
"inviteCodePlaceholder": "Enter invite code (leave blank to generate)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Enter new password (optional)",
|
"passwordPlaceholder": "Enter new password (optional)",
|
||||||
"permanent": "Permanent",
|
"permanent": "Permanent",
|
||||||
"pleaseEnterEmail": "Please enter email",
|
"pleaseEnterEmail": "Please enter email",
|
||||||
|
"price": "Price",
|
||||||
"referer": "Referer",
|
"referer": "Referer",
|
||||||
"refererId": "Referer ID",
|
"refererId": "Referer ID",
|
||||||
"refererIdPlaceholder": "Enter referer ID",
|
"refererIdPlaceholder": "Enter referer ID",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Search IP address",
|
"searchIp": "Search IP address",
|
||||||
"selectAuthType": "Select auth type",
|
"selectAuthType": "Select auth type",
|
||||||
"speedLimit": "Speed Limit",
|
"speedLimit": "Speed Limit",
|
||||||
|
"startTime": "Start Time",
|
||||||
|
"status": "Status",
|
||||||
"subscription": "Subscription",
|
"subscription": "Subscription",
|
||||||
"subscriptionDetails": "Subscription Details",
|
"subscriptionDetails": "Subscription Details",
|
||||||
|
"subscriptionId": "Subscription ID",
|
||||||
|
"subscriptionInfo": "Subscription Info",
|
||||||
"subscriptionList": "Subscription List",
|
"subscriptionList": "Subscription List",
|
||||||
"subscriptionLogs": "Subscription Logs",
|
"subscriptionLogs": "Subscription Logs",
|
||||||
"subscriptionName": "Subscription Name",
|
"subscriptionName": "Subscription Name",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Trade Notifications",
|
"tradeNotifications": "Trade Notifications",
|
||||||
"trafficLimit": "Traffic Limit",
|
"trafficLimit": "Traffic Limit",
|
||||||
"trafficLogs": "Traffic Logs",
|
"trafficLogs": "Traffic Logs",
|
||||||
|
"trafficUsage": "Traffic Usage",
|
||||||
|
"unknown": "Unknown",
|
||||||
"unlimited": "Unlimited",
|
"unlimited": "Unlimited",
|
||||||
"unverified": "Unverified",
|
"unverified": "Unverified",
|
||||||
"update": "Update",
|
"update": "Update",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "User Agent",
|
"userAgent": "User Agent",
|
||||||
"userEmail": "User Email",
|
"userEmail": "User Email",
|
||||||
"userEmailPlaceholder": "Enter user email",
|
"userEmailPlaceholder": "Enter user email",
|
||||||
|
"userId": "User ID",
|
||||||
|
"userInfo": "User Info",
|
||||||
"userList": "User List",
|
"userList": "User List",
|
||||||
"userLogs": "Login History",
|
"userLogs": "Login History",
|
||||||
"userName": "User Identifier",
|
"userName": "User Identifier",
|
||||||
"userOrders": "Orders",
|
"userOrders": "Orders",
|
||||||
"userProfile": "Profile",
|
"userProfile": "Profile",
|
||||||
"userSubscriptions": "Subscriptions",
|
"userSubscriptions": "Subscriptions",
|
||||||
"verified": "Verified"
|
"username": "Username",
|
||||||
|
"verified": "Verified",
|
||||||
|
"viewDetails": "View Details"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Configuración de ADS",
|
"ADS Config": "Configuración de ADS",
|
||||||
"Announcement Management": "Gestión de Anuncios",
|
"Announcement Management": "Gestión de Anuncios",
|
||||||
"Apple": "ID de Apple",
|
"Apple": "ID de Apple",
|
||||||
|
"Application Management": "Gestión de Aplicaciones",
|
||||||
"Auth Control": "Control de Autenticación",
|
"Auth Control": "Control de Autenticación",
|
||||||
"Coupon Management": "Gestión de Cupones",
|
"Coupon Management": "Gestión de Cupones",
|
||||||
"Dashboard": "Tablero",
|
"Dashboard": "Tablero",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Gestión de Pedidos",
|
"Order Management": "Gestión de Pedidos",
|
||||||
"Payment Config": "Configuración de Pago",
|
"Payment Config": "Configuración de Pago",
|
||||||
"Phone Number": "Número de Teléfono",
|
"Phone Number": "Número de Teléfono",
|
||||||
|
"Rule Management": "Gestión de Reglas",
|
||||||
"Server": "Servidor",
|
"Server": "Servidor",
|
||||||
"Server Management": "Gestión de Servidores",
|
"Server Management": "Gestión de Servidores",
|
||||||
"Settings": "Configuración",
|
"Settings": "Configuración",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analizando...",
|
||||||
|
"appIcon": "Icono de Regla",
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"confirmDelete": "Confirmar Eliminación",
|
||||||
|
"create": "Agregar Regla",
|
||||||
|
"createRule": "Agregar Regla",
|
||||||
|
"createSuccess": "Regla creada con éxito",
|
||||||
|
"createdAt": "Creado En",
|
||||||
|
"delete": "Eliminar",
|
||||||
|
"deleteSuccess": "Regla eliminada con éxito",
|
||||||
|
"deleteWarning": "¿Está seguro de que desea eliminar esta regla? Esta acción no se puede deshacer.",
|
||||||
|
"description": "Descripción de la Regla",
|
||||||
|
"downloadTemplate": "Descargar Plantilla",
|
||||||
|
"edit": "Editar",
|
||||||
|
"editRule": "Editar Regla",
|
||||||
|
"enable": "Habilitar",
|
||||||
|
"enterIconUrl": "Ingrese o suba un icono",
|
||||||
|
"enterRuleName": "Ingrese el nombre de la regla",
|
||||||
|
"enterRules": "Ingrese el contenido de la regla, uno por línea",
|
||||||
|
"import": "Importar",
|
||||||
|
"importFailed": "Importación fallida",
|
||||||
|
"importSuccess": "Importación exitosa",
|
||||||
|
"importYaml": "Importar YAML",
|
||||||
|
"importYamlDescription": "Importar reglas desde un archivo YAML, el sistema creará automáticamente grupos de reglas basados en los nombres de los grupos de políticas",
|
||||||
|
"importYamlRules": "Importar Reglas YAML",
|
||||||
|
"importing": "Importando...",
|
||||||
|
"invalidYamlFormat": "Formato YAML inválido, falta el campo de reglas",
|
||||||
|
"name": "Nombre de la Regla",
|
||||||
|
"noValidRules": "No se encontraron reglas válidas",
|
||||||
|
"pleaseUploadFile": "Por favor, suba un archivo YAML",
|
||||||
|
"preview": "Vista Previa",
|
||||||
|
"rules": "Contenido de la Regla",
|
||||||
|
"rulesFormat": "Formato de regla: tipo de regla, contenido de coincidencia, [política], donde la política es opcional.\nSi no se especifica la política, se utilizará automáticamente el nombre del grupo de reglas actual. Ejemplos:",
|
||||||
|
"rulesLabel": "Contenido de la Regla",
|
||||||
|
"searchRule": "Buscar nombre de regla",
|
||||||
|
"selectFile": "Seleccionar Archivo",
|
||||||
|
"selectTags": "Seleccionar etiquetas de nodo",
|
||||||
|
"tags": "Etiquetas de Nodo",
|
||||||
|
"tagsLabel": "Etiquetas de Nodo",
|
||||||
|
"updateSuccess": "Regla actualizada con éxito"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Habilitar cuenta",
|
"accountEnable": "Habilitar cuenta",
|
||||||
"actions": "acciones",
|
"actions": "acciones",
|
||||||
|
"active": "Activo",
|
||||||
"add": "Agregar",
|
"add": "Agregar",
|
||||||
"administrator": "Administrador",
|
"administrator": "Administrador",
|
||||||
"areaCode": "Código de Área",
|
"areaCode": "Código de Área",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "correo electrónico",
|
"email": "correo electrónico",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"expireTime": "Tiempo de Expiración",
|
"expireTime": "Tiempo de Expiración",
|
||||||
|
"expired": "Caducado",
|
||||||
"expiredAt": "Fecha de vencimiento",
|
"expiredAt": "Fecha de vencimiento",
|
||||||
"failed": "Fallido",
|
"failed": "Fallido",
|
||||||
"giftAmount": "Monto del Regalo",
|
"giftAmount": "Monto del Regalo",
|
||||||
"giftAmountPlaceholder": "Ingrese el monto del regalo",
|
"giftAmountPlaceholder": "Ingrese el monto del regalo",
|
||||||
|
"inactive": "Inactivo",
|
||||||
"invalidEmailFormat": "Formato de correo electrónico no válido",
|
"invalidEmailFormat": "Formato de correo electrónico no válido",
|
||||||
"inviteCode": "Código de invitación",
|
"inviteCode": "Código de invitación",
|
||||||
"inviteCodePlaceholder": "Introduce el código de invitación (déjalo en blanco para generar uno)",
|
"inviteCodePlaceholder": "Introduce el código de invitación (déjalo en blanco para generar uno)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Ingrese nueva contraseña (opcional)",
|
"passwordPlaceholder": "Ingrese nueva contraseña (opcional)",
|
||||||
"permanent": "Permanente",
|
"permanent": "Permanente",
|
||||||
"pleaseEnterEmail": "Por favor, introduce el correo electrónico",
|
"pleaseEnterEmail": "Por favor, introduce el correo electrónico",
|
||||||
|
"price": "Precio",
|
||||||
"referer": "Recomendador",
|
"referer": "Recomendador",
|
||||||
"refererId": "ID del Referente",
|
"refererId": "ID del Referente",
|
||||||
"refererIdPlaceholder": "Ingrese el ID del referente",
|
"refererIdPlaceholder": "Ingrese el ID del referente",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Buscar dirección IP",
|
"searchIp": "Buscar dirección IP",
|
||||||
"selectAuthType": "Seleccionar tipo de autenticación",
|
"selectAuthType": "Seleccionar tipo de autenticación",
|
||||||
"speedLimit": "Límite de Velocidad",
|
"speedLimit": "Límite de Velocidad",
|
||||||
|
"startTime": "Hora de Inicio",
|
||||||
|
"status": "Estado",
|
||||||
"subscription": "Suscripción",
|
"subscription": "Suscripción",
|
||||||
"subscriptionDetails": "Detalles de la suscripción",
|
"subscriptionDetails": "Detalles de la suscripción",
|
||||||
|
"subscriptionId": "ID de Suscripción",
|
||||||
|
"subscriptionInfo": "Información de Suscripción",
|
||||||
"subscriptionList": "Lista de Suscripción",
|
"subscriptionList": "Lista de Suscripción",
|
||||||
"subscriptionLogs": "Registros de Suscripción",
|
"subscriptionLogs": "Registros de Suscripción",
|
||||||
"subscriptionName": "Nombre de la Suscripción",
|
"subscriptionName": "Nombre de la Suscripción",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Notificaciones de Comercio",
|
"tradeNotifications": "Notificaciones de Comercio",
|
||||||
"trafficLimit": "Límite de Tráfico",
|
"trafficLimit": "Límite de Tráfico",
|
||||||
"trafficLogs": "Registros de Tráfico",
|
"trafficLogs": "Registros de Tráfico",
|
||||||
|
"trafficUsage": "Uso de Tráfico",
|
||||||
|
"unknown": "Desconocido",
|
||||||
"unlimited": "Ilimitado",
|
"unlimited": "Ilimitado",
|
||||||
"unverified": "No verificado",
|
"unverified": "No verificado",
|
||||||
"update": "Actualizar",
|
"update": "Actualizar",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Agente de Usuario",
|
"userAgent": "Agente de Usuario",
|
||||||
"userEmail": "Correo Electrónico del Usuario",
|
"userEmail": "Correo Electrónico del Usuario",
|
||||||
"userEmailPlaceholder": "Introduce el correo electrónico del usuario",
|
"userEmailPlaceholder": "Introduce el correo electrónico del usuario",
|
||||||
|
"userId": "ID de Usuario",
|
||||||
|
"userInfo": "Información de Usuario",
|
||||||
"userList": "Lista de usuarios",
|
"userList": "Lista de usuarios",
|
||||||
"userLogs": "Historial de inicio de sesión",
|
"userLogs": "Historial de inicio de sesión",
|
||||||
"userName": "Identificador de Usuario",
|
"userName": "Identificador de Usuario",
|
||||||
"userOrders": "Pedidos",
|
"userOrders": "Pedidos",
|
||||||
"userProfile": "Perfil",
|
"userProfile": "Perfil",
|
||||||
"userSubscriptions": "Suscripciones",
|
"userSubscriptions": "Suscripciones",
|
||||||
"verified": "Verificado"
|
"username": "Nombre de Usuario",
|
||||||
|
"verified": "Verificado",
|
||||||
|
"viewDetails": "Ver Detalles"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Configuración de ADS",
|
"ADS Config": "Configuración de ADS",
|
||||||
"Announcement Management": "Gestión de Anuncios",
|
"Announcement Management": "Gestión de Anuncios",
|
||||||
"Apple": "ID de Apple",
|
"Apple": "ID de Apple",
|
||||||
|
"Application Management": "Gestión de Aplicaciones",
|
||||||
"Auth Control": "Control de Autenticación",
|
"Auth Control": "Control de Autenticación",
|
||||||
"Coupon Management": "Gestión de Cupones",
|
"Coupon Management": "Gestión de Cupones",
|
||||||
"Dashboard": "Tablero",
|
"Dashboard": "Tablero",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Gestión de Pedidos",
|
"Order Management": "Gestión de Pedidos",
|
||||||
"Payment Config": "Configuración de Pago",
|
"Payment Config": "Configuración de Pago",
|
||||||
"Phone Number": "Número de Teléfono",
|
"Phone Number": "Número de Teléfono",
|
||||||
|
"Rule Management": "Gestión de Reglas",
|
||||||
"Server": "Servidor",
|
"Server": "Servidor",
|
||||||
"Server Management": "Gestión de Servidores",
|
"Server Management": "Gestión de Servidores",
|
||||||
"Settings": "Configuración",
|
"Settings": "Configuración",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analizando...",
|
||||||
|
"appIcon": "Ícono de Regla",
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"confirmDelete": "Confirmar Eliminación",
|
||||||
|
"create": "Agregar Regla",
|
||||||
|
"createRule": "Agregar Regla",
|
||||||
|
"createSuccess": "Regla creada con éxito",
|
||||||
|
"createdAt": "Creado En",
|
||||||
|
"delete": "Eliminar",
|
||||||
|
"deleteSuccess": "Regla eliminada con éxito",
|
||||||
|
"deleteWarning": "¿Está seguro de que desea eliminar esta regla? Esta acción no se puede deshacer.",
|
||||||
|
"description": "Descripción de la Regla",
|
||||||
|
"downloadTemplate": "Descargar Plantilla",
|
||||||
|
"edit": "Editar",
|
||||||
|
"editRule": "Editar Regla",
|
||||||
|
"enable": "Habilitar",
|
||||||
|
"enterIconUrl": "Ingrese o suba un ícono",
|
||||||
|
"enterRuleName": "Ingrese el nombre de la regla",
|
||||||
|
"enterRules": "Ingrese el contenido de la regla, uno por línea",
|
||||||
|
"import": "Importar",
|
||||||
|
"importFailed": "Importación fallida",
|
||||||
|
"importSuccess": "Importación exitosa",
|
||||||
|
"importYaml": "Importar YAML",
|
||||||
|
"importYamlDescription": "Importar reglas desde un archivo YAML, el sistema creará automáticamente grupos de reglas basados en los nombres de los grupos de políticas",
|
||||||
|
"importYamlRules": "Importar Reglas YAML",
|
||||||
|
"importing": "Importando...",
|
||||||
|
"invalidYamlFormat": "Formato YAML inválido, falta el campo de reglas",
|
||||||
|
"name": "Nombre de la Regla",
|
||||||
|
"noValidRules": "No se encontraron reglas válidas",
|
||||||
|
"pleaseUploadFile": "Por favor, suba un archivo YAML",
|
||||||
|
"preview": "Vista Previa",
|
||||||
|
"rules": "Contenido de la Regla",
|
||||||
|
"rulesFormat": "Formato de regla: tipo de regla, contenido de coincidencia, [política], donde la política es opcional.\nSi no se especifica la política, se utilizará automáticamente el nombre del grupo de reglas actual. Ejemplos:",
|
||||||
|
"rulesLabel": "Contenido de la Regla",
|
||||||
|
"searchRule": "Buscar nombre de regla",
|
||||||
|
"selectFile": "Seleccionar Archivo",
|
||||||
|
"selectTags": "Seleccionar etiquetas de nodo",
|
||||||
|
"tags": "Etiquetas de Nodo",
|
||||||
|
"tagsLabel": "Etiquetas de Nodo",
|
||||||
|
"updateSuccess": "Regla actualizada con éxito"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Habilitar Cuenta",
|
"accountEnable": "Habilitar Cuenta",
|
||||||
"actions": "acciones",
|
"actions": "acciones",
|
||||||
|
"active": "Activo",
|
||||||
"add": "Agregar",
|
"add": "Agregar",
|
||||||
"administrator": "Administrador",
|
"administrator": "Administrador",
|
||||||
"areaCode": "Código de Área",
|
"areaCode": "Código de Área",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "correo electrónico",
|
"email": "correo electrónico",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"expireTime": "Tiempo de Expiración",
|
"expireTime": "Tiempo de Expiración",
|
||||||
|
"expired": "Expirado",
|
||||||
"expiredAt": "Fecha de vencimiento",
|
"expiredAt": "Fecha de vencimiento",
|
||||||
"failed": "Fallido",
|
"failed": "Fallido",
|
||||||
"giftAmount": "Monto del Regalo",
|
"giftAmount": "Monto del Regalo",
|
||||||
"giftAmountPlaceholder": "Ingrese el monto del regalo",
|
"giftAmountPlaceholder": "Ingrese el monto del regalo",
|
||||||
|
"inactive": "Inactivo",
|
||||||
"invalidEmailFormat": "Formato de correo electrónico no válido",
|
"invalidEmailFormat": "Formato de correo electrónico no válido",
|
||||||
"inviteCode": "Código de Invitación",
|
"inviteCode": "Código de Invitación",
|
||||||
"inviteCodePlaceholder": "Ingresa el código de invitación (déjalo en blanco para generar uno)",
|
"inviteCodePlaceholder": "Ingresa el código de invitación (déjalo en blanco para generar uno)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Ingresa nueva contraseña (opcional)",
|
"passwordPlaceholder": "Ingresa nueva contraseña (opcional)",
|
||||||
"permanent": "Permanente",
|
"permanent": "Permanente",
|
||||||
"pleaseEnterEmail": "Por favor, ingresa el correo electrónico",
|
"pleaseEnterEmail": "Por favor, ingresa el correo electrónico",
|
||||||
|
"price": "Precio",
|
||||||
"referer": "Recomendador",
|
"referer": "Recomendador",
|
||||||
"refererId": "ID del Referente",
|
"refererId": "ID del Referente",
|
||||||
"refererIdPlaceholder": "Ingrese ID del referente",
|
"refererIdPlaceholder": "Ingrese ID del referente",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Buscar dirección IP",
|
"searchIp": "Buscar dirección IP",
|
||||||
"selectAuthType": "Seleccionar tipo de autenticación",
|
"selectAuthType": "Seleccionar tipo de autenticación",
|
||||||
"speedLimit": "Límite de Velocidad",
|
"speedLimit": "Límite de Velocidad",
|
||||||
|
"startTime": "Hora de Inicio",
|
||||||
|
"status": "Estado",
|
||||||
"subscription": "Suscripción",
|
"subscription": "Suscripción",
|
||||||
"subscriptionDetails": "Detalles de la Suscripción",
|
"subscriptionDetails": "Detalles de la Suscripción",
|
||||||
|
"subscriptionId": "ID de Suscripción",
|
||||||
|
"subscriptionInfo": "Información de Suscripción",
|
||||||
"subscriptionList": "Lista de Suscripción",
|
"subscriptionList": "Lista de Suscripción",
|
||||||
"subscriptionLogs": "Registros de Suscripción",
|
"subscriptionLogs": "Registros de Suscripción",
|
||||||
"subscriptionName": "Nombre de la Suscripción",
|
"subscriptionName": "Nombre de la Suscripción",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Notificaciones de Comercio",
|
"tradeNotifications": "Notificaciones de Comercio",
|
||||||
"trafficLimit": "Límite de Tráfico",
|
"trafficLimit": "Límite de Tráfico",
|
||||||
"trafficLogs": "Registros de Tráfico",
|
"trafficLogs": "Registros de Tráfico",
|
||||||
|
"trafficUsage": "Uso de Tráfico",
|
||||||
|
"unknown": "Desconocido",
|
||||||
"unlimited": "Ilimitado",
|
"unlimited": "Ilimitado",
|
||||||
"unverified": "No verificado",
|
"unverified": "No verificado",
|
||||||
"update": "Actualizar",
|
"update": "Actualizar",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Agente de Usuario",
|
"userAgent": "Agente de Usuario",
|
||||||
"userEmail": "Correo Electrónico del Usuario",
|
"userEmail": "Correo Electrónico del Usuario",
|
||||||
"userEmailPlaceholder": "Ingresa el correo electrónico del usuario",
|
"userEmailPlaceholder": "Ingresa el correo electrónico del usuario",
|
||||||
|
"userId": "ID de Usuario",
|
||||||
|
"userInfo": "Información de Usuario",
|
||||||
"userList": "Lista de usuarios",
|
"userList": "Lista de usuarios",
|
||||||
"userLogs": "Historial de Inicio de Sesión",
|
"userLogs": "Historial de Inicio de Sesión",
|
||||||
"userName": "Identificador de Usuario",
|
"userName": "Identificador de Usuario",
|
||||||
"userOrders": "Pedidos",
|
"userOrders": "Pedidos",
|
||||||
"userProfile": "Perfil",
|
"userProfile": "Perfil",
|
||||||
"userSubscriptions": "Suscripciones",
|
"userSubscriptions": "Suscripciones",
|
||||||
"verified": "Verificado"
|
"username": "Nombre de Usuario",
|
||||||
|
"verified": "Verificado",
|
||||||
|
"viewDetails": "Ver Detalles"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "تنظیمات ADS",
|
"ADS Config": "تنظیمات ADS",
|
||||||
"Announcement Management": "مدیریت اطلاعیهها",
|
"Announcement Management": "مدیریت اطلاعیهها",
|
||||||
"Apple": "شناسه اپل",
|
"Apple": "شناسه اپل",
|
||||||
|
"Application Management": "مدیریت برنامه",
|
||||||
"Auth Control": "کنترل احراز هویت",
|
"Auth Control": "کنترل احراز هویت",
|
||||||
"Coupon Management": "مدیریت کوپن",
|
"Coupon Management": "مدیریت کوپن",
|
||||||
"Dashboard": "داشبورد",
|
"Dashboard": "داشبورد",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "مدیریت سفارش",
|
"Order Management": "مدیریت سفارش",
|
||||||
"Payment Config": "پیکربندی پرداخت",
|
"Payment Config": "پیکربندی پرداخت",
|
||||||
"Phone Number": "شماره تلفن",
|
"Phone Number": "شماره تلفن",
|
||||||
|
"Rule Management": "مدیریت قوانین",
|
||||||
"Server": "سرور",
|
"Server": "سرور",
|
||||||
"Server Management": "مدیریت سرور",
|
"Server Management": "مدیریت سرور",
|
||||||
"Settings": "تنظیمات",
|
"Settings": "تنظیمات",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "در حال تجزیه و تحلیل...",
|
||||||
|
"appIcon": "آیکون قانون",
|
||||||
|
"cancel": "لغو",
|
||||||
|
"confirm": "تأیید",
|
||||||
|
"confirmDelete": "تأیید حذف",
|
||||||
|
"create": "افزودن قانون",
|
||||||
|
"createRule": "افزودن قانون",
|
||||||
|
"createSuccess": "قانون با موفقیت ایجاد شد",
|
||||||
|
"createdAt": "تاریخ ایجاد",
|
||||||
|
"delete": "حذف",
|
||||||
|
"deleteSuccess": "قانون با موفقیت حذف شد",
|
||||||
|
"deleteWarning": "آیا مطمئن هستید که میخواهید این قانون را حذف کنید؟ این عمل قابل بازگشت نیست.",
|
||||||
|
"description": "توضیحات قانون",
|
||||||
|
"downloadTemplate": "دانلود الگو",
|
||||||
|
"edit": "ویرایش",
|
||||||
|
"editRule": "ویرایش قانون",
|
||||||
|
"enable": "فعالسازی",
|
||||||
|
"enterIconUrl": "آدرس یا بارگذاری آیکون را وارد کنید",
|
||||||
|
"enterRuleName": "نام قانون را وارد کنید",
|
||||||
|
"enterRules": "محتوای قانون را وارد کنید، هر کدام در یک خط",
|
||||||
|
"import": "وارد کردن",
|
||||||
|
"importFailed": "وارد کردن ناموفق بود",
|
||||||
|
"importSuccess": "وارد کردن با موفقیت انجام شد",
|
||||||
|
"importYaml": "وارد کردن YAML",
|
||||||
|
"importYamlDescription": "وارد کردن قوانین از فایل YAML، سیستم به طور خودکار گروههای قانونی را بر اساس نامهای گروه سیاست ایجاد خواهد کرد",
|
||||||
|
"importYamlRules": "وارد کردن قوانین YAML",
|
||||||
|
"importing": "در حال وارد کردن...",
|
||||||
|
"invalidYamlFormat": "فرمت YAML نامعتبر است، فیلد قوانین گم شده است",
|
||||||
|
"name": "نام قانون",
|
||||||
|
"noValidRules": "هیچ قانونی یافت نشد",
|
||||||
|
"pleaseUploadFile": "لطفاً یک فایل YAML بارگذاری کنید",
|
||||||
|
"preview": "پیشنمایش",
|
||||||
|
"rules": "محتوای قانون",
|
||||||
|
"rulesFormat": "فرمت قانون: نوع قانون، محتوای تطابق، [سیاست]، که سیاست اختیاری است.\nاگر سیاست مشخص نشود، نام گروه قانونی فعلی به طور خودکار استفاده خواهد شد. مثالها:",
|
||||||
|
"rulesLabel": "محتوای قانون",
|
||||||
|
"searchRule": "جستجوی نام قانون",
|
||||||
|
"selectFile": "انتخاب فایل",
|
||||||
|
"selectTags": "انتخاب برچسبهای گره",
|
||||||
|
"tags": "برچسبهای گره",
|
||||||
|
"tagsLabel": "برچسبهای گره",
|
||||||
|
"updateSuccess": "قانون با موفقیت بهروزرسانی شد"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "فعالسازی حساب",
|
"accountEnable": "فعالسازی حساب",
|
||||||
"actions": "اقدامات",
|
"actions": "اقدامات",
|
||||||
|
"active": "فعال",
|
||||||
"add": "افزودن",
|
"add": "افزودن",
|
||||||
"administrator": "مدیر",
|
"administrator": "مدیر",
|
||||||
"areaCode": "کد منطقه",
|
"areaCode": "کد منطقه",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "ایمیل",
|
"email": "ایمیل",
|
||||||
"enable": "فعال کردن",
|
"enable": "فعال کردن",
|
||||||
"expireTime": "زمان انقضا",
|
"expireTime": "زمان انقضا",
|
||||||
|
"expired": "منقضی شده",
|
||||||
"expiredAt": "منقضی شده در",
|
"expiredAt": "منقضی شده در",
|
||||||
"failed": "ناموفق",
|
"failed": "ناموفق",
|
||||||
"giftAmount": "مقدار هدیه",
|
"giftAmount": "مقدار هدیه",
|
||||||
"giftAmountPlaceholder": "مبلغ هدیه را وارد کنید",
|
"giftAmountPlaceholder": "مبلغ هدیه را وارد کنید",
|
||||||
|
"inactive": "غیرفعال",
|
||||||
"invalidEmailFormat": "فرمت ایمیل نامعتبر است",
|
"invalidEmailFormat": "فرمت ایمیل نامعتبر است",
|
||||||
"inviteCode": "کد دعوت",
|
"inviteCode": "کد دعوت",
|
||||||
"inviteCodePlaceholder": "کد دعوت را وارد کنید (برای تولید خالی بگذارید)",
|
"inviteCodePlaceholder": "کد دعوت را وارد کنید (برای تولید خالی بگذارید)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "رمز عبور جدید را وارد کنید (اختیاری)",
|
"passwordPlaceholder": "رمز عبور جدید را وارد کنید (اختیاری)",
|
||||||
"permanent": "دائمی",
|
"permanent": "دائمی",
|
||||||
"pleaseEnterEmail": "لطفاً ایمیل خود را وارد کنید",
|
"pleaseEnterEmail": "لطفاً ایمیل خود را وارد کنید",
|
||||||
|
"price": "قیمت",
|
||||||
"referer": "ارجاعدهنده",
|
"referer": "ارجاعدهنده",
|
||||||
"refererId": "شناسه معرف",
|
"refererId": "شناسه معرف",
|
||||||
"refererIdPlaceholder": "شناسه معرف را وارد کنید",
|
"refererIdPlaceholder": "شناسه معرف را وارد کنید",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "جستجوی آدرس IP",
|
"searchIp": "جستجوی آدرس IP",
|
||||||
"selectAuthType": "نوع احراز هویت را انتخاب کنید",
|
"selectAuthType": "نوع احراز هویت را انتخاب کنید",
|
||||||
"speedLimit": "محدودیت سرعت",
|
"speedLimit": "محدودیت سرعت",
|
||||||
|
"startTime": "زمان شروع",
|
||||||
|
"status": "وضعیت",
|
||||||
"subscription": "اشتراک",
|
"subscription": "اشتراک",
|
||||||
"subscriptionDetails": "جزئیات اشتراک",
|
"subscriptionDetails": "جزئیات اشتراک",
|
||||||
|
"subscriptionId": "شناسه اشتراک",
|
||||||
|
"subscriptionInfo": "اطلاعات اشتراک",
|
||||||
"subscriptionList": "لیست اشتراک",
|
"subscriptionList": "لیست اشتراک",
|
||||||
"subscriptionLogs": "گزارشهای اشتراک",
|
"subscriptionLogs": "گزارشهای اشتراک",
|
||||||
"subscriptionName": "نام اشتراک",
|
"subscriptionName": "نام اشتراک",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "اعلانهای تجارت",
|
"tradeNotifications": "اعلانهای تجارت",
|
||||||
"trafficLimit": "محدودیت ترافیک",
|
"trafficLimit": "محدودیت ترافیک",
|
||||||
"trafficLogs": "گزارشهای ترافیک",
|
"trafficLogs": "گزارشهای ترافیک",
|
||||||
|
"trafficUsage": "استفاده از ترافیک",
|
||||||
|
"unknown": "نامشخص",
|
||||||
"unlimited": "نامحدود",
|
"unlimited": "نامحدود",
|
||||||
"unverified": "تأیید نشده",
|
"unverified": "تأیید نشده",
|
||||||
"update": "بهروزرسانی",
|
"update": "بهروزرسانی",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "عامل کاربر",
|
"userAgent": "عامل کاربر",
|
||||||
"userEmail": "ایمیل کاربر",
|
"userEmail": "ایمیل کاربر",
|
||||||
"userEmailPlaceholder": "ایمیل کاربر را وارد کنید",
|
"userEmailPlaceholder": "ایمیل کاربر را وارد کنید",
|
||||||
|
"userId": "شناسه کاربر",
|
||||||
|
"userInfo": "اطلاعات کاربر",
|
||||||
"userList": "فهرست کاربران",
|
"userList": "فهرست کاربران",
|
||||||
"userLogs": "تاریخچه ورود",
|
"userLogs": "تاریخچه ورود",
|
||||||
"userName": "شناسه کاربر",
|
"userName": "شناسه کاربر",
|
||||||
"userOrders": "سفارشها",
|
"userOrders": "سفارشها",
|
||||||
"userProfile": "پروفایل",
|
"userProfile": "پروفایل",
|
||||||
"userSubscriptions": "اشتراکها",
|
"userSubscriptions": "اشتراکها",
|
||||||
"verified": "تأیید شده"
|
"username": "نام کاربری",
|
||||||
|
"verified": "تأیید شده",
|
||||||
|
"viewDetails": "مشاهده جزئیات"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS-asetukset",
|
"ADS Config": "ADS-asetukset",
|
||||||
"Announcement Management": "Ilmoitusten hallinta",
|
"Announcement Management": "Ilmoitusten hallinta",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "Sovellushallinta",
|
||||||
"Auth Control": "Todennuksen hallinta",
|
"Auth Control": "Todennuksen hallinta",
|
||||||
"Coupon Management": "Kuponkien hallinta",
|
"Coupon Management": "Kuponkien hallinta",
|
||||||
"Dashboard": "Kojelauta",
|
"Dashboard": "Kojelauta",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Tilausten hallinta",
|
"Order Management": "Tilausten hallinta",
|
||||||
"Payment Config": "Maksukonfiguraatio",
|
"Payment Config": "Maksukonfiguraatio",
|
||||||
"Phone Number": "Puhelinnumero",
|
"Phone Number": "Puhelinnumero",
|
||||||
|
"Rule Management": "Sääntöhallinta",
|
||||||
"Server": "Palvelu",
|
"Server": "Palvelu",
|
||||||
"Server Management": "Palvelimen hallinta",
|
"Server Management": "Palvelimen hallinta",
|
||||||
"Settings": "Asetukset",
|
"Settings": "Asetukset",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analysoidaan...",
|
||||||
|
"appIcon": "Sääntökuvake",
|
||||||
|
"cancel": "Peruuta",
|
||||||
|
"confirm": "Vahvista",
|
||||||
|
"confirmDelete": "Vahvista poisto",
|
||||||
|
"create": "Lisää sääntö",
|
||||||
|
"createRule": "Lisää sääntö",
|
||||||
|
"createSuccess": "Sääntö luotiin onnistuneesti",
|
||||||
|
"createdAt": "Luotu",
|
||||||
|
"delete": "Poista",
|
||||||
|
"deleteSuccess": "Sääntö poistettiin onnistuneesti",
|
||||||
|
"deleteWarning": "Oletko varma, että haluat poistaa tämän säännön? Tätä toimintoa ei voi peruuttaa.",
|
||||||
|
"description": "Säännön kuvaus",
|
||||||
|
"downloadTemplate": "Lataa malli",
|
||||||
|
"edit": "Muokkaa",
|
||||||
|
"editRule": "Muokkaa sääntöä",
|
||||||
|
"enable": "Ota käyttöön",
|
||||||
|
"enterIconUrl": "Syötä tai lataa kuvake",
|
||||||
|
"enterRuleName": "Syötä säännön nimi",
|
||||||
|
"enterRules": "Syötä sääntöjen sisältö, yksi per rivi",
|
||||||
|
"import": "Tuoda",
|
||||||
|
"importFailed": "Tuonti epäonnistui",
|
||||||
|
"importSuccess": "Tuonti onnistui",
|
||||||
|
"importYaml": "Tuo YAML",
|
||||||
|
"importYamlDescription": "Tuo sääntöjä YAML-tiedostosta, järjestelmä luo automaattisesti sääntöryhmiä politiikkaryhmän nimien perusteella",
|
||||||
|
"importYamlRules": "Tuo YAML-säännöt",
|
||||||
|
"importing": "Tuodaan...",
|
||||||
|
"invalidYamlFormat": "Virheellinen YAML-muoto, puuttuu sääntöjen kenttä",
|
||||||
|
"name": "Säännön nimi",
|
||||||
|
"noValidRules": "Ei voimassa olevia sääntöjä löytynyt",
|
||||||
|
"pleaseUploadFile": "Lataa YAML-tiedosto",
|
||||||
|
"preview": "Esikatselu",
|
||||||
|
"rules": "Säännön sisältö",
|
||||||
|
"rulesFormat": "Sääntömuoto: sääntötyyppi, vastaavuus, [politiikka], jossa politiikka on valinnainen.\nJos politiikkaa ei ole määritelty, nykyistä sääntöryhmän nimeä käytetään automaattisesti. Esimerkkejä:",
|
||||||
|
"rulesLabel": "Säännön sisältö",
|
||||||
|
"searchRule": "Etsi säännön nimeä",
|
||||||
|
"selectFile": "Valitse tiedosto",
|
||||||
|
"selectTags": "Valitse solmun tunnisteet",
|
||||||
|
"tags": "Solmun tunnisteet",
|
||||||
|
"tagsLabel": "Solmun tunnisteet",
|
||||||
|
"updateSuccess": "Sääntö päivitettiin onnistuneesti"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Tilin aktivointi",
|
"accountEnable": "Tilin aktivointi",
|
||||||
"actions": "toiminnot",
|
"actions": "toiminnot",
|
||||||
|
"active": "Aktiivinen",
|
||||||
"add": "Lisää",
|
"add": "Lisää",
|
||||||
"administrator": "Ylläpitäjä",
|
"administrator": "Ylläpitäjä",
|
||||||
"areaCode": "Alueen koodi",
|
"areaCode": "Alueen koodi",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "sähköposti",
|
"email": "sähköposti",
|
||||||
"enable": "Ota käyttöön",
|
"enable": "Ota käyttöön",
|
||||||
"expireTime": "Vanhentumisaika",
|
"expireTime": "Vanhentumisaika",
|
||||||
|
"expired": "Vanhentunut",
|
||||||
"expiredAt": "Vanhentunut",
|
"expiredAt": "Vanhentunut",
|
||||||
"failed": "Epäonnistui",
|
"failed": "Epäonnistui",
|
||||||
"giftAmount": "Lahjan määrä",
|
"giftAmount": "Lahjan määrä",
|
||||||
"giftAmountPlaceholder": "Syötä lahjan määrä",
|
"giftAmountPlaceholder": "Syötä lahjan määrä",
|
||||||
|
"inactive": "Epäaktiivinen",
|
||||||
"invalidEmailFormat": "Virheellinen sähköpostimuoto",
|
"invalidEmailFormat": "Virheellinen sähköpostimuoto",
|
||||||
"inviteCode": "Kutsukoodi",
|
"inviteCode": "Kutsukoodi",
|
||||||
"inviteCodePlaceholder": "Syötä kutsukoodi (jätä tyhjäksi luodaksesi uuden)",
|
"inviteCodePlaceholder": "Syötä kutsukoodi (jätä tyhjäksi luodaksesi uuden)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Syötä uusi salasana (valinnainen)",
|
"passwordPlaceholder": "Syötä uusi salasana (valinnainen)",
|
||||||
"permanent": "Pysyvä",
|
"permanent": "Pysyvä",
|
||||||
"pleaseEnterEmail": "Ole hyvä ja syötä sähköpostiosoite",
|
"pleaseEnterEmail": "Ole hyvä ja syötä sähköpostiosoite",
|
||||||
|
"price": "Hinta",
|
||||||
"referer": "Suosittelija",
|
"referer": "Suosittelija",
|
||||||
"refererId": "Viittaajan ID",
|
"refererId": "Viittaajan ID",
|
||||||
"refererIdPlaceholder": "Syötä suosittelijan ID",
|
"refererIdPlaceholder": "Syötä suosittelijan ID",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Etsi IP-osoite",
|
"searchIp": "Etsi IP-osoite",
|
||||||
"selectAuthType": "Valitse todennustyyppi",
|
"selectAuthType": "Valitse todennustyyppi",
|
||||||
"speedLimit": "Nopeusrajoitus",
|
"speedLimit": "Nopeusrajoitus",
|
||||||
|
"startTime": "Aloitusaika",
|
||||||
|
"status": "Tila",
|
||||||
"subscription": "Tilaus",
|
"subscription": "Tilaus",
|
||||||
"subscriptionDetails": "Tilaustiedot",
|
"subscriptionDetails": "Tilaustiedot",
|
||||||
|
"subscriptionId": "Tilauksen ID",
|
||||||
|
"subscriptionInfo": "Tilauksen tiedot",
|
||||||
"subscriptionList": "Tilauksen lista",
|
"subscriptionList": "Tilauksen lista",
|
||||||
"subscriptionLogs": "Tilaushistoria",
|
"subscriptionLogs": "Tilaushistoria",
|
||||||
"subscriptionName": "Tilauksen nimi",
|
"subscriptionName": "Tilauksen nimi",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Kauppailmoitukset",
|
"tradeNotifications": "Kauppailmoitukset",
|
||||||
"trafficLimit": "Liikenteen rajoitus",
|
"trafficLimit": "Liikenteen rajoitus",
|
||||||
"trafficLogs": "Liikennelokit",
|
"trafficLogs": "Liikennelokit",
|
||||||
|
"trafficUsage": "Liikenteen käyttö",
|
||||||
|
"unknown": "Tuntematon",
|
||||||
"unlimited": "Rajoittamaton",
|
"unlimited": "Rajoittamaton",
|
||||||
"unverified": "Vahvistamaton",
|
"unverified": "Vahvistamaton",
|
||||||
"update": "Päivitä",
|
"update": "Päivitä",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Käyttäjäagentti",
|
"userAgent": "Käyttäjäagentti",
|
||||||
"userEmail": "Käyttäjän sähköposti",
|
"userEmail": "Käyttäjän sähköposti",
|
||||||
"userEmailPlaceholder": "Syötä käyttäjän sähköpostiosoite",
|
"userEmailPlaceholder": "Syötä käyttäjän sähköpostiosoite",
|
||||||
|
"userId": "Käyttäjän ID",
|
||||||
|
"userInfo": "Käyttäjän tiedot",
|
||||||
"userList": "Käyttäjälista",
|
"userList": "Käyttäjälista",
|
||||||
"userLogs": "Kirjautumishistoria",
|
"userLogs": "Kirjautumishistoria",
|
||||||
"userName": "Käyttäjän tunniste",
|
"userName": "Käyttäjän tunniste",
|
||||||
"userOrders": "Tilaukset",
|
"userOrders": "Tilaukset",
|
||||||
"userProfile": "Profiili",
|
"userProfile": "Profiili",
|
||||||
"userSubscriptions": "Tilaukset",
|
"userSubscriptions": "Tilaukset",
|
||||||
"verified": "Vahvistettu"
|
"username": "Käyttäjänimi",
|
||||||
|
"verified": "Vahvistettu",
|
||||||
|
"viewDetails": "Näytä tiedot"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Configuration ADS",
|
"ADS Config": "Configuration ADS",
|
||||||
"Announcement Management": "Gestion des annonces",
|
"Announcement Management": "Gestion des annonces",
|
||||||
"Apple": "Identifiant Apple",
|
"Apple": "Identifiant Apple",
|
||||||
|
"Application Management": "Gestion des applications",
|
||||||
"Auth Control": "Contrôle d'authentification",
|
"Auth Control": "Contrôle d'authentification",
|
||||||
"Coupon Management": "Gestion des coupons",
|
"Coupon Management": "Gestion des coupons",
|
||||||
"Dashboard": "Tableau de bord",
|
"Dashboard": "Tableau de bord",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Gestion des commandes",
|
"Order Management": "Gestion des commandes",
|
||||||
"Payment Config": "Configuration de paiement",
|
"Payment Config": "Configuration de paiement",
|
||||||
"Phone Number": "Numéro de téléphone",
|
"Phone Number": "Numéro de téléphone",
|
||||||
|
"Rule Management": "Gestion des règles",
|
||||||
"Server": "Serveur",
|
"Server": "Serveur",
|
||||||
"Server Management": "Gestion des services",
|
"Server Management": "Gestion des services",
|
||||||
"Settings": "Paramètres",
|
"Settings": "Paramètres",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analyse en cours...",
|
||||||
|
"appIcon": "Icône de règle",
|
||||||
|
"cancel": "Annuler",
|
||||||
|
"confirm": "Confirmer",
|
||||||
|
"confirmDelete": "Confirmer la suppression",
|
||||||
|
"create": "Ajouter une règle",
|
||||||
|
"createRule": "Ajouter une règle",
|
||||||
|
"createSuccess": "Règle créée avec succès",
|
||||||
|
"createdAt": "Créé le",
|
||||||
|
"delete": "Supprimer",
|
||||||
|
"deleteSuccess": "Règle supprimée avec succès",
|
||||||
|
"deleteWarning": "Êtes-vous sûr de vouloir supprimer cette règle ? Cette action ne peut pas être annulée.",
|
||||||
|
"description": "Description de la règle",
|
||||||
|
"downloadTemplate": "Télécharger le modèle",
|
||||||
|
"edit": "Modifier",
|
||||||
|
"editRule": "Modifier la règle",
|
||||||
|
"enable": "Activer",
|
||||||
|
"enterIconUrl": "Entrez ou téléchargez une icône",
|
||||||
|
"enterRuleName": "Entrez le nom de la règle",
|
||||||
|
"enterRules": "Entrez le contenu de la règle, un par ligne",
|
||||||
|
"import": "Importer",
|
||||||
|
"importFailed": "Échec de l'importation",
|
||||||
|
"importSuccess": "Importation réussie",
|
||||||
|
"importYaml": "Importer YAML",
|
||||||
|
"importYamlDescription": "Importer des règles à partir d'un fichier YAML, le système créera automatiquement des groupes de règles en fonction des noms de groupes de politiques",
|
||||||
|
"importYamlRules": "Importer des règles YAML",
|
||||||
|
"importing": "Importation en cours...",
|
||||||
|
"invalidYamlFormat": "Format YAML invalide, champ de règles manquant",
|
||||||
|
"name": "Nom de la règle",
|
||||||
|
"noValidRules": "Aucune règle valide trouvée",
|
||||||
|
"pleaseUploadFile": "Veuillez télécharger un fichier YAML",
|
||||||
|
"preview": "Aperçu",
|
||||||
|
"rules": "Contenu de la règle",
|
||||||
|
"rulesFormat": "Format de la règle : type de règle, contenu de correspondance, [politique], où la politique est optionnelle.\nSi la politique n'est pas spécifiée, le nom du groupe de règles actuel sera utilisé automatiquement. Exemples :",
|
||||||
|
"rulesLabel": "Contenu de la règle",
|
||||||
|
"searchRule": "Rechercher le nom de la règle",
|
||||||
|
"selectFile": "Sélectionner un fichier",
|
||||||
|
"selectTags": "Sélectionner des balises de nœud",
|
||||||
|
"tags": "Balises de nœud",
|
||||||
|
"tagsLabel": "Balises de nœud",
|
||||||
|
"updateSuccess": "Règle mise à jour avec succès"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Activation du compte",
|
"accountEnable": "Activation du compte",
|
||||||
"actions": "actions",
|
"actions": "actions",
|
||||||
|
"active": "Actif",
|
||||||
"add": "Ajouter",
|
"add": "Ajouter",
|
||||||
"administrator": "Administrateur",
|
"administrator": "Administrateur",
|
||||||
"areaCode": "Indicatif régional",
|
"areaCode": "Indicatif régional",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "e-mail",
|
"email": "e-mail",
|
||||||
"enable": "Activer",
|
"enable": "Activer",
|
||||||
"expireTime": "Date d'expiration",
|
"expireTime": "Date d'expiration",
|
||||||
|
"expired": "Expiré",
|
||||||
"expiredAt": "Expiré le",
|
"expiredAt": "Expiré le",
|
||||||
"failed": "Échoué",
|
"failed": "Échoué",
|
||||||
"giftAmount": "Montant du cadeau",
|
"giftAmount": "Montant du cadeau",
|
||||||
"giftAmountPlaceholder": "Entrez le montant du cadeau",
|
"giftAmountPlaceholder": "Entrez le montant du cadeau",
|
||||||
|
"inactive": "Inactif",
|
||||||
"invalidEmailFormat": "Format d'email invalide",
|
"invalidEmailFormat": "Format d'email invalide",
|
||||||
"inviteCode": "Code d'invitation",
|
"inviteCode": "Code d'invitation",
|
||||||
"inviteCodePlaceholder": "Entrez le code d'invitation (laissez vide pour générer)",
|
"inviteCodePlaceholder": "Entrez le code d'invitation (laissez vide pour générer)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Entrez un nouveau mot de passe (facultatif)",
|
"passwordPlaceholder": "Entrez un nouveau mot de passe (facultatif)",
|
||||||
"permanent": "Permanent",
|
"permanent": "Permanent",
|
||||||
"pleaseEnterEmail": "Veuillez entrer votre adresse e-mail",
|
"pleaseEnterEmail": "Veuillez entrer votre adresse e-mail",
|
||||||
|
"price": "Prix",
|
||||||
"referer": "Référent",
|
"referer": "Référent",
|
||||||
"refererId": "ID du référent",
|
"refererId": "ID du référent",
|
||||||
"refererIdPlaceholder": "Entrez l'ID du référent",
|
"refererIdPlaceholder": "Entrez l'ID du référent",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Rechercher une adresse IP",
|
"searchIp": "Rechercher une adresse IP",
|
||||||
"selectAuthType": "Sélectionner le type d'authentification",
|
"selectAuthType": "Sélectionner le type d'authentification",
|
||||||
"speedLimit": "Limite de vitesse",
|
"speedLimit": "Limite de vitesse",
|
||||||
|
"startTime": "Date de début",
|
||||||
|
"status": "Statut",
|
||||||
"subscription": "Abonnement",
|
"subscription": "Abonnement",
|
||||||
"subscriptionDetails": "Détails de l'abonnement",
|
"subscriptionDetails": "Détails de l'abonnement",
|
||||||
|
"subscriptionId": "ID d'abonnement",
|
||||||
|
"subscriptionInfo": "Informations sur l'abonnement",
|
||||||
"subscriptionList": "Liste des abonnements",
|
"subscriptionList": "Liste des abonnements",
|
||||||
"subscriptionLogs": "Journaux d'abonnement",
|
"subscriptionLogs": "Journaux d'abonnement",
|
||||||
"subscriptionName": "Nom de l'abonnement",
|
"subscriptionName": "Nom de l'abonnement",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Notifications de commerce",
|
"tradeNotifications": "Notifications de commerce",
|
||||||
"trafficLimit": "Limite de trafic",
|
"trafficLimit": "Limite de trafic",
|
||||||
"trafficLogs": "Journaux de trafic",
|
"trafficLogs": "Journaux de trafic",
|
||||||
|
"trafficUsage": "Utilisation du trafic",
|
||||||
|
"unknown": "Inconnu",
|
||||||
"unlimited": "Illimité",
|
"unlimited": "Illimité",
|
||||||
"unverified": "Non vérifié",
|
"unverified": "Non vérifié",
|
||||||
"update": "Mettre à jour",
|
"update": "Mettre à jour",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Agent utilisateur",
|
"userAgent": "Agent utilisateur",
|
||||||
"userEmail": "E-mail de l'utilisateur",
|
"userEmail": "E-mail de l'utilisateur",
|
||||||
"userEmailPlaceholder": "Entrez l'email de l'utilisateur",
|
"userEmailPlaceholder": "Entrez l'email de l'utilisateur",
|
||||||
|
"userId": "ID utilisateur",
|
||||||
|
"userInfo": "Informations sur l'utilisateur",
|
||||||
"userList": "Liste des utilisateurs",
|
"userList": "Liste des utilisateurs",
|
||||||
"userLogs": "Historique des connexions",
|
"userLogs": "Historique des connexions",
|
||||||
"userName": "Identifiant Utilisateur",
|
"userName": "Identifiant Utilisateur",
|
||||||
"userOrders": "Commandes",
|
"userOrders": "Commandes",
|
||||||
"userProfile": "Profil",
|
"userProfile": "Profil",
|
||||||
"userSubscriptions": "Abonnements",
|
"userSubscriptions": "Abonnements",
|
||||||
"verified": "Vérifié"
|
"username": "Nom d'utilisateur",
|
||||||
|
"verified": "Vérifié",
|
||||||
|
"viewDetails": "Voir les détails"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "एडीएस कॉन्फ़िग",
|
"ADS Config": "एडीएस कॉन्फ़िग",
|
||||||
"Announcement Management": "घोषणा प्रबंधन",
|
"Announcement Management": "घोषणा प्रबंधन",
|
||||||
"Apple": "एप्पल आईडी",
|
"Apple": "एप्पल आईडी",
|
||||||
|
"Application Management": "ऐप्लिकेशन प्रबंधन",
|
||||||
"Auth Control": "प्रमाणिकरण नियंत्रण",
|
"Auth Control": "प्रमाणिकरण नियंत्रण",
|
||||||
"Coupon Management": "कूपन प्रबंधन",
|
"Coupon Management": "कूपन प्रबंधन",
|
||||||
"Dashboard": "डैशबोर्ड",
|
"Dashboard": "डैशबोर्ड",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "ऑर्डर प्रबंधन",
|
"Order Management": "ऑर्डर प्रबंधन",
|
||||||
"Payment Config": "भुगतान कॉन्फ़िगरेशन",
|
"Payment Config": "भुगतान कॉन्फ़िगरेशन",
|
||||||
"Phone Number": "फ़ोन नंबर",
|
"Phone Number": "फ़ोन नंबर",
|
||||||
|
"Rule Management": "नियम प्रबंधन",
|
||||||
"Server": "सर्वर",
|
"Server": "सर्वर",
|
||||||
"Server Management": "सर्वर प्रबंधन",
|
"Server Management": "सर्वर प्रबंधन",
|
||||||
"Settings": "सेटिंग्स",
|
"Settings": "सेटिंग्स",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "विश्लेषण कर रहा है...",
|
||||||
|
"appIcon": "नियम आइकन",
|
||||||
|
"cancel": "रद्द करें",
|
||||||
|
"confirm": "पुष्टि करें",
|
||||||
|
"confirmDelete": "हटाने की पुष्टि करें",
|
||||||
|
"create": "नियम जोड़ें",
|
||||||
|
"createRule": "नियम जोड़ें",
|
||||||
|
"createSuccess": "नियम सफलतापूर्वक बनाया गया",
|
||||||
|
"createdAt": "बनाया गया",
|
||||||
|
"delete": "हटाएं",
|
||||||
|
"deleteSuccess": "नियम सफलतापूर्वक हटाया गया",
|
||||||
|
"deleteWarning": "क्या आप वाकई इस नियम को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।",
|
||||||
|
"description": "नियम विवरण",
|
||||||
|
"downloadTemplate": "टेम्पलेट डाउनलोड करें",
|
||||||
|
"edit": "संपादित करें",
|
||||||
|
"editRule": "नियम संपादित करें",
|
||||||
|
"enable": "सक्षम करें",
|
||||||
|
"enterIconUrl": "एक आइकन दर्ज करें या अपलोड करें",
|
||||||
|
"enterRuleName": "नियम का नाम दर्ज करें",
|
||||||
|
"enterRules": "नियम की सामग्री दर्ज करें, एक प्रति पंक्ति",
|
||||||
|
"import": "आयात करें",
|
||||||
|
"importFailed": "आयात विफल",
|
||||||
|
"importSuccess": "आयात सफल",
|
||||||
|
"importYaml": "YAML आयात करें",
|
||||||
|
"importYamlDescription": "YAML फ़ाइल से नियम आयात करें, प्रणाली स्वचालित रूप से नीति समूह नामों के आधार पर नियम समूह बनाएगी",
|
||||||
|
"importYamlRules": "YAML नियम आयात करें",
|
||||||
|
"importing": "आयात कर रहा है...",
|
||||||
|
"invalidYamlFormat": "अमान्य YAML प्रारूप, नियम फ़ील्ड गायब है",
|
||||||
|
"name": "नियम का नाम",
|
||||||
|
"noValidRules": "कोई मान्य नियम नहीं मिला",
|
||||||
|
"pleaseUploadFile": "कृपया एक YAML फ़ाइल अपलोड करें",
|
||||||
|
"preview": "पूर्वावलोकन",
|
||||||
|
"rules": "नियम सामग्री",
|
||||||
|
"rulesFormat": "नियम प्रारूप: नियम प्रकार, मिलान सामग्री, [नीति], जहाँ नीति वैकल्पिक है।\nयदि नीति निर्दिष्ट नहीं की गई है, तो वर्तमान नियम समूह का नाम स्वचालित रूप से उपयोग किया जाएगा। उदाहरण:",
|
||||||
|
"rulesLabel": "नियम सामग्री",
|
||||||
|
"searchRule": "नियम नाम खोजें",
|
||||||
|
"selectFile": "फ़ाइल चुनें",
|
||||||
|
"selectTags": "नोड टैग चुनें",
|
||||||
|
"tags": "नोड टैग",
|
||||||
|
"tagsLabel": "नोड टैग",
|
||||||
|
"updateSuccess": "नियम सफलतापूर्वक अपडेट किया गया"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "खाता सक्षम करें",
|
"accountEnable": "खाता सक्षम करें",
|
||||||
"actions": "क्रियाएँ",
|
"actions": "क्रियाएँ",
|
||||||
|
"active": "सक्रिय",
|
||||||
"add": "जोड़ें",
|
"add": "जोड़ें",
|
||||||
"administrator": "प्रशासक",
|
"administrator": "प्रशासक",
|
||||||
"areaCode": "क्षेत्र कोड",
|
"areaCode": "क्षेत्र कोड",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "ईमेल",
|
"email": "ईमेल",
|
||||||
"enable": "सक्षम करें",
|
"enable": "सक्षम करें",
|
||||||
"expireTime": "समाप्ति समय",
|
"expireTime": "समाप्ति समय",
|
||||||
|
"expired": "समाप्त",
|
||||||
"expiredAt": "समाप्ति तिथि",
|
"expiredAt": "समाप्ति तिथि",
|
||||||
"failed": "असफल",
|
"failed": "असफल",
|
||||||
"giftAmount": "उपहार राशि",
|
"giftAmount": "उपहार राशि",
|
||||||
"giftAmountPlaceholder": "उपहार राशि दर्ज करें",
|
"giftAmountPlaceholder": "उपहार राशि दर्ज करें",
|
||||||
|
"inactive": "निष्क्रिय",
|
||||||
"invalidEmailFormat": "अमान्य ईमेल प्रारूप",
|
"invalidEmailFormat": "अमान्य ईमेल प्रारूप",
|
||||||
"inviteCode": "आमंत्रण कोड",
|
"inviteCode": "आमंत्रण कोड",
|
||||||
"inviteCodePlaceholder": "आमंत्रण कोड दर्ज करें (उत्पन्न करने के लिए खाली छोड़ें)",
|
"inviteCodePlaceholder": "आमंत्रण कोड दर्ज करें (उत्पन्न करने के लिए खाली छोड़ें)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "नया पासवर्ड दर्ज करें (वैकल्पिक)",
|
"passwordPlaceholder": "नया पासवर्ड दर्ज करें (वैकल्पिक)",
|
||||||
"permanent": "स्थायी",
|
"permanent": "स्थायी",
|
||||||
"pleaseEnterEmail": "कृपया ईमेल दर्ज करें",
|
"pleaseEnterEmail": "कृपया ईमेल दर्ज करें",
|
||||||
|
"price": "कीमत",
|
||||||
"referer": "सिफारिशकर्ता",
|
"referer": "सिफारिशकर्ता",
|
||||||
"refererId": "रेफरर आईडी",
|
"refererId": "रेफरर आईडी",
|
||||||
"refererIdPlaceholder": "रेफरर आईडी दर्ज करें",
|
"refererIdPlaceholder": "रेफरर आईडी दर्ज करें",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "आईपी पता खोजें",
|
"searchIp": "आईपी पता खोजें",
|
||||||
"selectAuthType": "प्रमाणीकरण प्रकार चुनें",
|
"selectAuthType": "प्रमाणीकरण प्रकार चुनें",
|
||||||
"speedLimit": "गति सीमा",
|
"speedLimit": "गति सीमा",
|
||||||
|
"startTime": "शुरुआत का समय",
|
||||||
|
"status": "स्थिति",
|
||||||
"subscription": "सदस्यता",
|
"subscription": "सदस्यता",
|
||||||
"subscriptionDetails": "सदस्यता विवरण",
|
"subscriptionDetails": "सदस्यता विवरण",
|
||||||
|
"subscriptionId": "सदस्यता आईडी",
|
||||||
|
"subscriptionInfo": "सदस्यता जानकारी",
|
||||||
"subscriptionList": "सदस्यता सूची",
|
"subscriptionList": "सदस्यता सूची",
|
||||||
"subscriptionLogs": "सदस्यता लॉग्स",
|
"subscriptionLogs": "सदस्यता लॉग्स",
|
||||||
"subscriptionName": "सदस्यता नाम",
|
"subscriptionName": "सदस्यता नाम",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "व्यापार सूचनाएं",
|
"tradeNotifications": "व्यापार सूचनाएं",
|
||||||
"trafficLimit": "ट्रैफिक सीमा",
|
"trafficLimit": "ट्रैफिक सीमा",
|
||||||
"trafficLogs": "ट्रैफिक लॉग्स",
|
"trafficLogs": "ट्रैफिक लॉग्स",
|
||||||
|
"trafficUsage": "ट्रैफ़िक उपयोग",
|
||||||
|
"unknown": "अज्ञात",
|
||||||
"unlimited": "असीमित",
|
"unlimited": "असीमित",
|
||||||
"unverified": "असत्यापित",
|
"unverified": "असत्यापित",
|
||||||
"update": "अपडेट",
|
"update": "अपडेट",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "उपयोगकर्ता एजेंट",
|
"userAgent": "उपयोगकर्ता एजेंट",
|
||||||
"userEmail": "उपयोगकर्ता ईमेल",
|
"userEmail": "उपयोगकर्ता ईमेल",
|
||||||
"userEmailPlaceholder": "उपयोगकर्ता ईमेल दर्ज करें",
|
"userEmailPlaceholder": "उपयोगकर्ता ईमेल दर्ज करें",
|
||||||
|
"userId": "उपयोगकर्ता आईडी",
|
||||||
|
"userInfo": "उपयोगकर्ता जानकारी",
|
||||||
"userList": "उपयोगकर्ता सूची",
|
"userList": "उपयोगकर्ता सूची",
|
||||||
"userLogs": "लॉगिन इतिहास",
|
"userLogs": "लॉगिन इतिहास",
|
||||||
"userName": "उपयोगकर्ता पहचानकर्ता",
|
"userName": "उपयोगकर्ता पहचानकर्ता",
|
||||||
"userOrders": "ऑर्डर",
|
"userOrders": "ऑर्डर",
|
||||||
"userProfile": "प्रोफ़ाइल",
|
"userProfile": "प्रोफ़ाइल",
|
||||||
"userSubscriptions": "सदस्यताएँ",
|
"userSubscriptions": "सदस्यताएँ",
|
||||||
"verified": "सत्यापित"
|
"username": "उपयोगकर्ता नाम",
|
||||||
|
"verified": "सत्यापित",
|
||||||
|
"viewDetails": "विवरण देखें"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS konfiguráció",
|
"ADS Config": "ADS konfiguráció",
|
||||||
"Announcement Management": "Hirdetménykezelés",
|
"Announcement Management": "Hirdetménykezelés",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "Alkalmazáskezelés",
|
||||||
"Auth Control": "Hitelesítési vezérlés",
|
"Auth Control": "Hitelesítési vezérlés",
|
||||||
"Coupon Management": "Kuponkezelés",
|
"Coupon Management": "Kuponkezelés",
|
||||||
"Dashboard": "Irányítópult",
|
"Dashboard": "Irányítópult",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Rendeléskezelés",
|
"Order Management": "Rendeléskezelés",
|
||||||
"Payment Config": "Fizetési beállítások",
|
"Payment Config": "Fizetési beállítások",
|
||||||
"Phone Number": "Telefonszám",
|
"Phone Number": "Telefonszám",
|
||||||
|
"Rule Management": "Szabálykezelés",
|
||||||
"Server": "Szolgáltatás",
|
"Server": "Szolgáltatás",
|
||||||
"Server Management": "Szerverkezelés",
|
"Server Management": "Szerverkezelés",
|
||||||
"Settings": "Beállítások",
|
"Settings": "Beállítások",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Elemzés...",
|
||||||
|
"appIcon": "Szabály Ikon",
|
||||||
|
"cancel": "Mégse",
|
||||||
|
"confirm": "Megerősít",
|
||||||
|
"confirmDelete": "Törlés megerősítése",
|
||||||
|
"create": "Szabály hozzáadása",
|
||||||
|
"createRule": "Szabály hozzáadása",
|
||||||
|
"createSuccess": "A szabály sikeresen létrejött",
|
||||||
|
"createdAt": "Létrehozva",
|
||||||
|
"delete": "Törlés",
|
||||||
|
"deleteSuccess": "A szabály sikeresen törölve",
|
||||||
|
"deleteWarning": "Biztosan törölni szeretné ezt a szabályt? Ez a művelet nem vonható vissza.",
|
||||||
|
"description": "Szabály leírása",
|
||||||
|
"downloadTemplate": "Sablon letöltése",
|
||||||
|
"edit": "Szerkesztés",
|
||||||
|
"editRule": "Szabály szerkesztése",
|
||||||
|
"enable": "Engedélyezés",
|
||||||
|
"enterIconUrl": "Adja meg vagy töltse fel az ikont",
|
||||||
|
"enterRuleName": "Adja meg a szabály nevét",
|
||||||
|
"enterRules": "Adja meg a szabály tartalmát, soronként egyet",
|
||||||
|
"import": "Importálás",
|
||||||
|
"importFailed": "Importálás sikertelen",
|
||||||
|
"importSuccess": "Importálás sikeres",
|
||||||
|
"importYaml": "YAML importálása",
|
||||||
|
"importYamlDescription": "Szabályok importálása YAML fájlból, a rendszer automatikusan létrehozza a szabálycsoportokat a politikai csoportnevek alapján",
|
||||||
|
"importYamlRules": "YAML szabályok importálása",
|
||||||
|
"importing": "Importálás...",
|
||||||
|
"invalidYamlFormat": "Érvénytelen YAML formátum, hiányzik a szabályok mező",
|
||||||
|
"name": "Szabály neve",
|
||||||
|
"noValidRules": "Nincsenek érvényes szabályok",
|
||||||
|
"pleaseUploadFile": "Kérjük, töltsön fel egy YAML fájlt",
|
||||||
|
"preview": "Előnézet",
|
||||||
|
"rules": "Szabály tartalom",
|
||||||
|
"rulesFormat": "Szabály formátum: szabály típusa, egyezési tartalom, [politika], ahol a politika opcionális.\nHa a politika nincs megadva, az aktuális szabálycsoport neve automatikusan felhasználásra kerül. Példák:",
|
||||||
|
"rulesLabel": "Szabály tartalom",
|
||||||
|
"searchRule": "Szabály név keresése",
|
||||||
|
"selectFile": "Fájl kiválasztása",
|
||||||
|
"selectTags": "Válassza ki a csomópont címkéket",
|
||||||
|
"tags": "Csomópont címkék",
|
||||||
|
"tagsLabel": "Csomópont címkék",
|
||||||
|
"updateSuccess": "A szabály sikeresen frissítve"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Fiók engedélyezése",
|
"accountEnable": "Fiók engedélyezése",
|
||||||
"actions": "műveletek",
|
"actions": "műveletek",
|
||||||
|
"active": "Aktív",
|
||||||
"add": "Hozzáadás",
|
"add": "Hozzáadás",
|
||||||
"administrator": "Rendszergazda",
|
"administrator": "Rendszergazda",
|
||||||
"areaCode": "Körzetszám",
|
"areaCode": "Körzetszám",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "e-mail",
|
"email": "e-mail",
|
||||||
"enable": "Engedélyezés",
|
"enable": "Engedélyezés",
|
||||||
"expireTime": "Lejárati idő",
|
"expireTime": "Lejárati idő",
|
||||||
|
"expired": "Lejárt",
|
||||||
"expiredAt": "Lejárati dátum",
|
"expiredAt": "Lejárati dátum",
|
||||||
"failed": "Sikertelen",
|
"failed": "Sikertelen",
|
||||||
"giftAmount": "Ajándék Összeg",
|
"giftAmount": "Ajándék Összeg",
|
||||||
"giftAmountPlaceholder": "Adja meg az ajándék összegét",
|
"giftAmountPlaceholder": "Adja meg az ajándék összegét",
|
||||||
|
"inactive": "Inaktív",
|
||||||
"invalidEmailFormat": "Érvénytelen e-mail formátum",
|
"invalidEmailFormat": "Érvénytelen e-mail formátum",
|
||||||
"inviteCode": "Meghívókód",
|
"inviteCode": "Meghívókód",
|
||||||
"inviteCodePlaceholder": "Adja meg a meghívó kódot (hagyja üresen a generáláshoz)",
|
"inviteCodePlaceholder": "Adja meg a meghívó kódot (hagyja üresen a generáláshoz)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Adjon meg új jelszót (opcionális)",
|
"passwordPlaceholder": "Adjon meg új jelszót (opcionális)",
|
||||||
"permanent": "Állandó",
|
"permanent": "Állandó",
|
||||||
"pleaseEnterEmail": "Kérjük, adja meg az e-mail címet",
|
"pleaseEnterEmail": "Kérjük, adja meg az e-mail címet",
|
||||||
|
"price": "Ár",
|
||||||
"referer": "Ajánló",
|
"referer": "Ajánló",
|
||||||
"refererId": "Hivatkozó azonosító",
|
"refererId": "Hivatkozó azonosító",
|
||||||
"refererIdPlaceholder": "Adja meg az ajánló azonosítóját",
|
"refererIdPlaceholder": "Adja meg az ajánló azonosítóját",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "IP-cím keresése",
|
"searchIp": "IP-cím keresése",
|
||||||
"selectAuthType": "Válassza ki az azonosítás típusát",
|
"selectAuthType": "Válassza ki az azonosítás típusát",
|
||||||
"speedLimit": "Sebességhatár",
|
"speedLimit": "Sebességhatár",
|
||||||
|
"startTime": "Kezdési idő",
|
||||||
|
"status": "Állapot",
|
||||||
"subscription": "Előfizetés",
|
"subscription": "Előfizetés",
|
||||||
"subscriptionDetails": "Előfizetési részletek",
|
"subscriptionDetails": "Előfizetési részletek",
|
||||||
|
"subscriptionId": "Előfizetés azonosítója",
|
||||||
|
"subscriptionInfo": "Előfizetés információ",
|
||||||
"subscriptionList": "Előfizetési lista",
|
"subscriptionList": "Előfizetési lista",
|
||||||
"subscriptionLogs": "Előfizetési naplók",
|
"subscriptionLogs": "Előfizetési naplók",
|
||||||
"subscriptionName": "Előfizetés neve",
|
"subscriptionName": "Előfizetés neve",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Kereskedelmi értesítések",
|
"tradeNotifications": "Kereskedelmi értesítések",
|
||||||
"trafficLimit": "Forgalmi korlát",
|
"trafficLimit": "Forgalmi korlát",
|
||||||
"trafficLogs": "Forgalmi naplók",
|
"trafficLogs": "Forgalmi naplók",
|
||||||
|
"trafficUsage": "Forgalmi használat",
|
||||||
|
"unknown": "Ismeretlen",
|
||||||
"unlimited": "Korlátlan",
|
"unlimited": "Korlátlan",
|
||||||
"unverified": "Nem ellenőrzött",
|
"unverified": "Nem ellenőrzött",
|
||||||
"update": "Frissítés",
|
"update": "Frissítés",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Felhasználói ügynök",
|
"userAgent": "Felhasználói ügynök",
|
||||||
"userEmail": "Felhasználó e-mail",
|
"userEmail": "Felhasználó e-mail",
|
||||||
"userEmailPlaceholder": "Adja meg a felhasználó e-mail címét",
|
"userEmailPlaceholder": "Adja meg a felhasználó e-mail címét",
|
||||||
|
"userId": "Felhasználói azonosító",
|
||||||
|
"userInfo": "Felhasználói információ",
|
||||||
"userList": "Felhasználói lista",
|
"userList": "Felhasználói lista",
|
||||||
"userLogs": "Bejelentkezési előzmények",
|
"userLogs": "Bejelentkezési előzmények",
|
||||||
"userName": "Felhasználói azonosító",
|
"userName": "Felhasználói azonosító",
|
||||||
"userOrders": "Rendelések",
|
"userOrders": "Rendelések",
|
||||||
"userProfile": "Profil",
|
"userProfile": "Profil",
|
||||||
"userSubscriptions": "Előfizetések",
|
"userSubscriptions": "Előfizetések",
|
||||||
"verified": "Ellenőrzött"
|
"username": "Felhasználónév",
|
||||||
|
"verified": "Ellenőrzött",
|
||||||
|
"viewDetails": "Részletek megtekintése"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS設定",
|
"ADS Config": "ADS設定",
|
||||||
"Announcement Management": "お知らせ管理",
|
"Announcement Management": "お知らせ管理",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "アプリケーション管理",
|
||||||
"Auth Control": "認証管理",
|
"Auth Control": "認証管理",
|
||||||
"Coupon Management": "クーポン管理",
|
"Coupon Management": "クーポン管理",
|
||||||
"Dashboard": "ダッシュボード",
|
"Dashboard": "ダッシュボード",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "注文管理",
|
"Order Management": "注文管理",
|
||||||
"Payment Config": "支払い設定",
|
"Payment Config": "支払い設定",
|
||||||
"Phone Number": "電話番号",
|
"Phone Number": "電話番号",
|
||||||
|
"Rule Management": "ルール管理",
|
||||||
"Server": "サーバー",
|
"Server": "サーバー",
|
||||||
"Server Management": "サーバー管理",
|
"Server Management": "サーバー管理",
|
||||||
"Settings": "設定",
|
"Settings": "設定",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "分析中...",
|
||||||
|
"appIcon": "ルールアイコン",
|
||||||
|
"cancel": "キャンセル",
|
||||||
|
"confirm": "確認",
|
||||||
|
"confirmDelete": "削除の確認",
|
||||||
|
"create": "ルールを追加",
|
||||||
|
"createRule": "ルールを追加",
|
||||||
|
"createSuccess": "ルールが正常に作成されました",
|
||||||
|
"createdAt": "作成日時",
|
||||||
|
"delete": "削除",
|
||||||
|
"deleteSuccess": "ルールが正常に削除されました",
|
||||||
|
"deleteWarning": "このルールを削除してもよろしいですか?この操作は元に戻せません。",
|
||||||
|
"description": "ルールの説明",
|
||||||
|
"downloadTemplate": "テンプレートをダウンロード",
|
||||||
|
"edit": "編集",
|
||||||
|
"editRule": "ルールを編集",
|
||||||
|
"enable": "有効化",
|
||||||
|
"enterIconUrl": "アイコンのURLを入力またはアップロード",
|
||||||
|
"enterRuleName": "ルール名を入力",
|
||||||
|
"enterRules": "ルールの内容を入力してください(1行ごと)",
|
||||||
|
"import": "インポート",
|
||||||
|
"importFailed": "インポートに失敗しました",
|
||||||
|
"importSuccess": "インポートが成功しました",
|
||||||
|
"importYaml": "YAMLをインポート",
|
||||||
|
"importYamlDescription": "YAMLファイルからルールをインポートします。システムはポリシーグループ名に基づいてルールグループを自動的に作成します。",
|
||||||
|
"importYamlRules": "YAMLルールをインポート",
|
||||||
|
"importing": "インポート中...",
|
||||||
|
"invalidYamlFormat": "無効なYAML形式です。ルールフィールドが欠けています。",
|
||||||
|
"name": "ルール名",
|
||||||
|
"noValidRules": "有効なルールが見つかりません",
|
||||||
|
"pleaseUploadFile": "YAMLファイルをアップロードしてください",
|
||||||
|
"preview": "プレビュー",
|
||||||
|
"rules": "ルールの内容",
|
||||||
|
"rulesFormat": "ルール形式: ルールタイプ, マッチ内容, [ポリシー](ポリシーはオプションです)。\nポリシーが指定されていない場合、現在のルールグループ名が自動的に使用されます。例:",
|
||||||
|
"rulesLabel": "ルールの内容",
|
||||||
|
"searchRule": "ルール名を検索",
|
||||||
|
"selectFile": "ファイルを選択",
|
||||||
|
"selectTags": "ノードタグを選択",
|
||||||
|
"tags": "ノードタグ",
|
||||||
|
"tagsLabel": "ノードタグ",
|
||||||
|
"updateSuccess": "ルールが正常に更新されました"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "アカウント有効化",
|
"accountEnable": "アカウント有効化",
|
||||||
"actions": "アクション",
|
"actions": "アクション",
|
||||||
|
"active": "アクティブ",
|
||||||
"add": "追加",
|
"add": "追加",
|
||||||
"administrator": "管理者",
|
"administrator": "管理者",
|
||||||
"areaCode": "市外局番",
|
"areaCode": "市外局番",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "メールアドレス",
|
"email": "メールアドレス",
|
||||||
"enable": "有効",
|
"enable": "有効",
|
||||||
"expireTime": "有効期限",
|
"expireTime": "有効期限",
|
||||||
|
"expired": "期限切れ",
|
||||||
"expiredAt": "有効期限",
|
"expiredAt": "有効期限",
|
||||||
"failed": "失敗しました",
|
"failed": "失敗しました",
|
||||||
"giftAmount": "ギフト金額",
|
"giftAmount": "ギフト金額",
|
||||||
"giftAmountPlaceholder": "ギフト金額を入力してください",
|
"giftAmountPlaceholder": "ギフト金額を入力してください",
|
||||||
|
"inactive": "非アクティブ",
|
||||||
"invalidEmailFormat": "無効なメール形式です",
|
"invalidEmailFormat": "無効なメール形式です",
|
||||||
"inviteCode": "招待コード",
|
"inviteCode": "招待コード",
|
||||||
"inviteCodePlaceholder": "招待コードを入力してください(生成するには空白のままにしてください)",
|
"inviteCodePlaceholder": "招待コードを入力してください(生成するには空白のままにしてください)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "新しいパスワードを入力してください(任意)",
|
"passwordPlaceholder": "新しいパスワードを入力してください(任意)",
|
||||||
"permanent": "永久",
|
"permanent": "永久",
|
||||||
"pleaseEnterEmail": "メールアドレスを入力してください",
|
"pleaseEnterEmail": "メールアドレスを入力してください",
|
||||||
|
"price": "価格",
|
||||||
"referer": "推薦者",
|
"referer": "推薦者",
|
||||||
"refererId": "リファラーID",
|
"refererId": "リファラーID",
|
||||||
"refererIdPlaceholder": "紹介者IDを入力してください",
|
"refererIdPlaceholder": "紹介者IDを入力してください",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "IPアドレスを検索",
|
"searchIp": "IPアドレスを検索",
|
||||||
"selectAuthType": "認証タイプを選択",
|
"selectAuthType": "認証タイプを選択",
|
||||||
"speedLimit": "速度制限",
|
"speedLimit": "速度制限",
|
||||||
|
"startTime": "開始時間",
|
||||||
|
"status": "ステータス",
|
||||||
"subscription": "サブスクリプション",
|
"subscription": "サブスクリプション",
|
||||||
"subscriptionDetails": "サブスクリプションの詳細",
|
"subscriptionDetails": "サブスクリプションの詳細",
|
||||||
|
"subscriptionId": "サブスクリプションID",
|
||||||
|
"subscriptionInfo": "サブスクリプション情報",
|
||||||
"subscriptionList": "購読リスト",
|
"subscriptionList": "購読リスト",
|
||||||
"subscriptionLogs": "サブスクリプションログ",
|
"subscriptionLogs": "サブスクリプションログ",
|
||||||
"subscriptionName": "サブスクリプション名",
|
"subscriptionName": "サブスクリプション名",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "取引通知",
|
"tradeNotifications": "取引通知",
|
||||||
"trafficLimit": "トラフィック制限",
|
"trafficLimit": "トラフィック制限",
|
||||||
"trafficLogs": "トラフィックログ",
|
"trafficLogs": "トラフィックログ",
|
||||||
|
"trafficUsage": "トラフィック使用量",
|
||||||
|
"unknown": "不明",
|
||||||
"unlimited": "無制限",
|
"unlimited": "無制限",
|
||||||
"unverified": "未確認",
|
"unverified": "未確認",
|
||||||
"update": "更新",
|
"update": "更新",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "ユーザーエージェント",
|
"userAgent": "ユーザーエージェント",
|
||||||
"userEmail": "ユーザーのメール",
|
"userEmail": "ユーザーのメール",
|
||||||
"userEmailPlaceholder": "ユーザーのメールアドレスを入力してください",
|
"userEmailPlaceholder": "ユーザーのメールアドレスを入力してください",
|
||||||
|
"userId": "ユーザーID",
|
||||||
|
"userInfo": "ユーザー情報",
|
||||||
"userList": "ユーザーリスト",
|
"userList": "ユーザーリスト",
|
||||||
"userLogs": "ログイン履歴",
|
"userLogs": "ログイン履歴",
|
||||||
"userName": "ユーザー識別子",
|
"userName": "ユーザー識別子",
|
||||||
"userOrders": "注文",
|
"userOrders": "注文",
|
||||||
"userProfile": "プロフィール",
|
"userProfile": "プロフィール",
|
||||||
"userSubscriptions": "サブスクリプション",
|
"userSubscriptions": "サブスクリプション",
|
||||||
"verified": "確認済み"
|
"username": "ユーザー名",
|
||||||
|
"verified": "確認済み",
|
||||||
|
"viewDetails": "詳細を見る"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS 구성",
|
"ADS Config": "ADS 구성",
|
||||||
"Announcement Management": "공지 관리",
|
"Announcement Management": "공지 관리",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "애플리케이션 관리",
|
||||||
"Auth Control": "인증 제어",
|
"Auth Control": "인증 제어",
|
||||||
"Coupon Management": "쿠폰 관리",
|
"Coupon Management": "쿠폰 관리",
|
||||||
"Dashboard": "대시보드",
|
"Dashboard": "대시보드",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "주문 관리",
|
"Order Management": "주문 관리",
|
||||||
"Payment Config": "결제 구성",
|
"Payment Config": "결제 구성",
|
||||||
"Phone Number": "전화번호",
|
"Phone Number": "전화번호",
|
||||||
|
"Rule Management": "규칙 관리",
|
||||||
"Server": "서버",
|
"Server": "서버",
|
||||||
"Server Management": "서버 관리",
|
"Server Management": "서버 관리",
|
||||||
"Settings": "설정",
|
"Settings": "설정",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "분석 중...",
|
||||||
|
"appIcon": "규칙 아이콘",
|
||||||
|
"cancel": "취소",
|
||||||
|
"confirm": "확인",
|
||||||
|
"confirmDelete": "삭제 확인",
|
||||||
|
"create": "규칙 추가",
|
||||||
|
"createRule": "규칙 추가",
|
||||||
|
"createSuccess": "규칙이 성공적으로 생성되었습니다",
|
||||||
|
"createdAt": "생성일",
|
||||||
|
"delete": "삭제",
|
||||||
|
"deleteSuccess": "규칙이 성공적으로 삭제되었습니다",
|
||||||
|
"deleteWarning": "이 규칙을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
|
||||||
|
"description": "규칙 설명",
|
||||||
|
"downloadTemplate": "템플릿 다운로드",
|
||||||
|
"edit": "편집",
|
||||||
|
"editRule": "규칙 편집",
|
||||||
|
"enable": "활성화",
|
||||||
|
"enterIconUrl": "아이콘 URL을 입력하거나 업로드하세요",
|
||||||
|
"enterRuleName": "규칙 이름을 입력하세요",
|
||||||
|
"enterRules": "규칙 내용을 입력하세요, 한 줄에 하나씩",
|
||||||
|
"import": "가져오기",
|
||||||
|
"importFailed": "가져오기에 실패했습니다",
|
||||||
|
"importSuccess": "가져오기가 성공적으로 완료되었습니다",
|
||||||
|
"importYaml": "YAML 가져오기",
|
||||||
|
"importYamlDescription": "YAML 파일에서 규칙을 가져오며, 시스템이 정책 그룹 이름에 따라 규칙 그룹을 자동으로 생성합니다",
|
||||||
|
"importYamlRules": "YAML 규칙 가져오기",
|
||||||
|
"importing": "가져오는 중...",
|
||||||
|
"invalidYamlFormat": "잘못된 YAML 형식, 규칙 필드가 누락되었습니다",
|
||||||
|
"name": "규칙 이름",
|
||||||
|
"noValidRules": "유효한 규칙이 없습니다",
|
||||||
|
"pleaseUploadFile": "YAML 파일을 업로드해 주세요",
|
||||||
|
"preview": "미리보기",
|
||||||
|
"rules": "규칙 내용",
|
||||||
|
"rulesFormat": "규칙 형식: 규칙 유형, 일치하는 내용, [정책], 여기서 정책은 선택 사항입니다.\n정책이 지정되지 않으면 현재 규칙 그룹 이름이 자동으로 사용됩니다. 예시:",
|
||||||
|
"rulesLabel": "규칙 내용",
|
||||||
|
"searchRule": "규칙 이름 검색",
|
||||||
|
"selectFile": "파일 선택",
|
||||||
|
"selectTags": "노드 태그 선택",
|
||||||
|
"tags": "노드 태그",
|
||||||
|
"tagsLabel": "노드 태그",
|
||||||
|
"updateSuccess": "규칙이 성공적으로 업데이트되었습니다"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "계정 활성화",
|
"accountEnable": "계정 활성화",
|
||||||
"actions": "작업",
|
"actions": "작업",
|
||||||
|
"active": "활성",
|
||||||
"add": "추가",
|
"add": "추가",
|
||||||
"administrator": "관리자",
|
"administrator": "관리자",
|
||||||
"areaCode": "지역 코드",
|
"areaCode": "지역 코드",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "이메일",
|
"email": "이메일",
|
||||||
"enable": "사용",
|
"enable": "사용",
|
||||||
"expireTime": "만료 시간",
|
"expireTime": "만료 시간",
|
||||||
|
"expired": "만료됨",
|
||||||
"expiredAt": "만료일",
|
"expiredAt": "만료일",
|
||||||
"failed": "실패",
|
"failed": "실패",
|
||||||
"giftAmount": "선물 금액",
|
"giftAmount": "선물 금액",
|
||||||
"giftAmountPlaceholder": "선물 금액 입력",
|
"giftAmountPlaceholder": "선물 금액 입력",
|
||||||
|
"inactive": "비활성",
|
||||||
"invalidEmailFormat": "잘못된 이메일 형식입니다",
|
"invalidEmailFormat": "잘못된 이메일 형식입니다",
|
||||||
"inviteCode": "초대 코드",
|
"inviteCode": "초대 코드",
|
||||||
"inviteCodePlaceholder": "초대 코드를 입력하세요 (생성을 원하시면 비워두세요)",
|
"inviteCodePlaceholder": "초대 코드를 입력하세요 (생성을 원하시면 비워두세요)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "새 비밀번호 입력 (선택 사항)",
|
"passwordPlaceholder": "새 비밀번호 입력 (선택 사항)",
|
||||||
"permanent": "영구적인",
|
"permanent": "영구적인",
|
||||||
"pleaseEnterEmail": "이메일을 입력하세요",
|
"pleaseEnterEmail": "이메일을 입력하세요",
|
||||||
|
"price": "가격",
|
||||||
"referer": "추천인",
|
"referer": "추천인",
|
||||||
"refererId": "추천인 ID",
|
"refererId": "추천인 ID",
|
||||||
"refererIdPlaceholder": "추천인 ID를 입력하세요",
|
"refererIdPlaceholder": "추천인 ID를 입력하세요",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "IP 주소 검색",
|
"searchIp": "IP 주소 검색",
|
||||||
"selectAuthType": "인증 유형 선택",
|
"selectAuthType": "인증 유형 선택",
|
||||||
"speedLimit": "속도 제한",
|
"speedLimit": "속도 제한",
|
||||||
|
"startTime": "시작 시간",
|
||||||
|
"status": "상태",
|
||||||
"subscription": "구독",
|
"subscription": "구독",
|
||||||
"subscriptionDetails": "구독 세부 정보",
|
"subscriptionDetails": "구독 세부 정보",
|
||||||
|
"subscriptionId": "구독 ID",
|
||||||
|
"subscriptionInfo": "구독 정보",
|
||||||
"subscriptionList": "구독 목록",
|
"subscriptionList": "구독 목록",
|
||||||
"subscriptionLogs": "구독 로그",
|
"subscriptionLogs": "구독 로그",
|
||||||
"subscriptionName": "구독 이름",
|
"subscriptionName": "구독 이름",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "거래 알림",
|
"tradeNotifications": "거래 알림",
|
||||||
"trafficLimit": "트래픽 제한",
|
"trafficLimit": "트래픽 제한",
|
||||||
"trafficLogs": "트래픽 로그",
|
"trafficLogs": "트래픽 로그",
|
||||||
|
"trafficUsage": "트래픽 사용량",
|
||||||
|
"unknown": "알 수 없음",
|
||||||
"unlimited": "무제한",
|
"unlimited": "무제한",
|
||||||
"unverified": "확인되지 않음",
|
"unverified": "확인되지 않음",
|
||||||
"update": "업데이트",
|
"update": "업데이트",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "사용자 에이전트",
|
"userAgent": "사용자 에이전트",
|
||||||
"userEmail": "사용자 이메일",
|
"userEmail": "사용자 이메일",
|
||||||
"userEmailPlaceholder": "사용자 이메일 입력",
|
"userEmailPlaceholder": "사용자 이메일 입력",
|
||||||
|
"userId": "사용자 ID",
|
||||||
|
"userInfo": "사용자 정보",
|
||||||
"userList": "사용자 목록",
|
"userList": "사용자 목록",
|
||||||
"userLogs": "로그인 기록",
|
"userLogs": "로그인 기록",
|
||||||
"userName": "사용자 식별자",
|
"userName": "사용자 식별자",
|
||||||
"userOrders": "주문",
|
"userOrders": "주문",
|
||||||
"userProfile": "프로필",
|
"userProfile": "프로필",
|
||||||
"userSubscriptions": "구독",
|
"userSubscriptions": "구독",
|
||||||
"verified": "검증됨"
|
"username": "사용자 이름",
|
||||||
|
"verified": "검증됨",
|
||||||
|
"viewDetails": "세부 정보 보기"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS-konfigurasjon",
|
"ADS Config": "ADS-konfigurasjon",
|
||||||
"Announcement Management": "Kunngjøringsadministrasjon",
|
"Announcement Management": "Kunngjøringsadministrasjon",
|
||||||
"Apple": "Apple-ID",
|
"Apple": "Apple-ID",
|
||||||
|
"Application Management": "Applikasjonsadministrasjon",
|
||||||
"Auth Control": "Autentiseringskontroll",
|
"Auth Control": "Autentiseringskontroll",
|
||||||
"Coupon Management": "Kupongadministrasjon",
|
"Coupon Management": "Kupongadministrasjon",
|
||||||
"Dashboard": "Dashbord",
|
"Dashboard": "Dashbord",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Bestillingsadministrasjon",
|
"Order Management": "Bestillingsadministrasjon",
|
||||||
"Payment Config": "Betalingskonfigurasjon",
|
"Payment Config": "Betalingskonfigurasjon",
|
||||||
"Phone Number": "Telefonnummer",
|
"Phone Number": "Telefonnummer",
|
||||||
|
"Rule Management": "Regeladministrasjon",
|
||||||
"Server": "Tjeneste",
|
"Server": "Tjeneste",
|
||||||
"Server Management": "Serveradministrasjon",
|
"Server Management": "Serveradministrasjon",
|
||||||
"Settings": "Innstillinger",
|
"Settings": "Innstillinger",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analyserer...",
|
||||||
|
"appIcon": "Regelikon",
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"confirm": "Bekreft",
|
||||||
|
"confirmDelete": "Bekreft sletting",
|
||||||
|
"create": "Legg til regel",
|
||||||
|
"createRule": "Legg til regel",
|
||||||
|
"createSuccess": "Regel opprettet med suksess",
|
||||||
|
"createdAt": "Opprettet den",
|
||||||
|
"delete": "Slett",
|
||||||
|
"deleteSuccess": "Regel slettet med suksess",
|
||||||
|
"deleteWarning": "Er du sikker på at du vil slette denne regelen? Denne handlingen kan ikke angres.",
|
||||||
|
"description": "Regelbeskrivelse",
|
||||||
|
"downloadTemplate": "Last ned mal",
|
||||||
|
"edit": "Rediger",
|
||||||
|
"editRule": "Rediger regel",
|
||||||
|
"enable": "Aktiver",
|
||||||
|
"enterIconUrl": "Skriv inn eller last opp et ikon",
|
||||||
|
"enterRuleName": "Skriv inn regelnavn",
|
||||||
|
"enterRules": "Skriv inn regelinnhold, en per linje",
|
||||||
|
"import": "Importer",
|
||||||
|
"importFailed": "Import mislyktes",
|
||||||
|
"importSuccess": "Import vellykket",
|
||||||
|
"importYaml": "Importer YAML",
|
||||||
|
"importYamlDescription": "Importer regler fra YAML-fil, systemet vil automatisk opprette regelgrupper basert på policygruppens navn",
|
||||||
|
"importYamlRules": "Importer YAML-regler",
|
||||||
|
"importing": "Importer...",
|
||||||
|
"invalidYamlFormat": "Ugyldig YAML-format, mangler reglerfelt",
|
||||||
|
"name": "Regelnavn",
|
||||||
|
"noValidRules": "Ingen gyldige regler funnet",
|
||||||
|
"pleaseUploadFile": "Vennligst last opp en YAML-fil",
|
||||||
|
"preview": "Forhåndsvisning",
|
||||||
|
"rules": "Regelinnhold",
|
||||||
|
"rulesFormat": "Regelformat: regeltype, matchinnhold, [policy], der policy er valgfritt.\nHvis policy ikke er spesifisert, vil det nåværende regelgruppens navn bli brukt automatisk. Eksempler:",
|
||||||
|
"rulesLabel": "Regelinnhold",
|
||||||
|
"searchRule": "Søk etter regelnavn",
|
||||||
|
"selectFile": "Velg fil",
|
||||||
|
"selectTags": "Velg nodetagger",
|
||||||
|
"tags": "Nodetagger",
|
||||||
|
"tagsLabel": "Nodetagger",
|
||||||
|
"updateSuccess": "Regel oppdatert med suksess"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Aktiver konto",
|
"accountEnable": "Aktiver konto",
|
||||||
"actions": "handlinger",
|
"actions": "handlinger",
|
||||||
|
"active": "Aktiv",
|
||||||
"add": "Legg til",
|
"add": "Legg til",
|
||||||
"administrator": "Administrator",
|
"administrator": "Administrator",
|
||||||
"areaCode": "Retningsnummer",
|
"areaCode": "Retningsnummer",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "e-post",
|
"email": "e-post",
|
||||||
"enable": "Aktiver",
|
"enable": "Aktiver",
|
||||||
"expireTime": "Utløpstid",
|
"expireTime": "Utløpstid",
|
||||||
|
"expired": "Utgått",
|
||||||
"expiredAt": "Utløpt Dato",
|
"expiredAt": "Utløpt Dato",
|
||||||
"failed": "Mislyktes",
|
"failed": "Mislyktes",
|
||||||
"giftAmount": "Gavebeløp",
|
"giftAmount": "Gavebeløp",
|
||||||
"giftAmountPlaceholder": "Skriv inn gavebeløp",
|
"giftAmountPlaceholder": "Skriv inn gavebeløp",
|
||||||
|
"inactive": "Inaktiv",
|
||||||
"invalidEmailFormat": "Ugyldig e-postformat",
|
"invalidEmailFormat": "Ugyldig e-postformat",
|
||||||
"inviteCode": "Invitasjonskode",
|
"inviteCode": "Invitasjonskode",
|
||||||
"inviteCodePlaceholder": "Skriv inn invitasjonskode (la stå tom for å generere)",
|
"inviteCodePlaceholder": "Skriv inn invitasjonskode (la stå tom for å generere)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Skriv inn nytt passord (valgfritt)",
|
"passwordPlaceholder": "Skriv inn nytt passord (valgfritt)",
|
||||||
"permanent": "Permanent",
|
"permanent": "Permanent",
|
||||||
"pleaseEnterEmail": "Vennligst skriv inn e-post",
|
"pleaseEnterEmail": "Vennligst skriv inn e-post",
|
||||||
|
"price": "Pris",
|
||||||
"referer": "Henviser",
|
"referer": "Henviser",
|
||||||
"refererId": "Henvisnings-ID",
|
"refererId": "Henvisnings-ID",
|
||||||
"refererIdPlaceholder": "Skriv inn referanse-ID",
|
"refererIdPlaceholder": "Skriv inn referanse-ID",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Søk IP-adresse",
|
"searchIp": "Søk IP-adresse",
|
||||||
"selectAuthType": "Velg autentiseringstype",
|
"selectAuthType": "Velg autentiseringstype",
|
||||||
"speedLimit": "Fartsgrense",
|
"speedLimit": "Fartsgrense",
|
||||||
|
"startTime": "Starttid",
|
||||||
|
"status": "Status",
|
||||||
"subscription": "Abonnement",
|
"subscription": "Abonnement",
|
||||||
"subscriptionDetails": "Abonnementsdetaljer",
|
"subscriptionDetails": "Abonnementsdetaljer",
|
||||||
|
"subscriptionId": "Abonnements-ID",
|
||||||
|
"subscriptionInfo": "Abonnementsinformasjon",
|
||||||
"subscriptionList": "Abonnementsliste",
|
"subscriptionList": "Abonnementsliste",
|
||||||
"subscriptionLogs": "Abonnementslogger",
|
"subscriptionLogs": "Abonnementslogger",
|
||||||
"subscriptionName": "Abonnementsnavn",
|
"subscriptionName": "Abonnementsnavn",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Handelsvarsler",
|
"tradeNotifications": "Handelsvarsler",
|
||||||
"trafficLimit": "Trafikkgrense",
|
"trafficLimit": "Trafikkgrense",
|
||||||
"trafficLogs": "Trafikklogger",
|
"trafficLogs": "Trafikklogger",
|
||||||
|
"trafficUsage": "Trafikkbruk",
|
||||||
|
"unknown": "Ukjent",
|
||||||
"unlimited": "Ubegrenset",
|
"unlimited": "Ubegrenset",
|
||||||
"unverified": "Ubekreftet",
|
"unverified": "Ubekreftet",
|
||||||
"update": "Oppdater",
|
"update": "Oppdater",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Brukeragent",
|
"userAgent": "Brukeragent",
|
||||||
"userEmail": "Brukerens e-post",
|
"userEmail": "Brukerens e-post",
|
||||||
"userEmailPlaceholder": "Skriv inn brukers e-post",
|
"userEmailPlaceholder": "Skriv inn brukers e-post",
|
||||||
|
"userId": "Bruker-ID",
|
||||||
|
"userInfo": "Brukerinfo",
|
||||||
"userList": "Brukerliste",
|
"userList": "Brukerliste",
|
||||||
"userLogs": "Innloggingshistorikk",
|
"userLogs": "Innloggingshistorikk",
|
||||||
"userName": "Brukeridentifikator",
|
"userName": "Brukeridentifikator",
|
||||||
"userOrders": "Bestillinger",
|
"userOrders": "Bestillinger",
|
||||||
"userProfile": "Profil",
|
"userProfile": "Profil",
|
||||||
"userSubscriptions": "Abonnementer",
|
"userSubscriptions": "Abonnementer",
|
||||||
"verified": "Verifisert"
|
"username": "Brukernavn",
|
||||||
|
"verified": "Verifisert",
|
||||||
|
"viewDetails": "Vis detaljer"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Konfiguracja ADS",
|
"ADS Config": "Konfiguracja ADS",
|
||||||
"Announcement Management": "Zarządzanie ogłoszeniami",
|
"Announcement Management": "Zarządzanie ogłoszeniami",
|
||||||
"Apple": "Identyfikator Apple",
|
"Apple": "Identyfikator Apple",
|
||||||
|
"Application Management": "Zarządzanie aplikacjami",
|
||||||
"Auth Control": "Kontrola autoryzacji",
|
"Auth Control": "Kontrola autoryzacji",
|
||||||
"Coupon Management": "Zarządzanie kuponami",
|
"Coupon Management": "Zarządzanie kuponami",
|
||||||
"Dashboard": "Pulpit",
|
"Dashboard": "Pulpit",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Zarządzanie zamówieniami",
|
"Order Management": "Zarządzanie zamówieniami",
|
||||||
"Payment Config": "Konfiguracja płatności",
|
"Payment Config": "Konfiguracja płatności",
|
||||||
"Phone Number": "Numer telefonu",
|
"Phone Number": "Numer telefonu",
|
||||||
|
"Rule Management": "Zarządzanie regułami",
|
||||||
"Server": "Serwer",
|
"Server": "Serwer",
|
||||||
"Server Management": "Zarządzanie serwerem",
|
"Server Management": "Zarządzanie serwerem",
|
||||||
"Settings": "Ustawienia",
|
"Settings": "Ustawienia",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analizowanie...",
|
||||||
|
"appIcon": "Ikona Reguły",
|
||||||
|
"cancel": "Anuluj",
|
||||||
|
"confirm": "Potwierdź",
|
||||||
|
"confirmDelete": "Potwierdź usunięcie",
|
||||||
|
"create": "Dodaj Regułę",
|
||||||
|
"createRule": "Dodaj Regułę",
|
||||||
|
"createSuccess": "Reguła została pomyślnie utworzona",
|
||||||
|
"createdAt": "Utworzono",
|
||||||
|
"delete": "Usuń",
|
||||||
|
"deleteSuccess": "Reguła została pomyślnie usunięta",
|
||||||
|
"deleteWarning": "Czy na pewno chcesz usunąć tę regułę? Ta akcja nie może być cofnięta.",
|
||||||
|
"description": "Opis Reguły",
|
||||||
|
"downloadTemplate": "Pobierz Szablon",
|
||||||
|
"edit": "Edytuj",
|
||||||
|
"editRule": "Edytuj Regułę",
|
||||||
|
"enable": "Włącz",
|
||||||
|
"enterIconUrl": "Wprowadź lub prześlij ikonę",
|
||||||
|
"enterRuleName": "Wprowadź nazwę reguły",
|
||||||
|
"enterRules": "Wprowadź treść reguły, jedna na linię",
|
||||||
|
"import": "Importuj",
|
||||||
|
"importFailed": "Import nie powiódł się",
|
||||||
|
"importSuccess": "Import zakończony sukcesem",
|
||||||
|
"importYaml": "Importuj YAML",
|
||||||
|
"importYamlDescription": "Importuj reguły z pliku YAML, system automatycznie utworzy grupy reguł na podstawie nazw grup polityk",
|
||||||
|
"importYamlRules": "Importuj Reguły YAML",
|
||||||
|
"importing": "Importowanie...",
|
||||||
|
"invalidYamlFormat": "Nieprawidłowy format YAML, brak pola reguł",
|
||||||
|
"name": "Nazwa Reguły",
|
||||||
|
"noValidRules": "Nie znaleziono prawidłowych reguł",
|
||||||
|
"pleaseUploadFile": "Proszę przesłać plik YAML",
|
||||||
|
"preview": "Podgląd",
|
||||||
|
"rules": "Treść Reguły",
|
||||||
|
"rulesFormat": "Format reguły: typ reguły, treść dopasowania, [polityka], gdzie polityka jest opcjonalna.\nJeśli polityka nie jest określona, aktualna nazwa grupy reguł zostanie użyta automatycznie. Przykłady:",
|
||||||
|
"rulesLabel": "Treść Reguły",
|
||||||
|
"searchRule": "Szukaj nazwy reguły",
|
||||||
|
"selectFile": "Wybierz Plik",
|
||||||
|
"selectTags": "Wybierz tagi węzła",
|
||||||
|
"tags": "Tagi Węzła",
|
||||||
|
"tagsLabel": "Tagi Węzła",
|
||||||
|
"updateSuccess": "Reguła została pomyślnie zaktualizowana"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Aktywacja konta",
|
"accountEnable": "Aktywacja konta",
|
||||||
"actions": "działania",
|
"actions": "działania",
|
||||||
|
"active": "Aktywny",
|
||||||
"add": "Dodaj",
|
"add": "Dodaj",
|
||||||
"administrator": "Administrator",
|
"administrator": "Administrator",
|
||||||
"areaCode": "Kod obszaru",
|
"areaCode": "Kod obszaru",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "e-mail",
|
"email": "e-mail",
|
||||||
"enable": "Włącz",
|
"enable": "Włącz",
|
||||||
"expireTime": "Czas wygaśnięcia",
|
"expireTime": "Czas wygaśnięcia",
|
||||||
|
"expired": "Wygasły",
|
||||||
"expiredAt": "Data wygaśnięcia",
|
"expiredAt": "Data wygaśnięcia",
|
||||||
"failed": "Niepowodzenie",
|
"failed": "Niepowodzenie",
|
||||||
"giftAmount": "Kwota Prezentu",
|
"giftAmount": "Kwota Prezentu",
|
||||||
"giftAmountPlaceholder": "Wprowadź kwotę prezentu",
|
"giftAmountPlaceholder": "Wprowadź kwotę prezentu",
|
||||||
|
"inactive": "Nieaktywny",
|
||||||
"invalidEmailFormat": "Nieprawidłowy format adresu e-mail",
|
"invalidEmailFormat": "Nieprawidłowy format adresu e-mail",
|
||||||
"inviteCode": "Kod zaproszenia",
|
"inviteCode": "Kod zaproszenia",
|
||||||
"inviteCodePlaceholder": "Wprowadź kod zaproszenia (pozostaw puste, aby wygenerować)",
|
"inviteCodePlaceholder": "Wprowadź kod zaproszenia (pozostaw puste, aby wygenerować)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Wprowadź nowe hasło (opcjonalnie)",
|
"passwordPlaceholder": "Wprowadź nowe hasło (opcjonalnie)",
|
||||||
"permanent": "Stały",
|
"permanent": "Stały",
|
||||||
"pleaseEnterEmail": "Proszę wprowadzić adres e-mail",
|
"pleaseEnterEmail": "Proszę wprowadzić adres e-mail",
|
||||||
|
"price": "Cena",
|
||||||
"referer": "Polecający",
|
"referer": "Polecający",
|
||||||
"refererId": "Identyfikator polecającego",
|
"refererId": "Identyfikator polecającego",
|
||||||
"refererIdPlaceholder": "Wprowadź identyfikator polecającego",
|
"refererIdPlaceholder": "Wprowadź identyfikator polecającego",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Wyszukaj adres IP",
|
"searchIp": "Wyszukaj adres IP",
|
||||||
"selectAuthType": "Wybierz typ uwierzytelniania",
|
"selectAuthType": "Wybierz typ uwierzytelniania",
|
||||||
"speedLimit": "Ograniczenie prędkości",
|
"speedLimit": "Ograniczenie prędkości",
|
||||||
|
"startTime": "Czas rozpoczęcia",
|
||||||
|
"status": "Status",
|
||||||
"subscription": "Subskrypcja",
|
"subscription": "Subskrypcja",
|
||||||
"subscriptionDetails": "Szczegóły subskrypcji",
|
"subscriptionDetails": "Szczegóły subskrypcji",
|
||||||
|
"subscriptionId": "ID subskrypcji",
|
||||||
|
"subscriptionInfo": "Informacje o subskrypcji",
|
||||||
"subscriptionList": "Lista subskrypcji",
|
"subscriptionList": "Lista subskrypcji",
|
||||||
"subscriptionLogs": "Dzienniki subskrypcji",
|
"subscriptionLogs": "Dzienniki subskrypcji",
|
||||||
"subscriptionName": "Nazwa subskrypcji",
|
"subscriptionName": "Nazwa subskrypcji",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Powiadomienia o transakcjach",
|
"tradeNotifications": "Powiadomienia o transakcjach",
|
||||||
"trafficLimit": "Limit ruchu",
|
"trafficLimit": "Limit ruchu",
|
||||||
"trafficLogs": "Dzienniki Ruchu",
|
"trafficLogs": "Dzienniki Ruchu",
|
||||||
|
"trafficUsage": "Zużycie ruchu",
|
||||||
|
"unknown": "Nieznany",
|
||||||
"unlimited": "Nieograniczony",
|
"unlimited": "Nieograniczony",
|
||||||
"unverified": "Niezweryfikowane",
|
"unverified": "Niezweryfikowane",
|
||||||
"update": "Aktualizuj",
|
"update": "Aktualizuj",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Agent użytkownika",
|
"userAgent": "Agent użytkownika",
|
||||||
"userEmail": "Email użytkownika",
|
"userEmail": "Email użytkownika",
|
||||||
"userEmailPlaceholder": "Wprowadź adres e-mail użytkownika",
|
"userEmailPlaceholder": "Wprowadź adres e-mail użytkownika",
|
||||||
|
"userId": "ID użytkownika",
|
||||||
|
"userInfo": "Informacje o użytkowniku",
|
||||||
"userList": "Lista użytkowników",
|
"userList": "Lista użytkowników",
|
||||||
"userLogs": "Historia logowania",
|
"userLogs": "Historia logowania",
|
||||||
"userName": "Identyfikator użytkownika",
|
"userName": "Identyfikator użytkownika",
|
||||||
"userOrders": "Zamówienia",
|
"userOrders": "Zamówienia",
|
||||||
"userProfile": "Profil",
|
"userProfile": "Profil",
|
||||||
"userSubscriptions": "Subskrypcje",
|
"userSubscriptions": "Subskrypcje",
|
||||||
"verified": "Zweryfikowano"
|
"username": "Nazwa użytkownika",
|
||||||
|
"verified": "Zweryfikowano",
|
||||||
|
"viewDetails": "Zobacz szczegóły"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Configuração ADS",
|
"ADS Config": "Configuração ADS",
|
||||||
"Announcement Management": "Gerenciamento de Anúncios",
|
"Announcement Management": "Gerenciamento de Anúncios",
|
||||||
"Apple": "ID Apple",
|
"Apple": "ID Apple",
|
||||||
|
"Application Management": "Gerenciamento de Aplicativos",
|
||||||
"Auth Control": "Controle de Autenticação",
|
"Auth Control": "Controle de Autenticação",
|
||||||
"Coupon Management": "Gerenciamento de Cupons",
|
"Coupon Management": "Gerenciamento de Cupons",
|
||||||
"Dashboard": "Painel de Controle",
|
"Dashboard": "Painel de Controle",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Gerenciamento de Pedidos",
|
"Order Management": "Gerenciamento de Pedidos",
|
||||||
"Payment Config": "Configuração de Pagamento",
|
"Payment Config": "Configuração de Pagamento",
|
||||||
"Phone Number": "Número de Telefone",
|
"Phone Number": "Número de Telefone",
|
||||||
|
"Rule Management": "Gerenciamento de Regras",
|
||||||
"Server": "Servidor",
|
"Server": "Servidor",
|
||||||
"Server Management": "Gerenciamento de Servidor",
|
"Server Management": "Gerenciamento de Servidor",
|
||||||
"Settings": "Configurações",
|
"Settings": "Configurações",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analisando...",
|
||||||
|
"appIcon": "Ícone da Regra",
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"confirmDelete": "Confirmar Exclusão",
|
||||||
|
"create": "Adicionar Regra",
|
||||||
|
"createRule": "Adicionar Regra",
|
||||||
|
"createSuccess": "Regra criada com sucesso",
|
||||||
|
"createdAt": "Criado Em",
|
||||||
|
"delete": "Excluir",
|
||||||
|
"deleteSuccess": "Regra excluída com sucesso",
|
||||||
|
"deleteWarning": "Você tem certeza de que deseja excluir esta regra? Esta ação não pode ser desfeita.",
|
||||||
|
"description": "Descrição da Regra",
|
||||||
|
"downloadTemplate": "Baixar Modelo",
|
||||||
|
"edit": "Editar",
|
||||||
|
"editRule": "Editar Regra",
|
||||||
|
"enable": "Habilitar",
|
||||||
|
"enterIconUrl": "Insira ou faça upload de um ícone",
|
||||||
|
"enterRuleName": "Insira o nome da regra",
|
||||||
|
"enterRules": "Insira o conteúdo da regra, um por linha",
|
||||||
|
"import": "Importar",
|
||||||
|
"importFailed": "Falha na importação",
|
||||||
|
"importSuccess": "Importação bem-sucedida",
|
||||||
|
"importYaml": "Importar YAML",
|
||||||
|
"importYamlDescription": "Importar regras de um arquivo YAML, o sistema criará automaticamente grupos de regras com base nos nomes dos grupos de políticas",
|
||||||
|
"importYamlRules": "Importar Regras YAML",
|
||||||
|
"importing": "Importando...",
|
||||||
|
"invalidYamlFormat": "Formato YAML inválido, campo de regras ausente",
|
||||||
|
"name": "Nome da Regra",
|
||||||
|
"noValidRules": "Nenhuma regra válida encontrada",
|
||||||
|
"pleaseUploadFile": "Por favor, faça upload de um arquivo YAML",
|
||||||
|
"preview": "Pré-visualização",
|
||||||
|
"rules": "Conteúdo da Regra",
|
||||||
|
"rulesFormat": "Formato da regra: tipo de regra, conteúdo de correspondência, [política], onde a política é opcional.\nSe a política não for especificada, o nome do grupo de regras atual será usado automaticamente. Exemplos:",
|
||||||
|
"rulesLabel": "Conteúdo da Regra",
|
||||||
|
"searchRule": "Pesquisar nome da regra",
|
||||||
|
"selectFile": "Selecionar Arquivo",
|
||||||
|
"selectTags": "Selecionar tags de nó",
|
||||||
|
"tags": "Tags de Nó",
|
||||||
|
"tagsLabel": "Tags de Nó",
|
||||||
|
"updateSuccess": "Regra atualizada com sucesso"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Habilitar Conta",
|
"accountEnable": "Habilitar Conta",
|
||||||
"actions": "ações",
|
"actions": "ações",
|
||||||
|
"active": "Ativo",
|
||||||
"add": "Adicionar",
|
"add": "Adicionar",
|
||||||
"administrator": "Administrador",
|
"administrator": "Administrador",
|
||||||
"areaCode": "Código de Área",
|
"areaCode": "Código de Área",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "e-mail",
|
"email": "e-mail",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"expireTime": "Tempo de Expiração",
|
"expireTime": "Tempo de Expiração",
|
||||||
|
"expired": "Expirado",
|
||||||
"expiredAt": "Expirado Em",
|
"expiredAt": "Expirado Em",
|
||||||
"failed": "Falhou",
|
"failed": "Falhou",
|
||||||
"giftAmount": "Valor do Presente",
|
"giftAmount": "Valor do Presente",
|
||||||
"giftAmountPlaceholder": "Insira o valor do presente",
|
"giftAmountPlaceholder": "Insira o valor do presente",
|
||||||
|
"inactive": "Inativo",
|
||||||
"invalidEmailFormat": "Formato de e-mail inválido",
|
"invalidEmailFormat": "Formato de e-mail inválido",
|
||||||
"inviteCode": "Código de Convite",
|
"inviteCode": "Código de Convite",
|
||||||
"inviteCodePlaceholder": "Digite o código de convite (deixe em branco para gerar)",
|
"inviteCodePlaceholder": "Digite o código de convite (deixe em branco para gerar)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Digite a nova senha (opcional)",
|
"passwordPlaceholder": "Digite a nova senha (opcional)",
|
||||||
"permanent": "Permanente",
|
"permanent": "Permanente",
|
||||||
"pleaseEnterEmail": "Por favor, insira o e-mail",
|
"pleaseEnterEmail": "Por favor, insira o e-mail",
|
||||||
|
"price": "Preço",
|
||||||
"referer": "Referente",
|
"referer": "Referente",
|
||||||
"refererId": "ID do Referente",
|
"refererId": "ID do Referente",
|
||||||
"refererIdPlaceholder": "Digite o ID do referenciador",
|
"refererIdPlaceholder": "Digite o ID do referenciador",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Pesquisar endereço IP",
|
"searchIp": "Pesquisar endereço IP",
|
||||||
"selectAuthType": "Selecione o tipo de autenticação",
|
"selectAuthType": "Selecione o tipo de autenticação",
|
||||||
"speedLimit": "Limite de Velocidade",
|
"speedLimit": "Limite de Velocidade",
|
||||||
|
"startTime": "Hora de Início",
|
||||||
|
"status": "Status",
|
||||||
"subscription": "Assinatura",
|
"subscription": "Assinatura",
|
||||||
"subscriptionDetails": "Detalhes da Assinatura",
|
"subscriptionDetails": "Detalhes da Assinatura",
|
||||||
|
"subscriptionId": "ID da Assinatura",
|
||||||
|
"subscriptionInfo": "Informações da Assinatura",
|
||||||
"subscriptionList": "Lista de Assinaturas",
|
"subscriptionList": "Lista de Assinaturas",
|
||||||
"subscriptionLogs": "Registros de Assinatura",
|
"subscriptionLogs": "Registros de Assinatura",
|
||||||
"subscriptionName": "Nome da Assinatura",
|
"subscriptionName": "Nome da Assinatura",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Notificações de Comércio",
|
"tradeNotifications": "Notificações de Comércio",
|
||||||
"trafficLimit": "Limite de Tráfego",
|
"trafficLimit": "Limite de Tráfego",
|
||||||
"trafficLogs": "Registros de Tráfego",
|
"trafficLogs": "Registros de Tráfego",
|
||||||
|
"trafficUsage": "Uso de Tráfego",
|
||||||
|
"unknown": "Desconhecido",
|
||||||
"unlimited": "Ilimitado",
|
"unlimited": "Ilimitado",
|
||||||
"unverified": "Não verificado",
|
"unverified": "Não verificado",
|
||||||
"update": "Atualizar",
|
"update": "Atualizar",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Agente do Usuário",
|
"userAgent": "Agente do Usuário",
|
||||||
"userEmail": "E-mail do Usuário",
|
"userEmail": "E-mail do Usuário",
|
||||||
"userEmailPlaceholder": "Digite o e-mail do usuário",
|
"userEmailPlaceholder": "Digite o e-mail do usuário",
|
||||||
|
"userId": "ID do Usuário",
|
||||||
|
"userInfo": "Informações do Usuário",
|
||||||
"userList": "Lista de Usuários",
|
"userList": "Lista de Usuários",
|
||||||
"userLogs": "Histórico de Login",
|
"userLogs": "Histórico de Login",
|
||||||
"userName": "Identificador do Usuário",
|
"userName": "Identificador do Usuário",
|
||||||
"userOrders": "Pedidos",
|
"userOrders": "Pedidos",
|
||||||
"userProfile": "Perfil",
|
"userProfile": "Perfil",
|
||||||
"userSubscriptions": "Assinaturas",
|
"userSubscriptions": "Assinaturas",
|
||||||
"verified": "Verificado"
|
"username": "Nome de Usuário",
|
||||||
|
"verified": "Verificado",
|
||||||
|
"viewDetails": "Ver Detalhes"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export default getRequestConfig(async () => {
|
|||||||
'payment': (await import(`./${locale}/payment.json`)).default,
|
'payment': (await import(`./${locale}/payment.json`)).default,
|
||||||
'server': (await import(`./${locale}/server.json`)).default,
|
'server': (await import(`./${locale}/server.json`)).default,
|
||||||
'subscribe': (await import(`./${locale}/subscribe.json`)).default,
|
'subscribe': (await import(`./${locale}/subscribe.json`)).default,
|
||||||
|
'rules': (await import(`./${locale}/rules.json`)).default,
|
||||||
'order': (await import(`./${locale}/order.json`)).default,
|
'order': (await import(`./${locale}/order.json`)).default,
|
||||||
'coupon': (await import(`./${locale}/coupon.json`)).default,
|
'coupon': (await import(`./${locale}/coupon.json`)).default,
|
||||||
'user': (await import(`./${locale}/user.json`)).default,
|
'user': (await import(`./${locale}/user.json`)).default,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Configurație ADS",
|
"ADS Config": "Configurație ADS",
|
||||||
"Announcement Management": "Managementul Anunțurilor",
|
"Announcement Management": "Managementul Anunțurilor",
|
||||||
"Apple": "ID Apple",
|
"Apple": "ID Apple",
|
||||||
|
"Application Management": "Gestionarea aplicațiilor",
|
||||||
"Auth Control": "Control Autentificare",
|
"Auth Control": "Control Autentificare",
|
||||||
"Coupon Management": "Managementul Cuponului",
|
"Coupon Management": "Managementul Cuponului",
|
||||||
"Dashboard": "Tablou de bord",
|
"Dashboard": "Tablou de bord",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Gestionarea comenzilor",
|
"Order Management": "Gestionarea comenzilor",
|
||||||
"Payment Config": "Configurație Plată",
|
"Payment Config": "Configurație Plată",
|
||||||
"Phone Number": "Număr de telefon",
|
"Phone Number": "Număr de telefon",
|
||||||
|
"Rule Management": "Gestionarea regulilor",
|
||||||
"Server": "Serviciu",
|
"Server": "Serviciu",
|
||||||
"Server Management": "Managementul serverului",
|
"Server Management": "Managementul serverului",
|
||||||
"Settings": "Setări",
|
"Settings": "Setări",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Se analizează...",
|
||||||
|
"appIcon": "Iconiță Regulă",
|
||||||
|
"cancel": "Anulează",
|
||||||
|
"confirm": "Confirmă",
|
||||||
|
"confirmDelete": "Confirmă Ștergerea",
|
||||||
|
"create": "Adaugă Regulă",
|
||||||
|
"createRule": "Adaugă Regulă",
|
||||||
|
"createSuccess": "Regula a fost creată cu succes",
|
||||||
|
"createdAt": "Creat La",
|
||||||
|
"delete": "Șterge",
|
||||||
|
"deleteSuccess": "Regula a fost ștersă cu succes",
|
||||||
|
"deleteWarning": "Ești sigur că vrei să ștergi această regulă? Această acțiune nu poate fi anulată.",
|
||||||
|
"description": "Descrierea Regulii",
|
||||||
|
"downloadTemplate": "Descarcă Șablon",
|
||||||
|
"edit": "Editează",
|
||||||
|
"editRule": "Editează Regulă",
|
||||||
|
"enable": "Activează",
|
||||||
|
"enterIconUrl": "Introdu sau încarcă o iconiță",
|
||||||
|
"enterRuleName": "Introdu numele regulii",
|
||||||
|
"enterRules": "Introdu conținutul regulii, câte una pe linie",
|
||||||
|
"import": "Importă",
|
||||||
|
"importFailed": "Importul a eșuat",
|
||||||
|
"importSuccess": "Importul a fost realizat cu succes",
|
||||||
|
"importYaml": "Importă YAML",
|
||||||
|
"importYamlDescription": "Importă reguli din fișier YAML, sistemul va crea automat grupuri de reguli pe baza numelui grupului de politici",
|
||||||
|
"importYamlRules": "Importă Reguli YAML",
|
||||||
|
"importing": "Se importă...",
|
||||||
|
"invalidYamlFormat": "Format YAML invalid, lipsă câmp reguli",
|
||||||
|
"name": "Numele Regulii",
|
||||||
|
"noValidRules": "Nu au fost găsite reguli valide",
|
||||||
|
"pleaseUploadFile": "Te rugăm să încarci un fișier YAML",
|
||||||
|
"preview": "Previzualizare",
|
||||||
|
"rules": "Conținutul Regulii",
|
||||||
|
"rulesFormat": "Formatul regulii: tip regulă, conținut de potrivire, [politică], unde politica este opțională.\nDacă politica nu este specificată, numele grupului de reguli curent va fi folosit automat. Exemple:",
|
||||||
|
"rulesLabel": "Conținutul Regulii",
|
||||||
|
"searchRule": "Caută numele regulii",
|
||||||
|
"selectFile": "Selectează Fișier",
|
||||||
|
"selectTags": "Selectează etichetele nodului",
|
||||||
|
"tags": "Etichete Nod",
|
||||||
|
"tagsLabel": "Etichete Nod",
|
||||||
|
"updateSuccess": "Regula a fost actualizată cu succes"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Activare Cont",
|
"accountEnable": "Activare Cont",
|
||||||
"actions": "acțiuni",
|
"actions": "acțiuni",
|
||||||
|
"active": "Activ",
|
||||||
"add": "Adaugă",
|
"add": "Adaugă",
|
||||||
"administrator": "Administrator",
|
"administrator": "Administrator",
|
||||||
"areaCode": "Prefix telefonic",
|
"areaCode": "Prefix telefonic",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "e-mail",
|
"email": "e-mail",
|
||||||
"enable": "Activare",
|
"enable": "Activare",
|
||||||
"expireTime": "Timp de expirare",
|
"expireTime": "Timp de expirare",
|
||||||
|
"expired": "Expirat",
|
||||||
"expiredAt": "Expiră la",
|
"expiredAt": "Expiră la",
|
||||||
"failed": "Eșuat",
|
"failed": "Eșuat",
|
||||||
"giftAmount": "Sumă Cadou",
|
"giftAmount": "Sumă Cadou",
|
||||||
"giftAmountPlaceholder": "Introduceți suma cadoului",
|
"giftAmountPlaceholder": "Introduceți suma cadoului",
|
||||||
|
"inactive": "Inactiv",
|
||||||
"invalidEmailFormat": "Format de email invalid",
|
"invalidEmailFormat": "Format de email invalid",
|
||||||
"inviteCode": "Cod de invitație",
|
"inviteCode": "Cod de invitație",
|
||||||
"inviteCodePlaceholder": "Introduceți codul de invitație (lăsați necompletat pentru a genera)",
|
"inviteCodePlaceholder": "Introduceți codul de invitație (lăsați necompletat pentru a genera)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Introduceți o parolă nouă (opțional)",
|
"passwordPlaceholder": "Introduceți o parolă nouă (opțional)",
|
||||||
"permanent": "Permanent",
|
"permanent": "Permanent",
|
||||||
"pleaseEnterEmail": "Vă rugăm să introduceți adresa de email",
|
"pleaseEnterEmail": "Vă rugăm să introduceți adresa de email",
|
||||||
|
"price": "Preț",
|
||||||
"referer": "Referent",
|
"referer": "Referent",
|
||||||
"refererId": "ID Referent",
|
"refererId": "ID Referent",
|
||||||
"refererIdPlaceholder": "Introduceți ID-ul referentului",
|
"refererIdPlaceholder": "Introduceți ID-ul referentului",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Caută adresa IP",
|
"searchIp": "Caută adresa IP",
|
||||||
"selectAuthType": "Selectați tipul de autentificare",
|
"selectAuthType": "Selectați tipul de autentificare",
|
||||||
"speedLimit": "Limită de viteză",
|
"speedLimit": "Limită de viteză",
|
||||||
|
"startTime": "Timp de început",
|
||||||
|
"status": "Stare",
|
||||||
"subscription": "Abonament",
|
"subscription": "Abonament",
|
||||||
"subscriptionDetails": "Detalii abonament",
|
"subscriptionDetails": "Detalii abonament",
|
||||||
|
"subscriptionId": "ID Abonament",
|
||||||
|
"subscriptionInfo": "Informații Abonament",
|
||||||
"subscriptionList": "Listă de abonamente",
|
"subscriptionList": "Listă de abonamente",
|
||||||
"subscriptionLogs": "Jurnale de abonament",
|
"subscriptionLogs": "Jurnale de abonament",
|
||||||
"subscriptionName": "Numele Abonamentului",
|
"subscriptionName": "Numele Abonamentului",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Notificări de tranzacționare",
|
"tradeNotifications": "Notificări de tranzacționare",
|
||||||
"trafficLimit": "Limită de trafic",
|
"trafficLimit": "Limită de trafic",
|
||||||
"trafficLogs": "Jurnale de trafic",
|
"trafficLogs": "Jurnale de trafic",
|
||||||
|
"trafficUsage": "Utilizare Trafic",
|
||||||
|
"unknown": "Necunoscut",
|
||||||
"unlimited": "Nelimitat",
|
"unlimited": "Nelimitat",
|
||||||
"unverified": "Neverificat",
|
"unverified": "Neverificat",
|
||||||
"update": "Actualizare",
|
"update": "Actualizare",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Agent Utilizator",
|
"userAgent": "Agent Utilizator",
|
||||||
"userEmail": "Email utilizator",
|
"userEmail": "Email utilizator",
|
||||||
"userEmailPlaceholder": "Introduceți emailul utilizatorului",
|
"userEmailPlaceholder": "Introduceți emailul utilizatorului",
|
||||||
|
"userId": "ID Utilizator",
|
||||||
|
"userInfo": "Informații Utilizator",
|
||||||
"userList": "Lista utilizatorilor",
|
"userList": "Lista utilizatorilor",
|
||||||
"userLogs": "Istoricul autentificărilor",
|
"userLogs": "Istoricul autentificărilor",
|
||||||
"userName": "Identificator Utilizator",
|
"userName": "Identificator Utilizator",
|
||||||
"userOrders": "Comenzi",
|
"userOrders": "Comenzi",
|
||||||
"userProfile": "Profil",
|
"userProfile": "Profil",
|
||||||
"userSubscriptions": "Abonamente",
|
"userSubscriptions": "Abonamente",
|
||||||
"verified": "Verificat"
|
"username": "Nume Utilizator",
|
||||||
|
"verified": "Verificat",
|
||||||
|
"viewDetails": "Vezi Detalii"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Конфигурация ADS",
|
"ADS Config": "Конфигурация ADS",
|
||||||
"Announcement Management": "Управление объявлениями",
|
"Announcement Management": "Управление объявлениями",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "Управление приложениями",
|
||||||
"Auth Control": "Управление аутентификацией",
|
"Auth Control": "Управление аутентификацией",
|
||||||
"Coupon Management": "Управление купонами",
|
"Coupon Management": "Управление купонами",
|
||||||
"Dashboard": "Панель управления",
|
"Dashboard": "Панель управления",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Управление заказами",
|
"Order Management": "Управление заказами",
|
||||||
"Payment Config": "Настройки оплаты",
|
"Payment Config": "Настройки оплаты",
|
||||||
"Phone Number": "Номер телефона",
|
"Phone Number": "Номер телефона",
|
||||||
|
"Rule Management": "Управление правилами",
|
||||||
"Server": "Сервер",
|
"Server": "Сервер",
|
||||||
"Server Management": "Управление сервером",
|
"Server Management": "Управление сервером",
|
||||||
"Settings": "Настройки",
|
"Settings": "Настройки",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Анализирую...",
|
||||||
|
"appIcon": "Иконка правила",
|
||||||
|
"cancel": "Отмена",
|
||||||
|
"confirm": "Подтвердить",
|
||||||
|
"confirmDelete": "Подтвердите удаление",
|
||||||
|
"create": "Добавить правило",
|
||||||
|
"createRule": "Добавить правило",
|
||||||
|
"createSuccess": "Правило успешно создано",
|
||||||
|
"createdAt": "Создано",
|
||||||
|
"delete": "Удалить",
|
||||||
|
"deleteSuccess": "Правило успешно удалено",
|
||||||
|
"deleteWarning": "Вы уверены, что хотите удалить это правило? Это действие нельзя отменить.",
|
||||||
|
"description": "Описание правила",
|
||||||
|
"downloadTemplate": "Скачать шаблон",
|
||||||
|
"edit": "Редактировать",
|
||||||
|
"editRule": "Редактировать правило",
|
||||||
|
"enable": "Включить",
|
||||||
|
"enterIconUrl": "Введите или загрузите иконку",
|
||||||
|
"enterRuleName": "Введите имя правила",
|
||||||
|
"enterRules": "Введите содержание правила, по одному на строку",
|
||||||
|
"import": "Импортировать",
|
||||||
|
"importFailed": "Ошибка импорта",
|
||||||
|
"importSuccess": "Импорт успешен",
|
||||||
|
"importYaml": "Импортировать YAML",
|
||||||
|
"importYamlDescription": "Импорт правил из файла YAML, система автоматически создаст группы правил на основе имен групп политик",
|
||||||
|
"importYamlRules": "Импортировать правила YAML",
|
||||||
|
"importing": "Импортирую...",
|
||||||
|
"invalidYamlFormat": "Неверный формат YAML, отсутствует поле правил",
|
||||||
|
"name": "Имя правила",
|
||||||
|
"noValidRules": "Не найдено действительных правил",
|
||||||
|
"pleaseUploadFile": "Пожалуйста, загрузите файл YAML",
|
||||||
|
"preview": "Предварительный просмотр",
|
||||||
|
"rules": "Содержание правила",
|
||||||
|
"rulesFormat": "Формат правила: тип правила, содержание совпадения, [политика], где политика является необязательной.\nЕсли политика не указана, будет автоматически использовано текущее имя группы правил. Примеры:",
|
||||||
|
"rulesLabel": "Содержание правила",
|
||||||
|
"searchRule": "Поиск имени правила",
|
||||||
|
"selectFile": "Выбрать файл",
|
||||||
|
"selectTags": "Выбрать теги узлов",
|
||||||
|
"tags": "Теги узлов",
|
||||||
|
"tagsLabel": "Теги узлов",
|
||||||
|
"updateSuccess": "Правило успешно обновлено"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Включение аккаунта",
|
"accountEnable": "Включение аккаунта",
|
||||||
"actions": "действия",
|
"actions": "действия",
|
||||||
|
"active": "Активный",
|
||||||
"add": "Добавить",
|
"add": "Добавить",
|
||||||
"administrator": "Администратор",
|
"administrator": "Администратор",
|
||||||
"areaCode": "Код региона",
|
"areaCode": "Код региона",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "Электронная почта",
|
"email": "Электронная почта",
|
||||||
"enable": "Включить",
|
"enable": "Включить",
|
||||||
"expireTime": "Время истечения",
|
"expireTime": "Время истечения",
|
||||||
|
"expired": "Истекший",
|
||||||
"expiredAt": "Срок действия истек",
|
"expiredAt": "Срок действия истек",
|
||||||
"failed": "Не удалось",
|
"failed": "Не удалось",
|
||||||
"giftAmount": "Сумма подарка",
|
"giftAmount": "Сумма подарка",
|
||||||
"giftAmountPlaceholder": "Введите сумму подарка",
|
"giftAmountPlaceholder": "Введите сумму подарка",
|
||||||
|
"inactive": "Неактивный",
|
||||||
"invalidEmailFormat": "Неверный формат электронной почты",
|
"invalidEmailFormat": "Неверный формат электронной почты",
|
||||||
"inviteCode": "Код приглашения",
|
"inviteCode": "Код приглашения",
|
||||||
"inviteCodePlaceholder": "Введите код приглашения (оставьте пустым для генерации)",
|
"inviteCodePlaceholder": "Введите код приглашения (оставьте пустым для генерации)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Введите новый пароль (необязательно)",
|
"passwordPlaceholder": "Введите новый пароль (необязательно)",
|
||||||
"permanent": "Постоянный",
|
"permanent": "Постоянный",
|
||||||
"pleaseEnterEmail": "Пожалуйста, введите адрес электронной почты",
|
"pleaseEnterEmail": "Пожалуйста, введите адрес электронной почты",
|
||||||
|
"price": "Цена",
|
||||||
"referer": "Реферер",
|
"referer": "Реферер",
|
||||||
"refererId": "ID реферера",
|
"refererId": "ID реферера",
|
||||||
"refererIdPlaceholder": "Введите ID реферера",
|
"refererIdPlaceholder": "Введите ID реферера",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Поиск IP-адреса",
|
"searchIp": "Поиск IP-адреса",
|
||||||
"selectAuthType": "Выберите тип аутентификации",
|
"selectAuthType": "Выберите тип аутентификации",
|
||||||
"speedLimit": "Ограничение скорости",
|
"speedLimit": "Ограничение скорости",
|
||||||
|
"startTime": "Время начала",
|
||||||
|
"status": "Статус",
|
||||||
"subscription": "Подписка",
|
"subscription": "Подписка",
|
||||||
"subscriptionDetails": "Детали подписки",
|
"subscriptionDetails": "Детали подписки",
|
||||||
|
"subscriptionId": "ID подписки",
|
||||||
|
"subscriptionInfo": "Информация о подписке",
|
||||||
"subscriptionList": "Список подписок",
|
"subscriptionList": "Список подписок",
|
||||||
"subscriptionLogs": "Журналы подписки",
|
"subscriptionLogs": "Журналы подписки",
|
||||||
"subscriptionName": "Название подписки",
|
"subscriptionName": "Название подписки",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Уведомления о торговле",
|
"tradeNotifications": "Уведомления о торговле",
|
||||||
"trafficLimit": "Лимит трафика",
|
"trafficLimit": "Лимит трафика",
|
||||||
"trafficLogs": "Журналы трафика",
|
"trafficLogs": "Журналы трафика",
|
||||||
|
"trafficUsage": "Использование трафика",
|
||||||
|
"unknown": "Неизвестно",
|
||||||
"unlimited": "Неограниченный",
|
"unlimited": "Неограниченный",
|
||||||
"unverified": "Неподтверждено",
|
"unverified": "Неподтверждено",
|
||||||
"update": "Обновить",
|
"update": "Обновить",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Пользовательский агент",
|
"userAgent": "Пользовательский агент",
|
||||||
"userEmail": "Электронная почта пользователя",
|
"userEmail": "Электронная почта пользователя",
|
||||||
"userEmailPlaceholder": "Введите электронную почту пользователя",
|
"userEmailPlaceholder": "Введите электронную почту пользователя",
|
||||||
|
"userId": "ID пользователя",
|
||||||
|
"userInfo": "Информация о пользователе",
|
||||||
"userList": "Список пользователей",
|
"userList": "Список пользователей",
|
||||||
"userLogs": "История входов",
|
"userLogs": "История входов",
|
||||||
"userName": "Идентификатор пользователя",
|
"userName": "Идентификатор пользователя",
|
||||||
"userOrders": "Заказы",
|
"userOrders": "Заказы",
|
||||||
"userProfile": "Профиль",
|
"userProfile": "Профиль",
|
||||||
"userSubscriptions": "Подписки",
|
"userSubscriptions": "Подписки",
|
||||||
"verified": "Проверено"
|
"username": "Имя пользователя",
|
||||||
|
"verified": "Проверено",
|
||||||
|
"viewDetails": "Просмотреть детали"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "การตั้งค่า ADS",
|
"ADS Config": "การตั้งค่า ADS",
|
||||||
"Announcement Management": "การจัดการประกาศ",
|
"Announcement Management": "การจัดการประกาศ",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "การจัดการแอปพลิเคชัน",
|
||||||
"Auth Control": "การควบคุมการยืนยันตัวตน",
|
"Auth Control": "การควบคุมการยืนยันตัวตน",
|
||||||
"Coupon Management": "การจัดการคูปอง",
|
"Coupon Management": "การจัดการคูปอง",
|
||||||
"Dashboard": "แดชบอร์ด",
|
"Dashboard": "แดชบอร์ด",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "การจัดการคำสั่งซื้อ",
|
"Order Management": "การจัดการคำสั่งซื้อ",
|
||||||
"Payment Config": "การตั้งค่าการชำระเงิน",
|
"Payment Config": "การตั้งค่าการชำระเงิน",
|
||||||
"Phone Number": "หมายเลขโทรศัพท์",
|
"Phone Number": "หมายเลขโทรศัพท์",
|
||||||
|
"Rule Management": "การจัดการกฎ",
|
||||||
"Server": "เซิร์ฟเวอร์",
|
"Server": "เซิร์ฟเวอร์",
|
||||||
"Server Management": "การจัดการเซิร์ฟเวอร์",
|
"Server Management": "การจัดการเซิร์ฟเวอร์",
|
||||||
"Settings": "การตั้งค่า",
|
"Settings": "การตั้งค่า",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "กำลังวิเคราะห์...",
|
||||||
|
"appIcon": "ไอคอนกฎ",
|
||||||
|
"cancel": "ยกเลิก",
|
||||||
|
"confirm": "ยืนยัน",
|
||||||
|
"confirmDelete": "ยืนยันการลบ",
|
||||||
|
"create": "เพิ่มกฎ",
|
||||||
|
"createRule": "เพิ่มกฎ",
|
||||||
|
"createSuccess": "สร้างกฎเรียบร้อยแล้ว",
|
||||||
|
"createdAt": "สร้างเมื่อ",
|
||||||
|
"delete": "ลบ",
|
||||||
|
"deleteSuccess": "ลบกฎเรียบร้อยแล้ว",
|
||||||
|
"deleteWarning": "คุณแน่ใจหรือว่าต้องการลบกฎนี้? การกระทำนี้ไม่สามารถย้อนกลับได้.",
|
||||||
|
"description": "คำอธิบายกฎ",
|
||||||
|
"downloadTemplate": "ดาวน์โหลดเทมเพลต",
|
||||||
|
"edit": "แก้ไข",
|
||||||
|
"editRule": "แก้ไขกฎ",
|
||||||
|
"enable": "เปิดใช้งาน",
|
||||||
|
"enterIconUrl": "กรอกหรืออัปโหลดไอคอน",
|
||||||
|
"enterRuleName": "กรอกชื่อกฎ",
|
||||||
|
"enterRules": "กรอกเนื้อหากฎ, หนึ่งกฎต่อหนึ่งบรรทัด",
|
||||||
|
"import": "นำเข้า",
|
||||||
|
"importFailed": "นำเข้าล้มเหลว",
|
||||||
|
"importSuccess": "นำเข้าสำเร็จ",
|
||||||
|
"importYaml": "นำเข้า YAML",
|
||||||
|
"importYamlDescription": "นำเข้ากฎจากไฟล์ YAML, ระบบจะสร้างกลุ่มกฎโดยอัตโนมัติตามชื่อกลุ่มนโยบาย",
|
||||||
|
"importYamlRules": "นำเข้ากฎ YAML",
|
||||||
|
"importing": "กำลังนำเข้า...",
|
||||||
|
"invalidYamlFormat": "รูปแบบ YAML ไม่ถูกต้อง, ขาดฟิลด์กฎ",
|
||||||
|
"name": "ชื่อกฎ",
|
||||||
|
"noValidRules": "ไม่พบกฎที่ถูกต้อง",
|
||||||
|
"pleaseUploadFile": "กรุณาอัปโหลดไฟล์ YAML",
|
||||||
|
"preview": "ตัวอย่าง",
|
||||||
|
"rules": "เนื้อหากฎ",
|
||||||
|
"rulesFormat": "รูปแบบกฎ: ประเภทกฎ, เนื้อหาที่ตรงกัน, [นโยบาย], โดยที่นโยบายเป็นทางเลือก.\nหากไม่ได้ระบุนโยบาย, ชื่อกลุ่มกฎปัจจุบันจะถูกใช้โดยอัตโนมัติ. ตัวอย่าง:",
|
||||||
|
"rulesLabel": "เนื้อหากฎ",
|
||||||
|
"searchRule": "ค้นหาชื่อกฎ",
|
||||||
|
"selectFile": "เลือกไฟล์",
|
||||||
|
"selectTags": "เลือกแท็กโหนด",
|
||||||
|
"tags": "แท็กโหนด",
|
||||||
|
"tagsLabel": "แท็กโหนด",
|
||||||
|
"updateSuccess": "อัปเดตกฎเรียบร้อยแล้ว"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "เปิดใช้งานบัญชี",
|
"accountEnable": "เปิดใช้งานบัญชี",
|
||||||
"actions": "การดำเนินการ",
|
"actions": "การดำเนินการ",
|
||||||
|
"active": "ใช้งาน",
|
||||||
"add": "เพิ่ม",
|
"add": "เพิ่ม",
|
||||||
"administrator": "ผู้ดูแลระบบ",
|
"administrator": "ผู้ดูแลระบบ",
|
||||||
"areaCode": "รหัสพื้นที่",
|
"areaCode": "รหัสพื้นที่",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "อีเมล",
|
"email": "อีเมล",
|
||||||
"enable": "เปิดใช้งาน",
|
"enable": "เปิดใช้งาน",
|
||||||
"expireTime": "เวลาหมดอายุ",
|
"expireTime": "เวลาหมดอายุ",
|
||||||
|
"expired": "หมดอายุ",
|
||||||
"expiredAt": "วันหมดอายุ",
|
"expiredAt": "วันหมดอายุ",
|
||||||
"failed": "ล้มเหลว",
|
"failed": "ล้มเหลว",
|
||||||
"giftAmount": "จำนวนเงินของขวัญ",
|
"giftAmount": "จำนวนเงินของขวัญ",
|
||||||
"giftAmountPlaceholder": "กรอกจำนวนเงินของขวัญ",
|
"giftAmountPlaceholder": "กรอกจำนวนเงินของขวัญ",
|
||||||
|
"inactive": "ไม่ใช้งาน",
|
||||||
"invalidEmailFormat": "รูปแบบอีเมลไม่ถูกต้อง",
|
"invalidEmailFormat": "รูปแบบอีเมลไม่ถูกต้อง",
|
||||||
"inviteCode": "รหัสเชิญ",
|
"inviteCode": "รหัสเชิญ",
|
||||||
"inviteCodePlaceholder": "กรอกรหัสเชิญ (เว้นว่างไว้เพื่อสร้างใหม่)",
|
"inviteCodePlaceholder": "กรอกรหัสเชิญ (เว้นว่างไว้เพื่อสร้างใหม่)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "กรุณาใส่รหัสผ่านใหม่ (ไม่บังคับ)",
|
"passwordPlaceholder": "กรุณาใส่รหัสผ่านใหม่ (ไม่บังคับ)",
|
||||||
"permanent": "ถาวร",
|
"permanent": "ถาวร",
|
||||||
"pleaseEnterEmail": "กรุณาใส่อีเมล",
|
"pleaseEnterEmail": "กรุณาใส่อีเมล",
|
||||||
|
"price": "ราคา",
|
||||||
"referer": "ผู้แนะนำ",
|
"referer": "ผู้แนะนำ",
|
||||||
"refererId": "รหัสผู้แนะนำ",
|
"refererId": "รหัสผู้แนะนำ",
|
||||||
"refererIdPlaceholder": "กรอก ID ผู้แนะนำ",
|
"refererIdPlaceholder": "กรอก ID ผู้แนะนำ",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "ค้นหาที่อยู่ IP",
|
"searchIp": "ค้นหาที่อยู่ IP",
|
||||||
"selectAuthType": "เลือกประเภทการยืนยันตัวตน",
|
"selectAuthType": "เลือกประเภทการยืนยันตัวตน",
|
||||||
"speedLimit": "จำกัดความเร็ว",
|
"speedLimit": "จำกัดความเร็ว",
|
||||||
|
"startTime": "เวลาเริ่มต้น",
|
||||||
|
"status": "สถานะ",
|
||||||
"subscription": "การสมัครสมาชิก",
|
"subscription": "การสมัครสมาชิก",
|
||||||
"subscriptionDetails": "รายละเอียดการสมัครสมาชิก",
|
"subscriptionDetails": "รายละเอียดการสมัครสมาชิก",
|
||||||
|
"subscriptionId": "รหัสการสมัครสมาชิก",
|
||||||
|
"subscriptionInfo": "ข้อมูลการสมัครสมาชิก",
|
||||||
"subscriptionList": "รายการสมัครสมาชิก",
|
"subscriptionList": "รายการสมัครสมาชิก",
|
||||||
"subscriptionLogs": "บันทึกการสมัครสมาชิก",
|
"subscriptionLogs": "บันทึกการสมัครสมาชิก",
|
||||||
"subscriptionName": "ชื่อการสมัครสมาชิก",
|
"subscriptionName": "ชื่อการสมัครสมาชิก",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "การแจ้งเตือนการซื้อขาย",
|
"tradeNotifications": "การแจ้งเตือนการซื้อขาย",
|
||||||
"trafficLimit": "ขีดจำกัดการจราจร",
|
"trafficLimit": "ขีดจำกัดการจราจร",
|
||||||
"trafficLogs": "บันทึกการจราจร",
|
"trafficLogs": "บันทึกการจราจร",
|
||||||
|
"trafficUsage": "การใช้งานข้อมูล",
|
||||||
|
"unknown": "ไม่ทราบ",
|
||||||
"unlimited": "ไม่จำกัด",
|
"unlimited": "ไม่จำกัด",
|
||||||
"unverified": "ยังไม่ได้รับการยืนยัน",
|
"unverified": "ยังไม่ได้รับการยืนยัน",
|
||||||
"update": "อัปเดต",
|
"update": "อัปเดต",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "ตัวแทนผู้ใช้",
|
"userAgent": "ตัวแทนผู้ใช้",
|
||||||
"userEmail": "อีเมลผู้ใช้",
|
"userEmail": "อีเมลผู้ใช้",
|
||||||
"userEmailPlaceholder": "กรอกอีเมลผู้ใช้",
|
"userEmailPlaceholder": "กรอกอีเมลผู้ใช้",
|
||||||
|
"userId": "รหัสผู้ใช้",
|
||||||
|
"userInfo": "ข้อมูลผู้ใช้",
|
||||||
"userList": "รายชื่อผู้ใช้",
|
"userList": "รายชื่อผู้ใช้",
|
||||||
"userLogs": "ประวัติการเข้าสู่ระบบ",
|
"userLogs": "ประวัติการเข้าสู่ระบบ",
|
||||||
"userName": "ตัวระบุผู้ใช้",
|
"userName": "ตัวระบุผู้ใช้",
|
||||||
"userOrders": "คำสั่งซื้อ",
|
"userOrders": "คำสั่งซื้อ",
|
||||||
"userProfile": "โปรไฟล์",
|
"userProfile": "โปรไฟล์",
|
||||||
"userSubscriptions": "การสมัครสมาชิก",
|
"userSubscriptions": "การสมัครสมาชิก",
|
||||||
"verified": "ยืนยันแล้ว"
|
"username": "ชื่อผู้ใช้",
|
||||||
|
"verified": "ยืนยันแล้ว",
|
||||||
|
"viewDetails": "ดูรายละเอียด"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS Yapılandırması",
|
"ADS Config": "ADS Yapılandırması",
|
||||||
"Announcement Management": "Duyuru Yönetimi",
|
"Announcement Management": "Duyuru Yönetimi",
|
||||||
"Apple": "Apple Kimliği",
|
"Apple": "Apple Kimliği",
|
||||||
|
"Application Management": "Uygulama Yönetimi",
|
||||||
"Auth Control": "Yetki Kontrolü",
|
"Auth Control": "Yetki Kontrolü",
|
||||||
"Coupon Management": "Kupon Yönetimi",
|
"Coupon Management": "Kupon Yönetimi",
|
||||||
"Dashboard": "Gösterge Paneli",
|
"Dashboard": "Gösterge Paneli",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Sipariş Yönetimi",
|
"Order Management": "Sipariş Yönetimi",
|
||||||
"Payment Config": "Ödeme Yapılandırması",
|
"Payment Config": "Ödeme Yapılandırması",
|
||||||
"Phone Number": "Telefon Numarası",
|
"Phone Number": "Telefon Numarası",
|
||||||
|
"Rule Management": "Kural Yönetimi",
|
||||||
"Server": "Sunucu",
|
"Server": "Sunucu",
|
||||||
"Server Management": "Sunucu Yönetimi",
|
"Server Management": "Sunucu Yönetimi",
|
||||||
"Settings": "Ayarlar",
|
"Settings": "Ayarlar",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Analiz ediliyor...",
|
||||||
|
"appIcon": "Kural İkonu",
|
||||||
|
"cancel": "İptal",
|
||||||
|
"confirm": "Onayla",
|
||||||
|
"confirmDelete": "Silme Onayla",
|
||||||
|
"create": "Kural Ekle",
|
||||||
|
"createRule": "Kural Ekle",
|
||||||
|
"createSuccess": "Kural başarıyla oluşturuldu",
|
||||||
|
"createdAt": "Oluşturulma Tarihi",
|
||||||
|
"delete": "Sil",
|
||||||
|
"deleteSuccess": "Kural başarıyla silindi",
|
||||||
|
"deleteWarning": "Bu kuralı silmek istediğinize emin misiniz? Bu işlem geri alınamaz.",
|
||||||
|
"description": "Kural Açıklaması",
|
||||||
|
"downloadTemplate": "Şablonu İndir",
|
||||||
|
"edit": "Düzenle",
|
||||||
|
"editRule": "Kuralı Düzenle",
|
||||||
|
"enable": "Etkinleştir",
|
||||||
|
"enterIconUrl": "Bir ikon girin veya yükleyin",
|
||||||
|
"enterRuleName": "Kural adını girin",
|
||||||
|
"enterRules": "Kural içeriğini girin, her birini yeni bir satıra yazın",
|
||||||
|
"import": "İçe Aktar",
|
||||||
|
"importFailed": "İçe aktarma başarısız oldu",
|
||||||
|
"importSuccess": "İçe aktarma başarılı",
|
||||||
|
"importYaml": "YAML İçe Aktar",
|
||||||
|
"importYamlDescription": "YAML dosyasından kuralları içe aktarın, sistem otomatik olarak politika grup adlarına göre kural grupları oluşturacaktır",
|
||||||
|
"importYamlRules": "YAML Kurallarını İçe Aktar",
|
||||||
|
"importing": "İçe aktarılıyor...",
|
||||||
|
"invalidYamlFormat": "Geçersiz YAML formatı, kurallar alanı eksik",
|
||||||
|
"name": "Kural Adı",
|
||||||
|
"noValidRules": "Geçerli kural bulunamadı",
|
||||||
|
"pleaseUploadFile": "Lütfen bir YAML dosyası yükleyin",
|
||||||
|
"preview": "Önizleme",
|
||||||
|
"rules": "Kural İçeriği",
|
||||||
|
"rulesFormat": "Kural formatı: kural türü, eşleşme içeriği,[politika], burada politika isteğe bağlıdır.\nEğer politika belirtilmemişse, mevcut kural grup adı otomatik olarak kullanılacaktır. Örnekler:",
|
||||||
|
"rulesLabel": "Kural İçeriği",
|
||||||
|
"searchRule": "Kural adını ara",
|
||||||
|
"selectFile": "Dosya Seç",
|
||||||
|
"selectTags": "Düğüm etiketlerini seç",
|
||||||
|
"tags": "Düğüm Etiketleri",
|
||||||
|
"tagsLabel": "Düğüm Etiketleri",
|
||||||
|
"updateSuccess": "Kural başarıyla güncellendi"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Hesap Etkinleştir",
|
"accountEnable": "Hesap Etkinleştir",
|
||||||
"actions": "eylemler",
|
"actions": "eylemler",
|
||||||
|
"active": "Aktif",
|
||||||
"add": "Ekle",
|
"add": "Ekle",
|
||||||
"administrator": "Yönetici",
|
"administrator": "Yönetici",
|
||||||
"areaCode": "Alan Kodu",
|
"areaCode": "Alan Kodu",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "e-posta",
|
"email": "e-posta",
|
||||||
"enable": "etkinleştir",
|
"enable": "etkinleştir",
|
||||||
"expireTime": "Sona Erme Zamanı",
|
"expireTime": "Sona Erme Zamanı",
|
||||||
|
"expired": "Süresi Dolmuş",
|
||||||
"expiredAt": "Son Kullanma Tarihi",
|
"expiredAt": "Son Kullanma Tarihi",
|
||||||
"failed": "Başarısız",
|
"failed": "Başarısız",
|
||||||
"giftAmount": "Hediye Miktarı",
|
"giftAmount": "Hediye Miktarı",
|
||||||
"giftAmountPlaceholder": "Hediye tutarını girin",
|
"giftAmountPlaceholder": "Hediye tutarını girin",
|
||||||
|
"inactive": "Pasif",
|
||||||
"invalidEmailFormat": "Geçersiz e-posta formatı",
|
"invalidEmailFormat": "Geçersiz e-posta formatı",
|
||||||
"inviteCode": "Davet Kodu",
|
"inviteCode": "Davet Kodu",
|
||||||
"inviteCodePlaceholder": "Davet kodunu girin (oluşturmak için boş bırakın)",
|
"inviteCodePlaceholder": "Davet kodunu girin (oluşturmak için boş bırakın)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Yeni şifreyi girin (isteğe bağlı)",
|
"passwordPlaceholder": "Yeni şifreyi girin (isteğe bağlı)",
|
||||||
"permanent": "Kalıcı",
|
"permanent": "Kalıcı",
|
||||||
"pleaseEnterEmail": "Lütfen e-posta adresinizi girin",
|
"pleaseEnterEmail": "Lütfen e-posta adresinizi girin",
|
||||||
|
"price": "Fiyat",
|
||||||
"referer": "Referans",
|
"referer": "Referans",
|
||||||
"refererId": "Referans Kimliği",
|
"refererId": "Referans Kimliği",
|
||||||
"refererIdPlaceholder": "Referans kimliğini girin",
|
"refererIdPlaceholder": "Referans kimliğini girin",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "IP adresi ara",
|
"searchIp": "IP adresi ara",
|
||||||
"selectAuthType": "Kimlik doğrulama türünü seçin",
|
"selectAuthType": "Kimlik doğrulama türünü seçin",
|
||||||
"speedLimit": "Hız Sınırı",
|
"speedLimit": "Hız Sınırı",
|
||||||
|
"startTime": "Başlangıç Zamanı",
|
||||||
|
"status": "Durum",
|
||||||
"subscription": "Abonelik",
|
"subscription": "Abonelik",
|
||||||
"subscriptionDetails": "Abonelik Ayrıntıları",
|
"subscriptionDetails": "Abonelik Ayrıntıları",
|
||||||
|
"subscriptionId": "Abonelik ID",
|
||||||
|
"subscriptionInfo": "Abonelik Bilgisi",
|
||||||
"subscriptionList": "Abonelik Listesi",
|
"subscriptionList": "Abonelik Listesi",
|
||||||
"subscriptionLogs": "Abonelik Kayıtları",
|
"subscriptionLogs": "Abonelik Kayıtları",
|
||||||
"subscriptionName": "Abonelik Adı",
|
"subscriptionName": "Abonelik Adı",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Ticaret Bildirimleri",
|
"tradeNotifications": "Ticaret Bildirimleri",
|
||||||
"trafficLimit": "Trafik Limiti",
|
"trafficLimit": "Trafik Limiti",
|
||||||
"trafficLogs": "Trafik Günlükleri",
|
"trafficLogs": "Trafik Günlükleri",
|
||||||
|
"trafficUsage": "Trafik Kullanımı",
|
||||||
|
"unknown": "Bilinmiyor",
|
||||||
"unlimited": "Sınırsız",
|
"unlimited": "Sınırsız",
|
||||||
"unverified": "Doğrulanmamış",
|
"unverified": "Doğrulanmamış",
|
||||||
"update": "Güncelle",
|
"update": "Güncelle",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Kullanıcı Aracısı",
|
"userAgent": "Kullanıcı Aracısı",
|
||||||
"userEmail": "Kullanıcı E-postası",
|
"userEmail": "Kullanıcı E-postası",
|
||||||
"userEmailPlaceholder": "Kullanıcı e-postasını girin",
|
"userEmailPlaceholder": "Kullanıcı e-postasını girin",
|
||||||
|
"userId": "Kullanıcı ID",
|
||||||
|
"userInfo": "Kullanıcı Bilgisi",
|
||||||
"userList": "Kullanıcı Listesi",
|
"userList": "Kullanıcı Listesi",
|
||||||
"userLogs": "Giriş Geçmişi",
|
"userLogs": "Giriş Geçmişi",
|
||||||
"userName": "Kullanıcı Tanımlayıcı",
|
"userName": "Kullanıcı Tanımlayıcı",
|
||||||
"userOrders": "Siparişler",
|
"userOrders": "Siparişler",
|
||||||
"userProfile": "Profil",
|
"userProfile": "Profil",
|
||||||
"userSubscriptions": "Abonelikler",
|
"userSubscriptions": "Abonelikler",
|
||||||
"verified": "Doğrulandı"
|
"username": "Kullanıcı Adı",
|
||||||
|
"verified": "Doğrulandı",
|
||||||
|
"viewDetails": "Ayrıntıları Görüntüle"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Конфігурація ADS",
|
"ADS Config": "Конфігурація ADS",
|
||||||
"Announcement Management": "Управління оголошеннями",
|
"Announcement Management": "Управління оголошеннями",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "Управління додатками",
|
||||||
"Auth Control": "Контроль автентифікації",
|
"Auth Control": "Контроль автентифікації",
|
||||||
"Coupon Management": "Управління купонами",
|
"Coupon Management": "Управління купонами",
|
||||||
"Dashboard": "Панель приладів",
|
"Dashboard": "Панель приладів",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Управління замовленнями",
|
"Order Management": "Управління замовленнями",
|
||||||
"Payment Config": "Налаштування оплати",
|
"Payment Config": "Налаштування оплати",
|
||||||
"Phone Number": "Номер телефону",
|
"Phone Number": "Номер телефону",
|
||||||
|
"Rule Management": "Управління правилами",
|
||||||
"Server": "Сервер",
|
"Server": "Сервер",
|
||||||
"Server Management": "Управління сервером",
|
"Server Management": "Управління сервером",
|
||||||
"Settings": "Налаштування",
|
"Settings": "Налаштування",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Аналізую...",
|
||||||
|
"appIcon": "Іконка правила",
|
||||||
|
"cancel": "Скасувати",
|
||||||
|
"confirm": "Підтвердити",
|
||||||
|
"confirmDelete": "Підтвердити видалення",
|
||||||
|
"create": "Додати правило",
|
||||||
|
"createRule": "Додати правило",
|
||||||
|
"createSuccess": "Правило успішно створено",
|
||||||
|
"createdAt": "Створено",
|
||||||
|
"delete": "Видалити",
|
||||||
|
"deleteSuccess": "Правило успішно видалено",
|
||||||
|
"deleteWarning": "Ви впевнені, що хочете видалити це правило? Цю дію не можна скасувати.",
|
||||||
|
"description": "Опис правила",
|
||||||
|
"downloadTemplate": "Завантажити шаблон",
|
||||||
|
"edit": "Редагувати",
|
||||||
|
"editRule": "Редагувати правило",
|
||||||
|
"enable": "Увімкнути",
|
||||||
|
"enterIconUrl": "Введіть або завантажте іконку",
|
||||||
|
"enterRuleName": "Введіть назву правила",
|
||||||
|
"enterRules": "Введіть вміст правила, по одному на рядок",
|
||||||
|
"import": "Імпортувати",
|
||||||
|
"importFailed": "Імпорт не вдався",
|
||||||
|
"importSuccess": "Імпорт успішний",
|
||||||
|
"importYaml": "Імпортувати YAML",
|
||||||
|
"importYamlDescription": "Імпортуйте правила з файлу YAML, система автоматично створить групи правил на основі назв груп політик",
|
||||||
|
"importYamlRules": "Імпортувати правила YAML",
|
||||||
|
"importing": "Імпортується...",
|
||||||
|
"invalidYamlFormat": "Неправильний формат YAML, відсутнє поле правил",
|
||||||
|
"name": "Назва правила",
|
||||||
|
"noValidRules": "Не знайдено дійсних правил",
|
||||||
|
"pleaseUploadFile": "Будь ласка, завантажте файл YAML",
|
||||||
|
"preview": "Попередній перегляд",
|
||||||
|
"rules": "Вміст правила",
|
||||||
|
"rulesFormat": "Формат правила: тип правила, вміст збігу, [політика], де політика є необов'язковою.\nЯкщо політика не вказана, автоматично буде використано назву поточної групи правил. Приклади:",
|
||||||
|
"rulesLabel": "Вміст правила",
|
||||||
|
"searchRule": "Шукати назву правила",
|
||||||
|
"selectFile": "Вибрати файл",
|
||||||
|
"selectTags": "Вибрати теги вузлів",
|
||||||
|
"tags": "Теги вузлів",
|
||||||
|
"tagsLabel": "Теги вузлів",
|
||||||
|
"updateSuccess": "Правило успішно оновлено"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Увімкнення облікового запису",
|
"accountEnable": "Увімкнення облікового запису",
|
||||||
"actions": "дії",
|
"actions": "дії",
|
||||||
|
"active": "Активний",
|
||||||
"add": "Додати",
|
"add": "Додати",
|
||||||
"administrator": "Адміністратор",
|
"administrator": "Адміністратор",
|
||||||
"areaCode": "Код регіону",
|
"areaCode": "Код регіону",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "електронна пошта",
|
"email": "електронна пошта",
|
||||||
"enable": "Увімкнути",
|
"enable": "Увімкнути",
|
||||||
"expireTime": "Час закінчення",
|
"expireTime": "Час закінчення",
|
||||||
|
"expired": "Закінчився",
|
||||||
"expiredAt": "Термін дії закінчився",
|
"expiredAt": "Термін дії закінчився",
|
||||||
"failed": "Не вдалося",
|
"failed": "Не вдалося",
|
||||||
"giftAmount": "Сума подарунка",
|
"giftAmount": "Сума подарунка",
|
||||||
"giftAmountPlaceholder": "Введіть суму подарунка",
|
"giftAmountPlaceholder": "Введіть суму подарунка",
|
||||||
|
"inactive": "Неактивний",
|
||||||
"invalidEmailFormat": "Неправильний формат електронної пошти",
|
"invalidEmailFormat": "Неправильний формат електронної пошти",
|
||||||
"inviteCode": "Код запрошення",
|
"inviteCode": "Код запрошення",
|
||||||
"inviteCodePlaceholder": "Введіть код запрошення (залиште порожнім для генерації)",
|
"inviteCodePlaceholder": "Введіть код запрошення (залиште порожнім для генерації)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Введіть новий пароль (необов'язково)",
|
"passwordPlaceholder": "Введіть новий пароль (необов'язково)",
|
||||||
"permanent": "Постійний",
|
"permanent": "Постійний",
|
||||||
"pleaseEnterEmail": "Будь ласка, введіть електронну пошту",
|
"pleaseEnterEmail": "Будь ласка, введіть електронну пошту",
|
||||||
|
"price": "Ціна",
|
||||||
"referer": "Реферер",
|
"referer": "Реферер",
|
||||||
"refererId": "Ідентифікатор реферера",
|
"refererId": "Ідентифікатор реферера",
|
||||||
"refererIdPlaceholder": "Введіть ID реферера",
|
"refererIdPlaceholder": "Введіть ID реферера",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Пошук IP-адреси",
|
"searchIp": "Пошук IP-адреси",
|
||||||
"selectAuthType": "Виберіть тип автентифікації",
|
"selectAuthType": "Виберіть тип автентифікації",
|
||||||
"speedLimit": "Обмеження швидкості",
|
"speedLimit": "Обмеження швидкості",
|
||||||
|
"startTime": "Час початку",
|
||||||
|
"status": "Статус",
|
||||||
"subscription": "Підписка",
|
"subscription": "Підписка",
|
||||||
"subscriptionDetails": "Деталі підписки",
|
"subscriptionDetails": "Деталі підписки",
|
||||||
|
"subscriptionId": "ID підписки",
|
||||||
|
"subscriptionInfo": "Інформація про підписку",
|
||||||
"subscriptionList": "Список підписок",
|
"subscriptionList": "Список підписок",
|
||||||
"subscriptionLogs": "Журнали підписки",
|
"subscriptionLogs": "Журнали підписки",
|
||||||
"subscriptionName": "Назва підписки",
|
"subscriptionName": "Назва підписки",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Сповіщення про торгівлю",
|
"tradeNotifications": "Сповіщення про торгівлю",
|
||||||
"trafficLimit": "Ліміт трафіку",
|
"trafficLimit": "Ліміт трафіку",
|
||||||
"trafficLogs": "Журнали трафіку",
|
"trafficLogs": "Журнали трафіку",
|
||||||
|
"trafficUsage": "Використання трафіку",
|
||||||
|
"unknown": "Невідомо",
|
||||||
"unlimited": "Необмежено",
|
"unlimited": "Необмежено",
|
||||||
"unverified": "Непідтверджено",
|
"unverified": "Непідтверджено",
|
||||||
"update": "Оновити",
|
"update": "Оновити",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Агент користувача",
|
"userAgent": "Агент користувача",
|
||||||
"userEmail": "Електронна пошта користувача",
|
"userEmail": "Електронна пошта користувача",
|
||||||
"userEmailPlaceholder": "Введіть електронну адресу користувача",
|
"userEmailPlaceholder": "Введіть електронну адресу користувача",
|
||||||
|
"userId": "ID користувача",
|
||||||
|
"userInfo": "Інформація про користувача",
|
||||||
"userList": "Список користувачів",
|
"userList": "Список користувачів",
|
||||||
"userLogs": "Історія входів",
|
"userLogs": "Історія входів",
|
||||||
"userName": "Ідентифікатор користувача",
|
"userName": "Ідентифікатор користувача",
|
||||||
"userOrders": "Замовлення",
|
"userOrders": "Замовлення",
|
||||||
"userProfile": "Профіль",
|
"userProfile": "Профіль",
|
||||||
"userSubscriptions": "Підписки",
|
"userSubscriptions": "Підписки",
|
||||||
"verified": "Перевірено"
|
"username": "Ім'я користувача",
|
||||||
|
"verified": "Перевірено",
|
||||||
|
"viewDetails": "Переглянути деталі"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "Cấu hình ADS",
|
"ADS Config": "Cấu hình ADS",
|
||||||
"Announcement Management": "Quản lý Thông báo",
|
"Announcement Management": "Quản lý Thông báo",
|
||||||
"Apple": "ID Apple",
|
"Apple": "ID Apple",
|
||||||
|
"Application Management": "Quản lý Ứng dụng",
|
||||||
"Auth Control": "Kiểm Soát Xác Thực",
|
"Auth Control": "Kiểm Soát Xác Thực",
|
||||||
"Coupon Management": "Quản lý phiếu giảm giá",
|
"Coupon Management": "Quản lý phiếu giảm giá",
|
||||||
"Dashboard": "Bảng điều khiển",
|
"Dashboard": "Bảng điều khiển",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "Quản lý đơn hàng",
|
"Order Management": "Quản lý đơn hàng",
|
||||||
"Payment Config": "Cấu hình thanh toán",
|
"Payment Config": "Cấu hình thanh toán",
|
||||||
"Phone Number": "Số Điện Thoại",
|
"Phone Number": "Số Điện Thoại",
|
||||||
|
"Rule Management": "Quản lý Quy tắc",
|
||||||
"Server": "Dịch vụ",
|
"Server": "Dịch vụ",
|
||||||
"Server Management": "Quản lý máy chủ",
|
"Server Management": "Quản lý máy chủ",
|
||||||
"Settings": "Cài đặt",
|
"Settings": "Cài đặt",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "Đang phân tích...",
|
||||||
|
"appIcon": "Biểu tượng Quy tắc",
|
||||||
|
"cancel": "Hủy",
|
||||||
|
"confirm": "Xác nhận",
|
||||||
|
"confirmDelete": "Xác nhận Xóa",
|
||||||
|
"create": "Thêm Quy tắc",
|
||||||
|
"createRule": "Thêm Quy tắc",
|
||||||
|
"createSuccess": "Quy tắc đã được tạo thành công",
|
||||||
|
"createdAt": "Ngày Tạo",
|
||||||
|
"delete": "Xóa",
|
||||||
|
"deleteSuccess": "Quy tắc đã được xóa thành công",
|
||||||
|
"deleteWarning": "Bạn có chắc chắn muốn xóa quy tắc này không? Hành động này không thể hoàn tác.",
|
||||||
|
"description": "Mô tả Quy tắc",
|
||||||
|
"downloadTemplate": "Tải Mẫu",
|
||||||
|
"edit": "Chỉnh sửa",
|
||||||
|
"editRule": "Chỉnh sửa Quy tắc",
|
||||||
|
"enable": "Kích hoạt",
|
||||||
|
"enterIconUrl": "Nhập hoặc tải lên một biểu tượng",
|
||||||
|
"enterRuleName": "Nhập tên quy tắc",
|
||||||
|
"enterRules": "Nhập nội dung quy tắc, mỗi quy tắc một dòng",
|
||||||
|
"import": "Nhập khẩu",
|
||||||
|
"importFailed": "Nhập khẩu không thành công",
|
||||||
|
"importSuccess": "Nhập khẩu thành công",
|
||||||
|
"importYaml": "Nhập YAML",
|
||||||
|
"importYamlDescription": "Nhập quy tắc từ tệp YAML, hệ thống sẽ tự động tạo nhóm quy tắc dựa trên tên nhóm chính sách",
|
||||||
|
"importYamlRules": "Nhập Quy tắc YAML",
|
||||||
|
"importing": "Đang nhập khẩu...",
|
||||||
|
"invalidYamlFormat": "Định dạng YAML không hợp lệ, thiếu trường quy tắc",
|
||||||
|
"name": "Tên Quy tắc",
|
||||||
|
"noValidRules": "Không tìm thấy quy tắc hợp lệ",
|
||||||
|
"pleaseUploadFile": "Vui lòng tải lên một tệp YAML",
|
||||||
|
"preview": "Xem trước",
|
||||||
|
"rules": "Nội dung Quy tắc",
|
||||||
|
"rulesFormat": "Định dạng quy tắc: loại quy tắc, nội dung khớp, [chính sách], trong đó chính sách là tùy chọn.\nNếu không chỉ định chính sách, tên nhóm quy tắc hiện tại sẽ được sử dụng tự động. Ví dụ:",
|
||||||
|
"rulesLabel": "Nội dung Quy tắc",
|
||||||
|
"searchRule": "Tìm kiếm tên quy tắc",
|
||||||
|
"selectFile": "Chọn Tệp",
|
||||||
|
"selectTags": "Chọn thẻ nút",
|
||||||
|
"tags": "Thẻ Nút",
|
||||||
|
"tagsLabel": "Thẻ Nút",
|
||||||
|
"updateSuccess": "Quy tắc đã được cập nhật thành công"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "Kích hoạt tài khoản",
|
"accountEnable": "Kích hoạt tài khoản",
|
||||||
"actions": "Hành động",
|
"actions": "Hành động",
|
||||||
|
"active": "Đang hoạt động",
|
||||||
"add": "Thêm",
|
"add": "Thêm",
|
||||||
"administrator": "Quản trị viên",
|
"administrator": "Quản trị viên",
|
||||||
"areaCode": "Mã Vùng",
|
"areaCode": "Mã Vùng",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "Email",
|
"email": "Email",
|
||||||
"enable": "Kích hoạt",
|
"enable": "Kích hoạt",
|
||||||
"expireTime": "Thời gian hết hạn",
|
"expireTime": "Thời gian hết hạn",
|
||||||
|
"expired": "Đã hết hạn",
|
||||||
"expiredAt": "Ngày hết hạn",
|
"expiredAt": "Ngày hết hạn",
|
||||||
"failed": "Thất bại",
|
"failed": "Thất bại",
|
||||||
"giftAmount": "Số tiền quà tặng",
|
"giftAmount": "Số tiền quà tặng",
|
||||||
"giftAmountPlaceholder": "Nhập số tiền quà tặng",
|
"giftAmountPlaceholder": "Nhập số tiền quà tặng",
|
||||||
|
"inactive": "Không hoạt động",
|
||||||
"invalidEmailFormat": "Định dạng email không hợp lệ",
|
"invalidEmailFormat": "Định dạng email không hợp lệ",
|
||||||
"inviteCode": "Mã Mời",
|
"inviteCode": "Mã Mời",
|
||||||
"inviteCodePlaceholder": "Nhập mã mời (để trống để tạo mới)",
|
"inviteCodePlaceholder": "Nhập mã mời (để trống để tạo mới)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "Nhập mật khẩu mới (không bắt buộc)",
|
"passwordPlaceholder": "Nhập mật khẩu mới (không bắt buộc)",
|
||||||
"permanent": "Vĩnh viễn",
|
"permanent": "Vĩnh viễn",
|
||||||
"pleaseEnterEmail": "Vui lòng nhập email",
|
"pleaseEnterEmail": "Vui lòng nhập email",
|
||||||
|
"price": "Giá",
|
||||||
"referer": "Người giới thiệu",
|
"referer": "Người giới thiệu",
|
||||||
"refererId": "ID người giới thiệu",
|
"refererId": "ID người giới thiệu",
|
||||||
"refererIdPlaceholder": "Nhập mã người giới thiệu",
|
"refererIdPlaceholder": "Nhập mã người giới thiệu",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "Tìm kiếm địa chỉ IP",
|
"searchIp": "Tìm kiếm địa chỉ IP",
|
||||||
"selectAuthType": "Chọn loại xác thực",
|
"selectAuthType": "Chọn loại xác thực",
|
||||||
"speedLimit": "Giới hạn tốc độ",
|
"speedLimit": "Giới hạn tốc độ",
|
||||||
|
"startTime": "Thời gian bắt đầu",
|
||||||
|
"status": "Trạng thái",
|
||||||
"subscription": "Đăng ký",
|
"subscription": "Đăng ký",
|
||||||
"subscriptionDetails": "Chi Tiết Đăng Ký",
|
"subscriptionDetails": "Chi Tiết Đăng Ký",
|
||||||
|
"subscriptionId": "ID đăng ký",
|
||||||
|
"subscriptionInfo": "Thông tin đăng ký",
|
||||||
"subscriptionList": "Danh sách đăng ký",
|
"subscriptionList": "Danh sách đăng ký",
|
||||||
"subscriptionLogs": "Nhật ký Đăng ký",
|
"subscriptionLogs": "Nhật ký Đăng ký",
|
||||||
"subscriptionName": "Tên Đăng Ký",
|
"subscriptionName": "Tên Đăng Ký",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "Thông báo Giao dịch",
|
"tradeNotifications": "Thông báo Giao dịch",
|
||||||
"trafficLimit": "Giới hạn lưu lượng",
|
"trafficLimit": "Giới hạn lưu lượng",
|
||||||
"trafficLogs": "Nhật ký lưu lượng",
|
"trafficLogs": "Nhật ký lưu lượng",
|
||||||
|
"trafficUsage": "Sử dụng lưu lượng",
|
||||||
|
"unknown": "Không xác định",
|
||||||
"unlimited": "Không giới hạn",
|
"unlimited": "Không giới hạn",
|
||||||
"unverified": "Chưa được xác minh",
|
"unverified": "Chưa được xác minh",
|
||||||
"update": "Cập nhật",
|
"update": "Cập nhật",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "Tác nhân người dùng",
|
"userAgent": "Tác nhân người dùng",
|
||||||
"userEmail": "Email Người Dùng",
|
"userEmail": "Email Người Dùng",
|
||||||
"userEmailPlaceholder": "Nhập email người dùng",
|
"userEmailPlaceholder": "Nhập email người dùng",
|
||||||
|
"userId": "ID người dùng",
|
||||||
|
"userInfo": "Thông tin người dùng",
|
||||||
"userList": "Danh sách người dùng",
|
"userList": "Danh sách người dùng",
|
||||||
"userLogs": "Lịch sử đăng nhập",
|
"userLogs": "Lịch sử đăng nhập",
|
||||||
"userName": "Định danh Người dùng",
|
"userName": "Định danh Người dùng",
|
||||||
"userOrders": "Đơn hàng",
|
"userOrders": "Đơn hàng",
|
||||||
"userProfile": "Hồ sơ",
|
"userProfile": "Hồ sơ",
|
||||||
"userSubscriptions": "Đăng ký",
|
"userSubscriptions": "Đăng ký",
|
||||||
"verified": "Đã xác minh"
|
"username": "Tên người dùng",
|
||||||
|
"verified": "Đã xác minh",
|
||||||
|
"viewDetails": "Xem chi tiết"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS配置",
|
"ADS Config": "ADS配置",
|
||||||
"Announcement Management": "公告管理",
|
"Announcement Management": "公告管理",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "应用管理",
|
||||||
"Auth Control": "认证控制",
|
"Auth Control": "认证控制",
|
||||||
"Coupon Management": "优惠券管理",
|
"Coupon Management": "优惠券管理",
|
||||||
"Dashboard": "仪表盘",
|
"Dashboard": "仪表盘",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "订单管理",
|
"Order Management": "订单管理",
|
||||||
"Payment Config": "支付配置",
|
"Payment Config": "支付配置",
|
||||||
"Phone Number": "手机号",
|
"Phone Number": "手机号",
|
||||||
|
"Rule Management": "规则管理",
|
||||||
"Server": "服务",
|
"Server": "服务",
|
||||||
"Server Management": "服务管理",
|
"Server Management": "服务管理",
|
||||||
"Settings": "设置",
|
"Settings": "设置",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "分析中...",
|
||||||
|
"appIcon": "规则图标",
|
||||||
|
"cancel": "取消",
|
||||||
|
"confirm": "确认",
|
||||||
|
"confirmDelete": "确认删除",
|
||||||
|
"create": "添加规则",
|
||||||
|
"createRule": "添加规则",
|
||||||
|
"createSuccess": "创建规则成功",
|
||||||
|
"createdAt": "创建时间",
|
||||||
|
"delete": "删除",
|
||||||
|
"deleteSuccess": "删除规则成功",
|
||||||
|
"deleteWarning": "确定要删除所选规则吗?此操作不可恢复。",
|
||||||
|
"description": "规则描述",
|
||||||
|
"downloadTemplate": "下载模板",
|
||||||
|
"edit": "编辑",
|
||||||
|
"editRule": "编辑规则",
|
||||||
|
"enable": "启用",
|
||||||
|
"enterIconUrl": "请输入或上传图标",
|
||||||
|
"enterRuleName": "请输入规则名称",
|
||||||
|
"enterRules": "请输入规则内容,每行一条",
|
||||||
|
"import": "导入",
|
||||||
|
"importFailed": "导入失败",
|
||||||
|
"importSuccess": "导入成功",
|
||||||
|
"importYaml": "导入YAML",
|
||||||
|
"importYamlDescription": "从YAML文件导入规则,系统将自动根据策略组名称分组创建规则",
|
||||||
|
"importYamlRules": "导入YAML规则",
|
||||||
|
"importing": "导入中...",
|
||||||
|
"invalidYamlFormat": "无效的YAML格式,缺少rules字段",
|
||||||
|
"name": "规则名称",
|
||||||
|
"noValidRules": "没有找到有效的规则",
|
||||||
|
"pleaseUploadFile": "请上传YAML文件",
|
||||||
|
"preview": "预览",
|
||||||
|
"rules": "规则内容",
|
||||||
|
"rulesFormat": "规则格式说明:规则类型,匹配内容,[策略], 其中策略为可选项。\n不指定策略时,将自动使用当前规则组名称, 示例:",
|
||||||
|
"rulesLabel": "规则内容",
|
||||||
|
"searchRule": "搜索规则名称",
|
||||||
|
"selectFile": "选择文件",
|
||||||
|
"selectTags": "选择节点标签",
|
||||||
|
"tags": "节点标签",
|
||||||
|
"tagsLabel": "节点标签",
|
||||||
|
"updateSuccess": "更新规则成功"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "账号启用",
|
"accountEnable": "账号启用",
|
||||||
"actions": "操作",
|
"actions": "操作",
|
||||||
|
"active": "活跃",
|
||||||
"add": "添加",
|
"add": "添加",
|
||||||
"administrator": "管理员",
|
"administrator": "管理员",
|
||||||
"areaCode": "区号",
|
"areaCode": "区号",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "邮箱",
|
"email": "邮箱",
|
||||||
"enable": "启用",
|
"enable": "启用",
|
||||||
"expireTime": "到期时间",
|
"expireTime": "到期时间",
|
||||||
|
"expired": "已过期",
|
||||||
"expiredAt": "过期时间",
|
"expiredAt": "过期时间",
|
||||||
"failed": "失败",
|
"failed": "失败",
|
||||||
"giftAmount": "赠送金额",
|
"giftAmount": "赠送金额",
|
||||||
"giftAmountPlaceholder": "输入赠送金额",
|
"giftAmountPlaceholder": "输入赠送金额",
|
||||||
|
"inactive": "非活跃",
|
||||||
"invalidEmailFormat": "邮箱格式不正确",
|
"invalidEmailFormat": "邮箱格式不正确",
|
||||||
"inviteCode": "邀请码",
|
"inviteCode": "邀请码",
|
||||||
"inviteCodePlaceholder": "输入邀请码(留空自动生成)",
|
"inviteCodePlaceholder": "输入邀请码(留空自动生成)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "输入新密码(选填)",
|
"passwordPlaceholder": "输入新密码(选填)",
|
||||||
"permanent": "永久",
|
"permanent": "永久",
|
||||||
"pleaseEnterEmail": "请输入邮箱",
|
"pleaseEnterEmail": "请输入邮箱",
|
||||||
|
"price": "价格",
|
||||||
"referer": "推荐人",
|
"referer": "推荐人",
|
||||||
"refererId": "推荐人ID",
|
"refererId": "推荐人ID",
|
||||||
"refererIdPlaceholder": "输入推荐人ID",
|
"refererIdPlaceholder": "输入推荐人ID",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "搜索IP地址",
|
"searchIp": "搜索IP地址",
|
||||||
"selectAuthType": "选择认证类型",
|
"selectAuthType": "选择认证类型",
|
||||||
"speedLimit": "速度限制",
|
"speedLimit": "速度限制",
|
||||||
|
"startTime": "开始时间",
|
||||||
|
"status": "状态",
|
||||||
"subscription": "订阅",
|
"subscription": "订阅",
|
||||||
"subscriptionDetails": "订阅详情",
|
"subscriptionDetails": "订阅详情",
|
||||||
|
"subscriptionId": "订阅 ID",
|
||||||
|
"subscriptionInfo": "订阅信息",
|
||||||
"subscriptionList": "订阅列表",
|
"subscriptionList": "订阅列表",
|
||||||
"subscriptionLogs": "订阅日志",
|
"subscriptionLogs": "订阅日志",
|
||||||
"subscriptionName": "订阅名称",
|
"subscriptionName": "订阅名称",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "交易通知",
|
"tradeNotifications": "交易通知",
|
||||||
"trafficLimit": "流量限制",
|
"trafficLimit": "流量限制",
|
||||||
"trafficLogs": "流量日志",
|
"trafficLogs": "流量日志",
|
||||||
|
"trafficUsage": "流量使用",
|
||||||
|
"unknown": "未知",
|
||||||
"unlimited": "无限制",
|
"unlimited": "无限制",
|
||||||
"unverified": "未验证",
|
"unverified": "未验证",
|
||||||
"update": "更新",
|
"update": "更新",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "用户代理",
|
"userAgent": "用户代理",
|
||||||
"userEmail": "用户邮箱",
|
"userEmail": "用户邮箱",
|
||||||
"userEmailPlaceholder": "输入用户邮箱",
|
"userEmailPlaceholder": "输入用户邮箱",
|
||||||
|
"userId": "用户 ID",
|
||||||
|
"userInfo": "用户信息",
|
||||||
"userList": "用户列表",
|
"userList": "用户列表",
|
||||||
"userLogs": "登录历史",
|
"userLogs": "登录历史",
|
||||||
"userName": "用户标识",
|
"userName": "用户标识",
|
||||||
"userOrders": "订单",
|
"userOrders": "订单",
|
||||||
"userProfile": "个人资料",
|
"userProfile": "个人资料",
|
||||||
"userSubscriptions": "订阅",
|
"userSubscriptions": "订阅",
|
||||||
"verified": "已验证"
|
"username": "用户名",
|
||||||
|
"verified": "已验证",
|
||||||
|
"viewDetails": "查看详情"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"ADS Config": "ADS 配置",
|
"ADS Config": "ADS 配置",
|
||||||
"Announcement Management": "公告管理",
|
"Announcement Management": "公告管理",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
|
"Application Management": "應用程式管理",
|
||||||
"Auth Control": "身份驗證控制",
|
"Auth Control": "身份驗證控制",
|
||||||
"Coupon Management": "優惠券管理",
|
"Coupon Management": "優惠券管理",
|
||||||
"Dashboard": "儀表板",
|
"Dashboard": "儀表板",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"Order Management": "訂單管理",
|
"Order Management": "訂單管理",
|
||||||
"Payment Config": "支付配置",
|
"Payment Config": "支付配置",
|
||||||
"Phone Number": "電話號碼",
|
"Phone Number": "電話號碼",
|
||||||
|
"Rule Management": "規則管理",
|
||||||
"Server": "服務",
|
"Server": "服務",
|
||||||
"Server Management": "服務管理",
|
"Server Management": "服務管理",
|
||||||
"Settings": "設定",
|
"Settings": "設定",
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"analyzing": "分析中...",
|
||||||
|
"appIcon": "規則圖標",
|
||||||
|
"cancel": "取消",
|
||||||
|
"confirm": "確認",
|
||||||
|
"confirmDelete": "確認刪除",
|
||||||
|
"create": "新增規則",
|
||||||
|
"createRule": "新增規則",
|
||||||
|
"createSuccess": "規則創建成功",
|
||||||
|
"createdAt": "創建於",
|
||||||
|
"delete": "刪除",
|
||||||
|
"deleteSuccess": "規則刪除成功",
|
||||||
|
"deleteWarning": "您確定要刪除這條規則嗎?此操作無法撤銷。",
|
||||||
|
"description": "規則描述",
|
||||||
|
"downloadTemplate": "下載模板",
|
||||||
|
"edit": "編輯",
|
||||||
|
"editRule": "編輯規則",
|
||||||
|
"enable": "啟用",
|
||||||
|
"enterIconUrl": "輸入或上傳圖標",
|
||||||
|
"enterRuleName": "輸入規則名稱",
|
||||||
|
"enterRules": "輸入規則內容,每行一條",
|
||||||
|
"import": "導入",
|
||||||
|
"importFailed": "導入失敗",
|
||||||
|
"importSuccess": "導入成功",
|
||||||
|
"importYaml": "導入 YAML",
|
||||||
|
"importYamlDescription": "從 YAML 文件導入規則,系統將根據策略組名稱自動創建規則組",
|
||||||
|
"importYamlRules": "導入 YAML 規則",
|
||||||
|
"importing": "導入中...",
|
||||||
|
"invalidYamlFormat": "無效的 YAML 格式,缺少規則字段",
|
||||||
|
"name": "規則名稱",
|
||||||
|
"noValidRules": "未找到有效的規則",
|
||||||
|
"pleaseUploadFile": "請上傳 YAML 文件",
|
||||||
|
"preview": "預覽",
|
||||||
|
"rules": "規則內容",
|
||||||
|
"rulesFormat": "規則格式:規則類型,匹配內容,[策略],其中策略是可選的。\n如果未指定策略,將自動使用當前規則組名稱。示例:",
|
||||||
|
"rulesLabel": "規則內容",
|
||||||
|
"searchRule": "搜索規則名稱",
|
||||||
|
"selectFile": "選擇文件",
|
||||||
|
"selectTags": "選擇節點標籤",
|
||||||
|
"tags": "節點標籤",
|
||||||
|
"tagsLabel": "節點標籤",
|
||||||
|
"updateSuccess": "規則更新成功"
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"accountEnable": "帳戶啟用",
|
"accountEnable": "帳戶啟用",
|
||||||
"actions": "操作",
|
"actions": "操作",
|
||||||
|
"active": "活躍",
|
||||||
"add": "新增",
|
"add": "新增",
|
||||||
"administrator": "管理員",
|
"administrator": "管理員",
|
||||||
"areaCode": "地區代碼",
|
"areaCode": "地區代碼",
|
||||||
@@ -41,10 +42,12 @@
|
|||||||
"email": "電子郵件",
|
"email": "電子郵件",
|
||||||
"enable": "啟用",
|
"enable": "啟用",
|
||||||
"expireTime": "到期時間",
|
"expireTime": "到期時間",
|
||||||
|
"expired": "已過期",
|
||||||
"expiredAt": "到期時間",
|
"expiredAt": "到期時間",
|
||||||
"failed": "失敗",
|
"failed": "失敗",
|
||||||
"giftAmount": "禮物金額",
|
"giftAmount": "禮物金額",
|
||||||
"giftAmountPlaceholder": "輸入禮物金額",
|
"giftAmountPlaceholder": "輸入禮物金額",
|
||||||
|
"inactive": "不活躍",
|
||||||
"invalidEmailFormat": "電郵格式無效",
|
"invalidEmailFormat": "電郵格式無效",
|
||||||
"inviteCode": "邀請碼",
|
"inviteCode": "邀請碼",
|
||||||
"inviteCodePlaceholder": "輸入邀請碼(留空以生成)",
|
"inviteCodePlaceholder": "輸入邀請碼(留空以生成)",
|
||||||
@@ -63,6 +66,7 @@
|
|||||||
"passwordPlaceholder": "輸入新密碼(可選)",
|
"passwordPlaceholder": "輸入新密碼(可選)",
|
||||||
"permanent": "永久",
|
"permanent": "永久",
|
||||||
"pleaseEnterEmail": "請輸入電郵地址",
|
"pleaseEnterEmail": "請輸入電郵地址",
|
||||||
|
"price": "價格",
|
||||||
"referer": "推薦人",
|
"referer": "推薦人",
|
||||||
"refererId": "推薦人 ID",
|
"refererId": "推薦人 ID",
|
||||||
"refererIdPlaceholder": "輸入推薦人 ID",
|
"refererIdPlaceholder": "輸入推薦人 ID",
|
||||||
@@ -74,8 +78,12 @@
|
|||||||
"searchIp": "搜尋IP地址",
|
"searchIp": "搜尋IP地址",
|
||||||
"selectAuthType": "選擇認證類型",
|
"selectAuthType": "選擇認證類型",
|
||||||
"speedLimit": "速度限制",
|
"speedLimit": "速度限制",
|
||||||
|
"startTime": "開始時間",
|
||||||
|
"status": "狀態",
|
||||||
"subscription": "訂閱",
|
"subscription": "訂閱",
|
||||||
"subscriptionDetails": "訂閱詳情",
|
"subscriptionDetails": "訂閱詳情",
|
||||||
|
"subscriptionId": "訂閱 ID",
|
||||||
|
"subscriptionInfo": "訂閱資訊",
|
||||||
"subscriptionList": "訂閱列表",
|
"subscriptionList": "訂閱列表",
|
||||||
"subscriptionLogs": "訂閱日誌",
|
"subscriptionLogs": "訂閱日誌",
|
||||||
"subscriptionName": "訂閱名稱",
|
"subscriptionName": "訂閱名稱",
|
||||||
@@ -89,6 +97,8 @@
|
|||||||
"tradeNotifications": "交易通知",
|
"tradeNotifications": "交易通知",
|
||||||
"trafficLimit": "流量限制",
|
"trafficLimit": "流量限制",
|
||||||
"trafficLogs": "流量日誌",
|
"trafficLogs": "流量日誌",
|
||||||
|
"trafficUsage": "流量使用",
|
||||||
|
"unknown": "未知",
|
||||||
"unlimited": "無限",
|
"unlimited": "無限",
|
||||||
"unverified": "未經驗證",
|
"unverified": "未經驗證",
|
||||||
"update": "更新",
|
"update": "更新",
|
||||||
@@ -98,11 +108,15 @@
|
|||||||
"userAgent": "用戶代理",
|
"userAgent": "用戶代理",
|
||||||
"userEmail": "用戶電郵",
|
"userEmail": "用戶電郵",
|
||||||
"userEmailPlaceholder": "輸入用戶電郵",
|
"userEmailPlaceholder": "輸入用戶電郵",
|
||||||
|
"userId": "用戶 ID",
|
||||||
|
"userInfo": "用戶資訊",
|
||||||
"userList": "使用者列表",
|
"userList": "使用者列表",
|
||||||
"userLogs": "登入歷史",
|
"userLogs": "登入歷史",
|
||||||
"userName": "用戶識別碼",
|
"userName": "用戶識別碼",
|
||||||
"userOrders": "訂單",
|
"userOrders": "訂單",
|
||||||
"userProfile": "個人資料",
|
"userProfile": "個人資料",
|
||||||
"userSubscriptions": "訂閱",
|
"userSubscriptions": "訂閱",
|
||||||
"verified": "已驗證"
|
"username": "用戶名",
|
||||||
|
"verified": "已驗證",
|
||||||
|
"viewDetails": "查看詳情"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
"@workspace/ui": "workspace:*",
|
"@workspace/ui": "workspace:*",
|
||||||
"ahooks": "^3.8.4",
|
"ahooks": "^3.8.4",
|
||||||
"axios": "^1.7.9",
|
"axios": "^1.7.9",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
"nanoid": "^5.0.9",
|
"nanoid": "^5.0.9",
|
||||||
"next": "^15.1.4",
|
"next": "^15.1.4",
|
||||||
"next-intl": "^3.26.3",
|
"next-intl": "^3.26.3",
|
||||||
@@ -30,6 +31,7 @@
|
|||||||
"zustand": "^5.0.3"
|
"zustand": "^5.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/js-yaml": "^4.0.9",
|
||||||
"@types/node": "^22.10.5",
|
"@types/node": "^22.10.5",
|
||||||
"@types/react": "^19.0.4",
|
"@types/react": "^19.0.4",
|
||||||
"@types/react-dom": "^19.0.2",
|
"@types/react-dom": "^19.0.2",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -221,3 +221,14 @@ export async function nodeSort(body: API.NodeSortRequest, options?: { [key: stri
|
|||||||
...(options || {}),
|
...(options || {}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get node tag list GET /v1/admin/server/tag/list */
|
||||||
|
export async function getNodeTagList(options?: { [key: string]: any }) {
|
||||||
|
return request<API.Response & { data?: API.GetNodeTagListResponse }>(
|
||||||
|
'/v1/admin/server/tag/list',
|
||||||
|
{
|
||||||
|
method: 'GET',
|
||||||
|
...(options || {}),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
+52
-17
@@ -257,7 +257,8 @@ declare namespace API {
|
|||||||
type CreateRuleGroupRequest = {
|
type CreateRuleGroupRequest = {
|
||||||
name: string;
|
name: string;
|
||||||
icon: string;
|
icon: string;
|
||||||
description: string;
|
tags: string[];
|
||||||
|
rules: string;
|
||||||
enable: boolean;
|
enable: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -325,6 +326,7 @@ declare namespace API {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type CurrencyConfig = {
|
type CurrencyConfig = {
|
||||||
|
access_key: string;
|
||||||
currency_unit: string;
|
currency_unit: string;
|
||||||
currency_symbol: string;
|
currency_symbol: string;
|
||||||
};
|
};
|
||||||
@@ -618,6 +620,10 @@ declare namespace API {
|
|||||||
list: Server[];
|
list: Server[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type GetNodeTagListResponse = {
|
||||||
|
tags: string[];
|
||||||
|
};
|
||||||
|
|
||||||
type GetOrderListParams = {
|
type GetOrderListParams = {
|
||||||
page: number;
|
page: number;
|
||||||
size: number;
|
size: number;
|
||||||
@@ -744,12 +750,18 @@ declare namespace API {
|
|||||||
page: number;
|
page: number;
|
||||||
size: number;
|
size: number;
|
||||||
search?: string;
|
search?: string;
|
||||||
|
user_id?: number;
|
||||||
|
subscribe_id?: number;
|
||||||
|
user_subscribe_id?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type GetUserListRequest = {
|
type GetUserListRequest = {
|
||||||
page: number;
|
page: number;
|
||||||
size: number;
|
size: number;
|
||||||
search?: string;
|
search?: string;
|
||||||
|
user_id?: number;
|
||||||
|
subscribe_id?: number;
|
||||||
|
user_subscribe_id?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type GetUserListResponse = {
|
type GetUserListResponse = {
|
||||||
@@ -774,6 +786,14 @@ declare namespace API {
|
|||||||
total: number;
|
total: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type GetUserSubscribeByIdParams = {
|
||||||
|
id: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
type GetUserSubscribeByIdRequest = {
|
||||||
|
id: number;
|
||||||
|
};
|
||||||
|
|
||||||
type GetUserSubscribeDevicesParams = {
|
type GetUserSubscribeDevicesParams = {
|
||||||
page: number;
|
page: number;
|
||||||
size: number;
|
size: number;
|
||||||
@@ -909,9 +929,11 @@ declare namespace API {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type NodeStatus = {
|
type NodeStatus = {
|
||||||
online_users: OnlineUser[];
|
online: Record<string, any>;
|
||||||
status: ServerStatus;
|
cpu: number;
|
||||||
last_at: number;
|
mem: number;
|
||||||
|
disk: number;
|
||||||
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type OnlineUser = {
|
type OnlineUser = {
|
||||||
@@ -1215,21 +1237,15 @@ declare namespace API {
|
|||||||
|
|
||||||
type ServerRuleGroup = {
|
type ServerRuleGroup = {
|
||||||
id: number;
|
id: number;
|
||||||
name: string;
|
|
||||||
icon: string;
|
icon: string;
|
||||||
description: string;
|
name: string;
|
||||||
|
tags: string[];
|
||||||
|
rules: string;
|
||||||
enable: boolean;
|
enable: boolean;
|
||||||
created_at: number;
|
created_at: number;
|
||||||
updated_at: number;
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ServerStatus = {
|
|
||||||
cpu: number;
|
|
||||||
mem: number;
|
|
||||||
disk: number;
|
|
||||||
updated_at: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
type ServerTotalDataResponse = {
|
type ServerTotalDataResponse = {
|
||||||
online_user_ips: number;
|
online_user_ips: number;
|
||||||
online_servers: number;
|
online_servers: number;
|
||||||
@@ -1564,9 +1580,10 @@ declare namespace API {
|
|||||||
|
|
||||||
type UpdateRuleGroupRequest = {
|
type UpdateRuleGroupRequest = {
|
||||||
id: number;
|
id: number;
|
||||||
name: string;
|
|
||||||
icon: string;
|
icon: string;
|
||||||
description: string;
|
name: string;
|
||||||
|
tags: string[];
|
||||||
|
rules: string;
|
||||||
enable: boolean;
|
enable: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1741,6 +1758,25 @@ declare namespace API {
|
|||||||
updated_at: number;
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type UserSubscribeDetail = {
|
||||||
|
id: number;
|
||||||
|
user_id: number;
|
||||||
|
user: User;
|
||||||
|
order_id: number;
|
||||||
|
subscribe_id: number;
|
||||||
|
subscribe: Subscribe;
|
||||||
|
start_time: number;
|
||||||
|
expire_time: number;
|
||||||
|
reset_time: number;
|
||||||
|
traffic: number;
|
||||||
|
download: number;
|
||||||
|
upload: number;
|
||||||
|
token: string;
|
||||||
|
status: number;
|
||||||
|
created_at: number;
|
||||||
|
updated_at: number;
|
||||||
|
};
|
||||||
|
|
||||||
type UserSubscribeLog = {
|
type UserSubscribeLog = {
|
||||||
id: number;
|
id: number;
|
||||||
user_id: number;
|
user_id: number;
|
||||||
@@ -1752,8 +1788,7 @@ declare namespace API {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type UserTrafficData = {
|
type UserTrafficData = {
|
||||||
user_id: number;
|
sid: number;
|
||||||
email: string;
|
|
||||||
upload: number;
|
upload: number;
|
||||||
download: number;
|
download: number;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -291,6 +291,24 @@ export async function deleteUserSubscribe(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get user subcribe by id GET /v1/admin/user/subscribe/detail */
|
||||||
|
export async function getUserSubscribeById(
|
||||||
|
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
|
||||||
|
params: API.GetUserSubscribeByIdParams,
|
||||||
|
options?: { [key: string]: any },
|
||||||
|
) {
|
||||||
|
return request<API.Response & { data?: API.UserSubscribeDetail }>(
|
||||||
|
'/v1/admin/user/subscribe/detail',
|
||||||
|
{
|
||||||
|
method: 'GET',
|
||||||
|
params: {
|
||||||
|
...params,
|
||||||
|
},
|
||||||
|
...(options || {}),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/** Get user subcribe devices GET /v1/admin/user/subscribe/device */
|
/** Get user subcribe devices GET /v1/admin/user/subscribe/device */
|
||||||
export async function getUserSubscribeDevices(
|
export async function getUserSubscribeDevices(
|
||||||
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
|
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
|
||||||
|
|||||||
+15
-13
@@ -142,7 +142,13 @@ declare namespace API {
|
|||||||
updated_at: number;
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type Currency = {
|
||||||
|
currency_unit: string;
|
||||||
|
currency_symbol: string;
|
||||||
|
};
|
||||||
|
|
||||||
type CurrencyConfig = {
|
type CurrencyConfig = {
|
||||||
|
access_key: string;
|
||||||
currency_unit: string;
|
currency_unit: string;
|
||||||
currency_symbol: string;
|
currency_symbol: string;
|
||||||
};
|
};
|
||||||
@@ -214,7 +220,7 @@ declare namespace API {
|
|||||||
verify: VeifyConfig;
|
verify: VeifyConfig;
|
||||||
auth: AuthConfig;
|
auth: AuthConfig;
|
||||||
invite: InviteConfig;
|
invite: InviteConfig;
|
||||||
currency: CurrencyConfig;
|
currency: Currency;
|
||||||
subscribe: SubscribeConfig;
|
subscribe: SubscribeConfig;
|
||||||
verify_code: PubilcVerifyCodeConfig;
|
verify_code: PubilcVerifyCodeConfig;
|
||||||
oauth_methods: string[];
|
oauth_methods: string[];
|
||||||
@@ -300,9 +306,11 @@ declare namespace API {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type NodeStatus = {
|
type NodeStatus = {
|
||||||
online_users: OnlineUser[];
|
online: Record<string, any>;
|
||||||
status: ServerStatus;
|
cpu: number;
|
||||||
last_at: number;
|
mem: number;
|
||||||
|
disk: number;
|
||||||
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type OAthLoginRequest = {
|
type OAthLoginRequest = {
|
||||||
@@ -631,21 +639,15 @@ declare namespace API {
|
|||||||
|
|
||||||
type ServerRuleGroup = {
|
type ServerRuleGroup = {
|
||||||
id: number;
|
id: number;
|
||||||
name: string;
|
|
||||||
icon: string;
|
icon: string;
|
||||||
description: string;
|
name: string;
|
||||||
|
tags: string[];
|
||||||
|
rules: string;
|
||||||
enable: boolean;
|
enable: boolean;
|
||||||
created_at: number;
|
created_at: number;
|
||||||
updated_at: number;
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ServerStatus = {
|
|
||||||
cpu: number;
|
|
||||||
mem: number;
|
|
||||||
disk: number;
|
|
||||||
updated_at: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
type Shadowsocks = {
|
type Shadowsocks = {
|
||||||
method: string;
|
method: string;
|
||||||
port: number;
|
port: number;
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ export default function Page() {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{description && <li className='text-muted-foreground'>{description}</li>}
|
{description && <li className='text-muted-foreground'>{description}</li>}
|
||||||
{features.map(
|
{features?.map(
|
||||||
(
|
(
|
||||||
feature: {
|
feature: {
|
||||||
icon: string;
|
icon: string;
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ export function Content({ subscriptionData }: ProductShowcaseProps) {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{description && <li className='text-muted-foreground'>{description}</li>}
|
{description && <li className='text-muted-foreground'>{description}</li>}
|
||||||
{features.map(
|
{features?.map(
|
||||||
(
|
(
|
||||||
feature: {
|
feature: {
|
||||||
type: string;
|
type: string;
|
||||||
|
|||||||
+15
-13
@@ -142,7 +142,13 @@ declare namespace API {
|
|||||||
updated_at: number;
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type Currency = {
|
||||||
|
currency_unit: string;
|
||||||
|
currency_symbol: string;
|
||||||
|
};
|
||||||
|
|
||||||
type CurrencyConfig = {
|
type CurrencyConfig = {
|
||||||
|
access_key: string;
|
||||||
currency_unit: string;
|
currency_unit: string;
|
||||||
currency_symbol: string;
|
currency_symbol: string;
|
||||||
};
|
};
|
||||||
@@ -214,7 +220,7 @@ declare namespace API {
|
|||||||
verify: VeifyConfig;
|
verify: VeifyConfig;
|
||||||
auth: AuthConfig;
|
auth: AuthConfig;
|
||||||
invite: InviteConfig;
|
invite: InviteConfig;
|
||||||
currency: CurrencyConfig;
|
currency: Currency;
|
||||||
subscribe: SubscribeConfig;
|
subscribe: SubscribeConfig;
|
||||||
verify_code: PubilcVerifyCodeConfig;
|
verify_code: PubilcVerifyCodeConfig;
|
||||||
oauth_methods: string[];
|
oauth_methods: string[];
|
||||||
@@ -300,9 +306,11 @@ declare namespace API {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type NodeStatus = {
|
type NodeStatus = {
|
||||||
online_users: OnlineUser[];
|
online: Record<string, any>;
|
||||||
status: ServerStatus;
|
cpu: number;
|
||||||
last_at: number;
|
mem: number;
|
||||||
|
disk: number;
|
||||||
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type OAthLoginRequest = {
|
type OAthLoginRequest = {
|
||||||
@@ -631,21 +639,15 @@ declare namespace API {
|
|||||||
|
|
||||||
type ServerRuleGroup = {
|
type ServerRuleGroup = {
|
||||||
id: number;
|
id: number;
|
||||||
name: string;
|
|
||||||
icon: string;
|
icon: string;
|
||||||
description: string;
|
name: string;
|
||||||
|
tags: string[];
|
||||||
|
rules: string;
|
||||||
enable: boolean;
|
enable: boolean;
|
||||||
created_at: number;
|
created_at: number;
|
||||||
updated_at: number;
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ServerStatus = {
|
|
||||||
cpu: number;
|
|
||||||
mem: number;
|
|
||||||
disk: number;
|
|
||||||
updated_at: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
type Shadowsocks = {
|
type Shadowsocks = {
|
||||||
method: string;
|
method: string;
|
||||||
port: number;
|
port: number;
|
||||||
|
|||||||
Vendored
+9
-12
@@ -160,6 +160,7 @@ declare namespace API {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type CurrencyConfig = {
|
type CurrencyConfig = {
|
||||||
|
access_key: string;
|
||||||
currency_unit: string;
|
currency_unit: string;
|
||||||
currency_symbol: string;
|
currency_symbol: string;
|
||||||
};
|
};
|
||||||
@@ -331,9 +332,11 @@ declare namespace API {
|
|||||||
};
|
};
|
||||||
|
|
||||||
type NodeStatus = {
|
type NodeStatus = {
|
||||||
online_users: OnlineUser[];
|
online: Record<string, any>;
|
||||||
status: ServerStatus;
|
cpu: number;
|
||||||
last_at: number;
|
mem: number;
|
||||||
|
disk: number;
|
||||||
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type OnlineUser = {
|
type OnlineUser = {
|
||||||
@@ -749,21 +752,15 @@ declare namespace API {
|
|||||||
|
|
||||||
type ServerRuleGroup = {
|
type ServerRuleGroup = {
|
||||||
id: number;
|
id: number;
|
||||||
name: string;
|
|
||||||
icon: string;
|
icon: string;
|
||||||
description: string;
|
name: string;
|
||||||
|
tags: string[];
|
||||||
|
rules: string;
|
||||||
enable: boolean;
|
enable: boolean;
|
||||||
created_at: number;
|
created_at: number;
|
||||||
updated_at: number;
|
updated_at: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
type ServerStatus = {
|
|
||||||
cpu: number;
|
|
||||||
mem: number;
|
|
||||||
disk: number;
|
|
||||||
updated_at: number;
|
|
||||||
};
|
|
||||||
|
|
||||||
type Shadowsocks = {
|
type Shadowsocks = {
|
||||||
method: string;
|
method: string;
|
||||||
port: number;
|
port: number;
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ppanel-web",
|
"name": "ppanel-web",
|
||||||
"version": "1.0.0-beta.33",
|
"version": "1.0.0-beta.34",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/perfect-panel/ppanel-web",
|
"homepage": "https://github.com/perfect-panel/ppanel-web",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
|
|||||||
@@ -11,9 +11,6 @@ interface FieldConfig extends Omit<EnhancedInputProps, 'type'> {
|
|||||||
name: string;
|
name: string;
|
||||||
type: 'text' | 'number' | 'select' | 'time' | 'boolean';
|
type: 'text' | 'number' | 'select' | 'time' | 'boolean';
|
||||||
options?: { label: string; value: string }[];
|
options?: { label: string; value: string }[];
|
||||||
internal?: boolean;
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
||||||
calculateValue?: (value: Record<string, any>) => any;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ObjectInputProps<T> {
|
interface ObjectInputProps<T> {
|
||||||
@@ -33,36 +30,13 @@ export function ObjectInput<T extends Record<string, any>>({
|
|||||||
const [internalState, setInternalState] = useState<T>(value);
|
const [internalState, setInternalState] = useState<T>(value);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let updatedState = { ...internalState, ...value };
|
setInternalState(value);
|
||||||
|
}, [value]);
|
||||||
fields.forEach((field) => {
|
|
||||||
if (field?.calculateValue) {
|
|
||||||
updatedState = field.calculateValue(updatedState);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
setInternalState(updatedState);
|
|
||||||
}, [value, fields]);
|
|
||||||
|
|
||||||
const updateField = (key: keyof T, fieldValue: string | number | boolean) => {
|
const updateField = (key: keyof T, fieldValue: string | number | boolean) => {
|
||||||
let updatedInternalState = { ...internalState, [key]: fieldValue };
|
const updatedInternalState = { ...internalState, [key]: fieldValue };
|
||||||
fields.forEach((field) => {
|
|
||||||
if (field.calculateValue && field.name === key) {
|
|
||||||
const newValue = field.calculateValue(updatedInternalState);
|
|
||||||
updatedInternalState = newValue;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
setInternalState(updatedInternalState);
|
setInternalState(updatedInternalState);
|
||||||
|
onChange(updatedInternalState);
|
||||||
const filteredValue = Object.keys(updatedInternalState).reduce((acc, fieldKey) => {
|
|
||||||
const field = fields.find((f) => f.name === fieldKey);
|
|
||||||
if (field && !field.internal) {
|
|
||||||
acc[fieldKey as keyof T] = updatedInternalState[fieldKey as keyof T];
|
|
||||||
}
|
|
||||||
return acc;
|
|
||||||
}, {} as T);
|
|
||||||
|
|
||||||
onChange(filteredValue);
|
|
||||||
};
|
};
|
||||||
const renderField = (field: FieldConfig) => {
|
const renderField = (field: FieldConfig) => {
|
||||||
switch (field.type) {
|
switch (field.type) {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ interface UploadImageProps {
|
|||||||
id?: string;
|
id?: string;
|
||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
className?: string;
|
className?: string;
|
||||||
|
maxSize?: number; // Maximum file size in MB
|
||||||
}
|
}
|
||||||
|
|
||||||
export const UploadImage = ({
|
export const UploadImage = ({
|
||||||
@@ -20,6 +21,7 @@ export const UploadImage = ({
|
|||||||
id = 'image-upload',
|
id = 'image-upload',
|
||||||
children,
|
children,
|
||||||
className,
|
className,
|
||||||
|
maxSize = 1,
|
||||||
}: UploadImageProps) => {
|
}: UploadImageProps) => {
|
||||||
const [isDragging, setIsDragging] = useState(false);
|
const [isDragging, setIsDragging] = useState(false);
|
||||||
|
|
||||||
@@ -32,11 +34,22 @@ export const UploadImage = ({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const validateFileSize = (file: File): boolean => {
|
||||||
|
const maxSizeInBytes = maxSize * 1024 * 1024;
|
||||||
|
if (file.size > maxSizeInBytes) {
|
||||||
|
alert(`File size exceeds the limit (${maxSize}MB)`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
const handleImageUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {
|
const handleImageUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
const file = e.target.files?.[0];
|
const file = e.target.files?.[0];
|
||||||
if (!file) return;
|
if (!file) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if (!validateFileSize(file)) return;
|
||||||
|
|
||||||
if (returnType === 'base64') {
|
if (returnType === 'base64') {
|
||||||
const base64 = await toBase64(file);
|
const base64 = await toBase64(file);
|
||||||
onChange(base64);
|
onChange(base64);
|
||||||
@@ -66,6 +79,8 @@ export const UploadImage = ({
|
|||||||
if (!file) return;
|
if (!file) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if (!validateFileSize(file)) return;
|
||||||
|
|
||||||
if (returnType === 'base64') {
|
if (returnType === 'base64') {
|
||||||
const base64 = await toBase64(file);
|
const base64 = await toBase64(file);
|
||||||
onChange(base64);
|
onChange(base64);
|
||||||
|
|||||||
Reference in New Issue
Block a user