Compare commits

..

7 Commits

Author SHA1 Message Date
semantic-release-bot 8f772c2364 🔖 chore(release): v1.1.1 [skip ci]
## [1.1.1](https://github.com/perfect-panel/ppanel-web/compare/v1.1.0...v1.1.1) (2025-07-20)

### 🐛 Bug Fixes

* **node-table**: Update translations for headers and no data display ([eec0b12](https://github.com/perfect-panel/ppanel-web/commit/eec0b12))
* **rules**: Change rule type from 'auto' to 'default' and update ([3e290d7](https://github.com/perfect-panel/ppanel-web/commit/3e290d7))
* **rules**: Update rule settings ([3304a55](https://github.com/perfect-panel/ppanel-web/commit/3304a55))
* **subscribe-form**: Optimize discount calculation logic and debounce updates ([166e48f](https://github.com/perfect-panel/ppanel-web/commit/166e48f))
* **tutorial**: Comment out unused getVersion function and simplify getVersionPath ([7cdc6bd](https://github.com/perfect-panel/ppanel-web/commit/7cdc6bd))
* **tutorial**: Return latest version in case of fetch error ([1fb305e](https://github.com/perfect-panel/ppanel-web/commit/1fb305e))
2025-07-20 10:24:58 +00:00
web 166e48f442 🐛 fix(subscribe-form): Optimize discount calculation logic and debounce updates 2025-07-20 03:20:59 -07:00
web eec0b12154 🐛 fix(node-table): Update translations for headers and no data display 2025-07-20 03:00:59 -07:00
web 3e290d7cb5 🐛 fix(rules): Change rule type from 'auto' to 'default' and update 2025-07-17 03:30:12 -07:00
web 3304a55fd4 🐛 fix(rules): Update rule settings 2025-07-16 09:16:33 -07:00
web 7cdc6bdd8f 🐛 fix(tutorial): Comment out unused getVersion function and simplify getVersionPath 2025-07-11 02:58:37 -07:00
web 1fb305e7a1 🐛 fix(tutorial): Return latest version in case of fetch error 2025-07-11 01:56:42 -07:00
39 changed files with 327 additions and 198 deletions
+17 -2
View File
@@ -1,12 +1,27 @@
<a name="readme-top"></a> <a name="readme-top"></a>
# Changelog # Changelog
## [1.1.1](https://github.com/perfect-panel/ppanel-web/compare/v1.1.0...v1.1.1) (2025-07-20)
### 🐛 Bug Fixes
* **node-table**: Update translations for headers and no data display ([eec0b12](https://github.com/perfect-panel/ppanel-web/commit/eec0b12))
* **rules**: Change rule type from 'auto' to 'default' and update ([3e290d7](https://github.com/perfect-panel/ppanel-web/commit/3e290d7))
* **rules**: Update rule settings ([3304a55](https://github.com/perfect-panel/ppanel-web/commit/3304a55))
* **subscribe-form**: Optimize discount calculation logic and debounce updates ([166e48f](https://github.com/perfect-panel/ppanel-web/commit/166e48f))
* **tutorial**: Comment out unused getVersion function and simplify getVersionPath ([7cdc6bd](https://github.com/perfect-panel/ppanel-web/commit/7cdc6bd))
* **tutorial**: Return latest version in case of fetch error ([1fb305e](https://github.com/perfect-panel/ppanel-web/commit/1fb305e))
<a name="readme-top"></a>
# Changelog
# [1.1.0](https://github.com/perfect-panel/ppanel-web/compare/v1.0.2...v1.1.0) (2025-07-06) # [1.1.0](https://github.com/perfect-panel/ppanel-web/compare/v1.0.2...v1.1.0) (2025-07-06)
### ✨ Features ### ✨ Features
* **view**: Add AnyTLS protocol support and enhance node configuration options ([bcfb10a](https://github.com/perfect-panel/ppanel-web/commit/bcfb10a)) - **view**: Add AnyTLS protocol support and enhance node configuration options ([bcfb10a](https://github.com/perfect-panel/ppanel-web/commit/bcfb10a))
<a name="readme-top"></a> <a name="readme-top"></a>
@@ -88,12 +88,32 @@ export default function ImportYamlRules({ onImportSuccess }: ImportYamlRulesProp
if (!groups[policyGroup]) { if (!groups[policyGroup]) {
groups[policyGroup] = []; groups[policyGroup] = [];
} }
groups[policyGroup].push(cleanRule);
// 不插入 MATCH 规则,只用于标识默认规则组
if (!rule.trim().startsWith('MATCH,')) {
groups[policyGroup].push(cleanRule);
}
} }
return groups; return groups;
}; };
const checkIfDefaultRule = (originalRules: string[], groupName: string): boolean => {
return originalRules.some((rule) => {
const trimmedRule = rule.trim();
if (!trimmedRule.startsWith('MATCH,')) return false;
// 检查 MATCH 规则是否属于当前组
const parts = trimmedRule.split(',');
if (parts.length >= 3) {
const ruleGroup = parts[2]?.trim();
return ruleGroup === groupName;
}
return groupName === 'default';
});
};
const handleImport = async () => { const handleImport = async () => {
if (!yamlContent) { if (!yamlContent) {
toast.error(t('pleaseUploadFile')); toast.error(t('pleaseUploadFile'));
@@ -130,12 +150,17 @@ export default function ImportYamlRules({ onImportSuccess }: ImportYamlRulesProp
for (let i = 0; i < groups.length; i++) { for (let i = 0; i < groups.length; i++) {
const group = groups[i]; const group = groups[i];
if (!group?.name || !group?.rules.length) continue; if (!group?.name || !group?.rules.length) continue;
const isDefault = checkIfDefaultRule(allRules, group.name);
await createRuleGroup({ await createRuleGroup({
name: group.name, name: group.name,
rules: group?.rules.join('\n'), rules: group?.rules.join('\n'),
enable: false, enable: false,
tags: [], tags: [],
icon: '', icon: '',
type: 'default',
default: isDefault,
}); });
setImportProgress(i + 1); setImportProgress(i + 1);
} }
+49 -17
View File
@@ -50,6 +50,8 @@ export default function Page() {
enable: false, enable: false,
tags: values.tags || [], tags: values.tags || [],
icon: values.icon || '', icon: values.icon || '',
type: values.type || 'default',
default: false,
}); });
toast.success(t('createSuccess')); toast.success(t('createSuccess'));
ref.current?.refresh(); ref.current?.refresh();
@@ -100,27 +102,55 @@ export default function Page() {
}, },
}, },
{ {
accessorKey: 'icon', accessorKey: 'default',
header: t('appIcon'), header: t('defaultRule'),
cell: ({ row }) => cell: ({ row }) => (
row.getValue('icon') ? ( <Switch
<Image defaultChecked={row.original.default}
src={row.getValue('icon')} onCheckedChange={async (checked) => {
alt={row.getValue('name')} await updateRuleGroup({
className='h-8 w-8 rounded-md' ...row.original,
width={32} default: checked,
height={32} } as API.UpdateRuleGroupRequest);
/> ref.current?.refresh();
) : ( }}
<div className='bg-muted flex h-8 w-8 items-center justify-center rounded-md'> />
{row.original.name?.slice(0, 2)} ),
</div> },
), {
accessorKey: 'type',
header: t('type'),
cell: ({ row }) => {
const type = row.original.type || 'default';
if (type === 'default') {
return <Badge variant='default'>{t('default')}</Badge>;
}
if (type === 'reject') {
return <Badge variant='destructive'>{t('reject')}</Badge>;
}
if (type === 'direct') {
return <Badge variant='secondary'>{t('direct')}</Badge>;
}
return <Badge variant='default'>{t('default')}</Badge>;
},
}, },
{ {
accessorKey: 'name', accessorKey: 'name',
header: t('name'), header: t('name'),
cell: ({ row }) => (
<div className='flex items-center gap-2'>
{row.original.icon && (
<Image
src={row.original.icon}
alt={row.original.name}
className='h-6 w-6 rounded-md'
width={24}
height={24}
/>
)}
<span>{row.original.name}</span>
</div>
),
}, },
{ {
accessorKey: 'tags', accessorKey: 'tags',
@@ -163,6 +193,8 @@ export default function Page() {
rules: values.rules, rules: values.rules,
enable: row.enable, enable: row.enable,
icon: values.icon, icon: values.icon,
type: values.type,
default: row.default,
}); });
toast.success(t('updateSuccess')); toast.success(t('updateSuccess'));
ref.current?.refresh(); ref.current?.refresh();
@@ -13,6 +13,13 @@ import {
FormMessage, FormMessage,
} from '@workspace/ui/components/form'; } from '@workspace/ui/components/form';
import { ScrollArea } from '@workspace/ui/components/scroll-area'; import { ScrollArea } from '@workspace/ui/components/scroll-area';
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@workspace/ui/components/select';
import { import {
Sheet, Sheet,
SheetContent, SheetContent,
@@ -36,6 +43,7 @@ const formSchema = z.object({
tags: z.array(z.string()).default([]), tags: z.array(z.string()).default([]),
rules: z.string().default(''), rules: z.string().default(''),
icon: z.string().default(''), icon: z.string().default(''),
type: z.string().default('default'),
}); });
interface RuleFormProps<T> { interface RuleFormProps<T> {
@@ -147,6 +155,33 @@ export default function RuleForm<T extends Record<string, any>>({
</FormItem> </FormItem>
)} )}
/> />
<FormField
control={form.control}
name='type'
render={({ field }) => (
<FormItem>
<FormLabel>{t('type')}</FormLabel>
<FormControl>
<Select
value={field.value}
onValueChange={(value) => {
form.setValue(field.name, value);
}}
>
<SelectTrigger>
<SelectValue placeholder={t('selectType')} />
</SelectTrigger>
<SelectContent>
<SelectItem value='default'>{t('default')}</SelectItem>
<SelectItem value='reject'>{t('reject')}</SelectItem>
<SelectItem value='direct'>{t('direct')}</SelectItem>
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField <FormField
control={form.control} control={form.control}
name='tags' name='tags'
@@ -73,7 +73,7 @@ export default function NodeTable() {
columns={[ columns={[
{ {
accessorKey: 'id', accessorKey: 'id',
header: 'ID', header: t('id'),
cell: ({ row }) => ( cell: ({ row }) => (
<TooltipProvider> <TooltipProvider>
<Tooltip> <Tooltip>
@@ -160,7 +160,7 @@ export default function NodeTable() {
header: t('nodeGroup'), header: t('nodeGroup'),
cell: ({ row }) => { cell: ({ row }) => {
const name = groups?.find((group) => group.id === row.getValue('group_id'))?.name; const name = groups?.find((group) => group.id === row.getValue('group_id'))?.name;
return name ? <Badge variant='outline'>{name}</Badge> : '--'; return name ? <Badge variant='outline'>{name}</Badge> : t('noData');
}, },
}, },
{ {
@@ -177,7 +177,7 @@ export default function NodeTable() {
))} ))}
</div> </div>
) : ( ) : (
'--' t('noData')
); );
}, },
}, },
@@ -273,17 +273,17 @@ export default function NodeTable() {
<ConfirmButton <ConfirmButton
key='delete' key='delete'
trigger={<Button variant='destructive'>{t('delete')}</Button>} trigger={<Button variant='destructive'>{t('delete')}</Button>}
title={t('group.confirmDelete')} title={t('confirmDelete')}
description={t('group.deleteWarning')} description={t('deleteWarning')}
onConfirm={async () => { onConfirm={async () => {
await batchDeleteNode({ await batchDeleteNode({
ids: rows.map((item) => item.id), ids: rows.map((item) => item.id),
}); });
toast.success(t('group.deleteSuccess')); toast.success(t('deleteSuccess'));
ref.current?.refresh(); ref.current?.refresh();
}} }}
cancelText={t('group.cancel')} cancelText={t('cancel')}
confirmText={t('group.confirm')} confirmText={t('confirm')}
/>, />,
]; ];
}, },
@@ -42,7 +42,7 @@ import { evaluateWithPrecision, unitConversion } from '@workspace/ui/utils';
import { CreditCard, Server, Settings } from 'lucide-react'; import { CreditCard, Server, Settings } from 'lucide-react';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { assign, shake } from 'radash'; import { assign, shake } from 'radash';
import { useEffect, useState } from 'react'; import { useCallback, useEffect, useRef, useState } from 'react';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import { toast } from 'sonner'; import { toast } from 'sonner';
import { z } from 'zod'; import { z } from 'zod';
@@ -81,6 +81,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
}: Readonly<SubscribeFormProps<T>>) { }: Readonly<SubscribeFormProps<T>>) {
const t = useTranslations('subscribe'); const t = useTranslations('subscribe');
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null);
const formSchema = z.object({ const formSchema = z.object({
name: z.string(), name: z.string(),
@@ -118,12 +119,111 @@ export default function SubscribeForm<T extends Record<string, any>>({
), ),
}); });
const debouncedCalculateDiscount = useCallback(
(values: any[], fieldName: string, lastChangedField?: string, changedIndex?: number) => {
if (updateTimeoutRef.current) {
clearTimeout(updateTimeoutRef.current);
}
updateTimeoutRef.current = setTimeout(() => {
const { unit_price } = form.getValues();
if (!unit_price || !values?.length) return;
let hasChanges = false;
const calculatedValues = values.map((item: any, index: number) => {
const result = { ...item };
if (changedIndex !== undefined && index !== changedIndex) {
return result;
}
const quantity = Number(item.quantity) || 0;
const discount = Number(item.discount) || 0;
const price = Number(item.price) || 0;
switch (lastChangedField) {
case 'quantity':
case 'discount':
if (quantity > 0 && discount > 0) {
const newPrice = evaluateWithPrecision(
`${unit_price} * ${quantity} * ${discount} / 100`,
);
if (Math.abs(newPrice - price) > 0.01) {
result.price = newPrice;
hasChanges = true;
}
}
break;
case 'price':
if (quantity > 0 && price > 0) {
const newDiscount = evaluateWithPrecision(
`${price} / ${quantity} / ${unit_price} * 100`,
);
if (Math.abs(newDiscount - discount) > 0.01) {
result.discount = Math.min(100, Math.max(0, newDiscount));
hasChanges = true;
}
} else if (discount > 0 && price > 0) {
const newQuantity = evaluateWithPrecision(
`${price} / ${unit_price} / ${discount} * 100`,
);
if (Math.abs(newQuantity - quantity) > 0.01 && newQuantity > 0) {
result.quantity = Math.max(1, Math.round(newQuantity));
hasChanges = true;
}
}
break;
default:
if (quantity > 0 && discount > 0 && price === 0) {
result.price = evaluateWithPrecision(
`${unit_price} * ${quantity} * ${discount} / 100`,
);
hasChanges = true;
} else if (quantity > 0 && price > 0 && discount === 0) {
const newDiscount = evaluateWithPrecision(
`${price} / ${quantity} / ${unit_price} * 100`,
);
result.discount = Math.min(100, Math.max(0, newDiscount));
hasChanges = true;
} else if (discount > 0 && price > 0 && quantity === 0) {
const newQuantity = evaluateWithPrecision(
`${price} / ${unit_price} / ${discount} * 100`,
);
if (newQuantity > 0) {
result.quantity = Math.max(1, Math.round(newQuantity));
hasChanges = true;
}
}
break;
}
return result;
});
if (hasChanges) {
form.setValue(fieldName, calculatedValues, { shouldDirty: true });
}
}, 300);
},
[form],
);
useEffect(() => { useEffect(() => {
form?.reset( form?.reset(
assign(defaultValues, shake(initialValues, (value) => value === null) as Record<string, any>), assign(defaultValues, shake(initialValues, (value) => value === null) as Record<string, any>),
); );
}, [form, initialValues]); }, [form, initialValues]);
useEffect(() => {
return () => {
if (updateTimeoutRef.current) {
clearTimeout(updateTimeoutRef.current);
}
};
}, []);
async function handleSubmit(data: { [x: string]: any }) { async function handleSubmit(data: { [x: string]: any }) {
const bool = await onSubmit(data as T); const bool = await onSubmit(data as T);
if (bool) setOpen(false); if (bool) setOpen(false);
@@ -158,31 +258,6 @@ export default function SubscribeForm<T extends Record<string, any>>({
const unit_time = form.watch('unit_time'); const unit_time = form.watch('unit_time');
const unit_price = form.watch('unit_price'); const unit_price = form.watch('unit_price');
const discounts = form.watch('discount');
useEffect(() => {
if (!discounts?.length || !unit_price) return;
const calculatedValues = discounts.map((item: any) => {
const result = { ...item };
if (item.quantity && item.discount) {
result.price = evaluateWithPrecision(
`${unit_price || 0} * ${item.quantity} * ${item.discount} / 100`,
);
} else if (item.quantity && item.price && !item.discount) {
result.discount = evaluateWithPrecision(
`${item.price} / ${item.quantity} / ${unit_price} * 100`,
);
}
return result;
});
if (JSON.stringify(calculatedValues) !== JSON.stringify(discounts)) {
form.setValue('discount', calculatedValues);
}
}, [unit_price, discounts, form]);
return ( return (
<Sheet open={open} onOpenChange={setOpen}> <Sheet open={open} onOpenChange={setOpen}>
@@ -581,8 +656,9 @@ export default function SubscribeForm<T extends Record<string, any>>({
{ {
name: 'discount', name: 'discount',
type: 'number', type: 'number',
min: 1, min: 0.01,
max: 100, max: 100,
step: 0.01,
placeholder: t('form.discountPercent'), placeholder: t('form.discountPercent'),
suffix: '%', suffix: '%',
}, },
@@ -590,51 +666,53 @@ export default function SubscribeForm<T extends Record<string, any>>({
name: 'price', name: 'price',
placeholder: t('form.discount_price'), placeholder: t('form.discount_price'),
type: 'number', type: 'number',
min: 0,
step: 0.01,
formatInput: (value) => unitConversion('centsToDollars', value), formatInput: (value) => unitConversion('centsToDollars', value),
formatOutput: (value) => unitConversion('dollarsToCents', value), formatOutput: (value) => unitConversion('dollarsToCents', value),
}, },
]} ]}
value={field.value} value={field.value}
onChange={(newValues) => { onChange={(
newValues: (API.SubscribeDiscount & { price?: number })[],
) => {
const oldValues = field.value || []; const oldValues = field.value || [];
const { unit_price } = form.getValues(); let lastChangedField: string | undefined;
let changedIndex: number | undefined;
const calculatedValues = newValues.map((newItem, index) => { for (
const oldItem = oldValues[index] || {}; let i = 0;
i < Math.max(newValues.length, oldValues.length);
i++
) {
const newItem = newValues[i] || {};
const oldItem = oldValues[i] || {};
const result = { ...newItem }; if ((newItem as any).quantity !== (oldItem as any).quantity) {
lastChangedField = 'quantity';
const quantityChanged = newItem.quantity !== oldItem.quantity; changedIndex = i;
const discountChanged = newItem.discount !== oldItem.discount; break;
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 ((newItem as any).discount !== (oldItem as any).discount) {
if ( lastChangedField = 'discount';
priceChanged && changedIndex = i;
!discountChanged && break;
newItem.price &&
newItem.quantity &&
unit_price
) {
result.discount = evaluateWithPrecision(
`${newItem.price} / ${newItem.quantity} / ${unit_price} * 100`,
);
} }
if ((newItem as any).price !== (oldItem as any).price) {
return result; lastChangedField = 'price';
}); changedIndex = i;
break;
form.setValue(field.name, calculatedValues); }
}
form.setValue(field.name, newValues, { shouldDirty: true });
if (newValues?.length > 0) {
debouncedCalculateDiscount(
newValues,
field.name,
lastChangedField,
changedIndex,
);
}
}} }}
/> />
</FormControl> </FormControl>
-4
View File
@@ -11,7 +11,6 @@
"delete": "Smazat", "delete": "Smazat",
"deleteSuccess": "Pravidlo bylo úspěšně smazáno", "deleteSuccess": "Pravidlo bylo úspěšně smazáno",
"deleteWarning": "Opravdu chcete smazat toto pravidlo? Tato akce není vratná.", "deleteWarning": "Opravdu chcete smazat toto pravidlo? Tato akce není vratná.",
"description": "Popis pravidla",
"downloadTemplate": "Stáhnout šablonu", "downloadTemplate": "Stáhnout šablonu",
"edit": "Upravit", "edit": "Upravit",
"editRule": "Upravit pravidlo", "editRule": "Upravit pravidlo",
@@ -22,7 +21,6 @@
"import": "Importovat", "import": "Importovat",
"importFailed": "Import se nezdařil", "importFailed": "Import se nezdařil",
"importSuccess": "Import byl úspěšný", "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", "importYamlDescription": "Importujte pravidla ze souboru YAML, systém automaticky vytvoří skupiny pravidel na základě názvů skupin politiky",
"importYamlRules": "Importovat YAML pravidla", "importYamlRules": "Importovat YAML pravidla",
"importing": "Importuji...", "importing": "Importuji...",
@@ -31,11 +29,9 @@
"noValidRules": "Nebyly nalezeny žádné platné pravidla", "noValidRules": "Nebyly nalezeny žádné platné pravidla",
"pleaseUploadFile": "Prosím, nahrajte soubor YAML", "pleaseUploadFile": "Prosím, nahrajte soubor YAML",
"preview": "Náhled", "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:", "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", "rulesLabel": "Obsah pravidla",
"searchRule": "Hledat název pravidla", "searchRule": "Hledat název pravidla",
"selectFile": "Vybrat soubor",
"selectTags": "Vybrat značky uzlu", "selectTags": "Vybrat značky uzlu",
"tags": "Značky uzlu", "tags": "Značky uzlu",
"tagsLabel": "Značky uzlu", "tagsLabel": "Značky uzlu",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Löschen", "delete": "Löschen",
"deleteSuccess": "Regel erfolgreich gelöscht", "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.", "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", "downloadTemplate": "Vorlage herunterladen",
"edit": "Bearbeiten", "edit": "Bearbeiten",
"editRule": "Regel bearbeiten", "editRule": "Regel bearbeiten",
@@ -22,7 +21,6 @@
"import": "Importieren", "import": "Importieren",
"importFailed": "Import fehlgeschlagen", "importFailed": "Import fehlgeschlagen",
"importSuccess": "Import erfolgreich", "importSuccess": "Import erfolgreich",
"importYaml": "YAML importieren",
"importYamlDescription": "Regeln aus einer YAML-Datei importieren, das System erstellt automatisch Regelgruppen basierend auf den Namen der Richtliniengruppen", "importYamlDescription": "Regeln aus einer YAML-Datei importieren, das System erstellt automatisch Regelgruppen basierend auf den Namen der Richtliniengruppen",
"importYamlRules": "YAML-Regeln importieren", "importYamlRules": "YAML-Regeln importieren",
"importing": "Importiere...", "importing": "Importiere...",
@@ -31,11 +29,9 @@
"noValidRules": "Keine gültigen Regeln gefunden", "noValidRules": "Keine gültigen Regeln gefunden",
"pleaseUploadFile": "Bitte laden Sie eine YAML-Datei hoch", "pleaseUploadFile": "Bitte laden Sie eine YAML-Datei hoch",
"preview": "Vorschau", "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:", "rulesFormat": "Regelformat: Regeltyp, Übereinstimmungsinhalt, [Richtlinie], wobei die Richtlinie optional ist.\nWenn keine Richtlinie angegeben ist, wird automatisch der aktuelle Regelgruppenname verwendet. Beispiele:",
"rulesLabel": "Regelinhalt", "rulesLabel": "Regelinhalt",
"searchRule": "Regelname suchen", "searchRule": "Regelname suchen",
"selectFile": "Datei auswählen",
"selectTags": "Knoten-Tags auswählen", "selectTags": "Knoten-Tags auswählen",
"tags": "Knoten-Tags", "tags": "Knoten-Tags",
"tagsLabel": "Knoten-Tags", "tagsLabel": "Knoten-Tags",
+6 -4
View File
@@ -8,10 +8,12 @@
"createRule": "Add Rule", "createRule": "Add Rule",
"createSuccess": "Rule created successfully", "createSuccess": "Rule created successfully",
"createdAt": "Created At", "createdAt": "Created At",
"default": "Default",
"defaultRule": "Default Rule",
"delete": "Delete", "delete": "Delete",
"deleteSuccess": "Rule deleted successfully", "deleteSuccess": "Rule deleted successfully",
"deleteWarning": "Are you sure you want to delete this rule? This action cannot be undone.", "deleteWarning": "Are you sure you want to delete this rule? This action cannot be undone.",
"description": "Rule Description", "direct": "Direct",
"downloadTemplate": "Download Template", "downloadTemplate": "Download Template",
"edit": "Edit", "edit": "Edit",
"editRule": "Edit Rule", "editRule": "Edit Rule",
@@ -22,7 +24,6 @@
"import": "Import", "import": "Import",
"importFailed": "Import failed", "importFailed": "Import failed",
"importSuccess": "Import successful", "importSuccess": "Import successful",
"importYaml": "Import YAML",
"importYamlDescription": "Import rules from YAML file, the system will automatically create rule groups based on policy group names", "importYamlDescription": "Import rules from YAML file, the system will automatically create rule groups based on policy group names",
"importYamlRules": "Import YAML Rules", "importYamlRules": "Import YAML Rules",
"importing": "Importing...", "importing": "Importing...",
@@ -31,13 +32,14 @@
"noValidRules": "No valid rules found", "noValidRules": "No valid rules found",
"pleaseUploadFile": "Please upload a YAML file", "pleaseUploadFile": "Please upload a YAML file",
"preview": "Preview", "preview": "Preview",
"rules": "Rule Content", "reject": "Reject",
"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:", "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", "rulesLabel": "Rule Content",
"searchRule": "Search rule name", "searchRule": "Search rule name",
"selectFile": "Select File",
"selectTags": "Select node tags", "selectTags": "Select node tags",
"selectType": "Select rule type",
"tags": "Node Tags", "tags": "Node Tags",
"tagsLabel": "Node Tags", "tagsLabel": "Node Tags",
"type": "Rule Type",
"updateSuccess": "Rule updated successfully" "updateSuccess": "Rule updated successfully"
} }
+2
View File
@@ -63,6 +63,7 @@
"edit": "Edit", "edit": "Edit",
"editNode": "Edit Node", "editNode": "Edit Node",
"enable": "Enable", "enable": "Enable",
"id": "ID",
"form": { "form": {
"allowInsecure": "Allow Insecure", "allowInsecure": "Allow Insecure",
"cancel": "Cancel", "cancel": "Cancel",
@@ -141,6 +142,7 @@
"name": "Name", "name": "Name",
"node": "Node", "node": "Node",
"nodeGroup": "Node Group", "nodeGroup": "Node Group",
"noData": "--",
"normal": "Normal", "normal": "Normal",
"onlineCount": "Online users", "onlineCount": "Online users",
"onlineUsers": "Online Users", "onlineUsers": "Online Users",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Eliminar", "delete": "Eliminar",
"deleteSuccess": "Regla eliminada con éxito", "deleteSuccess": "Regla eliminada con éxito",
"deleteWarning": "¿Está seguro de que desea eliminar esta regla? Esta acción no se puede deshacer.", "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", "downloadTemplate": "Descargar Plantilla",
"edit": "Editar", "edit": "Editar",
"editRule": "Editar Regla", "editRule": "Editar Regla",
@@ -22,7 +21,6 @@
"import": "Importar", "import": "Importar",
"importFailed": "Importación fallida", "importFailed": "Importación fallida",
"importSuccess": "Importación exitosa", "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", "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", "importYamlRules": "Importar Reglas YAML",
"importing": "Importando...", "importing": "Importando...",
@@ -31,11 +29,9 @@
"noValidRules": "No se encontraron reglas válidas", "noValidRules": "No se encontraron reglas válidas",
"pleaseUploadFile": "Por favor, suba un archivo YAML", "pleaseUploadFile": "Por favor, suba un archivo YAML",
"preview": "Vista Previa", "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:", "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", "rulesLabel": "Contenido de la Regla",
"searchRule": "Buscar nombre de regla", "searchRule": "Buscar nombre de regla",
"selectFile": "Seleccionar Archivo",
"selectTags": "Seleccionar etiquetas de nodo", "selectTags": "Seleccionar etiquetas de nodo",
"tags": "Etiquetas de Nodo", "tags": "Etiquetas de Nodo",
"tagsLabel": "Etiquetas de Nodo", "tagsLabel": "Etiquetas de Nodo",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Eliminar", "delete": "Eliminar",
"deleteSuccess": "Regla eliminada con éxito", "deleteSuccess": "Regla eliminada con éxito",
"deleteWarning": "¿Está seguro de que desea eliminar esta regla? Esta acción no se puede deshacer.", "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", "downloadTemplate": "Descargar Plantilla",
"edit": "Editar", "edit": "Editar",
"editRule": "Editar Regla", "editRule": "Editar Regla",
@@ -22,7 +21,6 @@
"import": "Importar", "import": "Importar",
"importFailed": "Importación fallida", "importFailed": "Importación fallida",
"importSuccess": "Importación exitosa", "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", "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", "importYamlRules": "Importar Reglas YAML",
"importing": "Importando...", "importing": "Importando...",
@@ -31,11 +29,9 @@
"noValidRules": "No se encontraron reglas válidas", "noValidRules": "No se encontraron reglas válidas",
"pleaseUploadFile": "Por favor, suba un archivo YAML", "pleaseUploadFile": "Por favor, suba un archivo YAML",
"preview": "Vista Previa", "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:", "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", "rulesLabel": "Contenido de la Regla",
"searchRule": "Buscar nombre de regla", "searchRule": "Buscar nombre de regla",
"selectFile": "Seleccionar Archivo",
"selectTags": "Seleccionar etiquetas de nodo", "selectTags": "Seleccionar etiquetas de nodo",
"tags": "Etiquetas de Nodo", "tags": "Etiquetas de Nodo",
"tagsLabel": "Etiquetas de Nodo", "tagsLabel": "Etiquetas de Nodo",
-4
View File
@@ -11,7 +11,6 @@
"delete": "حذف", "delete": "حذف",
"deleteSuccess": "قانون با موفقیت حذف شد", "deleteSuccess": "قانون با موفقیت حذف شد",
"deleteWarning": "آیا مطمئن هستید که می‌خواهید این قانون را حذف کنید؟ این عمل قابل بازگشت نیست.", "deleteWarning": "آیا مطمئن هستید که می‌خواهید این قانون را حذف کنید؟ این عمل قابل بازگشت نیست.",
"description": "توضیحات قانون",
"downloadTemplate": "دانلود الگو", "downloadTemplate": "دانلود الگو",
"edit": "ویرایش", "edit": "ویرایش",
"editRule": "ویرایش قانون", "editRule": "ویرایش قانون",
@@ -22,7 +21,6 @@
"import": "وارد کردن", "import": "وارد کردن",
"importFailed": "وارد کردن ناموفق بود", "importFailed": "وارد کردن ناموفق بود",
"importSuccess": "وارد کردن با موفقیت انجام شد", "importSuccess": "وارد کردن با موفقیت انجام شد",
"importYaml": "وارد کردن YAML",
"importYamlDescription": "وارد کردن قوانین از فایل YAML، سیستم به طور خودکار گروه‌های قانونی را بر اساس نام‌های گروه سیاست ایجاد خواهد کرد", "importYamlDescription": "وارد کردن قوانین از فایل YAML، سیستم به طور خودکار گروه‌های قانونی را بر اساس نام‌های گروه سیاست ایجاد خواهد کرد",
"importYamlRules": "وارد کردن قوانین YAML", "importYamlRules": "وارد کردن قوانین YAML",
"importing": "در حال وارد کردن...", "importing": "در حال وارد کردن...",
@@ -31,11 +29,9 @@
"noValidRules": "هیچ قانونی یافت نشد", "noValidRules": "هیچ قانونی یافت نشد",
"pleaseUploadFile": "لطفاً یک فایل YAML بارگذاری کنید", "pleaseUploadFile": "لطفاً یک فایل YAML بارگذاری کنید",
"preview": "پیش‌نمایش", "preview": "پیش‌نمایش",
"rules": "محتوای قانون",
"rulesFormat": "فرمت قانون: نوع قانون، محتوای تطابق، [سیاست]، که سیاست اختیاری است.\nاگر سیاست مشخص نشود، نام گروه قانونی فعلی به طور خودکار استفاده خواهد شد. مثال‌ها:", "rulesFormat": "فرمت قانون: نوع قانون، محتوای تطابق، [سیاست]، که سیاست اختیاری است.\nاگر سیاست مشخص نشود، نام گروه قانونی فعلی به طور خودکار استفاده خواهد شد. مثال‌ها:",
"rulesLabel": "محتوای قانون", "rulesLabel": "محتوای قانون",
"searchRule": "جستجوی نام قانون", "searchRule": "جستجوی نام قانون",
"selectFile": "انتخاب فایل",
"selectTags": "انتخاب برچسب‌های گره", "selectTags": "انتخاب برچسب‌های گره",
"tags": "برچسب‌های گره", "tags": "برچسب‌های گره",
"tagsLabel": "برچسب‌های گره", "tagsLabel": "برچسب‌های گره",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Poista", "delete": "Poista",
"deleteSuccess": "Sääntö poistettiin onnistuneesti", "deleteSuccess": "Sääntö poistettiin onnistuneesti",
"deleteWarning": "Oletko varma, että haluat poistaa tämän säännön? Tätä toimintoa ei voi peruuttaa.", "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", "downloadTemplate": "Lataa malli",
"edit": "Muokkaa", "edit": "Muokkaa",
"editRule": "Muokkaa sääntöä", "editRule": "Muokkaa sääntöä",
@@ -22,7 +21,6 @@
"import": "Tuoda", "import": "Tuoda",
"importFailed": "Tuonti epäonnistui", "importFailed": "Tuonti epäonnistui",
"importSuccess": "Tuonti 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", "importYamlDescription": "Tuo sääntöjä YAML-tiedostosta, järjestelmä luo automaattisesti sääntöryhmiä politiikkaryhmän nimien perusteella",
"importYamlRules": "Tuo YAML-säännöt", "importYamlRules": "Tuo YAML-säännöt",
"importing": "Tuodaan...", "importing": "Tuodaan...",
@@ -31,11 +29,9 @@
"noValidRules": "Ei voimassa olevia sääntöjä löytynyt", "noValidRules": "Ei voimassa olevia sääntöjä löytynyt",
"pleaseUploadFile": "Lataa YAML-tiedosto", "pleaseUploadFile": "Lataa YAML-tiedosto",
"preview": "Esikatselu", "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ä:", "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ö", "rulesLabel": "Säännön sisältö",
"searchRule": "Etsi säännön nimeä", "searchRule": "Etsi säännön nimeä",
"selectFile": "Valitse tiedosto",
"selectTags": "Valitse solmun tunnisteet", "selectTags": "Valitse solmun tunnisteet",
"tags": "Solmun tunnisteet", "tags": "Solmun tunnisteet",
"tagsLabel": "Solmun tunnisteet", "tagsLabel": "Solmun tunnisteet",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Supprimer", "delete": "Supprimer",
"deleteSuccess": "Règle supprimée avec succès", "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.", "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", "downloadTemplate": "Télécharger le modèle",
"edit": "Modifier", "edit": "Modifier",
"editRule": "Modifier la règle", "editRule": "Modifier la règle",
@@ -22,7 +21,6 @@
"import": "Importer", "import": "Importer",
"importFailed": "Échec de l'importation", "importFailed": "Échec de l'importation",
"importSuccess": "Importation réussie", "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", "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", "importYamlRules": "Importer des règles YAML",
"importing": "Importation en cours...", "importing": "Importation en cours...",
@@ -31,11 +29,9 @@
"noValidRules": "Aucune règle valide trouvée", "noValidRules": "Aucune règle valide trouvée",
"pleaseUploadFile": "Veuillez télécharger un fichier YAML", "pleaseUploadFile": "Veuillez télécharger un fichier YAML",
"preview": "Aperçu", "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 :", "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", "rulesLabel": "Contenu de la règle",
"searchRule": "Rechercher le nom 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", "selectTags": "Sélectionner des balises de nœud",
"tags": "Balises de nœud", "tags": "Balises de nœud",
"tagsLabel": "Balises de nœud", "tagsLabel": "Balises de nœud",
-4
View File
@@ -11,7 +11,6 @@
"delete": "हटाएं", "delete": "हटाएं",
"deleteSuccess": "नियम सफलतापूर्वक हटाया गया", "deleteSuccess": "नियम सफलतापूर्वक हटाया गया",
"deleteWarning": "क्या आप वाकई इस नियम को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।", "deleteWarning": "क्या आप वाकई इस नियम को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।",
"description": "नियम विवरण",
"downloadTemplate": "टेम्पलेट डाउनलोड करें", "downloadTemplate": "टेम्पलेट डाउनलोड करें",
"edit": "संपादित करें", "edit": "संपादित करें",
"editRule": "नियम संपादित करें", "editRule": "नियम संपादित करें",
@@ -22,7 +21,6 @@
"import": "आयात करें", "import": "आयात करें",
"importFailed": "आयात विफल", "importFailed": "आयात विफल",
"importSuccess": "आयात सफल", "importSuccess": "आयात सफल",
"importYaml": "YAML आयात करें",
"importYamlDescription": "YAML फ़ाइल से नियम आयात करें, प्रणाली स्वचालित रूप से नीति समूह नामों के आधार पर नियम समूह बनाएगी", "importYamlDescription": "YAML फ़ाइल से नियम आयात करें, प्रणाली स्वचालित रूप से नीति समूह नामों के आधार पर नियम समूह बनाएगी",
"importYamlRules": "YAML नियम आयात करें", "importYamlRules": "YAML नियम आयात करें",
"importing": "आयात कर रहा है...", "importing": "आयात कर रहा है...",
@@ -31,11 +29,9 @@
"noValidRules": "कोई मान्य नियम नहीं मिला", "noValidRules": "कोई मान्य नियम नहीं मिला",
"pleaseUploadFile": "कृपया एक YAML फ़ाइल अपलोड करें", "pleaseUploadFile": "कृपया एक YAML फ़ाइल अपलोड करें",
"preview": "पूर्वावलोकन", "preview": "पूर्वावलोकन",
"rules": "नियम सामग्री",
"rulesFormat": "नियम प्रारूप: नियम प्रकार, मिलान सामग्री, [नीति], जहाँ नीति वैकल्पिक है।\nयदि नीति निर्दिष्ट नहीं की गई है, तो वर्तमान नियम समूह का नाम स्वचालित रूप से उपयोग किया जाएगा। उदाहरण:", "rulesFormat": "नियम प्रारूप: नियम प्रकार, मिलान सामग्री, [नीति], जहाँ नीति वैकल्पिक है।\nयदि नीति निर्दिष्ट नहीं की गई है, तो वर्तमान नियम समूह का नाम स्वचालित रूप से उपयोग किया जाएगा। उदाहरण:",
"rulesLabel": "नियम सामग्री", "rulesLabel": "नियम सामग्री",
"searchRule": "नियम नाम खोजें", "searchRule": "नियम नाम खोजें",
"selectFile": "फ़ाइल चुनें",
"selectTags": "नोड टैग चुनें", "selectTags": "नोड टैग चुनें",
"tags": "नोड टैग", "tags": "नोड टैग",
"tagsLabel": "नोड टैग", "tagsLabel": "नोड टैग",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Törlés", "delete": "Törlés",
"deleteSuccess": "A szabály sikeresen törölve", "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.", "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", "downloadTemplate": "Sablon letöltése",
"edit": "Szerkesztés", "edit": "Szerkesztés",
"editRule": "Szabály szerkesztése", "editRule": "Szabály szerkesztése",
@@ -22,7 +21,6 @@
"import": "Importálás", "import": "Importálás",
"importFailed": "Importálás sikertelen", "importFailed": "Importálás sikertelen",
"importSuccess": "Importálás sikeres", "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", "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", "importYamlRules": "YAML szabályok importálása",
"importing": "Importálás...", "importing": "Importálás...",
@@ -31,11 +29,9 @@
"noValidRules": "Nincsenek érvényes szabályok", "noValidRules": "Nincsenek érvényes szabályok",
"pleaseUploadFile": "Kérjük, töltsön fel egy YAML fájlt", "pleaseUploadFile": "Kérjük, töltsön fel egy YAML fájlt",
"preview": "Előnézet", "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:", "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", "rulesLabel": "Szabály tartalom",
"searchRule": "Szabály név keresése", "searchRule": "Szabály név keresése",
"selectFile": "Fájl kiválasztása",
"selectTags": "Válassza ki a csomópont címkéket", "selectTags": "Válassza ki a csomópont címkéket",
"tags": "Csomópont címkék", "tags": "Csomópont címkék",
"tagsLabel": "Csomópont címkék", "tagsLabel": "Csomópont címkék",
+3 -4
View File
@@ -8,10 +8,10 @@
"createRule": "ルールを追加", "createRule": "ルールを追加",
"createSuccess": "ルールが正常に作成されました", "createSuccess": "ルールが正常に作成されました",
"createdAt": "作成日時", "createdAt": "作成日時",
"defaultRule": "デフォルトルール",
"delete": "削除", "delete": "削除",
"deleteSuccess": "ルールが正常に削除されました", "deleteSuccess": "ルールが正常に削除されました",
"deleteWarning": "このルールを削除してもよろしいですか?この操作は元に戻せません。", "deleteWarning": "このルールを削除してもよろしいですか?この操作は元に戻せません。",
"description": "ルールの説明",
"downloadTemplate": "テンプレートをダウンロード", "downloadTemplate": "テンプレートをダウンロード",
"edit": "編集", "edit": "編集",
"editRule": "ルールを編集", "editRule": "ルールを編集",
@@ -22,7 +22,6 @@
"import": "インポート", "import": "インポート",
"importFailed": "インポートに失敗しました", "importFailed": "インポートに失敗しました",
"importSuccess": "インポートが成功しました", "importSuccess": "インポートが成功しました",
"importYaml": "YAMLをインポート",
"importYamlDescription": "YAMLファイルからルールをインポートします。システムはポリシーグループ名に基づいてルールグループを自動的に作成します。", "importYamlDescription": "YAMLファイルからルールをインポートします。システムはポリシーグループ名に基づいてルールグループを自動的に作成します。",
"importYamlRules": "YAMLルールをインポート", "importYamlRules": "YAMLルールをインポート",
"importing": "インポート中...", "importing": "インポート中...",
@@ -31,13 +30,13 @@
"noValidRules": "有効なルールが見つかりません", "noValidRules": "有効なルールが見つかりません",
"pleaseUploadFile": "YAMLファイルをアップロードしてください", "pleaseUploadFile": "YAMLファイルをアップロードしてください",
"preview": "プレビュー", "preview": "プレビュー",
"rules": "ルールの内容",
"rulesFormat": "ルール形式: ルールタイプ, マッチ内容, [ポリシー](ポリシーはオプションです)。\nポリシーが指定されていない場合、現在のルールグループ名が自動的に使用されます。例:", "rulesFormat": "ルール形式: ルールタイプ, マッチ内容, [ポリシー](ポリシーはオプションです)。\nポリシーが指定されていない場合、現在のルールグループ名が自動的に使用されます。例:",
"rulesLabel": "ルールの内容", "rulesLabel": "ルールの内容",
"searchRule": "ルール名を検索", "searchRule": "ルール名を検索",
"selectFile": "ファイルを選択",
"selectTags": "ノードタグを選択", "selectTags": "ノードタグを選択",
"selectType": "ルールタイプを選択",
"tags": "ノードタグ", "tags": "ノードタグ",
"tagsLabel": "ノードタグ", "tagsLabel": "ノードタグ",
"type": "ルールタイプ",
"updateSuccess": "ルールが正常に更新されました" "updateSuccess": "ルールが正常に更新されました"
} }
-4
View File
@@ -11,7 +11,6 @@
"delete": "삭제", "delete": "삭제",
"deleteSuccess": "규칙이 성공적으로 삭제되었습니다", "deleteSuccess": "규칙이 성공적으로 삭제되었습니다",
"deleteWarning": "이 규칙을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", "deleteWarning": "이 규칙을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
"description": "규칙 설명",
"downloadTemplate": "템플릿 다운로드", "downloadTemplate": "템플릿 다운로드",
"edit": "편집", "edit": "편집",
"editRule": "규칙 편집", "editRule": "규칙 편집",
@@ -22,7 +21,6 @@
"import": "가져오기", "import": "가져오기",
"importFailed": "가져오기에 실패했습니다", "importFailed": "가져오기에 실패했습니다",
"importSuccess": "가져오기가 성공적으로 완료되었습니다", "importSuccess": "가져오기가 성공적으로 완료되었습니다",
"importYaml": "YAML 가져오기",
"importYamlDescription": "YAML 파일에서 규칙을 가져오며, 시스템이 정책 그룹 이름에 따라 규칙 그룹을 자동으로 생성합니다", "importYamlDescription": "YAML 파일에서 규칙을 가져오며, 시스템이 정책 그룹 이름에 따라 규칙 그룹을 자동으로 생성합니다",
"importYamlRules": "YAML 규칙 가져오기", "importYamlRules": "YAML 규칙 가져오기",
"importing": "가져오는 중...", "importing": "가져오는 중...",
@@ -31,11 +29,9 @@
"noValidRules": "유효한 규칙이 없습니다", "noValidRules": "유효한 규칙이 없습니다",
"pleaseUploadFile": "YAML 파일을 업로드해 주세요", "pleaseUploadFile": "YAML 파일을 업로드해 주세요",
"preview": "미리보기", "preview": "미리보기",
"rules": "규칙 내용",
"rulesFormat": "규칙 형식: 규칙 유형, 일치하는 내용, [정책], 여기서 정책은 선택 사항입니다.\n정책이 지정되지 않으면 현재 규칙 그룹 이름이 자동으로 사용됩니다. 예시:", "rulesFormat": "규칙 형식: 규칙 유형, 일치하는 내용, [정책], 여기서 정책은 선택 사항입니다.\n정책이 지정되지 않으면 현재 규칙 그룹 이름이 자동으로 사용됩니다. 예시:",
"rulesLabel": "규칙 내용", "rulesLabel": "규칙 내용",
"searchRule": "규칙 이름 검색", "searchRule": "규칙 이름 검색",
"selectFile": "파일 선택",
"selectTags": "노드 태그 선택", "selectTags": "노드 태그 선택",
"tags": "노드 태그", "tags": "노드 태그",
"tagsLabel": "노드 태그", "tagsLabel": "노드 태그",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Slett", "delete": "Slett",
"deleteSuccess": "Regel slettet med suksess", "deleteSuccess": "Regel slettet med suksess",
"deleteWarning": "Er du sikker på at du vil slette denne regelen? Denne handlingen kan ikke angres.", "deleteWarning": "Er du sikker på at du vil slette denne regelen? Denne handlingen kan ikke angres.",
"description": "Regelbeskrivelse",
"downloadTemplate": "Last ned mal", "downloadTemplate": "Last ned mal",
"edit": "Rediger", "edit": "Rediger",
"editRule": "Rediger regel", "editRule": "Rediger regel",
@@ -22,7 +21,6 @@
"import": "Importer", "import": "Importer",
"importFailed": "Import mislyktes", "importFailed": "Import mislyktes",
"importSuccess": "Import vellykket", "importSuccess": "Import vellykket",
"importYaml": "Importer YAML",
"importYamlDescription": "Importer regler fra YAML-fil, systemet vil automatisk opprette regelgrupper basert på policygruppens navn", "importYamlDescription": "Importer regler fra YAML-fil, systemet vil automatisk opprette regelgrupper basert på policygruppens navn",
"importYamlRules": "Importer YAML-regler", "importYamlRules": "Importer YAML-regler",
"importing": "Importer...", "importing": "Importer...",
@@ -31,11 +29,9 @@
"noValidRules": "Ingen gyldige regler funnet", "noValidRules": "Ingen gyldige regler funnet",
"pleaseUploadFile": "Vennligst last opp en YAML-fil", "pleaseUploadFile": "Vennligst last opp en YAML-fil",
"preview": "Forhåndsvisning", "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:", "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", "rulesLabel": "Regelinnhold",
"searchRule": "Søk etter regelnavn", "searchRule": "Søk etter regelnavn",
"selectFile": "Velg fil",
"selectTags": "Velg nodetagger", "selectTags": "Velg nodetagger",
"tags": "Nodetagger", "tags": "Nodetagger",
"tagsLabel": "Nodetagger", "tagsLabel": "Nodetagger",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Usuń", "delete": "Usuń",
"deleteSuccess": "Reguła została pomyślnie usunięta", "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.", "deleteWarning": "Czy na pewno chcesz usunąć tę regułę? Ta akcja nie może być cofnięta.",
"description": "Opis Reguły",
"downloadTemplate": "Pobierz Szablon", "downloadTemplate": "Pobierz Szablon",
"edit": "Edytuj", "edit": "Edytuj",
"editRule": "Edytuj Regułę", "editRule": "Edytuj Regułę",
@@ -22,7 +21,6 @@
"import": "Importuj", "import": "Importuj",
"importFailed": "Import nie powiódł się", "importFailed": "Import nie powiódł się",
"importSuccess": "Import zakończony sukcesem", "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", "importYamlDescription": "Importuj reguły z pliku YAML, system automatycznie utworzy grupy reguł na podstawie nazw grup polityk",
"importYamlRules": "Importuj Reguły YAML", "importYamlRules": "Importuj Reguły YAML",
"importing": "Importowanie...", "importing": "Importowanie...",
@@ -31,11 +29,9 @@
"noValidRules": "Nie znaleziono prawidłowych reguł", "noValidRules": "Nie znaleziono prawidłowych reguł",
"pleaseUploadFile": "Proszę przesłać plik YAML", "pleaseUploadFile": "Proszę przesłać plik YAML",
"preview": "Podgląd", "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:", "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", "rulesLabel": "Treść Reguły",
"searchRule": "Szukaj nazwy reguły", "searchRule": "Szukaj nazwy reguły",
"selectFile": "Wybierz Plik",
"selectTags": "Wybierz tagi węzła", "selectTags": "Wybierz tagi węzła",
"tags": "Tagi Węzła", "tags": "Tagi Węzła",
"tagsLabel": "Tagi Węzła", "tagsLabel": "Tagi Węzła",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Excluir", "delete": "Excluir",
"deleteSuccess": "Regra excluída com sucesso", "deleteSuccess": "Regra excluída com sucesso",
"deleteWarning": "Você tem certeza de que deseja excluir esta regra? Esta ação não pode ser desfeita.", "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", "downloadTemplate": "Baixar Modelo",
"edit": "Editar", "edit": "Editar",
"editRule": "Editar Regra", "editRule": "Editar Regra",
@@ -22,7 +21,6 @@
"import": "Importar", "import": "Importar",
"importFailed": "Falha na importação", "importFailed": "Falha na importação",
"importSuccess": "Importação bem-sucedida", "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", "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", "importYamlRules": "Importar Regras YAML",
"importing": "Importando...", "importing": "Importando...",
@@ -31,11 +29,9 @@
"noValidRules": "Nenhuma regra válida encontrada", "noValidRules": "Nenhuma regra válida encontrada",
"pleaseUploadFile": "Por favor, faça upload de um arquivo YAML", "pleaseUploadFile": "Por favor, faça upload de um arquivo YAML",
"preview": "Pré-visualização", "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:", "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", "rulesLabel": "Conteúdo da Regra",
"searchRule": "Pesquisar nome da regra", "searchRule": "Pesquisar nome da regra",
"selectFile": "Selecionar Arquivo",
"selectTags": "Selecionar tags de nó", "selectTags": "Selecionar tags de nó",
"tags": "Tags de Nó", "tags": "Tags de Nó",
"tagsLabel": "Tags de Nó", "tagsLabel": "Tags de Nó",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Șterge", "delete": "Șterge",
"deleteSuccess": "Regula a fost ștersă cu succes", "deleteSuccess": "Regula a fost ștersă cu succes",
"deleteWarning": "Ești sigur că vrei să ștergi această regulă? Această acțiune nu poate fi anulată.", "deleteWarning": "Ești sigur că vrei să ștergi această regulă? Această acțiune nu poate fi anulată.",
"description": "Descrierea Regulii",
"downloadTemplate": "Descarcă Șablon", "downloadTemplate": "Descarcă Șablon",
"edit": "Editează", "edit": "Editează",
"editRule": "Editează Regulă", "editRule": "Editează Regulă",
@@ -22,7 +21,6 @@
"import": "Importă", "import": "Importă",
"importFailed": "Importul a eșuat", "importFailed": "Importul a eșuat",
"importSuccess": "Importul a fost realizat cu succes", "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", "importYamlDescription": "Importă reguli din fișier YAML, sistemul va crea automat grupuri de reguli pe baza numelui grupului de politici",
"importYamlRules": "Importă Reguli YAML", "importYamlRules": "Importă Reguli YAML",
"importing": "Se importă...", "importing": "Se importă...",
@@ -31,11 +29,9 @@
"noValidRules": "Nu au fost găsite reguli valide", "noValidRules": "Nu au fost găsite reguli valide",
"pleaseUploadFile": "Te rugăm să încarci un fișier YAML", "pleaseUploadFile": "Te rugăm să încarci un fișier YAML",
"preview": "Previzualizare", "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:", "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", "rulesLabel": "Conținutul Regulii",
"searchRule": "Caută numele regulii", "searchRule": "Caută numele regulii",
"selectFile": "Selectează Fișier",
"selectTags": "Selectează etichetele nodului", "selectTags": "Selectează etichetele nodului",
"tags": "Etichete Nod", "tags": "Etichete Nod",
"tagsLabel": "Etichete Nod", "tagsLabel": "Etichete Nod",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Удалить", "delete": "Удалить",
"deleteSuccess": "Правило успешно удалено", "deleteSuccess": "Правило успешно удалено",
"deleteWarning": "Вы уверены, что хотите удалить это правило? Это действие нельзя отменить.", "deleteWarning": "Вы уверены, что хотите удалить это правило? Это действие нельзя отменить.",
"description": "Описание правила",
"downloadTemplate": "Скачать шаблон", "downloadTemplate": "Скачать шаблон",
"edit": "Редактировать", "edit": "Редактировать",
"editRule": "Редактировать правило", "editRule": "Редактировать правило",
@@ -22,7 +21,6 @@
"import": "Импортировать", "import": "Импортировать",
"importFailed": "Ошибка импорта", "importFailed": "Ошибка импорта",
"importSuccess": "Импорт успешен", "importSuccess": "Импорт успешен",
"importYaml": "Импортировать YAML",
"importYamlDescription": "Импорт правил из файла YAML, система автоматически создаст группы правил на основе имен групп политик", "importYamlDescription": "Импорт правил из файла YAML, система автоматически создаст группы правил на основе имен групп политик",
"importYamlRules": "Импортировать правила YAML", "importYamlRules": "Импортировать правила YAML",
"importing": "Импортирую...", "importing": "Импортирую...",
@@ -31,11 +29,9 @@
"noValidRules": "Не найдено действительных правил", "noValidRules": "Не найдено действительных правил",
"pleaseUploadFile": "Пожалуйста, загрузите файл YAML", "pleaseUploadFile": "Пожалуйста, загрузите файл YAML",
"preview": "Предварительный просмотр", "preview": "Предварительный просмотр",
"rules": "Содержание правила",
"rulesFormat": "Формат правила: тип правила, содержание совпадения, [политика], где политика является необязательной.\nЕсли политика не указана, будет автоматически использовано текущее имя группы правил. Примеры:", "rulesFormat": "Формат правила: тип правила, содержание совпадения, [политика], где политика является необязательной.\nЕсли политика не указана, будет автоматически использовано текущее имя группы правил. Примеры:",
"rulesLabel": "Содержание правила", "rulesLabel": "Содержание правила",
"searchRule": "Поиск имени правила", "searchRule": "Поиск имени правила",
"selectFile": "Выбрать файл",
"selectTags": "Выбрать теги узлов", "selectTags": "Выбрать теги узлов",
"tags": "Теги узлов", "tags": "Теги узлов",
"tagsLabel": "Теги узлов", "tagsLabel": "Теги узлов",
-4
View File
@@ -11,7 +11,6 @@
"delete": "ลบ", "delete": "ลบ",
"deleteSuccess": "ลบกฎเรียบร้อยแล้ว", "deleteSuccess": "ลบกฎเรียบร้อยแล้ว",
"deleteWarning": "คุณแน่ใจหรือว่าต้องการลบกฎนี้? การกระทำนี้ไม่สามารถย้อนกลับได้.", "deleteWarning": "คุณแน่ใจหรือว่าต้องการลบกฎนี้? การกระทำนี้ไม่สามารถย้อนกลับได้.",
"description": "คำอธิบายกฎ",
"downloadTemplate": "ดาวน์โหลดเทมเพลต", "downloadTemplate": "ดาวน์โหลดเทมเพลต",
"edit": "แก้ไข", "edit": "แก้ไข",
"editRule": "แก้ไขกฎ", "editRule": "แก้ไขกฎ",
@@ -22,7 +21,6 @@
"import": "นำเข้า", "import": "นำเข้า",
"importFailed": "นำเข้าล้มเหลว", "importFailed": "นำเข้าล้มเหลว",
"importSuccess": "นำเข้าสำเร็จ", "importSuccess": "นำเข้าสำเร็จ",
"importYaml": "นำเข้า YAML",
"importYamlDescription": "นำเข้ากฎจากไฟล์ YAML, ระบบจะสร้างกลุ่มกฎโดยอัตโนมัติตามชื่อกลุ่มนโยบาย", "importYamlDescription": "นำเข้ากฎจากไฟล์ YAML, ระบบจะสร้างกลุ่มกฎโดยอัตโนมัติตามชื่อกลุ่มนโยบาย",
"importYamlRules": "นำเข้ากฎ YAML", "importYamlRules": "นำเข้ากฎ YAML",
"importing": "กำลังนำเข้า...", "importing": "กำลังนำเข้า...",
@@ -31,11 +29,9 @@
"noValidRules": "ไม่พบกฎที่ถูกต้อง", "noValidRules": "ไม่พบกฎที่ถูกต้อง",
"pleaseUploadFile": "กรุณาอัปโหลดไฟล์ YAML", "pleaseUploadFile": "กรุณาอัปโหลดไฟล์ YAML",
"preview": "ตัวอย่าง", "preview": "ตัวอย่าง",
"rules": "เนื้อหากฎ",
"rulesFormat": "รูปแบบกฎ: ประเภทกฎ, เนื้อหาที่ตรงกัน, [นโยบาย], โดยที่นโยบายเป็นทางเลือก.\nหากไม่ได้ระบุนโยบาย, ชื่อกลุ่มกฎปัจจุบันจะถูกใช้โดยอัตโนมัติ. ตัวอย่าง:", "rulesFormat": "รูปแบบกฎ: ประเภทกฎ, เนื้อหาที่ตรงกัน, [นโยบาย], โดยที่นโยบายเป็นทางเลือก.\nหากไม่ได้ระบุนโยบาย, ชื่อกลุ่มกฎปัจจุบันจะถูกใช้โดยอัตโนมัติ. ตัวอย่าง:",
"rulesLabel": "เนื้อหากฎ", "rulesLabel": "เนื้อหากฎ",
"searchRule": "ค้นหาชื่อกฎ", "searchRule": "ค้นหาชื่อกฎ",
"selectFile": "เลือกไฟล์",
"selectTags": "เลือกแท็กโหนด", "selectTags": "เลือกแท็กโหนด",
"tags": "แท็กโหนด", "tags": "แท็กโหนด",
"tagsLabel": "แท็กโหนด", "tagsLabel": "แท็กโหนด",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Sil", "delete": "Sil",
"deleteSuccess": "Kural başarıyla silindi", "deleteSuccess": "Kural başarıyla silindi",
"deleteWarning": "Bu kuralı silmek istediğinize emin misiniz? Bu işlem geri alınamaz.", "deleteWarning": "Bu kuralı silmek istediğinize emin misiniz? Bu işlem geri alınamaz.",
"description": "Kural Açıklaması",
"downloadTemplate": "Şablonu İndir", "downloadTemplate": "Şablonu İndir",
"edit": "Düzenle", "edit": "Düzenle",
"editRule": "Kuralı Düzenle", "editRule": "Kuralı Düzenle",
@@ -22,7 +21,6 @@
"import": "İçe Aktar", "import": "İçe Aktar",
"importFailed": "İçe aktarma başarısız oldu", "importFailed": "İçe aktarma başarısız oldu",
"importSuccess": "İçe aktarma başarılı", "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", "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", "importYamlRules": "YAML Kurallarını İçe Aktar",
"importing": "İçe aktarılıyor...", "importing": "İçe aktarılıyor...",
@@ -31,11 +29,9 @@
"noValidRules": "Geçerli kural bulunamadı", "noValidRules": "Geçerli kural bulunamadı",
"pleaseUploadFile": "Lütfen bir YAML dosyası yükleyin", "pleaseUploadFile": "Lütfen bir YAML dosyası yükleyin",
"preview": "Önizleme", "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:", "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", "rulesLabel": "Kural İçeriği",
"searchRule": "Kural adını ara", "searchRule": "Kural adını ara",
"selectFile": "Dosya Seç",
"selectTags": "Düğüm etiketlerini seç", "selectTags": "Düğüm etiketlerini seç",
"tags": "Düğüm Etiketleri", "tags": "Düğüm Etiketleri",
"tagsLabel": "Düğüm Etiketleri", "tagsLabel": "Düğüm Etiketleri",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Видалити", "delete": "Видалити",
"deleteSuccess": "Правило успішно видалено", "deleteSuccess": "Правило успішно видалено",
"deleteWarning": "Ви впевнені, що хочете видалити це правило? Цю дію не можна скасувати.", "deleteWarning": "Ви впевнені, що хочете видалити це правило? Цю дію не можна скасувати.",
"description": "Опис правила",
"downloadTemplate": "Завантажити шаблон", "downloadTemplate": "Завантажити шаблон",
"edit": "Редагувати", "edit": "Редагувати",
"editRule": "Редагувати правило", "editRule": "Редагувати правило",
@@ -22,7 +21,6 @@
"import": "Імпортувати", "import": "Імпортувати",
"importFailed": "Імпорт не вдався", "importFailed": "Імпорт не вдався",
"importSuccess": "Імпорт успішний", "importSuccess": "Імпорт успішний",
"importYaml": "Імпортувати YAML",
"importYamlDescription": "Імпортуйте правила з файлу YAML, система автоматично створить групи правил на основі назв груп політик", "importYamlDescription": "Імпортуйте правила з файлу YAML, система автоматично створить групи правил на основі назв груп політик",
"importYamlRules": "Імпортувати правила YAML", "importYamlRules": "Імпортувати правила YAML",
"importing": "Імпортується...", "importing": "Імпортується...",
@@ -31,11 +29,9 @@
"noValidRules": "Не знайдено дійсних правил", "noValidRules": "Не знайдено дійсних правил",
"pleaseUploadFile": "Будь ласка, завантажте файл YAML", "pleaseUploadFile": "Будь ласка, завантажте файл YAML",
"preview": "Попередній перегляд", "preview": "Попередній перегляд",
"rules": "Вміст правила",
"rulesFormat": "Формат правила: тип правила, вміст збігу, [політика], де політика є необов'язковою.\nЯкщо політика не вказана, автоматично буде використано назву поточної групи правил. Приклади:", "rulesFormat": "Формат правила: тип правила, вміст збігу, [політика], де політика є необов'язковою.\nЯкщо політика не вказана, автоматично буде використано назву поточної групи правил. Приклади:",
"rulesLabel": "Вміст правила", "rulesLabel": "Вміст правила",
"searchRule": "Шукати назву правила", "searchRule": "Шукати назву правила",
"selectFile": "Вибрати файл",
"selectTags": "Вибрати теги вузлів", "selectTags": "Вибрати теги вузлів",
"tags": "Теги вузлів", "tags": "Теги вузлів",
"tagsLabel": "Теги вузлів", "tagsLabel": "Теги вузлів",
-4
View File
@@ -11,7 +11,6 @@
"delete": "Xóa", "delete": "Xóa",
"deleteSuccess": "Quy tắc đã được xóa thành công", "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.", "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", "downloadTemplate": "Tải Mẫu",
"edit": "Chỉnh sửa", "edit": "Chỉnh sửa",
"editRule": "Chỉnh sửa Quy tắc", "editRule": "Chỉnh sửa Quy tắc",
@@ -22,7 +21,6 @@
"import": "Nhập khẩu", "import": "Nhập khẩu",
"importFailed": "Nhập khẩu không thành công", "importFailed": "Nhập khẩu không thành công",
"importSuccess": "Nhập khẩu 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", "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", "importYamlRules": "Nhập Quy tắc YAML",
"importing": "Đang nhập khẩu...", "importing": "Đang nhập khẩu...",
@@ -31,11 +29,9 @@
"noValidRules": "Không tìm thấy quy tắc hợp lệ", "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", "pleaseUploadFile": "Vui lòng tải lên một tệp YAML",
"preview": "Xem trước", "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ụ:", "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", "rulesLabel": "Nội dung Quy tắc",
"searchRule": "Tìm kiếm tên quy tắc", "searchRule": "Tìm kiếm tên quy tắc",
"selectFile": "Chọn Tệp",
"selectTags": "Chọn thẻ nút", "selectTags": "Chọn thẻ nút",
"tags": "Thẻ Nút", "tags": "Thẻ Nút",
"tagsLabel": "Thẻ Nút", "tagsLabel": "Thẻ Nút",
+6 -4
View File
@@ -8,10 +8,12 @@
"createRule": "添加规则", "createRule": "添加规则",
"createSuccess": "创建规则成功", "createSuccess": "创建规则成功",
"createdAt": "创建时间", "createdAt": "创建时间",
"default": "默认",
"defaultRule": "默认规则",
"delete": "删除", "delete": "删除",
"deleteSuccess": "删除规则成功", "deleteSuccess": "删除规则成功",
"deleteWarning": "确定要删除所选规则吗?此操作不可恢复。", "deleteWarning": "确定要删除所选规则吗?此操作不可恢复。",
"description": "规则描述", "direct": "直连",
"downloadTemplate": "下载模板", "downloadTemplate": "下载模板",
"edit": "编辑", "edit": "编辑",
"editRule": "编辑规则", "editRule": "编辑规则",
@@ -22,7 +24,6 @@
"import": "导入", "import": "导入",
"importFailed": "导入失败", "importFailed": "导入失败",
"importSuccess": "导入成功", "importSuccess": "导入成功",
"importYaml": "导入YAML",
"importYamlDescription": "从YAML文件导入规则,系统将自动根据策略组名称分组创建规则", "importYamlDescription": "从YAML文件导入规则,系统将自动根据策略组名称分组创建规则",
"importYamlRules": "导入YAML规则", "importYamlRules": "导入YAML规则",
"importing": "导入中...", "importing": "导入中...",
@@ -31,13 +32,14 @@
"noValidRules": "没有找到有效的规则", "noValidRules": "没有找到有效的规则",
"pleaseUploadFile": "请上传YAML文件", "pleaseUploadFile": "请上传YAML文件",
"preview": "预览", "preview": "预览",
"rules": "规则内容", "reject": "拒绝",
"rulesFormat": "规则格式说明:规则类型,匹配内容,[策略], 其中策略为可选项。\n不指定策略时,将自动使用当前规则组名称, 示例:", "rulesFormat": "规则格式说明:规则类型,匹配内容,[策略], 其中策略为可选项。\n不指定策略时,将自动使用当前规则组名称, 示例:",
"rulesLabel": "规则内容", "rulesLabel": "规则内容",
"searchRule": "搜索规则名称", "searchRule": "搜索规则名称",
"selectFile": "选择文件",
"selectTags": "选择节点标签", "selectTags": "选择节点标签",
"selectType": "选择规则类型",
"tags": "节点标签", "tags": "节点标签",
"tagsLabel": "节点标签", "tagsLabel": "节点标签",
"type": "规则类型",
"updateSuccess": "更新规则成功" "updateSuccess": "更新规则成功"
} }
+2
View File
@@ -63,6 +63,7 @@
"edit": "编辑", "edit": "编辑",
"editNode": "编辑节点", "editNode": "编辑节点",
"enable": "启用", "enable": "启用",
"id": "ID",
"form": { "form": {
"allowInsecure": "允许不安全", "allowInsecure": "允许不安全",
"cancel": "取消", "cancel": "取消",
@@ -141,6 +142,7 @@
"name": "名称", "name": "名称",
"node": "节点", "node": "节点",
"nodeGroup": "节点组", "nodeGroup": "节点组",
"noData": "--",
"normal": "正常", "normal": "正常",
"onlineCount": "在线人数", "onlineCount": "在线人数",
"onlineUsers": "在线用户", "onlineUsers": "在线用户",
+3 -4
View File
@@ -8,10 +8,10 @@
"createRule": "新增規則", "createRule": "新增規則",
"createSuccess": "規則創建成功", "createSuccess": "規則創建成功",
"createdAt": "創建於", "createdAt": "創建於",
"defaultRule": "默認規則",
"delete": "刪除", "delete": "刪除",
"deleteSuccess": "規則刪除成功", "deleteSuccess": "規則刪除成功",
"deleteWarning": "您確定要刪除這條規則嗎?此操作無法撤銷。", "deleteWarning": "您確定要刪除這條規則嗎?此操作無法撤銷。",
"description": "規則描述",
"downloadTemplate": "下載模板", "downloadTemplate": "下載模板",
"edit": "編輯", "edit": "編輯",
"editRule": "編輯規則", "editRule": "編輯規則",
@@ -22,7 +22,6 @@
"import": "導入", "import": "導入",
"importFailed": "導入失敗", "importFailed": "導入失敗",
"importSuccess": "導入成功", "importSuccess": "導入成功",
"importYaml": "導入 YAML",
"importYamlDescription": "從 YAML 文件導入規則,系統將根據策略組名稱自動創建規則組", "importYamlDescription": "從 YAML 文件導入規則,系統將根據策略組名稱自動創建規則組",
"importYamlRules": "導入 YAML 規則", "importYamlRules": "導入 YAML 規則",
"importing": "導入中...", "importing": "導入中...",
@@ -31,13 +30,13 @@
"noValidRules": "未找到有效的規則", "noValidRules": "未找到有效的規則",
"pleaseUploadFile": "請上傳 YAML 文件", "pleaseUploadFile": "請上傳 YAML 文件",
"preview": "預覽", "preview": "預覽",
"rules": "規則內容",
"rulesFormat": "規則格式:規則類型,匹配內容,[策略],其中策略是可選的。\n如果未指定策略,將自動使用當前規則組名稱。示例:", "rulesFormat": "規則格式:規則類型,匹配內容,[策略],其中策略是可選的。\n如果未指定策略,將自動使用當前規則組名稱。示例:",
"rulesLabel": "規則內容", "rulesLabel": "規則內容",
"searchRule": "搜索規則名稱", "searchRule": "搜索規則名稱",
"selectFile": "選擇文件",
"selectTags": "選擇節點標籤", "selectTags": "選擇節點標籤",
"selectType": "選擇規則類型",
"tags": "節點標籤", "tags": "節點標籤",
"tagsLabel": "節點標籤", "tagsLabel": "節點標籤",
"type": "規則類型",
"updateSuccess": "規則更新成功" "updateSuccess": "規則更新成功"
} }
+1
View File
@@ -9968,3 +9968,4 @@ rules:
- PROCESS-NAME,Weiyun.exe,🎯 全球直连 - PROCESS-NAME,Weiyun.exe,🎯 全球直连
- PROCESS-NAME,baidunetdisk.exe,🎯 全球直连 - PROCESS-NAME,baidunetdisk.exe,🎯 全球直连
- GEOIP,CN,🎯 全球直连 - GEOIP,CN,🎯 全球直连
- MATCH,🚀 节点选择
+6
View File
@@ -296,8 +296,10 @@ declare namespace API {
type CreateRuleGroupRequest = { type CreateRuleGroupRequest = {
name: string; name: string;
icon: string; icon: string;
type: string;
tags: string[]; tags: string[];
rules: string; rules: string;
default: boolean;
enable: boolean; enable: boolean;
}; };
@@ -1283,9 +1285,11 @@ declare namespace API {
id: number; id: number;
icon: string; icon: string;
name: string; name: string;
type: string;
tags: string[]; tags: string[];
rules: string; rules: string;
enable: boolean; enable: boolean;
default: boolean;
created_at: number; created_at: number;
updated_at: number; updated_at: number;
}; };
@@ -1629,9 +1633,11 @@ declare namespace API {
type UpdateRuleGroupRequest = { type UpdateRuleGroupRequest = {
id: number; id: number;
icon: string; icon: string;
type: string;
name: string; name: string;
tags: string[]; tags: string[];
rules: string; rules: string;
default: boolean;
enable: boolean; enable: boolean;
}; };
+2
View File
@@ -696,9 +696,11 @@ declare namespace API {
id: number; id: number;
icon: string; icon: string;
name: string; name: string;
type: string;
tags: string[]; tags: string[];
rules: string; rules: string;
enable: boolean; enable: boolean;
default: boolean;
created_at: number; created_at: number;
updated_at: number; updated_at: number;
}; };
+1 -1
View File
@@ -10,7 +10,7 @@ export const NEXT_PUBLIC_DEFAULT_LANGUAGE =
export const NEXT_PUBLIC_SITE_URL = env('NEXT_PUBLIC_SITE_URL') ?? process.env.NEXT_PUBLIC_SITE_URL; export const NEXT_PUBLIC_SITE_URL = env('NEXT_PUBLIC_SITE_URL') ?? process.env.NEXT_PUBLIC_SITE_URL;
export const NEXT_PUBLIC_API_URL = env('NEXT_PUBLIC_API_URL') ?? process.env.NEXT_PUBLIC_API_URL; export const NEXT_PUBLIC_API_URL = env('NEXT_PUBLIC_API_URL') ?? process.env.NEXT_PUBLIC_API_URL;
export const NEXT_PUBLIC_CDN_URL = export const NEXT_PUBLIC_CDN_URL =
env('NEXT_PUBLIC_CDN_URL') || process.env.NEXT_PUBLIC_CDN_URL || 'https://fastly.jsdelivr.net'; env('NEXT_PUBLIC_CDN_URL') || process.env.NEXT_PUBLIC_CDN_URL || 'https://cdn.jsdelivr.net';
export const NEXT_PUBLIC_DEFAULT_USER_EMAIL = export const NEXT_PUBLIC_DEFAULT_USER_EMAIL =
env('NEXT_PUBLIC_DEFAULT_USER_EMAIL') ?? process.env.NEXT_PUBLIC_DEFAULT_USER_EMAIL; env('NEXT_PUBLIC_DEFAULT_USER_EMAIL') ?? process.env.NEXT_PUBLIC_DEFAULT_USER_EMAIL;
+2
View File
@@ -696,9 +696,11 @@ declare namespace API {
id: number; id: number;
icon: string; icon: string;
name: string; name: string;
type: string;
tags: string[]; tags: string[];
rules: string; rules: string;
enable: boolean; enable: boolean;
default: boolean;
created_at: number; created_at: number;
updated_at: number; updated_at: number;
}; };
+2
View File
@@ -794,9 +794,11 @@ declare namespace API {
id: number; id: number;
icon: string; icon: string;
name: string; name: string;
type: string;
tags: string[]; tags: string[];
rules: string; rules: string;
enable: boolean; enable: boolean;
default: boolean;
created_at: number; created_at: number;
updated_at: number; updated_at: number;
}; };
+15 -14
View File
@@ -3,22 +3,23 @@ import matter from 'gray-matter';
const BASE_URL = `${NEXT_PUBLIC_CDN_URL}/gh/perfect-panel/ppanel-tutorial`; const BASE_URL = `${NEXT_PUBLIC_CDN_URL}/gh/perfect-panel/ppanel-tutorial`;
async function getVersion() { // async function getVersion() {
// API rate limit: 60 requests per hour // // API rate limit: 60 requests per hour
const response = await fetch( // const response = await fetch(
'https://data.jsdelivr.com/v1/stats/packages/gh/perfect-panel/ppanel-tutorial/versions', // 'https://data.jsdelivr.com/v1/stats/packages/gh/perfect-panel/ppanel-tutorial/versions',
); // );
const json = await response.json(); // const json = await response.json();
return json[0].version; // return json[0].version;
} // }
async function getVersionPath() { async function getVersionPath() {
return getVersion() // return getVersion()
.then((version) => `${BASE_URL}@${version}`) // .then((version) => `${BASE_URL}@${version}`)
.catch((error) => { // .catch((error) => {
console.warn('Error fetching the version:', error); // console.warn('Error fetching the version:', error);
return BASE_URL; // return `${BASE_URL}@latest`;
}); // });
return `${BASE_URL}@latest`;
} }
export async function getTutorial(path: string): Promise<{ export async function getTutorial(path: string): Promise<{
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "ppanel-web", "name": "ppanel-web",
"version": "1.1.0", "version": "1.1.1",
"private": true, "private": true,
"homepage": "https://github.com/perfect-panel/ppanel-web", "homepage": "https://github.com/perfect-panel/ppanel-web",
"bugs": { "bugs": {