Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7023875548 | |||
| a7aa5fee3e | |||
| 64cd842926 | |||
| 8b43e69bfe | |||
| ef153747bd | |||
| 328838d754 | |||
| 423b24077f | |||
| fa2fb2864f | |||
| 8d49daca21 | |||
| cf5c39cfe5 | |||
| 383638f702 | |||
| 5939763b57 | |||
| fa56eb8293 | |||
| 6a34bfb78d | |||
| b8f4f1e694 | |||
| aa1d42651d | |||
| 0c8f0911c7 |
+61
-18
@@ -1,32 +1,75 @@
|
||||
<a name="readme-top"></a>
|
||||
# Changelog
|
||||
|
||||
# [1.0.0-beta.30](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.29...v1.0.0-beta.30) (2025-03-15)
|
||||
# [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
|
||||
|
||||
* **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([48a1b97](https://github.com/perfect-panel/ppanel-web/commit/48a1b97))
|
||||
* **email**: Add traffic exhaustion template ([bb3bd7b](https://github.com/perfect-panel/ppanel-web/commit/bb3bd7b))
|
||||
* **formatting**: Update differenceInDays function to return whole days or two decimal places ([bf58f25](https://github.com/perfect-panel/ppanel-web/commit/bf58f25))
|
||||
* **global**: Add custom data ([6dbebd1](https://github.com/perfect-panel/ppanel-web/commit/6dbebd1))
|
||||
* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([ce31972](https://github.com/perfect-panel/ppanel-web/commit/ce31972))
|
||||
* **loading**: Replace loading animation with a simpler spinner and loading text ([f72df3a](https://github.com/perfect-panel/ppanel-web/commit/f72df3a))
|
||||
* **node-form**: Update number input fields to enforce step, min, and max values ([3f7b6d1](https://github.com/perfect-panel/ppanel-web/commit/3f7b6d1))
|
||||
* **payment**: Add isEdit prop to PaymentForm and disable fields when editing ([85f55de](https://github.com/perfect-panel/ppanel-web/commit/85f55de))
|
||||
* **timeline**: Simplify timeline component layout and remove commented-out code ([fbad3b0](https://github.com/perfect-panel/ppanel-web/commit/fbad3b0))
|
||||
|
||||
|
||||
### 🎫 Chores
|
||||
|
||||
* **release**: V1.0.0-beta.27 [skip ci] ([092477b](https://github.com/perfect-panel/ppanel-web/commit/092477b))
|
||||
* **release**: V1.0.0-beta.28 [skip ci] ([786ba0e](https://github.com/perfect-panel/ppanel-web/commit/786ba0e))
|
||||
* Merge branch 'beta' into develop ([f219c52](https://github.com/perfect-panel/ppanel-web/commit/f219c52))
|
||||
* **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
|
||||
|
||||
* **dashboard**: Update date display to use start_time if available ([e551232](https://github.com/perfect-panel/ppanel-web/commit/e551232))
|
||||
* **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)
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- **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)
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- **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))
|
||||
|
||||
<a name="readme-top"></a>
|
||||
|
||||
# Changelog
|
||||
|
||||
# [1.0.0-beta.31](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.30...v1.0.0-beta.31) (2025-03-15)
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- **site**: Se ref to store site configuration for updates ([0c8f091](https://github.com/perfect-panel/ppanel-web/commit/0c8f091))
|
||||
|
||||
# [1.0.0-beta.30](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.29...v1.0.0-beta.30) (2025-03-15)
|
||||
|
||||
### ✨ Features
|
||||
|
||||
- **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([48a1b97](https://github.com/perfect-panel/ppanel-web/commit/48a1b97))
|
||||
- **email**: Add traffic exhaustion template ([bb3bd7b](https://github.com/perfect-panel/ppanel-web/commit/bb3bd7b))
|
||||
- **formatting**: Update differenceInDays function to return whole days or two decimal places ([bf58f25](https://github.com/perfect-panel/ppanel-web/commit/bf58f25))
|
||||
- **global**: Add custom data ([6dbebd1](https://github.com/perfect-panel/ppanel-web/commit/6dbebd1))
|
||||
- **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([ce31972](https://github.com/perfect-panel/ppanel-web/commit/ce31972))
|
||||
- **loading**: Replace loading animation with a simpler spinner and loading text ([f72df3a](https://github.com/perfect-panel/ppanel-web/commit/f72df3a))
|
||||
- **node-form**: Update number input fields to enforce step, min, and max values ([3f7b6d1](https://github.com/perfect-panel/ppanel-web/commit/3f7b6d1))
|
||||
- **payment**: Add isEdit prop to PaymentForm and disable fields when editing ([85f55de](https://github.com/perfect-panel/ppanel-web/commit/85f55de))
|
||||
- **timeline**: Simplify timeline component layout and remove commented-out code ([fbad3b0](https://github.com/perfect-panel/ppanel-web/commit/fbad3b0))
|
||||
|
||||
### 🎫 Chores
|
||||
|
||||
- **release**: V1.0.0-beta.27 [skip ci] ([092477b](https://github.com/perfect-panel/ppanel-web/commit/092477b))
|
||||
- **release**: V1.0.0-beta.28 [skip ci] ([786ba0e](https://github.com/perfect-panel/ppanel-web/commit/786ba0e))
|
||||
- Merge branch 'beta' into develop ([f219c52](https://github.com/perfect-panel/ppanel-web/commit/f219c52))
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- **dashboard**: Update date display to use start_time if available ([e551232](https://github.com/perfect-panel/ppanel-web/commit/e551232))
|
||||
|
||||
<a name="readme-top"></a>
|
||||
|
||||
|
||||
+25
-13
@@ -232,16 +232,6 @@ export default function SubscribeAppForm<
|
||||
name: 'is_default',
|
||||
type: 'boolean',
|
||||
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',
|
||||
@@ -252,10 +242,32 @@ export default function SubscribeAppForm<
|
||||
]}
|
||||
value={field.value}
|
||||
onChange={(value) => {
|
||||
form.setValue(
|
||||
field.name,
|
||||
value.filter((item) => item.url),
|
||||
const filteredValue = 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>
|
||||
@@ -307,6 +307,7 @@ export default function CouponForm<T extends Record<string, any>>({
|
||||
<EnhancedInput
|
||||
placeholder={t('form.countPlaceholder')}
|
||||
type='number'
|
||||
step={1}
|
||||
{...field}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
@@ -327,6 +328,7 @@ export default function CouponForm<T extends Record<string, any>>({
|
||||
<EnhancedInput
|
||||
placeholder={t('form.userLimitPlaceholder')}
|
||||
type='number'
|
||||
step={1}
|
||||
{...field}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
|
||||
@@ -319,7 +319,8 @@ export default function PaymentForm<T>({
|
||||
}}
|
||||
defaultValue={field.value}
|
||||
value={field.value}
|
||||
disabled={isEdit}
|
||||
// @ts-expect-error
|
||||
disabled={isEdit && Boolean(initialValues?.platform)}
|
||||
>
|
||||
<FormControl>
|
||||
<SelectTrigger>
|
||||
|
||||
@@ -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';
|
||||
|
||||
import {
|
||||
Accordion,
|
||||
AccordionContent,
|
||||
AccordionItem,
|
||||
AccordionTrigger,
|
||||
} from '@workspace/ui/components/accordion';
|
||||
import { Badge } from '@workspace/ui/components/badge';
|
||||
import { Progress } from '@workspace/ui/components/progress';
|
||||
import { ScrollArea } from '@workspace/ui/components/scroll-area';
|
||||
@@ -11,6 +17,8 @@ import {
|
||||
} from '@workspace/ui/components/tooltip';
|
||||
import { formatDate } from '@workspace/ui/utils';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { useState } from 'react';
|
||||
import { UserSubscribeDetail } from '../user/user-detail';
|
||||
|
||||
export function formatPercentage(value: number): string {
|
||||
return `${value.toFixed(1)}%`;
|
||||
@@ -18,25 +26,19 @@ export function formatPercentage(value: number): string {
|
||||
|
||||
export function NodeStatusCell({ status }: { status: API.NodeStatus }) {
|
||||
const t = useTranslations('server.node');
|
||||
const [openItem, setOpenItem] = useState<string | null>(null);
|
||||
|
||||
const {
|
||||
last_at,
|
||||
online_users,
|
||||
status: serverStatus,
|
||||
} = status || {
|
||||
online_users: [],
|
||||
status: {
|
||||
cpu: 0,
|
||||
mem: 0,
|
||||
disk: 0,
|
||||
updated_at: 0,
|
||||
},
|
||||
last_at: 0,
|
||||
const { online, cpu, mem, disk, updated_at } = status || {
|
||||
online: {},
|
||||
cpu: 0,
|
||||
mem: 0,
|
||||
disk: 0,
|
||||
updated_at: 0,
|
||||
};
|
||||
const isOnline = last_at > 0;
|
||||
const isOnline = updated_at > 0;
|
||||
const badgeVariant = isOnline ? 'default' : 'destructive';
|
||||
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 (
|
||||
<TooltipProvider>
|
||||
@@ -52,45 +54,56 @@ export function NodeStatusCell({ status }: { status: API.NodeStatus }) {
|
||||
<div className='flex flex-col space-y-1'>
|
||||
<div className='flex justify-between'>
|
||||
<span>CPU</span>
|
||||
<span>{formatPercentage(serverStatus?.cpu ?? 0)}</span>
|
||||
<span>{formatPercentage(cpu ?? 0)}</span>
|
||||
</div>
|
||||
<Progress value={serverStatus?.cpu ?? 0} className='h-2' max={100} />
|
||||
<Progress value={cpu ?? 0} className='h-2' max={100} />
|
||||
</div>
|
||||
<div className='flex flex-col space-y-1'>
|
||||
<div className='flex justify-between'>
|
||||
<span>{t('memory')}</span>
|
||||
<span>{formatPercentage(serverStatus?.mem ?? 0)}</span>
|
||||
<span>{formatPercentage(mem ?? 0)}</span>
|
||||
</div>
|
||||
<Progress value={serverStatus?.mem ?? 0} className='h-2' max={100} />
|
||||
<Progress value={mem ?? 0} className='h-2' max={100} />
|
||||
</div>
|
||||
<div className='flex flex-col space-y-1'>
|
||||
<div className='flex justify-between'>
|
||||
<span>{t('disk')}</span>
|
||||
<span>{formatPercentage(serverStatus?.disk ?? 0)}</span>
|
||||
<span>{formatPercentage(disk ?? 0)}</span>
|
||||
</div>
|
||||
<Progress value={serverStatus?.disk ?? 0} className='h-2' max={100} />
|
||||
<Progress value={disk ?? 0} className='h-2' max={100} />
|
||||
</div>
|
||||
{isOnline && (
|
||||
<div>
|
||||
{t('lastUpdated')}: {formatDate(serverStatus?.updated_at ?? 0)}
|
||||
{t('lastUpdated')}: {formatDate(updated_at ?? 0)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</TooltipTrigger>
|
||||
{isOnline && onlineCount > 0 && (
|
||||
<TooltipContent className='bg-muted text-foreground w-80'>
|
||||
<div className='space-y-4'>
|
||||
<div className='space-y-2'>
|
||||
<h4 className='text-sm font-semibold'>{t('onlineUsers')}</h4>
|
||||
<ScrollArea className='h-[400px] rounded-md border p-2'>
|
||||
{online_users.map((user, index) => (
|
||||
<div key={user.uid} className='py-1 text-xs'>
|
||||
{user.ip} (UID: {user.uid})
|
||||
</div>
|
||||
))}
|
||||
</ScrollArea>
|
||||
</div>
|
||||
</div>
|
||||
<TooltipContent className='bg-card text-foreground w-96'>
|
||||
<ScrollArea className='h-[540px] rounded-md border px-4 py-2'>
|
||||
<h4 className='py-1 text-sm font-semibold'>{t('onlineUsers')}</h4>
|
||||
<Accordion
|
||||
type='single'
|
||||
collapsible
|
||||
className='w-full'
|
||||
onValueChange={(value) => setOpenItem(value)}
|
||||
>
|
||||
{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>
|
||||
</TooltipContent>
|
||||
)}
|
||||
</Tooltip>
|
||||
|
||||
@@ -2,7 +2,6 @@ import { getTranslations } from 'next-intl/server';
|
||||
|
||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
||||
|
||||
import SubscribeApp from './app/table';
|
||||
import GroupTable from './group/table';
|
||||
import SubscribeConfig from './subscribe-config';
|
||||
import SubscribeTable from './subscribe-table';
|
||||
@@ -16,7 +15,6 @@ export default async function Page() {
|
||||
<TabsTrigger value='subscribe'>{t('tabs.subscribe')}</TabsTrigger>
|
||||
<TabsTrigger value='group'>{t('tabs.subscribeGroup')}</TabsTrigger>
|
||||
<TabsTrigger value='config'>{t('tabs.subscribeConfig')}</TabsTrigger>
|
||||
<TabsTrigger value='app'>{t('tabs.subscribeApp')}</TabsTrigger>
|
||||
</TabsList>
|
||||
<TabsContent value='subscribe'>
|
||||
<SubscribeTable />
|
||||
@@ -27,9 +25,6 @@ export default async function Page() {
|
||||
<TabsContent value='config'>
|
||||
<SubscribeConfig />
|
||||
</TabsContent>
|
||||
<TabsContent value='app'>
|
||||
<SubscribeApp />
|
||||
</TabsContent>
|
||||
</Tabs>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -157,6 +157,32 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
});
|
||||
|
||||
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 (
|
||||
<Sheet open={open} onOpenChange={setOpen}>
|
||||
@@ -298,6 +324,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
<EnhancedInput
|
||||
placeholder={t('form.noLimit')}
|
||||
type='number'
|
||||
step={1}
|
||||
{...field}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
@@ -321,7 +348,8 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
<EnhancedInput
|
||||
placeholder={t('form.noLimit')}
|
||||
type='number'
|
||||
value={field.value === -1 ? 0 : field.value}
|
||||
step={1}
|
||||
value={field.value}
|
||||
min={0}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
@@ -343,6 +371,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
<EnhancedInput
|
||||
placeholder={t('form.noLimit')}
|
||||
type='number'
|
||||
step={1}
|
||||
{...field}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
@@ -540,11 +569,12 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
<FormItem>
|
||||
<FormLabel>{t('form.discount')}</FormLabel>
|
||||
<FormControl>
|
||||
<ArrayInput<API.SubscribeDiscount>
|
||||
<ArrayInput<API.SubscribeDiscount & { price?: number }>
|
||||
fields={[
|
||||
{
|
||||
name: 'quantity',
|
||||
type: 'number',
|
||||
step: 1,
|
||||
min: 1,
|
||||
suffix: unit_time && t(`form.${unit_time}`),
|
||||
},
|
||||
@@ -555,38 +585,56 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
max: 100,
|
||||
placeholder: t('form.discountPercent'),
|
||||
suffix: '%',
|
||||
calculateValue: function (data) {
|
||||
const { unit_price } = form.getValues();
|
||||
return {
|
||||
...data,
|
||||
price: evaluateWithPrecision(
|
||||
`${unit_price} * ${data.quantity} * ${data.discount} / 100`,
|
||||
),
|
||||
};
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'price',
|
||||
placeholder: t('form.discount_price'),
|
||||
type: 'number',
|
||||
min: 0,
|
||||
formatInput: (value) => unitConversion('centsToDollars', value),
|
||||
formatOutput: (value) => unitConversion('dollarsToCents', value),
|
||||
internal: true,
|
||||
calculateValue: (data) => {
|
||||
const { unit_price } = form.getValues();
|
||||
return {
|
||||
...data,
|
||||
discount: evaluateWithPrecision(
|
||||
`${data.price} / ${data.quantity} / ${unit_price} * 100`,
|
||||
),
|
||||
};
|
||||
},
|
||||
},
|
||||
]}
|
||||
value={field.value}
|
||||
onChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
onChange={(newValues) => {
|
||||
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>
|
||||
|
||||
@@ -9,15 +9,17 @@ import { JSONEditor } from '@workspace/ui/custom-components/editor';
|
||||
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||
import { UploadImage } from '@workspace/ui/custom-components/upload-image';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { useRef } from 'react';
|
||||
import { toast } from 'sonner';
|
||||
|
||||
export default function Site() {
|
||||
const t = useTranslations('system.site');
|
||||
|
||||
const ref = useRef<API.SiteConfig | undefined>(undefined);
|
||||
const { data, refetch } = useQuery({
|
||||
queryKey: ['getSiteConfig'],
|
||||
queryFn: async () => {
|
||||
const { data } = await getSiteConfig();
|
||||
ref.current = data.data;
|
||||
return data.data;
|
||||
},
|
||||
});
|
||||
@@ -26,7 +28,7 @@ export default function Site() {
|
||||
if (data?.[key] === value) return;
|
||||
try {
|
||||
await updateSiteConfig({
|
||||
...data,
|
||||
...ref.current,
|
||||
[key]: value,
|
||||
} as API.SiteConfig);
|
||||
toast.success(t('saveSuccess'));
|
||||
|
||||
@@ -10,7 +10,6 @@ import {
|
||||
} from '@workspace/ui/components/accordion';
|
||||
import {
|
||||
AlertDialog,
|
||||
AlertDialogAction,
|
||||
AlertDialogCancel,
|
||||
AlertDialogContent,
|
||||
AlertDialogDescription,
|
||||
@@ -67,7 +66,7 @@ export default function Page() {
|
||||
<CardDescription>{t('viewLogsAndManage')}</CardDescription>
|
||||
</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'>
|
||||
<AlertDialog>
|
||||
{/* <AlertDialog>
|
||||
<AlertDialogTrigger asChild>
|
||||
<Button>{t('systemUpgrade')}</Button>
|
||||
</AlertDialogTrigger>
|
||||
@@ -81,7 +80,7 @@ export default function Page() {
|
||||
<AlertDialogAction>{t('confirmUpgrade')}</AlertDialogAction>
|
||||
</AlertDialogFooter>
|
||||
</AlertDialogContent>
|
||||
</AlertDialog>
|
||||
</AlertDialog> */}
|
||||
<AlertDialog open={openRestart} onOpenChange={setOpenRestart}>
|
||||
<AlertDialogTrigger asChild>
|
||||
<Button variant='destructive'>{t('systemReboot')}</Button>
|
||||
@@ -113,14 +112,14 @@ export default function Page() {
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<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'>
|
||||
{t('currentVersion')} <span>V1.0.0</span>
|
||||
</div>
|
||||
<div className='text-muted-foreground text-sm'>
|
||||
{t('lastUpdated')} <span>2024-12-16 12:00:00</span>
|
||||
</div>
|
||||
</div>
|
||||
</div> */}
|
||||
<Card className='overflow-hidden'>
|
||||
<CardHeader className='bg-secondary py-1'>
|
||||
<div className='flex items-center justify-between'>
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
|
||||
import { Display } from '@/components/display';
|
||||
import { ProTable, ProTableActions } from '@/components/pro-table';
|
||||
import { getSubscribeList } from '@/services/admin/subscribe';
|
||||
import { createUser, deleteUser, getUserList, updateUserBasicInfo } from '@/services/admin/user';
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { Badge } from '@workspace/ui/components/badge';
|
||||
import { Button } from '@workspace/ui/components/button';
|
||||
import { Switch } from '@workspace/ui/components/switch';
|
||||
@@ -20,8 +22,19 @@ export default function Page() {
|
||||
const [loading, setLoading] = useState(false);
|
||||
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 (
|
||||
<ProTable<API.User, Record<string, unknown>>
|
||||
<ProTable<API.User, API.GetUserListParams>
|
||||
action={ref}
|
||||
header={{
|
||||
title: t('userList'),
|
||||
@@ -132,13 +145,38 @@ export default function Page() {
|
||||
cell: ({ row }) => formatDate(row.getValue('created_at')),
|
||||
},
|
||||
]}
|
||||
request={async (pagination) => {
|
||||
const { data } = await getUserList(pagination);
|
||||
request={async (pagination, filter) => {
|
||||
const { data } = await getUserList({
|
||||
...pagination,
|
||||
...filter,
|
||||
});
|
||||
return {
|
||||
list: data.data?.list || [],
|
||||
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={{
|
||||
render: (row) => {
|
||||
return [
|
||||
|
||||
@@ -1,15 +1,121 @@
|
||||
'use client';
|
||||
|
||||
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 { Button } from '@workspace/ui/components/button';
|
||||
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 Link from 'next/link';
|
||||
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 }) {
|
||||
const t = useTranslations('user');
|
||||
const [shouldFetch, setShouldFetch] = useState(false);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
'use client';
|
||||
|
||||
import { UserSubscribeDetail } from '@/app/dashboard/user/user-detail';
|
||||
import { queryServerTotalData, queryTicketWaitReply } from '@/services/admin/console';
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card';
|
||||
@@ -11,6 +12,7 @@ import {
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from '@workspace/ui/components/select';
|
||||
import { Separator } from '@workspace/ui/components/separator';
|
||||
import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||
import { formatBytes } from '@workspace/ui/utils';
|
||||
@@ -59,15 +61,13 @@ export default function Statistics() {
|
||||
users: {
|
||||
today:
|
||||
ServerTotal?.user_traffic_ranking_today?.map((item) => ({
|
||||
name: item.user_id,
|
||||
name: item.sid,
|
||||
traffic: item.download + item.upload,
|
||||
email: item.email,
|
||||
})) || [],
|
||||
yesterday:
|
||||
ServerTotal?.user_traffic_ranking_yesterday?.map((item) => ({
|
||||
name: item.user_id,
|
||||
name: item.sid,
|
||||
traffic: item.download + item.upload,
|
||||
email: item.email,
|
||||
})) || [],
|
||||
},
|
||||
};
|
||||
@@ -175,10 +175,6 @@ export default function Statistics() {
|
||||
label: t('type'),
|
||||
color: 'hsl(var(--muted))',
|
||||
},
|
||||
email: {
|
||||
label: t('email'),
|
||||
color: 'hsl(var(--muted))',
|
||||
},
|
||||
label: {
|
||||
color: 'hsl(var(--foreground))',
|
||||
},
|
||||
@@ -204,13 +200,22 @@ export default function Statistics() {
|
||||
tickFormatter={(value, index) => String(index + 1)}
|
||||
/>
|
||||
<ChartTooltip
|
||||
trigger='hover'
|
||||
content={
|
||||
<ChartTooltipContent
|
||||
label={true}
|
||||
labelFormatter={(label) =>
|
||||
dataType === 'nodes'
|
||||
? `${t('nodes')}: ${label}`
|
||||
: `${t('users')}: ${label}`
|
||||
labelFormatter={(label, [payload]) =>
|
||||
dataType === 'nodes' ? (
|
||||
`${t('nodes')}: ${label}`
|
||||
) : (
|
||||
<>
|
||||
<div className='w-80'>
|
||||
<UserSubscribeDetail id={payload?.payload.name} enabled={true} />
|
||||
</div>
|
||||
<Separator className='my-2' />
|
||||
<div>{`${t('users')}: ${label}`}</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
formatter={(value) => {
|
||||
return formatBytes(Number(value) || 0);
|
||||
|
||||
@@ -81,16 +81,26 @@ export const navs = [
|
||||
url: '/dashboard/server',
|
||||
icon: 'flat-color-icons:data-protection',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Finance',
|
||||
items: [
|
||||
{
|
||||
title: 'Application Management',
|
||||
url: '/dashboard/application',
|
||||
icon: 'flat-color-icons:touchscreen-smartphone',
|
||||
},
|
||||
{
|
||||
title: 'Rule Management',
|
||||
url: '/dashboard/rules',
|
||||
icon: 'flat-color-icons:ruler',
|
||||
},
|
||||
{
|
||||
title: 'Subscribe Management',
|
||||
url: '/dashboard/subscribe',
|
||||
icon: 'flat-color-icons:shop',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Finance',
|
||||
items: [
|
||||
{
|
||||
title: 'Order Management',
|
||||
url: '/dashboard/order',
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Zadejte platnou e-mailovou adresu.",
|
||||
"existingAccount": "Již máte účet?",
|
||||
"get": "Získat",
|
||||
"invite": "Pozvánkový kód",
|
||||
"invite": "Pozvánkový kód (volitelné)",
|
||||
"message": "#### Vážený uživateli,\n\nDěkujeme za váš zájem a podporu. V důsledku úpravy provozní strategie jsme uzavřeli registraci nových uživatelů. Během této doby nebude používání stávajících účtů nijak ovlivněno.\n\nSnažíme se vám poskytnout lepší služby a zážitky, a proto během uzavření registrace provedeme komplexní optimalizaci systému a aktualizaci funkcí. V budoucnu vás přivítáme s kvalitnějším obsahem a službami.\n\nSledujte naše webové stránky a sociální média pro nejnovější aktualizace a oznámení. Děkujeme za vaše pochopení a podporu.\n\nPokud máte jakékoli dotazy nebo potřebujete pomoc, neváhejte kontaktovat náš zákaznický servis.\n\n**Ještě jednou děkujeme za vaši podporu a pochopení.**",
|
||||
"passwordMismatch": "Hesla se neshodují",
|
||||
"success": "Registrace úspěšná, automaticky přihlášeno!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "Konfigurace ADS",
|
||||
"Announcement Management": "Správa oznámení",
|
||||
"Apple": "Apple ID",
|
||||
"Application Management": "Správa aplikací",
|
||||
"Auth Control": "Řízení ověřování",
|
||||
"Coupon Management": "Správa kupónů",
|
||||
"Dashboard": "Přístrojová deska",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Správa objednávek",
|
||||
"Payment Config": "Konfigurace platby",
|
||||
"Phone Number": "Telefonní číslo",
|
||||
"Rule Management": "Správa pravidel",
|
||||
"Server": "Server",
|
||||
"Server Management": "Správa serveru",
|
||||
"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",
|
||||
"actions": "akce",
|
||||
"active": "Aktivní",
|
||||
"add": "Přidat",
|
||||
"administrator": "Administrátor",
|
||||
"areaCode": "Směrový kód",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "e-mail",
|
||||
"enable": "Povolit",
|
||||
"expireTime": "Čas vypršení",
|
||||
"expired": "Vypršelo",
|
||||
"expiredAt": "Platnost vypršela",
|
||||
"failed": "Neúspěch",
|
||||
"giftAmount": "Částka dárku",
|
||||
"giftAmountPlaceholder": "Zadejte částku dárku",
|
||||
"inactive": "Neaktivní",
|
||||
"invalidEmailFormat": "Neplatný formát e-mailu",
|
||||
"inviteCode": "Pozvánkový kód",
|
||||
"inviteCodePlaceholder": "Zadejte kód pozvánky (ponechte prázdné pro vygenerování)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Zadejte nové heslo (volitelné)",
|
||||
"permanent": "Trvalý",
|
||||
"pleaseEnterEmail": "Prosím, zadejte e-mail",
|
||||
"price": "Cena",
|
||||
"referer": "Doporučitel",
|
||||
"refererId": "ID doporučitele",
|
||||
"refererIdPlaceholder": "Zadejte ID doporučitele",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Vyhledat IP adresu",
|
||||
"selectAuthType": "Vyberte typ ověření",
|
||||
"speedLimit": "Rychlostní limit",
|
||||
"startTime": "Čas zahájení",
|
||||
"status": "Stav",
|
||||
"subscription": "Předplatné",
|
||||
"subscriptionDetails": "Podrobnosti o předplatném",
|
||||
"subscriptionId": "ID předplatného",
|
||||
"subscriptionInfo": "Informace o předplatném",
|
||||
"subscriptionList": "Seznam předplatných",
|
||||
"subscriptionLogs": "Záznamy o předplatném",
|
||||
"subscriptionName": "Název předplatného",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Obchodní oznámení",
|
||||
"trafficLimit": "Limit provozu",
|
||||
"trafficLogs": "Protokoly provozu",
|
||||
"trafficUsage": "Využití dat",
|
||||
"unknown": "Neznámé",
|
||||
"unlimited": "Neomezený",
|
||||
"unverified": "Neověřeno",
|
||||
"update": "Aktualizovat",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Uživatelský agent",
|
||||
"userEmail": "Uživatelský e-mail",
|
||||
"userEmailPlaceholder": "Zadejte e-mail uživatele",
|
||||
"userId": "ID uživatele",
|
||||
"userInfo": "Informace o uživateli",
|
||||
"userList": "Seznam uživatelů",
|
||||
"userLogs": "Historie přihlášení",
|
||||
"userName": "Identifikátor uživatele",
|
||||
"userOrders": "Objednávky",
|
||||
"userProfile": "Profil",
|
||||
"userSubscriptions": "Předplatné",
|
||||
"verified": "Ověřeno"
|
||||
"username": "Uživatelské jméno",
|
||||
"verified": "Ověřeno",
|
||||
"viewDetails": "Zobrazit podrobnosti"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
|
||||
"existingAccount": "Bereits ein Konto?",
|
||||
"get": "Erhalten",
|
||||
"invite": "Einladungscode",
|
||||
"invite": "Einladungscode (optional)",
|
||||
"message": "#### Sehr geehrter Nutzer,\n\nVielen Dank für Ihr Interesse und Ihre Unterstützung. Aufgrund einer Anpassung unserer Betriebsstrategie haben wir die Registrierung für neue Nutzer geschlossen. Während dieser Zeit wird die Nutzung für bestehende Nutzer nicht beeinträchtigt.\n\nWir sind bestrebt, Ihnen einen besseren Service und ein besseres Erlebnis zu bieten, und werden daher während der Schließung der Registrierung umfassende Systemoptimierungen und Funktionsupgrades durchführen. In Zukunft werden wir Sie mit hochwertigeren Inhalten und Dienstleistungen willkommen heißen.\n\nBitte folgen Sie unserer Website und unseren Social-Media-Plattformen, um die neuesten Updates und Benachrichtigungen zu erhalten. Vielen Dank für Ihr Verständnis und Ihre Unterstützung.\n\nBei Fragen oder wenn Sie Hilfe benötigen, kontaktieren Sie bitte jederzeit unser Kundenserviceteam.\n\n**Nochmals vielen Dank für Ihre Unterstützung und Ihr Verständnis.**",
|
||||
"passwordMismatch": "Die eingegebenen Passwörter stimmen nicht überein",
|
||||
"success": "Registrierung erfolgreich, Sie sind automatisch eingeloggt!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "ADS-Konfiguration",
|
||||
"Announcement Management": "Ankündigungsverwaltung",
|
||||
"Apple": "Apple-ID",
|
||||
"Application Management": "Anwendungsverwaltung",
|
||||
"Auth Control": "Authentifizierungskontrolle",
|
||||
"Coupon Management": "Gutscheinverwaltung",
|
||||
"Dashboard": "Armaturenbrett",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Bestellverwaltung",
|
||||
"Payment Config": "Zahlungskonfiguration",
|
||||
"Phone Number": "Telefonnummer",
|
||||
"Rule Management": "Regelverwaltung",
|
||||
"Server": "Dienst",
|
||||
"Server Management": "Serververwaltung",
|
||||
"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",
|
||||
"actions": "Aktionen",
|
||||
"active": "Aktiv",
|
||||
"add": "Hinzufügen",
|
||||
"administrator": "Administrator",
|
||||
"areaCode": "Vorwahl",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "E-Mail",
|
||||
"enable": "Aktivieren",
|
||||
"expireTime": "Ablaufzeit",
|
||||
"expired": "Abgelaufen",
|
||||
"expiredAt": "Abgelaufen am",
|
||||
"failed": "Fehlgeschlagen",
|
||||
"giftAmount": "Geschenkbetrag",
|
||||
"giftAmountPlaceholder": "Geben Sie den Geschenkbetrag ein",
|
||||
"inactive": "Inaktiv",
|
||||
"invalidEmailFormat": "Ungültiges E-Mail-Format",
|
||||
"inviteCode": "Einladungscode",
|
||||
"inviteCodePlaceholder": "Einladungscode eingeben (leer lassen, um zu generieren)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Neues Passwort eingeben (optional)",
|
||||
"permanent": "Dauerhaft",
|
||||
"pleaseEnterEmail": "Bitte E-Mail eingeben",
|
||||
"price": "Preis",
|
||||
"referer": "Empfehler",
|
||||
"refererId": "Referenz-ID",
|
||||
"refererIdPlaceholder": "Geben Sie die Referenz-ID ein",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "IP-Adresse suchen",
|
||||
"selectAuthType": "Authentifizierungstyp auswählen",
|
||||
"speedLimit": "Geschwindigkeitsbegrenzung",
|
||||
"startTime": "Startzeit",
|
||||
"status": "Status",
|
||||
"subscription": "Abonnement",
|
||||
"subscriptionDetails": "Abonnementdetails",
|
||||
"subscriptionId": "Abonnement-ID",
|
||||
"subscriptionInfo": "Abonnement-Informationen",
|
||||
"subscriptionList": "Abonnementsliste",
|
||||
"subscriptionLogs": "Abonnementprotokolle",
|
||||
"subscriptionName": "Abonnementname",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Handelsbenachrichtigungen",
|
||||
"trafficLimit": "Verkehrslimit",
|
||||
"trafficLogs": "Verkehrsprotokolle",
|
||||
"trafficUsage": "Datenverbrauch",
|
||||
"unknown": "Unbekannt",
|
||||
"unlimited": "Unbegrenzt",
|
||||
"unverified": "Unbestätigt",
|
||||
"update": "Aktualisieren",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Benutzeragent",
|
||||
"userEmail": "Benutzer-E-Mail",
|
||||
"userEmailPlaceholder": "Benutzer-E-Mail eingeben",
|
||||
"userId": "Benutzer-ID",
|
||||
"userInfo": "Benutzerinformationen",
|
||||
"userList": "Benutzerliste",
|
||||
"userLogs": "Anmeldeverlauf",
|
||||
"userName": "Benutzerkennung",
|
||||
"userOrders": "Bestellungen",
|
||||
"userProfile": "Profil",
|
||||
"userSubscriptions": "Abonnements",
|
||||
"verified": "Verifiziert"
|
||||
"username": "Benutzername",
|
||||
"verified": "Verifiziert",
|
||||
"viewDetails": "Details anzeigen"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Please enter a valid email address.",
|
||||
"existingAccount": "Already have an account?",
|
||||
"get": "Get",
|
||||
"invite": "Invitation code",
|
||||
"invite": "Invitation code (optional)",
|
||||
"message": "#### Dear User, Hello!\n\nThank you for your attention and support. Due to adjustments in site operation strategy, we have closed the new user registration function. During this period, existing users will not be affected.\n\nWe are committed to providing you with better service and experience, so we will conduct comprehensive system optimization and feature upgrades during the registration closure. In the future, we will welcome you with better content and services.\n\nPlease follow our website and social media platforms to get the latest updates and notifications. Thank you for your understanding and support.\n\nIf you have any questions or need assistance, please feel free to contact our customer service team.\n\n**Thank you again for your support and understanding.**",
|
||||
"passwordMismatch": "Passwords do not match",
|
||||
"success": "Registration successful, automatically logged in!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "ADS Config",
|
||||
"Announcement Management": "Announcement Management",
|
||||
"Apple": "Apple ID",
|
||||
"Application Management": "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": "Rule Management",
|
||||
"Server": "Server",
|
||||
"Server Management": "Server Management",
|
||||
"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",
|
||||
"actions": "Actions",
|
||||
"active": "Active",
|
||||
"add": "Add",
|
||||
"administrator": "Administrator",
|
||||
"areaCode": "Area Code",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "Email",
|
||||
"enable": "Enable",
|
||||
"expireTime": "Expire Time",
|
||||
"expired": "Expired",
|
||||
"expiredAt": "Expired At",
|
||||
"failed": "Failed",
|
||||
"giftAmount": "Gift Amount",
|
||||
"giftAmountPlaceholder": "Enter gift amount",
|
||||
"inactive": "Inactive",
|
||||
"invalidEmailFormat": "Invalid email format",
|
||||
"inviteCode": "Invite Code",
|
||||
"inviteCodePlaceholder": "Enter invite code (leave blank to generate)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Enter new password (optional)",
|
||||
"permanent": "Permanent",
|
||||
"pleaseEnterEmail": "Please enter email",
|
||||
"price": "Price",
|
||||
"referer": "Referer",
|
||||
"refererId": "Referer ID",
|
||||
"refererIdPlaceholder": "Enter referer ID",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Search IP address",
|
||||
"selectAuthType": "Select auth type",
|
||||
"speedLimit": "Speed Limit",
|
||||
"startTime": "Start Time",
|
||||
"status": "Status",
|
||||
"subscription": "Subscription",
|
||||
"subscriptionDetails": "Subscription Details",
|
||||
"subscriptionId": "Subscription ID",
|
||||
"subscriptionInfo": "Subscription Info",
|
||||
"subscriptionList": "Subscription List",
|
||||
"subscriptionLogs": "Subscription Logs",
|
||||
"subscriptionName": "Subscription Name",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Trade Notifications",
|
||||
"trafficLimit": "Traffic Limit",
|
||||
"trafficLogs": "Traffic Logs",
|
||||
"trafficUsage": "Traffic Usage",
|
||||
"unknown": "Unknown",
|
||||
"unlimited": "Unlimited",
|
||||
"unverified": "Unverified",
|
||||
"update": "Update",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "User Agent",
|
||||
"userEmail": "User Email",
|
||||
"userEmailPlaceholder": "Enter user email",
|
||||
"userId": "User ID",
|
||||
"userInfo": "User Info",
|
||||
"userList": "User List",
|
||||
"userLogs": "Login History",
|
||||
"userName": "User Identifier",
|
||||
"userOrders": "Orders",
|
||||
"userProfile": "Profile",
|
||||
"userSubscriptions": "Subscriptions",
|
||||
"verified": "Verified"
|
||||
"username": "Username",
|
||||
"verified": "Verified",
|
||||
"viewDetails": "View Details"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Por favor, introduce una dirección de correo electrónico válida.",
|
||||
"existingAccount": "¿Ya tienes una cuenta?",
|
||||
"get": "Obtener",
|
||||
"invite": "Código de invitación",
|
||||
"invite": "Código de invitación (opcional)",
|
||||
"message": "#### ¡Estimado usuario!\n\nGracias por su interés y apoyo. Debido a un ajuste en la estrategia de operación del sitio, hemos cerrado la función de registro para nuevos usuarios. Durante este período, el uso por parte de los usuarios existentes no se verá afectado.\n\nNos comprometemos a brindarle un mejor servicio y experiencia, por lo que realizaremos una optimización completa del sistema y una actualización de funciones durante el cierre del registro. En el futuro, le daremos la bienvenida con contenido y servicios de mayor calidad.\n\nPor favor, siga nuestro sitio web y plataformas de redes sociales para obtener las últimas actualizaciones y notificaciones. Agradecemos su comprensión y apoyo.\n\nSi tiene alguna pregunta o necesita ayuda, no dude en ponerse en contacto con nuestro equipo de atención al cliente.\n\n**Nuevamente, gracias por su apoyo y comprensión.**",
|
||||
"passwordMismatch": "Las contraseñas no coinciden",
|
||||
"success": "¡Registro exitoso, sesión iniciada automáticamente!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "Configuración de ADS",
|
||||
"Announcement Management": "Gestión de Anuncios",
|
||||
"Apple": "ID de Apple",
|
||||
"Application Management": "Gestión de Aplicaciones",
|
||||
"Auth Control": "Control de Autenticación",
|
||||
"Coupon Management": "Gestión de Cupones",
|
||||
"Dashboard": "Tablero",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Gestión de Pedidos",
|
||||
"Payment Config": "Configuración de Pago",
|
||||
"Phone Number": "Número de Teléfono",
|
||||
"Rule Management": "Gestión de Reglas",
|
||||
"Server": "Servidor",
|
||||
"Server Management": "Gestión de Servidores",
|
||||
"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",
|
||||
"actions": "acciones",
|
||||
"active": "Activo",
|
||||
"add": "Agregar",
|
||||
"administrator": "Administrador",
|
||||
"areaCode": "Código de Área",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "correo electrónico",
|
||||
"enable": "Habilitar",
|
||||
"expireTime": "Tiempo de Expiración",
|
||||
"expired": "Caducado",
|
||||
"expiredAt": "Fecha de vencimiento",
|
||||
"failed": "Fallido",
|
||||
"giftAmount": "Monto del Regalo",
|
||||
"giftAmountPlaceholder": "Ingrese el monto del regalo",
|
||||
"inactive": "Inactivo",
|
||||
"invalidEmailFormat": "Formato de correo electrónico no válido",
|
||||
"inviteCode": "Código de invitación",
|
||||
"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)",
|
||||
"permanent": "Permanente",
|
||||
"pleaseEnterEmail": "Por favor, introduce el correo electrónico",
|
||||
"price": "Precio",
|
||||
"referer": "Recomendador",
|
||||
"refererId": "ID del Referente",
|
||||
"refererIdPlaceholder": "Ingrese el ID del referente",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Buscar dirección IP",
|
||||
"selectAuthType": "Seleccionar tipo de autenticación",
|
||||
"speedLimit": "Límite de Velocidad",
|
||||
"startTime": "Hora de Inicio",
|
||||
"status": "Estado",
|
||||
"subscription": "Suscripción",
|
||||
"subscriptionDetails": "Detalles de la suscripción",
|
||||
"subscriptionId": "ID de Suscripción",
|
||||
"subscriptionInfo": "Información de Suscripción",
|
||||
"subscriptionList": "Lista de Suscripción",
|
||||
"subscriptionLogs": "Registros de Suscripción",
|
||||
"subscriptionName": "Nombre de la Suscripción",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Notificaciones de Comercio",
|
||||
"trafficLimit": "Límite de Tráfico",
|
||||
"trafficLogs": "Registros de Tráfico",
|
||||
"trafficUsage": "Uso de Tráfico",
|
||||
"unknown": "Desconocido",
|
||||
"unlimited": "Ilimitado",
|
||||
"unverified": "No verificado",
|
||||
"update": "Actualizar",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Agente de Usuario",
|
||||
"userEmail": "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",
|
||||
"userLogs": "Historial de inicio de sesión",
|
||||
"userName": "Identificador de Usuario",
|
||||
"userOrders": "Pedidos",
|
||||
"userProfile": "Perfil",
|
||||
"userSubscriptions": "Suscripciones",
|
||||
"verified": "Verificado"
|
||||
"username": "Nombre de Usuario",
|
||||
"verified": "Verificado",
|
||||
"viewDetails": "Ver Detalles"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Por favor, ingresa una dirección de correo electrónico válida.",
|
||||
"existingAccount": "¿Ya tienes una cuenta?",
|
||||
"get": "Obtener",
|
||||
"invite": "Código de invitación",
|
||||
"invite": "Código de invitación (opcional)",
|
||||
"message": "#### Estimado usuario,\n\nGracias por su interés y apoyo. Debido a un ajuste en la estrategia de operación del sitio, hemos cerrado la función de registro para nuevos usuarios. Durante este período, el uso por parte de los usuarios existentes no se verá afectado.\n\nNos comprometemos a ofrecerle un mejor servicio y experiencia, por lo que realizaremos una optimización completa del sistema y una actualización de funciones durante el cierre del registro. En el futuro, le daremos la bienvenida con contenido y servicios de mayor calidad.\n\nPor favor, siga nuestro sitio web y plataformas de redes sociales para obtener las últimas actualizaciones y notificaciones. Agradecemos su comprensión y apoyo.\n\nSi tiene alguna pregunta o necesita ayuda, no dude en ponerse en contacto con nuestro equipo de atención al cliente.\n\n**Nuevamente, gracias por su apoyo y comprensión.**",
|
||||
"passwordMismatch": "Las contraseñas no coinciden",
|
||||
"success": "¡Registro exitoso, has iniciado sesión automáticamente!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "Configuración de ADS",
|
||||
"Announcement Management": "Gestión de Anuncios",
|
||||
"Apple": "ID de Apple",
|
||||
"Application Management": "Gestión de Aplicaciones",
|
||||
"Auth Control": "Control de Autenticación",
|
||||
"Coupon Management": "Gestión de Cupones",
|
||||
"Dashboard": "Tablero",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Gestión de Pedidos",
|
||||
"Payment Config": "Configuración de Pago",
|
||||
"Phone Number": "Número de Teléfono",
|
||||
"Rule Management": "Gestión de Reglas",
|
||||
"Server": "Servidor",
|
||||
"Server Management": "Gestión de Servidores",
|
||||
"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",
|
||||
"actions": "acciones",
|
||||
"active": "Activo",
|
||||
"add": "Agregar",
|
||||
"administrator": "Administrador",
|
||||
"areaCode": "Código de Área",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "correo electrónico",
|
||||
"enable": "Habilitar",
|
||||
"expireTime": "Tiempo de Expiración",
|
||||
"expired": "Expirado",
|
||||
"expiredAt": "Fecha de vencimiento",
|
||||
"failed": "Fallido",
|
||||
"giftAmount": "Monto del Regalo",
|
||||
"giftAmountPlaceholder": "Ingrese el monto del regalo",
|
||||
"inactive": "Inactivo",
|
||||
"invalidEmailFormat": "Formato de correo electrónico no válido",
|
||||
"inviteCode": "Código de Invitación",
|
||||
"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)",
|
||||
"permanent": "Permanente",
|
||||
"pleaseEnterEmail": "Por favor, ingresa el correo electrónico",
|
||||
"price": "Precio",
|
||||
"referer": "Recomendador",
|
||||
"refererId": "ID del Referente",
|
||||
"refererIdPlaceholder": "Ingrese ID del referente",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Buscar dirección IP",
|
||||
"selectAuthType": "Seleccionar tipo de autenticación",
|
||||
"speedLimit": "Límite de Velocidad",
|
||||
"startTime": "Hora de Inicio",
|
||||
"status": "Estado",
|
||||
"subscription": "Suscripción",
|
||||
"subscriptionDetails": "Detalles de la Suscripción",
|
||||
"subscriptionId": "ID de Suscripción",
|
||||
"subscriptionInfo": "Información de Suscripción",
|
||||
"subscriptionList": "Lista de Suscripción",
|
||||
"subscriptionLogs": "Registros de Suscripción",
|
||||
"subscriptionName": "Nombre de la Suscripción",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Notificaciones de Comercio",
|
||||
"trafficLimit": "Límite de Tráfico",
|
||||
"trafficLogs": "Registros de Tráfico",
|
||||
"trafficUsage": "Uso de Tráfico",
|
||||
"unknown": "Desconocido",
|
||||
"unlimited": "Ilimitado",
|
||||
"unverified": "No verificado",
|
||||
"update": "Actualizar",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Agente de Usuario",
|
||||
"userEmail": "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",
|
||||
"userLogs": "Historial de Inicio de Sesión",
|
||||
"userName": "Identificador de Usuario",
|
||||
"userOrders": "Pedidos",
|
||||
"userProfile": "Perfil",
|
||||
"userSubscriptions": "Suscripciones",
|
||||
"verified": "Verificado"
|
||||
"username": "Nombre de Usuario",
|
||||
"verified": "Verificado",
|
||||
"viewDetails": "Ver Detalles"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "لطفاً یک آدرس ایمیل معتبر وارد کنید.",
|
||||
"existingAccount": "آیا قبلاً حساب کاربری دارید؟",
|
||||
"get": "دریافت",
|
||||
"invite": "کد دعوت",
|
||||
"invite": "کد دعوت (اختیاری)",
|
||||
"message": "#### کاربر گرامی، سلام!\n\nاز توجه و حمایت شما سپاسگزاریم. به دلیل تغییرات در استراتژی عملیاتی سایت، عملکرد ثبتنام کاربران جدید را متوقف کردهایم. در این مدت، کاربران فعلی تحت تأثیر قرار نخواهند گرفت.\n\nما متعهد به ارائه خدمات و تجربه بهتر به شما هستیم، بنابراین در طول این دوره، بهینهسازی جامع سیستم و ارتقاء ویژگیها را انجام خواهیم داد. در آینده، با محتوای و خدمات بهتر از شما استقبال خواهیم کرد.\n\nلطفاً برای دریافت آخرین بهروزرسانیها و اطلاعیهها، وبسایت و پلتفرمهای اجتماعی ما را دنبال کنید. از درک و حمایت شما سپاسگزاریم.\n\nاگر سوالی دارید یا به کمک نیاز دارید، لطفاً با تیم خدمات مشتری ما تماس بگیرید.\n\n**بار دیگر از حمایت و درک شما سپاسگزاریم.**",
|
||||
"passwordMismatch": "رمزهای عبور مطابقت ندارند",
|
||||
"success": "ثبتنام موفقیتآمیز بود، بهطور خودکار وارد شدید!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "تنظیمات ADS",
|
||||
"Announcement Management": "مدیریت اطلاعیهها",
|
||||
"Apple": "شناسه اپل",
|
||||
"Application Management": "مدیریت برنامه",
|
||||
"Auth Control": "کنترل احراز هویت",
|
||||
"Coupon Management": "مدیریت کوپن",
|
||||
"Dashboard": "داشبورد",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "مدیریت سفارش",
|
||||
"Payment Config": "پیکربندی پرداخت",
|
||||
"Phone Number": "شماره تلفن",
|
||||
"Rule Management": "مدیریت قوانین",
|
||||
"Server": "سرور",
|
||||
"Server Management": "مدیریت سرور",
|
||||
"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": "فعالسازی حساب",
|
||||
"actions": "اقدامات",
|
||||
"active": "فعال",
|
||||
"add": "افزودن",
|
||||
"administrator": "مدیر",
|
||||
"areaCode": "کد منطقه",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "ایمیل",
|
||||
"enable": "فعال کردن",
|
||||
"expireTime": "زمان انقضا",
|
||||
"expired": "منقضی شده",
|
||||
"expiredAt": "منقضی شده در",
|
||||
"failed": "ناموفق",
|
||||
"giftAmount": "مقدار هدیه",
|
||||
"giftAmountPlaceholder": "مبلغ هدیه را وارد کنید",
|
||||
"inactive": "غیرفعال",
|
||||
"invalidEmailFormat": "فرمت ایمیل نامعتبر است",
|
||||
"inviteCode": "کد دعوت",
|
||||
"inviteCodePlaceholder": "کد دعوت را وارد کنید (برای تولید خالی بگذارید)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "رمز عبور جدید را وارد کنید (اختیاری)",
|
||||
"permanent": "دائمی",
|
||||
"pleaseEnterEmail": "لطفاً ایمیل خود را وارد کنید",
|
||||
"price": "قیمت",
|
||||
"referer": "ارجاعدهنده",
|
||||
"refererId": "شناسه معرف",
|
||||
"refererIdPlaceholder": "شناسه معرف را وارد کنید",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "جستجوی آدرس IP",
|
||||
"selectAuthType": "نوع احراز هویت را انتخاب کنید",
|
||||
"speedLimit": "محدودیت سرعت",
|
||||
"startTime": "زمان شروع",
|
||||
"status": "وضعیت",
|
||||
"subscription": "اشتراک",
|
||||
"subscriptionDetails": "جزئیات اشتراک",
|
||||
"subscriptionId": "شناسه اشتراک",
|
||||
"subscriptionInfo": "اطلاعات اشتراک",
|
||||
"subscriptionList": "لیست اشتراک",
|
||||
"subscriptionLogs": "گزارشهای اشتراک",
|
||||
"subscriptionName": "نام اشتراک",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "اعلانهای تجارت",
|
||||
"trafficLimit": "محدودیت ترافیک",
|
||||
"trafficLogs": "گزارشهای ترافیک",
|
||||
"trafficUsage": "استفاده از ترافیک",
|
||||
"unknown": "نامشخص",
|
||||
"unlimited": "نامحدود",
|
||||
"unverified": "تأیید نشده",
|
||||
"update": "بهروزرسانی",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "عامل کاربر",
|
||||
"userEmail": "ایمیل کاربر",
|
||||
"userEmailPlaceholder": "ایمیل کاربر را وارد کنید",
|
||||
"userId": "شناسه کاربر",
|
||||
"userInfo": "اطلاعات کاربر",
|
||||
"userList": "فهرست کاربران",
|
||||
"userLogs": "تاریخچه ورود",
|
||||
"userName": "شناسه کاربر",
|
||||
"userOrders": "سفارشها",
|
||||
"userProfile": "پروفایل",
|
||||
"userSubscriptions": "اشتراکها",
|
||||
"verified": "تأیید شده"
|
||||
"username": "نام کاربری",
|
||||
"verified": "تأیید شده",
|
||||
"viewDetails": "مشاهده جزئیات"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Anna kelvollinen sähköpostiosoite.",
|
||||
"existingAccount": "Onko sinulla jo tili?",
|
||||
"get": "Hanki",
|
||||
"invite": "Kutsukoodi",
|
||||
"invite": "Kutsukoodi (valinnainen)",
|
||||
"message": "#### Arvoisa käyttäjä,\n\nKiitos mielenkiinnostasi ja tuestasi. Sivuston toimintastrategian muutosten vuoksi olemme sulkeneet uusien käyttäjien rekisteröinnin. Tänä aikana nykyisten käyttäjien käyttö ei vaikutu millään tavalla.\n\nOlemme sitoutuneet tarjoamaan sinulle parempaa palvelua ja kokemusta, joten rekisteröinnin sulkemisen aikana suoritamme kattavan järjestelmän optimoinnin ja toiminnallisuuden päivityksen. Tulevaisuudessa toivotamme sinut tervetulleeksi entistä laadukkaamman sisällön ja palvelun kera.\n\nSeuraa verkkosivustoamme ja sosiaalisen median alustoja saadaksesi uusimmat päivitykset ja ilmoitukset. Kiitos ymmärryksestäsi ja tuestasi.\n\nJos sinulla on kysyttävää tai tarvitset apua, ota yhteyttä asiakaspalvelutiimiimme.\n\n**Kiitos vielä kerran tuestasi ja ymmärryksestäsi.**",
|
||||
"passwordMismatch": "Salasanat eivät täsmää",
|
||||
"success": "Rekisteröinti onnistui, olet kirjautunut automaattisesti!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "ADS-asetukset",
|
||||
"Announcement Management": "Ilmoitusten hallinta",
|
||||
"Apple": "Apple ID",
|
||||
"Application Management": "Sovellushallinta",
|
||||
"Auth Control": "Todennuksen hallinta",
|
||||
"Coupon Management": "Kuponkien hallinta",
|
||||
"Dashboard": "Kojelauta",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Tilausten hallinta",
|
||||
"Payment Config": "Maksukonfiguraatio",
|
||||
"Phone Number": "Puhelinnumero",
|
||||
"Rule Management": "Sääntöhallinta",
|
||||
"Server": "Palvelu",
|
||||
"Server Management": "Palvelimen hallinta",
|
||||
"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",
|
||||
"actions": "toiminnot",
|
||||
"active": "Aktiivinen",
|
||||
"add": "Lisää",
|
||||
"administrator": "Ylläpitäjä",
|
||||
"areaCode": "Alueen koodi",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "sähköposti",
|
||||
"enable": "Ota käyttöön",
|
||||
"expireTime": "Vanhentumisaika",
|
||||
"expired": "Vanhentunut",
|
||||
"expiredAt": "Vanhentunut",
|
||||
"failed": "Epäonnistui",
|
||||
"giftAmount": "Lahjan määrä",
|
||||
"giftAmountPlaceholder": "Syötä lahjan määrä",
|
||||
"inactive": "Epäaktiivinen",
|
||||
"invalidEmailFormat": "Virheellinen sähköpostimuoto",
|
||||
"inviteCode": "Kutsukoodi",
|
||||
"inviteCodePlaceholder": "Syötä kutsukoodi (jätä tyhjäksi luodaksesi uuden)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Syötä uusi salasana (valinnainen)",
|
||||
"permanent": "Pysyvä",
|
||||
"pleaseEnterEmail": "Ole hyvä ja syötä sähköpostiosoite",
|
||||
"price": "Hinta",
|
||||
"referer": "Suosittelija",
|
||||
"refererId": "Viittaajan ID",
|
||||
"refererIdPlaceholder": "Syötä suosittelijan ID",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Etsi IP-osoite",
|
||||
"selectAuthType": "Valitse todennustyyppi",
|
||||
"speedLimit": "Nopeusrajoitus",
|
||||
"startTime": "Aloitusaika",
|
||||
"status": "Tila",
|
||||
"subscription": "Tilaus",
|
||||
"subscriptionDetails": "Tilaustiedot",
|
||||
"subscriptionId": "Tilauksen ID",
|
||||
"subscriptionInfo": "Tilauksen tiedot",
|
||||
"subscriptionList": "Tilauksen lista",
|
||||
"subscriptionLogs": "Tilaushistoria",
|
||||
"subscriptionName": "Tilauksen nimi",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Kauppailmoitukset",
|
||||
"trafficLimit": "Liikenteen rajoitus",
|
||||
"trafficLogs": "Liikennelokit",
|
||||
"trafficUsage": "Liikenteen käyttö",
|
||||
"unknown": "Tuntematon",
|
||||
"unlimited": "Rajoittamaton",
|
||||
"unverified": "Vahvistamaton",
|
||||
"update": "Päivitä",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Käyttäjäagentti",
|
||||
"userEmail": "Käyttäjän sähköposti",
|
||||
"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",
|
||||
"userLogs": "Kirjautumishistoria",
|
||||
"userName": "Käyttäjän tunniste",
|
||||
"userOrders": "Tilaukset",
|
||||
"userProfile": "Profiili",
|
||||
"userSubscriptions": "Tilaukset",
|
||||
"verified": "Vahvistettu"
|
||||
"username": "Käyttäjänimi",
|
||||
"verified": "Vahvistettu",
|
||||
"viewDetails": "Näytä tiedot"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Veuillez entrer une adresse e-mail valide.",
|
||||
"existingAccount": "Vous avez déjà un compte ?",
|
||||
"get": "Obtenir",
|
||||
"invite": "Code d'invitation",
|
||||
"invite": "Code d'invitation (facultatif)",
|
||||
"message": "#### Cher utilisateur,\n\nMerci pour votre intérêt et votre soutien. En raison d'un ajustement de notre stratégie opérationnelle, nous avons fermé la fonction d'inscription pour les nouveaux utilisateurs. Pendant cette période, l'utilisation par les utilisateurs existants ne sera pas affectée.\n\nNous nous engageons à vous offrir un meilleur service et une meilleure expérience, c'est pourquoi nous procéderons à une optimisation complète du système et à une mise à niveau des fonctionnalités pendant la fermeture des inscriptions. À l'avenir, nous vous accueillerons avec un contenu et des services de meilleure qualité.\n\nVeuillez suivre notre site web et nos plateformes de médias sociaux pour obtenir les dernières nouvelles et notifications. Merci pour votre compréhension et votre soutien.\n\nSi vous avez des questions ou avez besoin d'aide, n'hésitez pas à contacter notre équipe de service client.\n\n**Merci encore pour votre soutien et votre compréhension.**",
|
||||
"passwordMismatch": "Les mots de passe saisis ne correspondent pas",
|
||||
"success": "Inscription réussie, vous êtes maintenant connecté automatiquement !",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "Configuration ADS",
|
||||
"Announcement Management": "Gestion des annonces",
|
||||
"Apple": "Identifiant Apple",
|
||||
"Application Management": "Gestion des applications",
|
||||
"Auth Control": "Contrôle d'authentification",
|
||||
"Coupon Management": "Gestion des coupons",
|
||||
"Dashboard": "Tableau de bord",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Gestion des commandes",
|
||||
"Payment Config": "Configuration de paiement",
|
||||
"Phone Number": "Numéro de téléphone",
|
||||
"Rule Management": "Gestion des règles",
|
||||
"Server": "Serveur",
|
||||
"Server Management": "Gestion des services",
|
||||
"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",
|
||||
"actions": "actions",
|
||||
"active": "Actif",
|
||||
"add": "Ajouter",
|
||||
"administrator": "Administrateur",
|
||||
"areaCode": "Indicatif régional",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "e-mail",
|
||||
"enable": "Activer",
|
||||
"expireTime": "Date d'expiration",
|
||||
"expired": "Expiré",
|
||||
"expiredAt": "Expiré le",
|
||||
"failed": "Échoué",
|
||||
"giftAmount": "Montant du cadeau",
|
||||
"giftAmountPlaceholder": "Entrez le montant du cadeau",
|
||||
"inactive": "Inactif",
|
||||
"invalidEmailFormat": "Format d'email invalide",
|
||||
"inviteCode": "Code d'invitation",
|
||||
"inviteCodePlaceholder": "Entrez le code d'invitation (laissez vide pour générer)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Entrez un nouveau mot de passe (facultatif)",
|
||||
"permanent": "Permanent",
|
||||
"pleaseEnterEmail": "Veuillez entrer votre adresse e-mail",
|
||||
"price": "Prix",
|
||||
"referer": "Référent",
|
||||
"refererId": "ID du référent",
|
||||
"refererIdPlaceholder": "Entrez l'ID du référent",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Rechercher une adresse IP",
|
||||
"selectAuthType": "Sélectionner le type d'authentification",
|
||||
"speedLimit": "Limite de vitesse",
|
||||
"startTime": "Date de début",
|
||||
"status": "Statut",
|
||||
"subscription": "Abonnement",
|
||||
"subscriptionDetails": "Détails de l'abonnement",
|
||||
"subscriptionId": "ID d'abonnement",
|
||||
"subscriptionInfo": "Informations sur l'abonnement",
|
||||
"subscriptionList": "Liste des abonnements",
|
||||
"subscriptionLogs": "Journaux d'abonnement",
|
||||
"subscriptionName": "Nom de l'abonnement",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Notifications de commerce",
|
||||
"trafficLimit": "Limite de trafic",
|
||||
"trafficLogs": "Journaux de trafic",
|
||||
"trafficUsage": "Utilisation du trafic",
|
||||
"unknown": "Inconnu",
|
||||
"unlimited": "Illimité",
|
||||
"unverified": "Non vérifié",
|
||||
"update": "Mettre à jour",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Agent utilisateur",
|
||||
"userEmail": "E-mail de l'utilisateur",
|
||||
"userEmailPlaceholder": "Entrez l'email de l'utilisateur",
|
||||
"userId": "ID utilisateur",
|
||||
"userInfo": "Informations sur l'utilisateur",
|
||||
"userList": "Liste des utilisateurs",
|
||||
"userLogs": "Historique des connexions",
|
||||
"userName": "Identifiant Utilisateur",
|
||||
"userOrders": "Commandes",
|
||||
"userProfile": "Profil",
|
||||
"userSubscriptions": "Abonnements",
|
||||
"verified": "Vérifié"
|
||||
"username": "Nom d'utilisateur",
|
||||
"verified": "Vérifié",
|
||||
"viewDetails": "Voir les détails"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "कृपया एक मान्य ईमेल पता दर्ज करें।",
|
||||
"existingAccount": "पहले से खाता है?",
|
||||
"get": "प्राप्त करें",
|
||||
"invite": "आमंत्रण कोड",
|
||||
"invite": "आमंत्रण कोड (वैकल्पिक)",
|
||||
"message": "#### प्रिय उपयोगकर्ता, नमस्ते!\n\nहमारे प्रति आपकी रुचि और समर्थन के लिए धन्यवाद। साइट संचालन रणनीति में बदलाव के कारण, हमने नए उपयोगकर्ता पंजीकरण को बंद कर दिया है। इस दौरान, मौजूदा उपयोगकर्ताओं के उपयोग पर कोई प्रभाव नहीं पड़ेगा।\n\nहम आपको बेहतर सेवा और अनुभव प्रदान करने के लिए प्रतिबद्ध हैं, इसलिए पंजीकरण बंद होने के दौरान हम व्यापक प्रणाली अनुकूलन और कार्यक्षमता उन्नयन करेंगे। भविष्य में, हम आपको बेहतर सामग्री और सेवाओं के साथ स्वागत करेंगे।\n\nहमारी वेबसाइट और सोशल मीडिया प्लेटफॉर्म पर नवीनतम अपडेट और सूचनाएं प्राप्त करने के लिए ध्यान दें। आपकी समझ और समर्थन के लिए धन्यवाद।\n\nयदि आपके कोई प्रश्न हैं या सहायता की आवश्यकता है, तो कृपया हमारी ग्राहक सेवा टीम से संपर्क करें।\n\n**आपके समर्थन और समझ के लिए एक बार फिर धन्यवाद।**",
|
||||
"passwordMismatch": "दोनों बार दर्ज किया गया पासवर्ड मेल नहीं खा रहा है",
|
||||
"success": "पंजीकरण सफल, स्वचालित रूप से लॉग इन हो गया!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "एडीएस कॉन्फ़िग",
|
||||
"Announcement Management": "घोषणा प्रबंधन",
|
||||
"Apple": "एप्पल आईडी",
|
||||
"Application Management": "ऐप्लिकेशन प्रबंधन",
|
||||
"Auth Control": "प्रमाणिकरण नियंत्रण",
|
||||
"Coupon Management": "कूपन प्रबंधन",
|
||||
"Dashboard": "डैशबोर्ड",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "ऑर्डर प्रबंधन",
|
||||
"Payment Config": "भुगतान कॉन्फ़िगरेशन",
|
||||
"Phone Number": "फ़ोन नंबर",
|
||||
"Rule Management": "नियम प्रबंधन",
|
||||
"Server": "सर्वर",
|
||||
"Server Management": "सर्वर प्रबंधन",
|
||||
"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": "खाता सक्षम करें",
|
||||
"actions": "क्रियाएँ",
|
||||
"active": "सक्रिय",
|
||||
"add": "जोड़ें",
|
||||
"administrator": "प्रशासक",
|
||||
"areaCode": "क्षेत्र कोड",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "ईमेल",
|
||||
"enable": "सक्षम करें",
|
||||
"expireTime": "समाप्ति समय",
|
||||
"expired": "समाप्त",
|
||||
"expiredAt": "समाप्ति तिथि",
|
||||
"failed": "असफल",
|
||||
"giftAmount": "उपहार राशि",
|
||||
"giftAmountPlaceholder": "उपहार राशि दर्ज करें",
|
||||
"inactive": "निष्क्रिय",
|
||||
"invalidEmailFormat": "अमान्य ईमेल प्रारूप",
|
||||
"inviteCode": "आमंत्रण कोड",
|
||||
"inviteCodePlaceholder": "आमंत्रण कोड दर्ज करें (उत्पन्न करने के लिए खाली छोड़ें)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "नया पासवर्ड दर्ज करें (वैकल्पिक)",
|
||||
"permanent": "स्थायी",
|
||||
"pleaseEnterEmail": "कृपया ईमेल दर्ज करें",
|
||||
"price": "कीमत",
|
||||
"referer": "सिफारिशकर्ता",
|
||||
"refererId": "रेफरर आईडी",
|
||||
"refererIdPlaceholder": "रेफरर आईडी दर्ज करें",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "आईपी पता खोजें",
|
||||
"selectAuthType": "प्रमाणीकरण प्रकार चुनें",
|
||||
"speedLimit": "गति सीमा",
|
||||
"startTime": "शुरुआत का समय",
|
||||
"status": "स्थिति",
|
||||
"subscription": "सदस्यता",
|
||||
"subscriptionDetails": "सदस्यता विवरण",
|
||||
"subscriptionId": "सदस्यता आईडी",
|
||||
"subscriptionInfo": "सदस्यता जानकारी",
|
||||
"subscriptionList": "सदस्यता सूची",
|
||||
"subscriptionLogs": "सदस्यता लॉग्स",
|
||||
"subscriptionName": "सदस्यता नाम",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "व्यापार सूचनाएं",
|
||||
"trafficLimit": "ट्रैफिक सीमा",
|
||||
"trafficLogs": "ट्रैफिक लॉग्स",
|
||||
"trafficUsage": "ट्रैफ़िक उपयोग",
|
||||
"unknown": "अज्ञात",
|
||||
"unlimited": "असीमित",
|
||||
"unverified": "असत्यापित",
|
||||
"update": "अपडेट",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "उपयोगकर्ता एजेंट",
|
||||
"userEmail": "उपयोगकर्ता ईमेल",
|
||||
"userEmailPlaceholder": "उपयोगकर्ता ईमेल दर्ज करें",
|
||||
"userId": "उपयोगकर्ता आईडी",
|
||||
"userInfo": "उपयोगकर्ता जानकारी",
|
||||
"userList": "उपयोगकर्ता सूची",
|
||||
"userLogs": "लॉगिन इतिहास",
|
||||
"userName": "उपयोगकर्ता पहचानकर्ता",
|
||||
"userOrders": "ऑर्डर",
|
||||
"userProfile": "प्रोफ़ाइल",
|
||||
"userSubscriptions": "सदस्यताएँ",
|
||||
"verified": "सत्यापित"
|
||||
"username": "उपयोगकर्ता नाम",
|
||||
"verified": "सत्यापित",
|
||||
"viewDetails": "विवरण देखें"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Kérjük, adjon meg egy érvényes e-mail címet.",
|
||||
"existingAccount": "Már van fiókja?",
|
||||
"get": "Megkap",
|
||||
"invite": "Meghívókód",
|
||||
"invite": "Meghívó kód (opcionális)",
|
||||
"message": "#### Tisztelt Felhasználó!\n\nKöszönjük érdeklődését és támogatását. Az oldal működési stratégiájának módosítása miatt lezártuk az új felhasználók regisztrációját. Ez idő alatt a meglévő felhasználók használata nem lesz érintett.\n\nElkötelezettek vagyunk abban, hogy jobb szolgáltatást és élményt nyújtsunk Önnek, ezért a regisztráció lezárása alatt átfogó rendszeroptimalizálást és funkciófrissítést hajtunk végre. A jövőben még jobb tartalommal és szolgáltatásokkal várjuk Önt.\n\nKérjük, kövesse weboldalunkat és közösségi média platformjainkat, hogy megkapja a legfrissebb híreket és értesítéseket. Köszönjük megértését és támogatását.\n\nHa bármilyen kérdése van, vagy segítségre van szüksége, kérjük, forduljon ügyfélszolgálati csapatunkhoz.\n\n**Még egyszer köszönjük támogatását és megértését.**",
|
||||
"passwordMismatch": "A két jelszó nem egyezik meg",
|
||||
"success": "Sikeres regisztráció, automatikusan bejelentkezett!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "ADS konfiguráció",
|
||||
"Announcement Management": "Hirdetménykezelés",
|
||||
"Apple": "Apple ID",
|
||||
"Application Management": "Alkalmazáskezelés",
|
||||
"Auth Control": "Hitelesítési vezérlés",
|
||||
"Coupon Management": "Kuponkezelés",
|
||||
"Dashboard": "Irányítópult",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Rendeléskezelés",
|
||||
"Payment Config": "Fizetési beállítások",
|
||||
"Phone Number": "Telefonszám",
|
||||
"Rule Management": "Szabálykezelés",
|
||||
"Server": "Szolgáltatás",
|
||||
"Server Management": "Szerverkezelés",
|
||||
"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",
|
||||
"actions": "műveletek",
|
||||
"active": "Aktív",
|
||||
"add": "Hozzáadás",
|
||||
"administrator": "Rendszergazda",
|
||||
"areaCode": "Körzetszám",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "e-mail",
|
||||
"enable": "Engedélyezés",
|
||||
"expireTime": "Lejárati idő",
|
||||
"expired": "Lejárt",
|
||||
"expiredAt": "Lejárati dátum",
|
||||
"failed": "Sikertelen",
|
||||
"giftAmount": "Ajándék Összeg",
|
||||
"giftAmountPlaceholder": "Adja meg az ajándék összegét",
|
||||
"inactive": "Inaktív",
|
||||
"invalidEmailFormat": "Érvénytelen e-mail formátum",
|
||||
"inviteCode": "Meghívókód",
|
||||
"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)",
|
||||
"permanent": "Állandó",
|
||||
"pleaseEnterEmail": "Kérjük, adja meg az e-mail címet",
|
||||
"price": "Ár",
|
||||
"referer": "Ajánló",
|
||||
"refererId": "Hivatkozó azonosító",
|
||||
"refererIdPlaceholder": "Adja meg az ajánló azonosítóját",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "IP-cím keresése",
|
||||
"selectAuthType": "Válassza ki az azonosítás típusát",
|
||||
"speedLimit": "Sebességhatár",
|
||||
"startTime": "Kezdési idő",
|
||||
"status": "Állapot",
|
||||
"subscription": "Előfizetés",
|
||||
"subscriptionDetails": "Előfizetési részletek",
|
||||
"subscriptionId": "Előfizetés azonosítója",
|
||||
"subscriptionInfo": "Előfizetés információ",
|
||||
"subscriptionList": "Előfizetési lista",
|
||||
"subscriptionLogs": "Előfizetési naplók",
|
||||
"subscriptionName": "Előfizetés neve",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Kereskedelmi értesítések",
|
||||
"trafficLimit": "Forgalmi korlát",
|
||||
"trafficLogs": "Forgalmi naplók",
|
||||
"trafficUsage": "Forgalmi használat",
|
||||
"unknown": "Ismeretlen",
|
||||
"unlimited": "Korlátlan",
|
||||
"unverified": "Nem ellenőrzött",
|
||||
"update": "Frissítés",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Felhasználói ügynök",
|
||||
"userEmail": "Felhasználó e-mail",
|
||||
"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",
|
||||
"userLogs": "Bejelentkezési előzmények",
|
||||
"userName": "Felhasználói azonosító",
|
||||
"userOrders": "Rendelések",
|
||||
"userProfile": "Profil",
|
||||
"userSubscriptions": "Előfizetések",
|
||||
"verified": "Ellenőrzött"
|
||||
"username": "Felhasználónév",
|
||||
"verified": "Ellenőrzött",
|
||||
"viewDetails": "Részletek megtekintése"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "有効なメールアドレスを入力してください。",
|
||||
"existingAccount": "すでにアカウントをお持ちですか?",
|
||||
"get": "取得",
|
||||
"invite": "招待コード",
|
||||
"invite": "招待コード(任意)",
|
||||
"message": "#### 親愛なるユーザーの皆様へ\n\n私たちのサイトにご関心とご支援をいただき、誠にありがとうございます。運営方針の調整に伴い、新規ユーザー登録機能を停止いたしました。この期間中、既存ユーザーのご利用には影響はございません。\n\nより良いサービスと体験を提供するため、登録停止期間中にシステムの全面的な最適化と機能のアップグレードを行います。今後、より質の高いコンテンツとサービスで皆様をお迎えいたします。\n\n最新の情報や通知を得るために、当社のウェブサイトやソーシャルメディアプラットフォームをご覧ください。ご理解とご支援に感謝いたします。\n\nご不明な点やご質問がございましたら、いつでもカスタマーサポートチームにお問い合わせください。\n\n**改めてご支援とご理解に感謝いたします。**",
|
||||
"passwordMismatch": "パスワードが一致しません",
|
||||
"success": "登録が成功しました。自動的にログインしました!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "ADS設定",
|
||||
"Announcement Management": "お知らせ管理",
|
||||
"Apple": "Apple ID",
|
||||
"Application Management": "アプリケーション管理",
|
||||
"Auth Control": "認証管理",
|
||||
"Coupon Management": "クーポン管理",
|
||||
"Dashboard": "ダッシュボード",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "注文管理",
|
||||
"Payment Config": "支払い設定",
|
||||
"Phone Number": "電話番号",
|
||||
"Rule Management": "ルール管理",
|
||||
"Server": "サーバー",
|
||||
"Server Management": "サーバー管理",
|
||||
"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": "アカウント有効化",
|
||||
"actions": "アクション",
|
||||
"active": "アクティブ",
|
||||
"add": "追加",
|
||||
"administrator": "管理者",
|
||||
"areaCode": "市外局番",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "メールアドレス",
|
||||
"enable": "有効",
|
||||
"expireTime": "有効期限",
|
||||
"expired": "期限切れ",
|
||||
"expiredAt": "有効期限",
|
||||
"failed": "失敗しました",
|
||||
"giftAmount": "ギフト金額",
|
||||
"giftAmountPlaceholder": "ギフト金額を入力してください",
|
||||
"inactive": "非アクティブ",
|
||||
"invalidEmailFormat": "無効なメール形式です",
|
||||
"inviteCode": "招待コード",
|
||||
"inviteCodePlaceholder": "招待コードを入力してください(生成するには空白のままにしてください)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "新しいパスワードを入力してください(任意)",
|
||||
"permanent": "永久",
|
||||
"pleaseEnterEmail": "メールアドレスを入力してください",
|
||||
"price": "価格",
|
||||
"referer": "推薦者",
|
||||
"refererId": "リファラーID",
|
||||
"refererIdPlaceholder": "紹介者IDを入力してください",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "IPアドレスを検索",
|
||||
"selectAuthType": "認証タイプを選択",
|
||||
"speedLimit": "速度制限",
|
||||
"startTime": "開始時間",
|
||||
"status": "ステータス",
|
||||
"subscription": "サブスクリプション",
|
||||
"subscriptionDetails": "サブスクリプションの詳細",
|
||||
"subscriptionId": "サブスクリプションID",
|
||||
"subscriptionInfo": "サブスクリプション情報",
|
||||
"subscriptionList": "購読リスト",
|
||||
"subscriptionLogs": "サブスクリプションログ",
|
||||
"subscriptionName": "サブスクリプション名",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "取引通知",
|
||||
"trafficLimit": "トラフィック制限",
|
||||
"trafficLogs": "トラフィックログ",
|
||||
"trafficUsage": "トラフィック使用量",
|
||||
"unknown": "不明",
|
||||
"unlimited": "無制限",
|
||||
"unverified": "未確認",
|
||||
"update": "更新",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "ユーザーエージェント",
|
||||
"userEmail": "ユーザーのメール",
|
||||
"userEmailPlaceholder": "ユーザーのメールアドレスを入力してください",
|
||||
"userId": "ユーザーID",
|
||||
"userInfo": "ユーザー情報",
|
||||
"userList": "ユーザーリスト",
|
||||
"userLogs": "ログイン履歴",
|
||||
"userName": "ユーザー識別子",
|
||||
"userOrders": "注文",
|
||||
"userProfile": "プロフィール",
|
||||
"userSubscriptions": "サブスクリプション",
|
||||
"verified": "確認済み"
|
||||
"username": "ユーザー名",
|
||||
"verified": "確認済み",
|
||||
"viewDetails": "詳細を見る"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "유효한 이메일 주소를 입력하세요.",
|
||||
"existingAccount": "이미 계정이 있으신가요?",
|
||||
"get": "받기",
|
||||
"invite": "초대 코드",
|
||||
"invite": "초대 코드 (선택 사항)",
|
||||
"message": "#### 존경하는 사용자님, 안녕하세요!\n\n저희에 대한 관심과 지원에 감사드립니다. 사이트 운영 전략의 조정으로 인해 신규 사용자 등록 기능을 닫았습니다. 이 기간 동안 기존 사용자의 사용에는 아무런 영향이 없습니다.\n\n저희는 더 나은 서비스와 경험을 제공하기 위해 등록이 닫힌 동안 시스템 최적화와 기능 업그레이드를 전면적으로 진행할 것입니다. 앞으로 더 나은 콘텐츠와 서비스로 여러분을 맞이하겠습니다.\n\n저희 웹사이트와 소셜 미디어 플랫폼을 주시하여 최신 동향과 공지를 받아보세요. 이해와 지원에 감사드립니다.\n\n궁금한 점이나 도움이 필요하시면 언제든지 고객 서비스 팀에 문의해 주세요.\n\n**다시 한번 지원과 이해에 감사드립니다.**",
|
||||
"passwordMismatch": "비밀번호가 일치하지 않습니다.",
|
||||
"success": "등록 성공, 자동으로 로그인되었습니다!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "ADS 구성",
|
||||
"Announcement Management": "공지 관리",
|
||||
"Apple": "Apple ID",
|
||||
"Application Management": "애플리케이션 관리",
|
||||
"Auth Control": "인증 제어",
|
||||
"Coupon Management": "쿠폰 관리",
|
||||
"Dashboard": "대시보드",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "주문 관리",
|
||||
"Payment Config": "결제 구성",
|
||||
"Phone Number": "전화번호",
|
||||
"Rule Management": "규칙 관리",
|
||||
"Server": "서버",
|
||||
"Server Management": "서버 관리",
|
||||
"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": "계정 활성화",
|
||||
"actions": "작업",
|
||||
"active": "활성",
|
||||
"add": "추가",
|
||||
"administrator": "관리자",
|
||||
"areaCode": "지역 코드",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "이메일",
|
||||
"enable": "사용",
|
||||
"expireTime": "만료 시간",
|
||||
"expired": "만료됨",
|
||||
"expiredAt": "만료일",
|
||||
"failed": "실패",
|
||||
"giftAmount": "선물 금액",
|
||||
"giftAmountPlaceholder": "선물 금액 입력",
|
||||
"inactive": "비활성",
|
||||
"invalidEmailFormat": "잘못된 이메일 형식입니다",
|
||||
"inviteCode": "초대 코드",
|
||||
"inviteCodePlaceholder": "초대 코드를 입력하세요 (생성을 원하시면 비워두세요)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "새 비밀번호 입력 (선택 사항)",
|
||||
"permanent": "영구적인",
|
||||
"pleaseEnterEmail": "이메일을 입력하세요",
|
||||
"price": "가격",
|
||||
"referer": "추천인",
|
||||
"refererId": "추천인 ID",
|
||||
"refererIdPlaceholder": "추천인 ID를 입력하세요",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "IP 주소 검색",
|
||||
"selectAuthType": "인증 유형 선택",
|
||||
"speedLimit": "속도 제한",
|
||||
"startTime": "시작 시간",
|
||||
"status": "상태",
|
||||
"subscription": "구독",
|
||||
"subscriptionDetails": "구독 세부 정보",
|
||||
"subscriptionId": "구독 ID",
|
||||
"subscriptionInfo": "구독 정보",
|
||||
"subscriptionList": "구독 목록",
|
||||
"subscriptionLogs": "구독 로그",
|
||||
"subscriptionName": "구독 이름",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "거래 알림",
|
||||
"trafficLimit": "트래픽 제한",
|
||||
"trafficLogs": "트래픽 로그",
|
||||
"trafficUsage": "트래픽 사용량",
|
||||
"unknown": "알 수 없음",
|
||||
"unlimited": "무제한",
|
||||
"unverified": "확인되지 않음",
|
||||
"update": "업데이트",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "사용자 에이전트",
|
||||
"userEmail": "사용자 이메일",
|
||||
"userEmailPlaceholder": "사용자 이메일 입력",
|
||||
"userId": "사용자 ID",
|
||||
"userInfo": "사용자 정보",
|
||||
"userList": "사용자 목록",
|
||||
"userLogs": "로그인 기록",
|
||||
"userName": "사용자 식별자",
|
||||
"userOrders": "주문",
|
||||
"userProfile": "프로필",
|
||||
"userSubscriptions": "구독",
|
||||
"verified": "검증됨"
|
||||
"username": "사용자 이름",
|
||||
"verified": "검증됨",
|
||||
"viewDetails": "세부 정보 보기"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Vennligst skriv inn en gyldig e-postadresse.",
|
||||
"existingAccount": "Har du allerede en konto?",
|
||||
"get": "Få",
|
||||
"invite": "Invitasjonskode",
|
||||
"invite": "Invitasjonskode (valgfritt)",
|
||||
"message": "#### Kjære bruker,\n\nTakk for din interesse og støtte. På grunn av justeringer i vår driftsstrategi har vi stengt for registrering av nye brukere. I denne perioden vil eksisterende brukere ikke bli påvirket.\n\nVi er forpliktet til å gi deg bedre service og opplevelse, og vil derfor gjennomføre en omfattende systemoptimalisering og funksjonsoppgradering mens registreringen er stengt. I fremtiden vil vi ønske deg velkommen med bedre innhold og tjenester.\n\nFølg med på vår nettside og sosiale medieplattformer for å få de siste oppdateringene og kunngjøringene. Takk for din forståelse og støtte.\n\nHvis du har spørsmål eller trenger hjelp, vennligst kontakt vårt kundeserviceteam.\n\n**Takk igjen for din støtte og forståelse.**",
|
||||
"passwordMismatch": "Passordene stemmer ikke overens",
|
||||
"success": "Registrering vellykket, du er nå automatisk logget inn!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "ADS-konfigurasjon",
|
||||
"Announcement Management": "Kunngjøringsadministrasjon",
|
||||
"Apple": "Apple-ID",
|
||||
"Application Management": "Applikasjonsadministrasjon",
|
||||
"Auth Control": "Autentiseringskontroll",
|
||||
"Coupon Management": "Kupongadministrasjon",
|
||||
"Dashboard": "Dashbord",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Bestillingsadministrasjon",
|
||||
"Payment Config": "Betalingskonfigurasjon",
|
||||
"Phone Number": "Telefonnummer",
|
||||
"Rule Management": "Regeladministrasjon",
|
||||
"Server": "Tjeneste",
|
||||
"Server Management": "Serveradministrasjon",
|
||||
"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",
|
||||
"actions": "handlinger",
|
||||
"active": "Aktiv",
|
||||
"add": "Legg til",
|
||||
"administrator": "Administrator",
|
||||
"areaCode": "Retningsnummer",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "e-post",
|
||||
"enable": "Aktiver",
|
||||
"expireTime": "Utløpstid",
|
||||
"expired": "Utgått",
|
||||
"expiredAt": "Utløpt Dato",
|
||||
"failed": "Mislyktes",
|
||||
"giftAmount": "Gavebeløp",
|
||||
"giftAmountPlaceholder": "Skriv inn gavebeløp",
|
||||
"inactive": "Inaktiv",
|
||||
"invalidEmailFormat": "Ugyldig e-postformat",
|
||||
"inviteCode": "Invitasjonskode",
|
||||
"inviteCodePlaceholder": "Skriv inn invitasjonskode (la stå tom for å generere)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Skriv inn nytt passord (valgfritt)",
|
||||
"permanent": "Permanent",
|
||||
"pleaseEnterEmail": "Vennligst skriv inn e-post",
|
||||
"price": "Pris",
|
||||
"referer": "Henviser",
|
||||
"refererId": "Henvisnings-ID",
|
||||
"refererIdPlaceholder": "Skriv inn referanse-ID",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Søk IP-adresse",
|
||||
"selectAuthType": "Velg autentiseringstype",
|
||||
"speedLimit": "Fartsgrense",
|
||||
"startTime": "Starttid",
|
||||
"status": "Status",
|
||||
"subscription": "Abonnement",
|
||||
"subscriptionDetails": "Abonnementsdetaljer",
|
||||
"subscriptionId": "Abonnements-ID",
|
||||
"subscriptionInfo": "Abonnementsinformasjon",
|
||||
"subscriptionList": "Abonnementsliste",
|
||||
"subscriptionLogs": "Abonnementslogger",
|
||||
"subscriptionName": "Abonnementsnavn",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Handelsvarsler",
|
||||
"trafficLimit": "Trafikkgrense",
|
||||
"trafficLogs": "Trafikklogger",
|
||||
"trafficUsage": "Trafikkbruk",
|
||||
"unknown": "Ukjent",
|
||||
"unlimited": "Ubegrenset",
|
||||
"unverified": "Ubekreftet",
|
||||
"update": "Oppdater",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Brukeragent",
|
||||
"userEmail": "Brukerens e-post",
|
||||
"userEmailPlaceholder": "Skriv inn brukers e-post",
|
||||
"userId": "Bruker-ID",
|
||||
"userInfo": "Brukerinfo",
|
||||
"userList": "Brukerliste",
|
||||
"userLogs": "Innloggingshistorikk",
|
||||
"userName": "Brukeridentifikator",
|
||||
"userOrders": "Bestillinger",
|
||||
"userProfile": "Profil",
|
||||
"userSubscriptions": "Abonnementer",
|
||||
"verified": "Verifisert"
|
||||
"username": "Brukernavn",
|
||||
"verified": "Verifisert",
|
||||
"viewDetails": "Vis detaljer"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Proszę wprowadzić prawidłowy adres e-mail.",
|
||||
"existingAccount": "Masz już konto?",
|
||||
"get": "Pobierz",
|
||||
"invite": "Kod zaproszenia",
|
||||
"invite": "Kod zaproszenia (opcjonalnie)",
|
||||
"message": "#### Szanowny Użytkowniku,\n\nDziękujemy za Twoje zainteresowanie i wsparcie. Ze względu na zmianę strategii operacyjnej serwisu, zamknęliśmy funkcję rejestracji nowych użytkowników. W tym czasie korzystanie z serwisu przez obecnych użytkowników nie będzie w żaden sposób ograniczone.\n\nDążymy do zapewnienia lepszej obsługi i doświadczeń, dlatego w okresie zamknięcia rejestracji przeprowadzimy kompleksową optymalizację systemu i aktualizację funkcji. W przyszłości powitamy Cię z lepszą jakością treści i usług.\n\nŚledź naszą stronę internetową i platformy społecznościowe, aby uzyskać najnowsze informacje i powiadomienia. Dziękujemy za zrozumienie i wsparcie.\n\nW razie jakichkolwiek pytań lub potrzeby pomocy, skontaktuj się z naszym zespołem obsługi klienta.\n\n**Jeszcze raz dziękujemy za Twoje wsparcie i zrozumienie.**",
|
||||
"passwordMismatch": "Wprowadzone hasła nie są zgodne",
|
||||
"success": "Rejestracja zakończona sukcesem, automatycznie zalogowano!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "Konfiguracja ADS",
|
||||
"Announcement Management": "Zarządzanie ogłoszeniami",
|
||||
"Apple": "Identyfikator Apple",
|
||||
"Application Management": "Zarządzanie aplikacjami",
|
||||
"Auth Control": "Kontrola autoryzacji",
|
||||
"Coupon Management": "Zarządzanie kuponami",
|
||||
"Dashboard": "Pulpit",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Zarządzanie zamówieniami",
|
||||
"Payment Config": "Konfiguracja płatności",
|
||||
"Phone Number": "Numer telefonu",
|
||||
"Rule Management": "Zarządzanie regułami",
|
||||
"Server": "Serwer",
|
||||
"Server Management": "Zarządzanie serwerem",
|
||||
"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",
|
||||
"actions": "działania",
|
||||
"active": "Aktywny",
|
||||
"add": "Dodaj",
|
||||
"administrator": "Administrator",
|
||||
"areaCode": "Kod obszaru",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "e-mail",
|
||||
"enable": "Włącz",
|
||||
"expireTime": "Czas wygaśnięcia",
|
||||
"expired": "Wygasły",
|
||||
"expiredAt": "Data wygaśnięcia",
|
||||
"failed": "Niepowodzenie",
|
||||
"giftAmount": "Kwota Prezentu",
|
||||
"giftAmountPlaceholder": "Wprowadź kwotę prezentu",
|
||||
"inactive": "Nieaktywny",
|
||||
"invalidEmailFormat": "Nieprawidłowy format adresu e-mail",
|
||||
"inviteCode": "Kod zaproszenia",
|
||||
"inviteCodePlaceholder": "Wprowadź kod zaproszenia (pozostaw puste, aby wygenerować)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Wprowadź nowe hasło (opcjonalnie)",
|
||||
"permanent": "Stały",
|
||||
"pleaseEnterEmail": "Proszę wprowadzić adres e-mail",
|
||||
"price": "Cena",
|
||||
"referer": "Polecający",
|
||||
"refererId": "Identyfikator polecającego",
|
||||
"refererIdPlaceholder": "Wprowadź identyfikator polecającego",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Wyszukaj adres IP",
|
||||
"selectAuthType": "Wybierz typ uwierzytelniania",
|
||||
"speedLimit": "Ograniczenie prędkości",
|
||||
"startTime": "Czas rozpoczęcia",
|
||||
"status": "Status",
|
||||
"subscription": "Subskrypcja",
|
||||
"subscriptionDetails": "Szczegóły subskrypcji",
|
||||
"subscriptionId": "ID subskrypcji",
|
||||
"subscriptionInfo": "Informacje o subskrypcji",
|
||||
"subscriptionList": "Lista subskrypcji",
|
||||
"subscriptionLogs": "Dzienniki subskrypcji",
|
||||
"subscriptionName": "Nazwa subskrypcji",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Powiadomienia o transakcjach",
|
||||
"trafficLimit": "Limit ruchu",
|
||||
"trafficLogs": "Dzienniki Ruchu",
|
||||
"trafficUsage": "Zużycie ruchu",
|
||||
"unknown": "Nieznany",
|
||||
"unlimited": "Nieograniczony",
|
||||
"unverified": "Niezweryfikowane",
|
||||
"update": "Aktualizuj",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Agent użytkownika",
|
||||
"userEmail": "Email użytkownika",
|
||||
"userEmailPlaceholder": "Wprowadź adres e-mail użytkownika",
|
||||
"userId": "ID użytkownika",
|
||||
"userInfo": "Informacje o użytkowniku",
|
||||
"userList": "Lista użytkowników",
|
||||
"userLogs": "Historia logowania",
|
||||
"userName": "Identyfikator użytkownika",
|
||||
"userOrders": "Zamówienia",
|
||||
"userProfile": "Profil",
|
||||
"userSubscriptions": "Subskrypcje",
|
||||
"verified": "Zweryfikowano"
|
||||
"username": "Nazwa użytkownika",
|
||||
"verified": "Zweryfikowano",
|
||||
"viewDetails": "Zobacz szczegóły"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Por favor, insira um endereço de e-mail válido.",
|
||||
"existingAccount": "Já tem uma conta?",
|
||||
"get": "Obter",
|
||||
"invite": "Código de convite",
|
||||
"invite": "Código de convite (opcional)",
|
||||
"message": "#### Prezado usuário,\n\nAgradecemos seu interesse e apoio. Devido a ajustes na estratégia de operação do site, fechamos o registro de novos usuários. Durante este período, o uso por usuários existentes não será afetado.\n\nEstamos comprometidos em oferecer um serviço e experiência melhores, por isso realizaremos uma otimização completa do sistema e atualizações de funcionalidades durante o fechamento do registro. No futuro, receberemos você com conteúdo e serviços de maior qualidade.\n\nAcompanhe nosso site e plataformas de mídia social para obter as últimas atualizações e notificações. Agradecemos sua compreensão e apoio.\n\nSe tiver dúvidas ou precisar de ajuda, entre em contato com nossa equipe de atendimento ao cliente.\n\n**Mais uma vez, obrigado por seu apoio e compreensão.**",
|
||||
"passwordMismatch": "As senhas digitadas não coincidem",
|
||||
"success": "Registro bem-sucedido, login automático realizado!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "Configuração ADS",
|
||||
"Announcement Management": "Gerenciamento de Anúncios",
|
||||
"Apple": "ID Apple",
|
||||
"Application Management": "Gerenciamento de Aplicativos",
|
||||
"Auth Control": "Controle de Autenticação",
|
||||
"Coupon Management": "Gerenciamento de Cupons",
|
||||
"Dashboard": "Painel de Controle",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Gerenciamento de Pedidos",
|
||||
"Payment Config": "Configuração de Pagamento",
|
||||
"Phone Number": "Número de Telefone",
|
||||
"Rule Management": "Gerenciamento de Regras",
|
||||
"Server": "Servidor",
|
||||
"Server Management": "Gerenciamento de Servidor",
|
||||
"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",
|
||||
"actions": "ações",
|
||||
"active": "Ativo",
|
||||
"add": "Adicionar",
|
||||
"administrator": "Administrador",
|
||||
"areaCode": "Código de Área",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "e-mail",
|
||||
"enable": "Habilitar",
|
||||
"expireTime": "Tempo de Expiração",
|
||||
"expired": "Expirado",
|
||||
"expiredAt": "Expirado Em",
|
||||
"failed": "Falhou",
|
||||
"giftAmount": "Valor do Presente",
|
||||
"giftAmountPlaceholder": "Insira o valor do presente",
|
||||
"inactive": "Inativo",
|
||||
"invalidEmailFormat": "Formato de e-mail inválido",
|
||||
"inviteCode": "Código de Convite",
|
||||
"inviteCodePlaceholder": "Digite o código de convite (deixe em branco para gerar)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Digite a nova senha (opcional)",
|
||||
"permanent": "Permanente",
|
||||
"pleaseEnterEmail": "Por favor, insira o e-mail",
|
||||
"price": "Preço",
|
||||
"referer": "Referente",
|
||||
"refererId": "ID do Referente",
|
||||
"refererIdPlaceholder": "Digite o ID do referenciador",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Pesquisar endereço IP",
|
||||
"selectAuthType": "Selecione o tipo de autenticação",
|
||||
"speedLimit": "Limite de Velocidade",
|
||||
"startTime": "Hora de Início",
|
||||
"status": "Status",
|
||||
"subscription": "Assinatura",
|
||||
"subscriptionDetails": "Detalhes da Assinatura",
|
||||
"subscriptionId": "ID da Assinatura",
|
||||
"subscriptionInfo": "Informações da Assinatura",
|
||||
"subscriptionList": "Lista de Assinaturas",
|
||||
"subscriptionLogs": "Registros de Assinatura",
|
||||
"subscriptionName": "Nome da Assinatura",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Notificações de Comércio",
|
||||
"trafficLimit": "Limite de Tráfego",
|
||||
"trafficLogs": "Registros de Tráfego",
|
||||
"trafficUsage": "Uso de Tráfego",
|
||||
"unknown": "Desconhecido",
|
||||
"unlimited": "Ilimitado",
|
||||
"unverified": "Não verificado",
|
||||
"update": "Atualizar",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Agente do Usuário",
|
||||
"userEmail": "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",
|
||||
"userLogs": "Histórico de Login",
|
||||
"userName": "Identificador do Usuário",
|
||||
"userOrders": "Pedidos",
|
||||
"userProfile": "Perfil",
|
||||
"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,
|
||||
'server': (await import(`./${locale}/server.json`)).default,
|
||||
'subscribe': (await import(`./${locale}/subscribe.json`)).default,
|
||||
'rules': (await import(`./${locale}/rules.json`)).default,
|
||||
'order': (await import(`./${locale}/order.json`)).default,
|
||||
'coupon': (await import(`./${locale}/coupon.json`)).default,
|
||||
'user': (await import(`./${locale}/user.json`)).default,
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Vă rugăm să introduceți o adresă de email validă.",
|
||||
"existingAccount": "Aveți deja un cont?",
|
||||
"get": "Obțineți",
|
||||
"invite": "Cod de invitație",
|
||||
"invite": "Cod de invitație (opțional)",
|
||||
"message": "#### Stimate utilizator,\n\nVă mulțumim pentru interesul și sprijinul acordat. Datorită ajustării strategiei de operare a site-ului, am închis funcția de înregistrare a utilizatorilor noi. În această perioadă, utilizatorii existenți nu vor fi afectați în niciun fel.\n\nNe angajăm să vă oferim servicii și experiențe mai bune, așa că vom efectua optimizări complete ale sistemului și actualizări ale funcționalităților în perioada în care înregistrarea este închisă. În viitor, vă vom întâmpina cu conținut și servicii de calitate superioară.\n\nVă rugăm să urmăriți site-ul nostru și platformele de social media pentru a obține cele mai recente actualizări și notificări. Vă mulțumim pentru înțelegerea și sprijinul dvs.\n\nDacă aveți întrebări sau aveți nevoie de ajutor, nu ezitați să contactați echipa noastră de asistență clienți.\n\n**Vă mulțumim din nou pentru sprijinul și înțelegerea dvs.**",
|
||||
"passwordMismatch": "Parolele introduse nu se potrivesc",
|
||||
"success": "Înregistrare reușită, ați fost conectat automat!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "Configurație ADS",
|
||||
"Announcement Management": "Managementul Anunțurilor",
|
||||
"Apple": "ID Apple",
|
||||
"Application Management": "Gestionarea aplicațiilor",
|
||||
"Auth Control": "Control Autentificare",
|
||||
"Coupon Management": "Managementul Cuponului",
|
||||
"Dashboard": "Tablou de bord",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Gestionarea comenzilor",
|
||||
"Payment Config": "Configurație Plată",
|
||||
"Phone Number": "Număr de telefon",
|
||||
"Rule Management": "Gestionarea regulilor",
|
||||
"Server": "Serviciu",
|
||||
"Server Management": "Managementul serverului",
|
||||
"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",
|
||||
"actions": "acțiuni",
|
||||
"active": "Activ",
|
||||
"add": "Adaugă",
|
||||
"administrator": "Administrator",
|
||||
"areaCode": "Prefix telefonic",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "e-mail",
|
||||
"enable": "Activare",
|
||||
"expireTime": "Timp de expirare",
|
||||
"expired": "Expirat",
|
||||
"expiredAt": "Expiră la",
|
||||
"failed": "Eșuat",
|
||||
"giftAmount": "Sumă Cadou",
|
||||
"giftAmountPlaceholder": "Introduceți suma cadoului",
|
||||
"inactive": "Inactiv",
|
||||
"invalidEmailFormat": "Format de email invalid",
|
||||
"inviteCode": "Cod de invitație",
|
||||
"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)",
|
||||
"permanent": "Permanent",
|
||||
"pleaseEnterEmail": "Vă rugăm să introduceți adresa de email",
|
||||
"price": "Preț",
|
||||
"referer": "Referent",
|
||||
"refererId": "ID Referent",
|
||||
"refererIdPlaceholder": "Introduceți ID-ul referentului",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Caută adresa IP",
|
||||
"selectAuthType": "Selectați tipul de autentificare",
|
||||
"speedLimit": "Limită de viteză",
|
||||
"startTime": "Timp de început",
|
||||
"status": "Stare",
|
||||
"subscription": "Abonament",
|
||||
"subscriptionDetails": "Detalii abonament",
|
||||
"subscriptionId": "ID Abonament",
|
||||
"subscriptionInfo": "Informații Abonament",
|
||||
"subscriptionList": "Listă de abonamente",
|
||||
"subscriptionLogs": "Jurnale de abonament",
|
||||
"subscriptionName": "Numele Abonamentului",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Notificări de tranzacționare",
|
||||
"trafficLimit": "Limită de trafic",
|
||||
"trafficLogs": "Jurnale de trafic",
|
||||
"trafficUsage": "Utilizare Trafic",
|
||||
"unknown": "Necunoscut",
|
||||
"unlimited": "Nelimitat",
|
||||
"unverified": "Neverificat",
|
||||
"update": "Actualizare",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Agent Utilizator",
|
||||
"userEmail": "Email utilizator",
|
||||
"userEmailPlaceholder": "Introduceți emailul utilizatorului",
|
||||
"userId": "ID Utilizator",
|
||||
"userInfo": "Informații Utilizator",
|
||||
"userList": "Lista utilizatorilor",
|
||||
"userLogs": "Istoricul autentificărilor",
|
||||
"userName": "Identificator Utilizator",
|
||||
"userOrders": "Comenzi",
|
||||
"userProfile": "Profil",
|
||||
"userSubscriptions": "Abonamente",
|
||||
"verified": "Verificat"
|
||||
"username": "Nume Utilizator",
|
||||
"verified": "Verificat",
|
||||
"viewDetails": "Vezi Detalii"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Пожалуйста, введите действительный адрес электронной почты.",
|
||||
"existingAccount": "Уже есть аккаунт?",
|
||||
"get": "Получить",
|
||||
"invite": "Код приглашения",
|
||||
"invite": "Код приглашения (необязательно)",
|
||||
"message": "#### Уважаемый пользователь!\n\nБлагодарим вас за интерес и поддержку. В связи с изменением стратегии работы сайта, мы закрыли функцию регистрации новых пользователей. В этот период использование существующими пользователями не будет затронуто.\n\nМы стремимся предоставить вам лучший сервис и опыт, поэтому в период закрытия регистрации будет проведена полная оптимизация системы и обновление функций. В будущем мы встретим вас с более качественным контентом и услугами.\n\nПожалуйста, следите за нашим сайтом и социальными сетями, чтобы получать последние новости и уведомления. Благодарим за ваше понимание и поддержку.\n\nЕсли у вас есть вопросы или нужна помощь, пожалуйста, свяжитесь с нашей службой поддержки.\n\n**Еще раз благодарим за вашу поддержку и понимание.**",
|
||||
"passwordMismatch": "Введенные пароли не совпадают",
|
||||
"success": "Регистрация успешна, вы автоматически вошли в систему!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "Конфигурация ADS",
|
||||
"Announcement Management": "Управление объявлениями",
|
||||
"Apple": "Apple ID",
|
||||
"Application Management": "Управление приложениями",
|
||||
"Auth Control": "Управление аутентификацией",
|
||||
"Coupon Management": "Управление купонами",
|
||||
"Dashboard": "Панель управления",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Управление заказами",
|
||||
"Payment Config": "Настройки оплаты",
|
||||
"Phone Number": "Номер телефона",
|
||||
"Rule Management": "Управление правилами",
|
||||
"Server": "Сервер",
|
||||
"Server Management": "Управление сервером",
|
||||
"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": "Включение аккаунта",
|
||||
"actions": "действия",
|
||||
"active": "Активный",
|
||||
"add": "Добавить",
|
||||
"administrator": "Администратор",
|
||||
"areaCode": "Код региона",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "Электронная почта",
|
||||
"enable": "Включить",
|
||||
"expireTime": "Время истечения",
|
||||
"expired": "Истекший",
|
||||
"expiredAt": "Срок действия истек",
|
||||
"failed": "Не удалось",
|
||||
"giftAmount": "Сумма подарка",
|
||||
"giftAmountPlaceholder": "Введите сумму подарка",
|
||||
"inactive": "Неактивный",
|
||||
"invalidEmailFormat": "Неверный формат электронной почты",
|
||||
"inviteCode": "Код приглашения",
|
||||
"inviteCodePlaceholder": "Введите код приглашения (оставьте пустым для генерации)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Введите новый пароль (необязательно)",
|
||||
"permanent": "Постоянный",
|
||||
"pleaseEnterEmail": "Пожалуйста, введите адрес электронной почты",
|
||||
"price": "Цена",
|
||||
"referer": "Реферер",
|
||||
"refererId": "ID реферера",
|
||||
"refererIdPlaceholder": "Введите ID реферера",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Поиск IP-адреса",
|
||||
"selectAuthType": "Выберите тип аутентификации",
|
||||
"speedLimit": "Ограничение скорости",
|
||||
"startTime": "Время начала",
|
||||
"status": "Статус",
|
||||
"subscription": "Подписка",
|
||||
"subscriptionDetails": "Детали подписки",
|
||||
"subscriptionId": "ID подписки",
|
||||
"subscriptionInfo": "Информация о подписке",
|
||||
"subscriptionList": "Список подписок",
|
||||
"subscriptionLogs": "Журналы подписки",
|
||||
"subscriptionName": "Название подписки",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Уведомления о торговле",
|
||||
"trafficLimit": "Лимит трафика",
|
||||
"trafficLogs": "Журналы трафика",
|
||||
"trafficUsage": "Использование трафика",
|
||||
"unknown": "Неизвестно",
|
||||
"unlimited": "Неограниченный",
|
||||
"unverified": "Неподтверждено",
|
||||
"update": "Обновить",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Пользовательский агент",
|
||||
"userEmail": "Электронная почта пользователя",
|
||||
"userEmailPlaceholder": "Введите электронную почту пользователя",
|
||||
"userId": "ID пользователя",
|
||||
"userInfo": "Информация о пользователе",
|
||||
"userList": "Список пользователей",
|
||||
"userLogs": "История входов",
|
||||
"userName": "Идентификатор пользователя",
|
||||
"userOrders": "Заказы",
|
||||
"userProfile": "Профиль",
|
||||
"userSubscriptions": "Подписки",
|
||||
"verified": "Проверено"
|
||||
"username": "Имя пользователя",
|
||||
"verified": "Проверено",
|
||||
"viewDetails": "Просмотреть детали"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "กรุณาใส่ที่อยู่อีเมลที่ถูกต้อง",
|
||||
"existingAccount": "มีบัญชีอยู่แล้ว?",
|
||||
"get": "รับ",
|
||||
"invite": "รหัสเชิญ",
|
||||
"invite": "รหัสเชิญ (ไม่บังคับ)",
|
||||
"message": "#### เรียนผู้ใช้ที่เคารพ\n\nขอขอบคุณที่ให้ความสนใจและสนับสนุนเรา เนื่องจากการปรับเปลี่ยนนโยบายการดำเนินงานของเว็บไซต์ เราได้ปิดการลงทะเบียนผู้ใช้ใหม่ ในช่วงเวลานี้ การใช้งานของผู้ใช้ปัจจุบันจะไม่ได้รับผลกระทบใดๆ\n\nเรามุ่งมั่นที่จะให้บริการและประสบการณ์ที่ดียิ่งขึ้นแก่คุณ ดังนั้นเราจะทำการปรับปรุงระบบและอัปเกรดฟังก์ชันอย่างเต็มรูปแบบในช่วงที่ปิดการลงทะเบียน ในอนาคต เราจะต้อนรับคุณด้วยเนื้อหาและบริการที่มีคุณภาพยิ่งขึ้น\n\nโปรดติดตามเว็บไซต์และแพลตฟอร์มโซเชียลมีเดียของเรา เพื่อรับข้อมูลและการแจ้งเตือนล่าสุด ขอบคุณสำหรับความเข้าใจและการสนับสนุนของคุณ\n\nหากมีคำถามหรือความต้องการความช่วยเหลือใดๆ โปรดติดต่อทีมบริการลูกค้าของเราได้ตลอดเวลา\n\n**ขอขอบคุณอีกครั้งสำหรับการสนับสนุนและความเข้าใจของคุณ**",
|
||||
"passwordMismatch": "รหัสผ่านที่กรอกไม่ตรงกัน",
|
||||
"success": "สมัครสมาชิกสำเร็จ เข้าสู่ระบบอัตโนมัติแล้ว!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "การตั้งค่า ADS",
|
||||
"Announcement Management": "การจัดการประกาศ",
|
||||
"Apple": "Apple ID",
|
||||
"Application Management": "การจัดการแอปพลิเคชัน",
|
||||
"Auth Control": "การควบคุมการยืนยันตัวตน",
|
||||
"Coupon Management": "การจัดการคูปอง",
|
||||
"Dashboard": "แดชบอร์ด",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "การจัดการคำสั่งซื้อ",
|
||||
"Payment Config": "การตั้งค่าการชำระเงิน",
|
||||
"Phone Number": "หมายเลขโทรศัพท์",
|
||||
"Rule Management": "การจัดการกฎ",
|
||||
"Server": "เซิร์ฟเวอร์",
|
||||
"Server Management": "การจัดการเซิร์ฟเวอร์",
|
||||
"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": "เปิดใช้งานบัญชี",
|
||||
"actions": "การดำเนินการ",
|
||||
"active": "ใช้งาน",
|
||||
"add": "เพิ่ม",
|
||||
"administrator": "ผู้ดูแลระบบ",
|
||||
"areaCode": "รหัสพื้นที่",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "อีเมล",
|
||||
"enable": "เปิดใช้งาน",
|
||||
"expireTime": "เวลาหมดอายุ",
|
||||
"expired": "หมดอายุ",
|
||||
"expiredAt": "วันหมดอายุ",
|
||||
"failed": "ล้มเหลว",
|
||||
"giftAmount": "จำนวนเงินของขวัญ",
|
||||
"giftAmountPlaceholder": "กรอกจำนวนเงินของขวัญ",
|
||||
"inactive": "ไม่ใช้งาน",
|
||||
"invalidEmailFormat": "รูปแบบอีเมลไม่ถูกต้อง",
|
||||
"inviteCode": "รหัสเชิญ",
|
||||
"inviteCodePlaceholder": "กรอกรหัสเชิญ (เว้นว่างไว้เพื่อสร้างใหม่)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "กรุณาใส่รหัสผ่านใหม่ (ไม่บังคับ)",
|
||||
"permanent": "ถาวร",
|
||||
"pleaseEnterEmail": "กรุณาใส่อีเมล",
|
||||
"price": "ราคา",
|
||||
"referer": "ผู้แนะนำ",
|
||||
"refererId": "รหัสผู้แนะนำ",
|
||||
"refererIdPlaceholder": "กรอก ID ผู้แนะนำ",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "ค้นหาที่อยู่ IP",
|
||||
"selectAuthType": "เลือกประเภทการยืนยันตัวตน",
|
||||
"speedLimit": "จำกัดความเร็ว",
|
||||
"startTime": "เวลาเริ่มต้น",
|
||||
"status": "สถานะ",
|
||||
"subscription": "การสมัครสมาชิก",
|
||||
"subscriptionDetails": "รายละเอียดการสมัครสมาชิก",
|
||||
"subscriptionId": "รหัสการสมัครสมาชิก",
|
||||
"subscriptionInfo": "ข้อมูลการสมัครสมาชิก",
|
||||
"subscriptionList": "รายการสมัครสมาชิก",
|
||||
"subscriptionLogs": "บันทึกการสมัครสมาชิก",
|
||||
"subscriptionName": "ชื่อการสมัครสมาชิก",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "การแจ้งเตือนการซื้อขาย",
|
||||
"trafficLimit": "ขีดจำกัดการจราจร",
|
||||
"trafficLogs": "บันทึกการจราจร",
|
||||
"trafficUsage": "การใช้งานข้อมูล",
|
||||
"unknown": "ไม่ทราบ",
|
||||
"unlimited": "ไม่จำกัด",
|
||||
"unverified": "ยังไม่ได้รับการยืนยัน",
|
||||
"update": "อัปเดต",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "ตัวแทนผู้ใช้",
|
||||
"userEmail": "อีเมลผู้ใช้",
|
||||
"userEmailPlaceholder": "กรอกอีเมลผู้ใช้",
|
||||
"userId": "รหัสผู้ใช้",
|
||||
"userInfo": "ข้อมูลผู้ใช้",
|
||||
"userList": "รายชื่อผู้ใช้",
|
||||
"userLogs": "ประวัติการเข้าสู่ระบบ",
|
||||
"userName": "ตัวระบุผู้ใช้",
|
||||
"userOrders": "คำสั่งซื้อ",
|
||||
"userProfile": "โปรไฟล์",
|
||||
"userSubscriptions": "การสมัครสมาชิก",
|
||||
"verified": "ยืนยันแล้ว"
|
||||
"username": "ชื่อผู้ใช้",
|
||||
"verified": "ยืนยันแล้ว",
|
||||
"viewDetails": "ดูรายละเอียด"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Lütfen geçerli bir e-posta adresi girin.",
|
||||
"existingAccount": "Zaten bir hesabınız var mı?",
|
||||
"get": "Al",
|
||||
"invite": "Davet Kodu",
|
||||
"invite": "Davet kodu (isteğe bağlı)",
|
||||
"message": "#### Sayın Kullanıcı,\n\nİlginiz ve desteğiniz için teşekkür ederiz. Site işletme stratejimizin değişikliği nedeniyle, yeni kullanıcı kaydı işlevini kapattık. Bu süre zarfında, mevcut kullanıcıların kullanımı hiçbir şekilde etkilenmeyecektir.\n\nSize daha iyi hizmet ve deneyim sunmak için, kayıt kapalıyken kapsamlı bir sistem optimizasyonu ve işlev yükseltmesi gerçekleştireceğiz. Gelecekte, daha kaliteli içerik ve hizmetlerle sizi karşılamayı dört gözle bekliyoruz.\n\nEn son gelişmeler ve bildirimler için web sitemizi ve sosyal medya platformlarımızı takip edin. Anlayışınız ve desteğiniz için teşekkür ederiz.\n\nHerhangi bir sorunuz veya yardıma ihtiyacınız olursa, lütfen müşteri hizmetleri ekibimizle iletişime geçmekten çekinmeyin.\n\n**Desteğiniz ve anlayışınız için tekrar teşekkür ederiz.**",
|
||||
"passwordMismatch": "Girilen şifreler uyuşmuyor",
|
||||
"success": "Kayıt başarılı, otomatik olarak giriş yapıldı!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "ADS Yapılandırması",
|
||||
"Announcement Management": "Duyuru Yönetimi",
|
||||
"Apple": "Apple Kimliği",
|
||||
"Application Management": "Uygulama Yönetimi",
|
||||
"Auth Control": "Yetki Kontrolü",
|
||||
"Coupon Management": "Kupon Yönetimi",
|
||||
"Dashboard": "Gösterge Paneli",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Sipariş Yönetimi",
|
||||
"Payment Config": "Ödeme Yapılandırması",
|
||||
"Phone Number": "Telefon Numarası",
|
||||
"Rule Management": "Kural Yönetimi",
|
||||
"Server": "Sunucu",
|
||||
"Server Management": "Sunucu Yönetimi",
|
||||
"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",
|
||||
"actions": "eylemler",
|
||||
"active": "Aktif",
|
||||
"add": "Ekle",
|
||||
"administrator": "Yönetici",
|
||||
"areaCode": "Alan Kodu",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "e-posta",
|
||||
"enable": "etkinleştir",
|
||||
"expireTime": "Sona Erme Zamanı",
|
||||
"expired": "Süresi Dolmuş",
|
||||
"expiredAt": "Son Kullanma Tarihi",
|
||||
"failed": "Başarısız",
|
||||
"giftAmount": "Hediye Miktarı",
|
||||
"giftAmountPlaceholder": "Hediye tutarını girin",
|
||||
"inactive": "Pasif",
|
||||
"invalidEmailFormat": "Geçersiz e-posta formatı",
|
||||
"inviteCode": "Davet Kodu",
|
||||
"inviteCodePlaceholder": "Davet kodunu girin (oluşturmak için boş bırakın)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Yeni şifreyi girin (isteğe bağlı)",
|
||||
"permanent": "Kalıcı",
|
||||
"pleaseEnterEmail": "Lütfen e-posta adresinizi girin",
|
||||
"price": "Fiyat",
|
||||
"referer": "Referans",
|
||||
"refererId": "Referans Kimliği",
|
||||
"refererIdPlaceholder": "Referans kimliğini girin",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "IP adresi ara",
|
||||
"selectAuthType": "Kimlik doğrulama türünü seçin",
|
||||
"speedLimit": "Hız Sınırı",
|
||||
"startTime": "Başlangıç Zamanı",
|
||||
"status": "Durum",
|
||||
"subscription": "Abonelik",
|
||||
"subscriptionDetails": "Abonelik Ayrıntıları",
|
||||
"subscriptionId": "Abonelik ID",
|
||||
"subscriptionInfo": "Abonelik Bilgisi",
|
||||
"subscriptionList": "Abonelik Listesi",
|
||||
"subscriptionLogs": "Abonelik Kayıtları",
|
||||
"subscriptionName": "Abonelik Adı",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Ticaret Bildirimleri",
|
||||
"trafficLimit": "Trafik Limiti",
|
||||
"trafficLogs": "Trafik Günlükleri",
|
||||
"trafficUsage": "Trafik Kullanımı",
|
||||
"unknown": "Bilinmiyor",
|
||||
"unlimited": "Sınırsız",
|
||||
"unverified": "Doğrulanmamış",
|
||||
"update": "Güncelle",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Kullanıcı Aracısı",
|
||||
"userEmail": "Kullanıcı E-postası",
|
||||
"userEmailPlaceholder": "Kullanıcı e-postasını girin",
|
||||
"userId": "Kullanıcı ID",
|
||||
"userInfo": "Kullanıcı Bilgisi",
|
||||
"userList": "Kullanıcı Listesi",
|
||||
"userLogs": "Giriş Geçmişi",
|
||||
"userName": "Kullanıcı Tanımlayıcı",
|
||||
"userOrders": "Siparişler",
|
||||
"userProfile": "Profil",
|
||||
"userSubscriptions": "Abonelikler",
|
||||
"verified": "Doğrulandı"
|
||||
"username": "Kullanıcı Adı",
|
||||
"verified": "Doğrulandı",
|
||||
"viewDetails": "Ayrıntıları Görüntüle"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Будь ласка, введіть дійсну електронну адресу.",
|
||||
"existingAccount": "Вже маєте обліковий запис?",
|
||||
"get": "Отримати",
|
||||
"invite": "Код запрошення",
|
||||
"invite": "Код запрошення (необов'язково)",
|
||||
"message": "#### Шановний користувач!\n\nДякуємо за вашу увагу та підтримку. У зв'язку зі зміною стратегії роботи сайту, ми закрили функцію реєстрації нових користувачів. Протягом цього періоду використання існуючими користувачами не буде зазнавати жодних змін.\n\nМи прагнемо надавати вам кращий сервіс та досвід, тому під час закриття реєстрації ми проведемо повну оптимізацію системи та оновлення функцій. У майбутньому ми зустрінемо вас з якіснішим контентом та послугами.\n\nБудь ласка, слідкуйте за нашим сайтом та соціальними мережами, щоб отримувати останні новини та повідомлення. Дякуємо за ваше розуміння та підтримку.\n\nЯкщо у вас є будь-які питання або потрібна допомога, будь ласка, зв'яжіться з нашою службою підтримки.\n\n**Ще раз дякуємо за вашу підтримку та розуміння.**",
|
||||
"passwordMismatch": "Паролі не співпадають",
|
||||
"success": "Реєстрація успішна, автоматично увійшли!",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"ADS Config": "Конфігурація ADS",
|
||||
"Announcement Management": "Управління оголошеннями",
|
||||
"Apple": "Apple ID",
|
||||
"Application Management": "Управління додатками",
|
||||
"Auth Control": "Контроль автентифікації",
|
||||
"Coupon Management": "Управління купонами",
|
||||
"Dashboard": "Панель приладів",
|
||||
@@ -16,6 +17,7 @@
|
||||
"Order Management": "Управління замовленнями",
|
||||
"Payment Config": "Налаштування оплати",
|
||||
"Phone Number": "Номер телефону",
|
||||
"Rule Management": "Управління правилами",
|
||||
"Server": "Сервер",
|
||||
"Server Management": "Управління сервером",
|
||||
"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": "Увімкнення облікового запису",
|
||||
"actions": "дії",
|
||||
"active": "Активний",
|
||||
"add": "Додати",
|
||||
"administrator": "Адміністратор",
|
||||
"areaCode": "Код регіону",
|
||||
@@ -41,10 +42,12 @@
|
||||
"email": "електронна пошта",
|
||||
"enable": "Увімкнути",
|
||||
"expireTime": "Час закінчення",
|
||||
"expired": "Закінчився",
|
||||
"expiredAt": "Термін дії закінчився",
|
||||
"failed": "Не вдалося",
|
||||
"giftAmount": "Сума подарунка",
|
||||
"giftAmountPlaceholder": "Введіть суму подарунка",
|
||||
"inactive": "Неактивний",
|
||||
"invalidEmailFormat": "Неправильний формат електронної пошти",
|
||||
"inviteCode": "Код запрошення",
|
||||
"inviteCodePlaceholder": "Введіть код запрошення (залиште порожнім для генерації)",
|
||||
@@ -63,6 +66,7 @@
|
||||
"passwordPlaceholder": "Введіть новий пароль (необов'язково)",
|
||||
"permanent": "Постійний",
|
||||
"pleaseEnterEmail": "Будь ласка, введіть електронну пошту",
|
||||
"price": "Ціна",
|
||||
"referer": "Реферер",
|
||||
"refererId": "Ідентифікатор реферера",
|
||||
"refererIdPlaceholder": "Введіть ID реферера",
|
||||
@@ -74,8 +78,12 @@
|
||||
"searchIp": "Пошук IP-адреси",
|
||||
"selectAuthType": "Виберіть тип автентифікації",
|
||||
"speedLimit": "Обмеження швидкості",
|
||||
"startTime": "Час початку",
|
||||
"status": "Статус",
|
||||
"subscription": "Підписка",
|
||||
"subscriptionDetails": "Деталі підписки",
|
||||
"subscriptionId": "ID підписки",
|
||||
"subscriptionInfo": "Інформація про підписку",
|
||||
"subscriptionList": "Список підписок",
|
||||
"subscriptionLogs": "Журнали підписки",
|
||||
"subscriptionName": "Назва підписки",
|
||||
@@ -89,6 +97,8 @@
|
||||
"tradeNotifications": "Сповіщення про торгівлю",
|
||||
"trafficLimit": "Ліміт трафіку",
|
||||
"trafficLogs": "Журнали трафіку",
|
||||
"trafficUsage": "Використання трафіку",
|
||||
"unknown": "Невідомо",
|
||||
"unlimited": "Необмежено",
|
||||
"unverified": "Непідтверджено",
|
||||
"update": "Оновити",
|
||||
@@ -98,11 +108,15 @@
|
||||
"userAgent": "Агент користувача",
|
||||
"userEmail": "Електронна пошта користувача",
|
||||
"userEmailPlaceholder": "Введіть електронну адресу користувача",
|
||||
"userId": "ID користувача",
|
||||
"userInfo": "Інформація про користувача",
|
||||
"userList": "Список користувачів",
|
||||
"userLogs": "Історія входів",
|
||||
"userName": "Ідентифікатор користувача",
|
||||
"userOrders": "Замовлення",
|
||||
"userProfile": "Профіль",
|
||||
"userSubscriptions": "Підписки",
|
||||
"verified": "Перевірено"
|
||||
"username": "Ім'я користувача",
|
||||
"verified": "Перевірено",
|
||||
"viewDetails": "Переглянути деталі"
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"email": "Vui lòng nhập địa chỉ email hợp lệ.",
|
||||
"existingAccount": "Đã có tài khoản?",
|
||||
"get": "Lấy",
|
||||
"invite": "Mã mời",
|
||||
"invite": "Mã mời (tùy chọn)",
|
||||
"message": "#### Kính gửi người dùng,\n\nCảm ơn bạn đã quan tâm và ủng hộ chúng tôi. Do điều chỉnh chiến lược vận hành trang web, chúng tôi đã đóng chức năng đăng ký người dùng mới. Trong thời gian này, việc sử dụng của người dùng hiện tại sẽ không bị ảnh hưởng.\n\nChúng tôi cam kết mang đến cho bạn dịch vụ và trải nghiệm tốt hơn, do đó sẽ tiến hành tối ưu hóa hệ thống và nâng cấp chức năng toàn diện trong thời gian đóng đăng ký. Trong tương lai, chúng tôi sẽ chào đón bạn với nội dung và dịch vụ chất lượng hơn.\n\nHãy theo dõi trang web và các nền tảng truyền thông xã hội của chúng tôi để nhận thông tin và thông báo mới nhất. Cảm ơn bạn đã hiểu và ủng hộ.\n\nNếu có bất kỳ thắc mắc hoặc cần hỗ trợ, vui lòng liên hệ với đội ngũ chăm sóc khách hàng của chúng tôi.\n\n**Một lần nữa cảm ơn sự ủng hộ và hiểu biết của bạn.**",
|
||||
"passwordMismatch": "Mật khẩu nhập hai lần không khớp",
|
||||
"success": "Đăng ký thành công, đã tự động đăng nhập!",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user