feat(admin): Add application and rule management entries to localization files

This commit is contained in:
web@ppanel 2025-04-02 00:12:02 +07:00
parent ef153747bd
commit 8b43e69bfe
64 changed files with 11730 additions and 21 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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": "تنظیمات",

View File

@ -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": "قانون با موفقیت به‌روزرسانی شد"
}

View File

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

View File

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

View File

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

View File

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

View File

@ -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": "सेटिंग्स",

View File

@ -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": "नियम सफलतापूर्वक अपडेट किया गया"
}

View File

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

View File

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

View File

@ -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": "設定",

View File

@ -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": "ルールが正常に更新されました"
}

View File

@ -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": "설정",

View File

@ -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": "규칙이 성공적으로 업데이트되었습니다"
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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": "Настройки",

View File

@ -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": "Правило успешно обновлено"
}

View File

@ -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": "การตั้งค่า",

View File

@ -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": "อัปเดตกฎเรียบร้อยแล้ว"
}

View File

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

View File

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

View File

@ -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": "Налаштування",

View File

@ -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": "Правило успішно оновлено"
}

View File

@ -2,6 +2,7 @@
"ADS Config": "Cấu hình ADS",
"Announcement Management": "Quản lý Thông báo",
"Apple": "ID Apple",
"Application Management": "Quản lý Ứng dụng",
"Auth Control": "Kiểm Soát Xác Thực",
"Coupon Management": "Quản lý phiếu giảm giá",
"Dashboard": "Bảng điều khiển",
@ -16,6 +17,7 @@
"Order Management": "Quản lý đơn hàng",
"Payment Config": "Cấu hình thanh toán",
"Phone Number": "Số Điện Thoại",
"Rule Management": "Quản lý Quy tắc",
"Server": "Dịch vụ",
"Server Management": "Quản lý máy chủ",
"Settings": "Cài đặt",

View File

@ -0,0 +1,43 @@
{
"analyzing": "Đang phân tích...",
"appIcon": "Biểu tượng Quy tắc",
"cancel": "Hủy",
"confirm": "Xác nhận",
"confirmDelete": "Xác nhận Xóa",
"create": "Thêm Quy tắc",
"createRule": "Thêm Quy tắc",
"createSuccess": "Quy tắc đã được tạo thành công",
"createdAt": "Ngày Tạo",
"delete": "Xóa",
"deleteSuccess": "Quy tắc đã được xóa thành công",
"deleteWarning": "Bạn có chắc chắn muốn xóa quy tắc này không? Hành động này không thể hoàn tác.",
"description": "Mô tả Quy tắc",
"downloadTemplate": "Tải Mẫu",
"edit": "Chỉnh sửa",
"editRule": "Chỉnh sửa Quy tắc",
"enable": "Kích hoạt",
"enterIconUrl": "Nhập hoặc tải lên một biểu tượng",
"enterRuleName": "Nhập tên quy tắc",
"enterRules": "Nhập nội dung quy tắc, mỗi quy tắc một dòng",
"import": "Nhập khẩu",
"importFailed": "Nhập khẩu không thành công",
"importSuccess": "Nhập khẩu thành công",
"importYaml": "Nhập YAML",
"importYamlDescription": "Nhập quy tắc từ tệp YAML, hệ thống sẽ tự động tạo nhóm quy tắc dựa trên tên nhóm chính sách",
"importYamlRules": "Nhập Quy tắc YAML",
"importing": "Đang nhập khẩu...",
"invalidYamlFormat": "Định dạng YAML không hợp lệ, thiếu trường quy tắc",
"name": "Tên Quy tắc",
"noValidRules": "Không tìm thấy quy tắc hợp lệ",
"pleaseUploadFile": "Vui lòng tải lên một tệp YAML",
"preview": "Xem trước",
"rules": "Nội dung Quy tắc",
"rulesFormat": "Định dạng quy tắc: loại quy tắc, nội dung khớp, [chính sách], trong đó chính sách là tùy chọn.\nNếu không chỉ định chính sách, tên nhóm quy tắc hiện tại sẽ được sử dụng tự động. Ví dụ:",
"rulesLabel": "Nội dung Quy tắc",
"searchRule": "Tìm kiếm tên quy tắc",
"selectFile": "Chọn Tệp",
"selectTags": "Chọn thẻ nút",
"tags": "Thẻ Nút",
"tagsLabel": "Thẻ Nút",
"updateSuccess": "Quy tắc đã được cập nhật thành công"
}

View File

@ -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": "设置",

View File

@ -0,0 +1,43 @@
{
"analyzing": "分析中...",
"appIcon": "规则图标",
"cancel": "取消",
"confirm": "确认",
"confirmDelete": "确认删除",
"create": "添加规则",
"createRule": "添加规则",
"createSuccess": "创建规则成功",
"createdAt": "创建时间",
"delete": "删除",
"deleteSuccess": "删除规则成功",
"deleteWarning": "确定要删除所选规则吗?此操作不可恢复。",
"description": "规则描述",
"downloadTemplate": "下载模板",
"edit": "编辑",
"editRule": "编辑规则",
"enable": "启用",
"enterIconUrl": "请输入或上传图标",
"enterRuleName": "请输入规则名称",
"enterRules": "请输入规则内容,每行一条",
"import": "导入",
"importFailed": "导入失败",
"importSuccess": "导入成功",
"importYaml": "导入YAML",
"importYamlDescription": "从YAML文件导入规则系统将自动根据策略组名称分组创建规则",
"importYamlRules": "导入YAML规则",
"importing": "导入中...",
"invalidYamlFormat": "无效的YAML格式缺少rules字段",
"name": "规则名称",
"noValidRules": "没有找到有效的规则",
"pleaseUploadFile": "请上传YAML文件",
"preview": "预览",
"rules": "规则内容",
"rulesFormat": "规则格式说明:规则类型,匹配内容,[策略], 其中策略为可选项。\n不指定策略时将自动使用当前规则组名称, 示例:",
"rulesLabel": "规则内容",
"searchRule": "搜索规则名称",
"selectFile": "选择文件",
"selectTags": "选择节点标签",
"tags": "节点标签",
"tagsLabel": "节点标签",
"updateSuccess": "更新规则成功"
}

View File

@ -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": "設定",

View File

@ -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": "規則更新成功"
}

View File

@ -16,6 +16,7 @@
"@workspace/ui": "workspace:*",
"ahooks": "^3.8.4",
"axios": "^1.7.9",
"js-yaml": "^4.1.0",
"nanoid": "^5.0.9",
"next": "^15.1.4",
"next-intl": "^3.26.3",
@ -30,6 +31,7 @@
"zustand": "^5.0.3"
},
"devDependencies": {
"@types/js-yaml": "^4.0.9",
"@types/node": "^22.10.5",
"@types/react": "^19.0.4",
"@types/react-dom": "^19.0.2",

File diff suppressed because it is too large Load Diff

View File

@ -221,3 +221,14 @@ export async function nodeSort(body: API.NodeSortRequest, options?: { [key: stri
...(options || {}),
});
}
/** Get node tag list GET /v1/admin/server/tag/list */
export async function getNodeTagList(options?: { [key: string]: any }) {
return request<API.Response & { data?: API.GetNodeTagListResponse }>(
'/v1/admin/server/tag/list',
{
method: 'GET',
...(options || {}),
},
);
}

View File

@ -257,7 +257,8 @@ declare namespace API {
type CreateRuleGroupRequest = {
name: string;
icon: string;
description: string;
tags: string[];
rules: string;
enable: boolean;
};
@ -619,6 +620,10 @@ declare namespace API {
list: Server[];
};
type GetNodeTagListResponse = {
tags: string[];
};
type GetOrderListParams = {
page: number;
size: number;
@ -1232,9 +1237,10 @@ declare namespace API {
type ServerRuleGroup = {
id: number;
name: string;
icon: string;
description: string;
name: string;
tags: string[];
rules: string;
enable: boolean;
created_at: number;
updated_at: number;
@ -1574,9 +1580,10 @@ declare namespace API {
type UpdateRuleGroupRequest = {
id: number;
name: string;
icon: string;
description: string;
name: string;
tags: string[];
rules: string;
enable: boolean;
};

View File

@ -639,9 +639,10 @@ declare namespace API {
type ServerRuleGroup = {
id: number;
name: string;
icon: string;
description: string;
name: string;
tags: string[];
rules: string;
enable: boolean;
created_at: number;
updated_at: number;

View File

@ -639,9 +639,10 @@ declare namespace API {
type ServerRuleGroup = {
id: number;
name: string;
icon: string;
description: string;
name: string;
tags: string[];
rules: string;
enable: boolean;
created_at: number;
updated_at: number;

View File

@ -752,9 +752,10 @@ declare namespace API {
type ServerRuleGroup = {
id: number;
name: string;
icon: string;
description: string;
name: string;
tags: string[];
rules: string;
enable: boolean;
created_at: number;
updated_at: number;

BIN
bun.lockb

Binary file not shown.

View File

@ -12,6 +12,7 @@ interface UploadImageProps {
id?: string;
children?: React.ReactNode;
className?: string;
maxSize?: number; // Maximum file size in MB
}
export const UploadImage = ({
@ -20,6 +21,7 @@ export const UploadImage = ({
id = 'image-upload',
children,
className,
maxSize = 1,
}: UploadImageProps) => {
const [isDragging, setIsDragging] = useState(false);
@ -32,11 +34,22 @@ export const UploadImage = ({
});
};
const validateFileSize = (file: File): boolean => {
const maxSizeInBytes = maxSize * 1024 * 1024;
if (file.size > maxSizeInBytes) {
alert(`File size exceeds the limit (${maxSize}MB)`);
return false;
}
return true;
};
const handleImageUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
if (!file) return;
try {
if (!validateFileSize(file)) return;
if (returnType === 'base64') {
const base64 = await toBase64(file);
onChange(base64);
@ -66,6 +79,8 @@ export const UploadImage = ({
if (!file) return;
try {
if (!validateFileSize(file)) return;
if (returnType === 'base64') {
const base64 = await toBase64(file);
onChange(base64);