refactor(i18n): restructure feedback and profile namespaces for better organization

This commit is contained in:
Slinetrac
2025-11-05 17:08:51 +08:00
Unverified
parent 6b4e4eed6d
commit 70bc5100b0
27 changed files with 2535 additions and 2230 deletions

View File

@@ -177,7 +177,7 @@ const TrafficErrorFallback: React.FC<TrafficErrorFallbackProps> = ({
<ErrorOutlineRounded sx={{ fontSize: 48, mb: 2, color: "error.main" }} />
<Typography variant="h6" gutterBottom>
{t("shared.messages.errors.trafficStats")}
{t("shared.feedback.errors.trafficStats")}
</Typography>
<Typography
@@ -186,7 +186,7 @@ const TrafficErrorFallback: React.FC<TrafficErrorFallbackProps> = ({
textAlign="center"
sx={{ mb: 2 }}
>
{t("shared.messages.errors.trafficStatsDescription")}
{t("shared.feedback.errors.trafficStatsDescription")}
</Typography>
<Alert severity="error" sx={{ mb: 2, maxWidth: 400 }}>

View File

@@ -112,7 +112,7 @@ const ProfileDetails = ({
sx={{ display: "flex", alignItems: "center" }}
>
<span style={{ flexShrink: 0 }}>
{t("profiles.card.labels.from")}:{" "}
{t("profiles.components.card.labels.from")}:{" "}
</span>
{current.home ? (
<Link
@@ -188,7 +188,7 @@ const ProfileDetails = ({
sx={{ cursor: "pointer" }}
onClick={onUpdateProfile}
>
{t("profiles.card.labels.updateTime")}:{" "}
{t("profiles.components.card.labels.updateTime")}:{" "}
<Box component="span" fontWeight="medium">
{dayjs(current.updated * 1000).format("YYYY-MM-DD HH:mm")}
</Box>
@@ -201,7 +201,7 @@ const ProfileDetails = ({
<Stack direction="row" alignItems="center" spacing={1}>
<SpeedOutlined fontSize="small" color="action" />
<Typography variant="body2" color="text.secondary">
{t("profiles.card.labels.usedTotal")}:{" "}
{t("profiles.components.card.labels.usedTotal")}:{" "}
<Box component="span" fontWeight="medium">
{parseTraffic(usedTraffic)} /{" "}
{parseTraffic(current.extra.total)}
@@ -213,7 +213,7 @@ const ProfileDetails = ({
<Stack direction="row" alignItems="center" spacing={1}>
<EventOutlined fontSize="small" color="action" />
<Typography variant="body2" color="text.secondary">
{t("profiles.card.labels.expireTime")}:{" "}
{t("profiles.components.card.labels.expireTime")}:{" "}
<Box component="span" fontWeight="medium">
{parseExpire(current.extra.expire)}
</Box>
@@ -268,10 +268,10 @@ const EmptyProfile = ({ onClick }: { onClick: () => void }) => {
sx={{ fontSize: 60, color: "primary.main", mb: 2 }}
/>
<Typography variant="h6" gutterBottom>
{t("profiles.page.actions.import")} {t("profiles.page.title")}
{t("profiles.page.actions.import")} {t("profiles.page.header.title")}
</Typography>
<Typography variant="body2" color="text.secondary">
{t("profiles.card.labels.clickToImport")}
{t("profiles.components.card.labels.clickToImport")}
</Typography>
</Box>
);
@@ -312,7 +312,7 @@ export const HomeProfileCard = ({
// 卡片标题
const cardTitle = useMemo(() => {
if (!current) return t("profiles.page.title");
if (!current) return t("profiles.page.header.title");
if (!current.home) return current.name;

View File

@@ -97,7 +97,7 @@ export const EditorViewer = <T extends Language>(props: Props<T>) => {
onClose,
} = props;
const resolvedTitle = title ?? t("profiles.menu.editFile");
const resolvedTitle = title ?? t("profiles.components.menu.editFile");
const resolvedInitialData = useMemo(
() => initialData ?? Promise.resolve(""),
[initialData],
@@ -203,7 +203,7 @@ export const EditorViewer = <T extends Language>(props: Props<T>) => {
mouseWheelZoom: true, // 按住Ctrl滚轮调节缩放比例
readOnly: readOnly, // 只读模式
readOnlyMessage: {
value: t("profiles.editor.readOnlyMessage"),
value: t("profiles.modals.editor.messages.readOnly"),
}, // 只读模式尝试编辑时的提示信息
renderValidationDecorations: "on", // 只读模式下显示校验信息
quickSuggestions: {
@@ -233,7 +233,7 @@ export const EditorViewer = <T extends Language>(props: Props<T>) => {
size="medium"
color="inherit"
sx={{ display: readOnly ? "none" : "" }}
title={t("profiles.editor.format")}
title={t("profiles.modals.editor.actions.format")}
onClick={() =>
editorRef.current
?.getAction("editor.action.formatDocument")

View File

@@ -42,7 +42,7 @@ export const FileInput = (props: Props) => {
sx={{ flex: "none" }}
onClick={() => inputRef.current?.click()}
>
{t("profiles.fileInput.chooseFile")}
{t("profiles.components.fileInput.chooseFile")}
</Button>
<input

View File

@@ -400,7 +400,7 @@ export const GroupsEditorViewer = (props: Props) => {
const validateGroup = () => {
const group = formIns.getValues();
if (group.name === "") {
throw new Error(t("profiles.groupsEditor.errors.nameRequired"));
throw new Error(t("profiles.modals.groupsEditor.errors.nameRequired"));
}
};
@@ -415,7 +415,7 @@ export const GroupsEditorViewer = (props: Props) => {
}
await saveProfileFile(property, nextData);
showNotice.success("profiles.notifications.saved");
showNotice.success("shared.feedback.notifications.saved");
setPrevData(nextData);
onSave?.(prevData, nextData);
onClose();
@@ -429,7 +429,7 @@ export const GroupsEditorViewer = (props: Props) => {
<DialogTitle>
{
<Box display="flex" justifyContent="space-between">
{t("profiles.groupsEditor.title")}
{t("profiles.modals.groupsEditor.title")}
<Box>
<Button
variant="contained"
@@ -470,7 +470,7 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.type")}
primary={t("profiles.modals.groupsEditor.fields.type")}
/>
<Autocomplete
size="small"
@@ -501,7 +501,7 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.name")}
primary={t("profiles.modals.groupsEditor.fields.name")}
/>
<TextField
autoComplete="new-password"
@@ -520,7 +520,7 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.icon")}
primary={t("profiles.modals.groupsEditor.fields.icon")}
/>
<TextField
autoComplete="new-password"
@@ -537,7 +537,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.proxies")}
primary={t(
"profiles.modals.groupsEditor.fields.proxies",
)}
/>
<Autocomplete
size="small"
@@ -565,7 +567,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.provider")}
primary={t(
"profiles.modals.groupsEditor.fields.provider",
)}
/>
<Autocomplete
size="small"
@@ -586,7 +590,7 @@ export const GroupsEditorViewer = (props: Props) => {
<Item>
<ListItemText
primary={t(
"profiles.groupsEditor.fields.healthCheckUrl",
"profiles.modals.groupsEditor.fields.healthCheckUrl",
)}
/>
<TextField
@@ -606,7 +610,7 @@ export const GroupsEditorViewer = (props: Props) => {
<Item>
<ListItemText
primary={t(
"profiles.groupsEditor.fields.expectedStatus",
"profiles.modals.groupsEditor.fields.expectedStatus",
)}
/>
<TextField
@@ -627,7 +631,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.interval")}
primary={t(
"profiles.modals.groupsEditor.fields.interval",
)}
/>
<TextField
autoComplete="new-password"
@@ -657,7 +663,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.timeout")}
primary={t(
"profiles.modals.groupsEditor.fields.timeout",
)}
/>
<TextField
autoComplete="new-password"
@@ -688,7 +696,7 @@ export const GroupsEditorViewer = (props: Props) => {
<Item>
<ListItemText
primary={t(
"profiles.groupsEditor.fields.maxFailedTimes",
"profiles.modals.groupsEditor.fields.maxFailedTimes",
)}
/>
<TextField
@@ -711,7 +719,7 @@ export const GroupsEditorViewer = (props: Props) => {
<Item>
<ListItemText
primary={t(
"profiles.groupsEditor.fields.interfaceName",
"profiles.modals.groupsEditor.fields.interfaceName",
)}
/>
<Autocomplete
@@ -731,7 +739,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.routingMark")}
primary={t(
"profiles.modals.groupsEditor.fields.routingMark",
)}
/>
<TextField
autoComplete="new-password"
@@ -751,7 +761,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.filter")}
primary={t(
"profiles.modals.groupsEditor.fields.filter",
)}
/>
<TextField
autoComplete="new-password"
@@ -769,7 +781,7 @@ export const GroupsEditorViewer = (props: Props) => {
<Item>
<ListItemText
primary={t(
"profiles.groupsEditor.fields.excludeFilter",
"profiles.modals.groupsEditor.fields.excludeFilter",
)}
/>
<TextField
@@ -787,7 +799,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.excludeType")}
primary={t(
"profiles.modals.groupsEditor.fields.excludeType",
)}
/>
<Autocomplete
multiple
@@ -835,7 +849,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.fields.includeAll")}
primary={t(
"profiles.modals.groupsEditor.fields.includeAll",
)}
/>
<Switch checked={field.value} {...field} />
</Item>
@@ -848,7 +864,7 @@ export const GroupsEditorViewer = (props: Props) => {
<Item>
<ListItemText
primary={t(
"profiles.groupsEditor.fields.includeAllProxies",
"profiles.modals.groupsEditor.fields.includeAllProxies",
)}
/>
<Switch checked={field.value} {...field} />
@@ -862,7 +878,7 @@ export const GroupsEditorViewer = (props: Props) => {
<Item>
<ListItemText
primary={t(
"profiles.groupsEditor.fields.includeAllProviders",
"profiles.modals.groupsEditor.fields.includeAllProviders",
)}
/>
<Switch checked={field.value} {...field} />
@@ -875,7 +891,7 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.toggles.lazy")}
primary={t("profiles.modals.groupsEditor.toggles.lazy")}
/>
<Switch checked={field.value} {...field} />
</Item>
@@ -887,7 +903,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.toggles.disableUdp")}
primary={t(
"profiles.modals.groupsEditor.toggles.disableUdp",
)}
/>
<Switch checked={field.value} {...field} />
</Item>
@@ -899,7 +917,9 @@ export const GroupsEditorViewer = (props: Props) => {
render={({ field }) => (
<Item>
<ListItemText
primary={t("profiles.groupsEditor.toggles.hidden")}
primary={t(
"profiles.modals.groupsEditor.toggles.hidden",
)}
/>
<Switch checked={field.value} {...field} />
</Item>
@@ -917,7 +937,7 @@ export const GroupsEditorViewer = (props: Props) => {
for (const item of [...prependSeq, ...groupList]) {
if (item.name === formIns.getValues().name) {
throw new Error(
t("profiles.groupsEditor.errors.nameExists"),
t("profiles.modals.groupsEditor.errors.nameExists"),
);
}
}
@@ -927,7 +947,7 @@ export const GroupsEditorViewer = (props: Props) => {
}
}}
>
{t("profiles.groupsEditor.actions.prepend")}
{t("profiles.modals.groupsEditor.actions.prepend")}
</Button>
</Item>
<Item>
@@ -941,7 +961,7 @@ export const GroupsEditorViewer = (props: Props) => {
for (const item of [...appendSeq, ...groupList]) {
if (item.name === formIns.getValues().name) {
throw new Error(
t("profiles.groupsEditor.errors.nameExists"),
t("profiles.modals.groupsEditor.errors.nameExists"),
);
}
}
@@ -951,7 +971,7 @@ export const GroupsEditorViewer = (props: Props) => {
}
}}
>
{t("profiles.groupsEditor.actions.append")}
{t("profiles.modals.groupsEditor.actions.append")}
</Button>
</Item>
</List>

View File

@@ -26,7 +26,7 @@ export const LogViewer = (props: Props) => {
return (
<Dialog open={open} onClose={onClose}>
<DialogTitle>{t("profiles.logViewer.title")}</DialogTitle>
<DialogTitle>{t("profiles.modals.logViewer.title")}</DialogTitle>
<DialogContent
sx={{

View File

@@ -120,38 +120,46 @@ export const ProfileItem = (props: Props) => {
// 如果已经过期,显示"更新失败"
if (nextUpdateDate.isBefore(now)) {
setNextUpdateTime(t("profiles.item.status.lastUpdateFailed"));
setNextUpdateTime(
t("profiles.components.profileItem.status.lastUpdateFailed"),
);
} else {
// 否则显示剩余时间
const diffMinutes = nextUpdateDate.diff(now, "minute");
if (diffMinutes < 60) {
if (diffMinutes <= 0) {
setNextUpdateTime(`${t("profiles.item.status.nextUp")} <1m`);
setNextUpdateTime(
`${t("profiles.components.profileItem.status.nextUp")} <1m`,
);
} else {
setNextUpdateTime(
`${t("profiles.item.status.nextUp")} ${diffMinutes}m`,
`${t("profiles.components.profileItem.status.nextUp")} ${diffMinutes}m`,
);
}
} else {
const hours = Math.floor(diffMinutes / 60);
const mins = diffMinutes % 60;
setNextUpdateTime(
`${t("profiles.item.status.nextUp")} ${hours}h ${mins}m`,
`${t("profiles.components.profileItem.status.nextUp")} ${hours}h ${mins}m`,
);
}
}
} else {
console.log(`返回的下次更新时间为空`);
setNextUpdateTime(t("profiles.item.status.noSchedule"));
setNextUpdateTime(
t("profiles.components.profileItem.status.noSchedule"),
);
}
} catch (err) {
console.error(`获取下次更新时间出错:`, err);
setNextUpdateTime(t("profiles.item.status.unknown"));
setNextUpdateTime(t("profiles.components.profileItem.status.unknown"));
}
} else {
console.log(`该配置未设置更新间隔或间隔为0`);
setNextUpdateTime(t("profiles.item.status.autoUpdateDisabled"));
setNextUpdateTime(
t("profiles.components.profileItem.status.autoUpdateDisabled"),
);
}
});
@@ -365,18 +373,18 @@ export const ProfileItem = (props: Props) => {
};
const menuLabels = {
home: "profiles.menu.home",
select: "profiles.menu.select",
editInfo: "profiles.menu.editInfo",
editFile: "profiles.menu.editFile",
editRules: "profiles.menu.editRules",
editProxies: "profiles.menu.editProxies",
editGroups: "profiles.menu.editGroups",
extendConfig: "profiles.menu.extendConfig",
extendScript: "profiles.menu.extendScript",
openFile: "profiles.menu.openFile",
update: "profiles.menu.update",
updateViaProxy: "profiles.menu.updateViaProxy",
home: "profiles.components.menu.home",
select: "profiles.components.menu.select",
editInfo: "profiles.components.menu.editInfo",
editFile: "profiles.components.menu.editFile",
editRules: "profiles.components.menu.editRules",
editProxies: "profiles.components.menu.editProxies",
editGroups: "profiles.components.menu.editGroups",
extendConfig: "profiles.components.menu.extendConfig",
extendScript: "profiles.components.menu.extendScript",
openFile: "profiles.components.menu.openFile",
update: "profiles.components.menu.update",
updateViaProxy: "profiles.components.menu.updateViaProxy",
delete: "shared.actions.delete",
} as const;
@@ -733,8 +741,8 @@ export const ProfileItem = (props: Props) => {
textAlign="right"
title={
showNextUpdate
? t("profiles.item.tooltips.showLast")
: `${t("shared.labels.updateTime")}: ${parseExpire(updated)}\n${t("profiles.item.tooltips.showNext")}`
? t("profiles.components.profileItem.tooltips.showLast")
: `${t("shared.labels.updateTime")}: ${parseExpire(updated)}\n${t("profiles.components.profileItem.tooltips.showNext")}`
}
sx={{
cursor: "pointer",
@@ -891,8 +899,8 @@ export const ProfileItem = (props: Props) => {
)}
<ConfirmViewer
title={t("profiles.confirm.delete.title")}
message={t("profiles.confirm.delete.message")}
title={t("profiles.modals.confirmDelete.title")}
message={t("profiles.modals.confirmDelete.message")}
open={confirmOpen}
onClose={() => setConfirmOpen(false)}
onConfirm={() => {

View File

@@ -55,18 +55,18 @@ export const ProfileMore = (props: Props) => {
const hasError = entries.some(([level]) => level === "exception");
const globalTitles: Record<Props["id"], string> = {
Merge: "profiles.more.global.merge",
Script: "profiles.more.global.script",
Merge: "profiles.components.more.global.merge",
Script: "profiles.components.more.global.script",
};
const chipLabels: Record<Props["id"], string> = {
Merge: "profiles.more.chips.merge",
Script: "profiles.more.chips.script",
Merge: "profiles.components.more.chips.merge",
Script: "profiles.components.more.chips.script",
};
const itemMenu = [
{ label: "profiles.menu.editFile", handler: onEditFile },
{ label: "profiles.menu.openFile", handler: onOpenFile },
{ label: "profiles.components.menu.editFile", handler: onEditFile },
{ label: "profiles.components.menu.openFile", handler: onOpenFile },
];
const boxStyle = {
@@ -121,7 +121,7 @@ export const ProfileMore = (props: Props) => {
size="small"
edge="start"
color="error"
title={t("profiles.logViewer.title")}
title={t("profiles.modals.logViewer.title")}
onClick={() => setLogOpen(true)}
>
<FeaturedPlayListRounded fontSize="inherit" />
@@ -132,7 +132,7 @@ export const ProfileMore = (props: Props) => {
size="small"
edge="start"
color="inherit"
title={t("profiles.logViewer.title")}
title={t("profiles.modals.logViewer.title")}
onClick={() => setLogOpen(true)}
>
<FeaturedPlayListRounded fontSize="inherit" />

View File

@@ -144,7 +144,9 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
}
} catch {
// 首次创建/更新失败,尝试使用自身代理
showNotice.info("profiles.viewer.notifications.creationRetry");
showNotice.info(
"profiles.modals.profileForm.feedback.notifications.creationRetry",
);
// 使用自身代理的配置
const retryItem = {
@@ -167,7 +169,9 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
await patchProfile(form.uid, { option: originalOptions });
}
showNotice.success("profiles.viewer.notifications.creationSuccess");
showNotice.success(
"profiles.modals.profileForm.feedback.notifications.creationSuccess",
);
}
}
@@ -216,8 +220,8 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
open={open}
title={
openType === "new"
? t("profiles.viewer.title.create")
: t("profiles.viewer.title.edit")
? t("profiles.modals.profileForm.title.create")
: t("profiles.modals.profileForm.title.edit")
}
contentSx={{ width: 375, pb: 0, maxHeight: "80%" }}
okBtn={t("shared.actions.save")}
@@ -232,11 +236,13 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
control={control}
render={({ field }) => (
<FormControl size="small" fullWidth sx={{ mt: 1, mb: 1 }}>
<InputLabel>{t("profiles.viewer.fields.type")}</InputLabel>
<InputLabel>
{t("profiles.modals.profileForm.fields.type")}
</InputLabel>
<Select
{...field}
autoFocus
label={t("profiles.viewer.fields.type")}
label={t("profiles.modals.profileForm.fields.type")}
>
<MenuItem value="remote">Remote</MenuItem>
<MenuItem value="local">Local</MenuItem>
@@ -252,7 +258,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
<TextField
{...text}
{...field}
label={t("profiles.viewer.fields.name")}
label={t("profiles.modals.profileForm.fields.name")}
/>
)}
/>
@@ -264,7 +270,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
<TextField
{...text}
{...field}
label={t("profiles.viewer.fields.description")}
label={t("profiles.modals.profileForm.fields.description")}
/>
)}
/>
@@ -279,7 +285,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
{...text}
{...field}
multiline
label={t("profiles.viewer.fields.subscriptionUrl")}
label={t("profiles.modals.profileForm.fields.subscriptionUrl")}
/>
)}
/>
@@ -306,7 +312,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
{...field}
type="number"
placeholder="60"
label={t("profiles.viewer.fields.httpTimeout")}
label={t("profiles.modals.profileForm.fields.httpTimeout")}
slotProps={{
input: {
endAdornment: (
@@ -331,7 +337,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
{...text}
{...field}
type="number"
label={t("profiles.viewer.fields.updateInterval")}
label={t("profiles.modals.profileForm.fields.updateInterval")}
slotProps={{
input: {
endAdornment: (
@@ -363,7 +369,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
render={({ field }) => (
<StyledBox>
<InputLabel>
{t("profiles.viewer.fields.useSystemProxy")}
{t("profiles.modals.profileForm.fields.useSystemProxy")}
</InputLabel>
<Switch checked={field.value} {...field} color="primary" />
</StyledBox>
@@ -376,7 +382,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
render={({ field }) => (
<StyledBox>
<InputLabel>
{t("profiles.viewer.fields.useClashProxy")}
{t("profiles.modals.profileForm.fields.useClashProxy")}
</InputLabel>
<Switch checked={field.value} {...field} color="primary" />
</StyledBox>
@@ -389,7 +395,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
render={({ field }) => (
<StyledBox>
<InputLabel>
{t("profiles.viewer.fields.acceptInvalidCerts")}
{t("profiles.modals.profileForm.fields.acceptInvalidCerts")}
</InputLabel>
<Switch checked={field.value} {...field} color="primary" />
</StyledBox>
@@ -402,7 +408,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
render={({ field }) => (
<StyledBox>
<InputLabel>
{t("profiles.viewer.fields.allowAutoUpdate")}
{t("profiles.modals.profileForm.fields.allowAutoUpdate")}
</InputLabel>
<Switch checked={field.value} {...field} color="primary" />
</StyledBox>

View File

@@ -263,7 +263,7 @@ export const ProxiesEditorViewer = (props: Props) => {
const handleSave = useLockFn(async () => {
try {
await saveProfileFile(property, currData);
showNotice.success("profiles.notifications.saved");
showNotice.success("shared.feedback.notifications.saved");
onSave?.(prevData, currData);
onClose();
} catch (err) {
@@ -276,7 +276,7 @@ export const ProxiesEditorViewer = (props: Props) => {
<DialogTitle>
{
<Box display="flex" justifyContent="space-between">
{t("profiles.proxiesEditor.title")}
{t("profiles.modals.proxiesEditor.title")}
<Box>
<Button
variant="contained"
@@ -315,7 +315,7 @@ export const ProxiesEditorViewer = (props: Props) => {
<TextField
autoComplete="new-password"
placeholder={t(
"profiles.proxiesEditor.placeholders.multiUri",
"profiles.modals.proxiesEditor.placeholders.multiUri",
)}
fullWidth
rows={9}
@@ -336,7 +336,7 @@ export const ProxiesEditorViewer = (props: Props) => {
});
}}
>
{t("profiles.proxiesEditor.actions.prepend")}
{t("profiles.modals.proxiesEditor.actions.prepend")}
</Button>
</Item>
<Item>
@@ -350,7 +350,7 @@ export const ProxiesEditorViewer = (props: Props) => {
});
}}
>
{t("profiles.proxiesEditor.actions.append")}
{t("profiles.modals.proxiesEditor.actions.append")}
</Button>
</Item>
</List>

View File

@@ -490,7 +490,7 @@ export const RulesEditorViewer = (props: Props) => {
const handleSave = useLockFn(async () => {
try {
await saveProfileFile(property, currData);
showNotice.success("profiles.notifications.saved");
showNotice.success("shared.feedback.notifications.saved");
onSave?.(prevData, currData);
onClose();
} catch (err: any) {

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "تكبير",
"minimize": "تصغير"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "تصور",
"advanced": "متقدم"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "تم استيراد الملف الشخصي بنجاح",
"importSubscriptionSuccess": "تم استيراد الاشتراك بنجاح",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "الملفات الشخصية",
"header": {
"title": "الملفات الشخصية"
},
"actions": {
"updateAll": "تحديث جميع الملفات الشخصية",
"viewRuntimeConfig": "عرض تكوين وقت التشغيل",
@@ -82,172 +90,184 @@
"import": "استيراد"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
"header": {
"title": "Batch Operations"
},
"actions": {
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done"
},
"summary": {
"selected": "Selected",
"items": "items"
}
},
"import": {
"importForm": {
"placeholder": "رابط الملف الشخصي",
"paste": "لصق",
"clear": "مسح"
"actions": {
"paste": "لصق",
"clear": "مسح"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "لا يتم دعم سوى ملفات YAML"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "تم التبديل إلى الملف الشخصي",
"profileReactivated": "تم إعادة تنشيط الملف الشخصي",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "لا يتم دعم سوى ملفات YAML"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "تم التبديل إلى الملف الشخصي",
"profileReactivated": "تم إعادة تنشيط الملف الشخصي",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "تم استيراد الملف الشخصي بنجاح",
"importSubscriptionSuccess": "تم استيراد الاشتراك بنجاح",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "إنشاء ملف شخصي",
"edit": "تعديل الملف الشخصي"
"components": {
"card": {
"labels": {
"from": "من",
"updateTime": "وقت التحديث",
"usedTotal": "المستخدم / الإجمالي",
"expireTime": "وقت الانتهاء",
"clickToImport": "Click to import subscription"
}
},
"fields": {
"type": "النوع",
"name": "الاسم",
"description": "الوصف",
"subscriptionUrl": "رابط الاشتراك",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "فاصل التحديث",
"useSystemProxy": "استخدام وكيل النظام",
"useClashProxy": "استخدام وكيل Clash",
"acceptInvalidCerts": "قبول الشهادات غير الصالحة (خطر)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "اختر ملف"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
"menu": {
"home": "Home",
"select": "اختيار",
"editInfo": "تعديل المعلومات",
"editFile": "تعديل الملف",
"editRules": "تعديل القواعد",
"editProxies": "تعديل الوكلاء",
"editGroups": "تعديل مجموعات الوكلاء",
"extendConfig": "توسيع الإعدادات",
"extendScript": "توسيع السكربت",
"openFile": "فتح الملف",
"update": "تحديث",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
}
},
"menu": {
"home": "Home",
"select": "اختيار",
"editInfo": "تعديل المعلومات",
"editFile": "تعديل الملف",
"editRules": "تعديل القواعد",
"editProxies": "تعديل الوكلاء",
"editGroups": "تعديل مجموعات الوكلاء",
"extendConfig": "توسيع الإعدادات",
"extendScript": "توسيع السكربت",
"openFile": "فتح الملف",
"update": "تحديث",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "تعديل الوكلاء",
"placeholders": {
"multiUri": "استخدم أسطرًا جديدة لعدّة عناوين URI (يدعم التشفير Base64)"
"modals": {
"profileForm": {
"title": {
"create": "إنشاء ملف شخصي",
"edit": "تعديل الملف الشخصي"
},
"fields": {
"type": "النوع",
"name": "الاسم",
"description": "الوصف",
"subscriptionUrl": "رابط الاشتراك",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "فاصل التحديث",
"useSystemProxy": "استخدام وكيل النظام",
"useClashProxy": "استخدام وكيل Clash",
"acceptInvalidCerts": "قبول الشهادات غير الصالحة (خطر)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
}
},
"actions": {
"prepend": "إضافة وكيل في البداية",
"append": "إضافة وكيل في النهاية"
}
},
"groupsEditor": {
"title": "تعديل مجموعات الوكلاء",
"errors": {
"nameRequired": "اسم المجموعة مطلوب",
"nameExists": "اسم المجموعة موجود بالفعل"
"proxiesEditor": {
"title": "تعديل الوكلاء",
"placeholders": {
"multiUri": "استخدم أسطرًا جديدة لعدّة عناوين URI (يدعم التشفير Base64)"
},
"actions": {
"prepend": "إضافة وكيل في البداية",
"append": "إضافة وكيل في النهاية"
}
},
"fields": {
"type": "نوع المجموعة",
"name": "اسم المجموعة",
"icon": "أيقونة مجموعة الوكلاء",
"proxies": "استخدام الوكلاء",
"provider": "استخدام المزود",
"healthCheckUrl": "رابط فحص الصحة",
"expectedStatus": "الحالة المتوقعة",
"interval": "الفاصل الزمني",
"timeout": "مهلة",
"maxFailedTimes": "الحد الأقصى لمحاولات الفشل",
"interfaceName": "اسم الواجهة",
"routingMark": "علامة التوجيه",
"filter": "تصفية",
"excludeFilter": "استبعاد المرشح",
"excludeType": "استبعاد النوع",
"includeAll": "تضمين جميع الوكلاء والمزودين",
"includeAllProxies": "تضمين جميع الوكلاء",
"includeAllProviders": "تضمين جميع المزودين"
"groupsEditor": {
"title": "تعديل مجموعات الوكلاء",
"errors": {
"nameRequired": "اسم المجموعة مطلوب",
"nameExists": "اسم المجموعة موجود بالفعل"
},
"fields": {
"type": "نوع المجموعة",
"name": "اسم المجموعة",
"icon": "أيقونة مجموعة الوكلاء",
"proxies": "استخدام الوكلاء",
"provider": "استخدام المزود",
"healthCheckUrl": "رابط فحص الصحة",
"expectedStatus": "الحالة المتوقعة",
"interval": "الفاصل الزمني",
"timeout": "مهلة",
"maxFailedTimes": "الحد الأقصى لمحاولات الفشل",
"interfaceName": "اسم الواجهة",
"routingMark": "علامة التوجيه",
"filter": "تصفية",
"excludeFilter": "استبعاد المرشح",
"excludeType": "استبعاد النوع",
"includeAll": "تضمين جميع الوكلاء والمزودين",
"includeAllProxies": "تضمين جميع الوكلاء",
"includeAllProviders": "تضمين جميع المزودين"
},
"toggles": {
"lazy": "كسول",
"disableUdp": "تعطيل UDP",
"hidden": "مخفي"
},
"actions": {
"prepend": "إضافة مجموعة في البداية",
"append": "إضافة مجموعة في النهاية"
}
},
"toggles": {
"lazy": "كسول",
"disableUdp": "تعطيل UDP",
"hidden": "مخفي"
"editor": {
"actions": {
"format": "تنسيق المستند"
},
"messages": {
"readOnly": "لا يمكن التعديل في محرر القراءة فقط"
}
},
"actions": {
"prepend": "إضافة مجموعة في البداية",
"append": "إضافة مجموعة في النهاية"
}
},
"fileInput": {
"chooseFile": "اختر ملف"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "تأكيد الحذف",
"message": "لا يمكن التراجع عن هذه العملية"
}
},
"editor": {
"format": "تنسيق المستند",
"readOnlyMessage": "لا يمكن التعديل في محرر القراءة فقط"
},
"logViewer": {
"title": "وحدة التحكم للسكريبت"
},
"card": {
"labels": {
"from": "من",
"updateTime": "وقت التحديث",
"usedTotal": "المستخدم / الإجمالي",
"expireTime": "وقت الانتهاء",
"clickToImport": "Click to import subscription"
},
"logViewer": {
"title": "وحدة التحكم للسكريبت"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "Maximieren",
"minimize": "Minimieren"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "Visualisierung",
"advanced": "Erweitert"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "Abonnement erfolgreich importiert",
"importSubscriptionSuccess": "Abonnement erfolgreich importiert",
"importWithClashProxy": "Abonnement mit Clash-Proxy importiert",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "Abonnement",
"header": {
"title": "Abonnement"
},
"actions": {
"updateAll": "Alle Abonnements aktualisieren",
"viewRuntimeConfig": "Laufzeit-Abonnement anzeigen",
@@ -82,172 +90,184 @@
"import": "Importieren"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
"header": {
"title": "Batch Operations"
},
"actions": {
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done"
},
"summary": {
"selected": "Selected",
"items": "items"
}
},
"import": {
"importForm": {
"placeholder": "Abonnement-Datei-Link",
"paste": "Einfügen",
"clear": "Löschen"
"actions": {
"paste": "Einfügen",
"clear": "Löschen"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Nur YAML-Dateien werden unterstützt"
},
"notifications": {
"importRetry": "Import des Abonnements fehlgeschlagen. Versuche es mit dem Clash-Proxy erneut...",
"importFail": "Import des Abonnements auch mit Clash-Proxy fehlgeschlagen",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Abonnement gewechselt",
"profileReactivated": "Abonnement erneut aktiviert",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Nur YAML-Dateien werden unterstützt"
},
"notifications": {
"importRetry": "Import des Abonnements fehlgeschlagen. Versuche es mit dem Clash-Proxy erneut...",
"importFail": "Import des Abonnements auch mit Clash-Proxy fehlgeschlagen",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Abonnement gewechselt",
"profileReactivated": "Abonnement erneut aktiviert",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "Abonnement erfolgreich importiert",
"importSubscriptionSuccess": "Abonnement erfolgreich importiert",
"importWithClashProxy": "Abonnement mit Clash-Proxy importiert",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "Neue Konfiguration erstellen",
"edit": "Konfiguration bearbeiten"
"components": {
"card": {
"labels": {
"from": "Von",
"updateTime": "Aktualisierungszeit",
"usedTotal": "Verwendet / Gesamt",
"expireTime": "Ablaufzeit",
"clickToImport": "Klicken Sie hier, um ein Abonnement zu importieren."
}
},
"fields": {
"type": "Typ",
"name": "Name",
"description": "Beschreibung",
"subscriptionUrl": "Abonnement-Link",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Aktualisierungsintervall",
"useSystemProxy": "Systemproxy zur Aktualisierung verwenden",
"useClashProxy": "Kernel-Proxy zur Aktualisierung verwenden",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "Datei auswählen"
},
"notifications": {
"creationRetry": "Erstellung des Abonnements fehlgeschlagen. Versuche es mit dem Clash-Proxy erneut...",
"creationSuccess": "Erstellung des Abonnements mit Clash-Proxy erfolgreich"
"menu": {
"home": "Startseite",
"select": "Verwenden",
"editInfo": "Informationen bearbeiten",
"editFile": "Datei bearbeiten",
"editRules": "Regeln bearbeiten",
"editProxies": "Knoten bearbeiten",
"editGroups": "Proxy-Gruppen bearbeiten",
"extendConfig": "Erweiterte Überdeckungskonfiguration",
"extendScript": "Erweitertes Skript",
"openFile": "Datei öffnen",
"update": "Aktualisieren",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Letzte Aktualisierung fehlgeschlagen",
"nextUp": "Nächste Aktualisierung",
"noSchedule": "Kein Zeitplan",
"unknown": "Unbekannt",
"autoUpdateDisabled": "Automatische Aktualisierung deaktiviert"
}
}
},
"menu": {
"home": "Startseite",
"select": "Verwenden",
"editInfo": "Informationen bearbeiten",
"editFile": "Datei bearbeiten",
"editRules": "Regeln bearbeiten",
"editProxies": "Knoten bearbeiten",
"editGroups": "Proxy-Gruppen bearbeiten",
"extendConfig": "Erweiterte Überdeckungskonfiguration",
"extendScript": "Erweitertes Skript",
"openFile": "Datei öffnen",
"update": "Aktualisieren",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "Knoten bearbeiten",
"placeholders": {
"multiUri": "Für mehrere URI verwenden Sie Zeilenumbrüche (Base64-Codierung wird unterstützt)"
"modals": {
"profileForm": {
"title": {
"create": "Neue Konfiguration erstellen",
"edit": "Konfiguration bearbeiten"
},
"fields": {
"type": "Typ",
"name": "Name",
"description": "Beschreibung",
"subscriptionUrl": "Abonnement-Link",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Aktualisierungsintervall",
"useSystemProxy": "Systemproxy zur Aktualisierung verwenden",
"useClashProxy": "Kernel-Proxy zur Aktualisierung verwenden",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Erstellung des Abonnements fehlgeschlagen. Versuche es mit dem Clash-Proxy erneut...",
"creationSuccess": "Erstellung des Abonnements mit Clash-Proxy erfolgreich"
}
}
},
"actions": {
"prepend": "Vorherigen Proxy-Knoten hinzufügen",
"append": "Nachfolgenden Proxy-Knoten hinzufügen"
}
},
"groupsEditor": {
"title": "Proxy-Gruppen bearbeiten",
"errors": {
"nameRequired": "Der Proxy-Gruppenname darf nicht leer sein",
"nameExists": "Der Proxy-Gruppenname existiert bereits"
"proxiesEditor": {
"title": "Knoten bearbeiten",
"placeholders": {
"multiUri": "Für mehrere URI verwenden Sie Zeilenumbrüche (Base64-Codierung wird unterstützt)"
},
"actions": {
"prepend": "Vorherigen Proxy-Knoten hinzufügen",
"append": "Nachfolgenden Proxy-Knoten hinzufügen"
}
},
"fields": {
"type": "Proxy-Gruppentyp",
"name": "Proxy-Gruppenname",
"icon": "Proxy-Gruppen-Symbol",
"proxies": "Proxy einführen",
"provider": "Proxy-Sammlung einführen",
"healthCheckUrl": "URL für Gesundheitstest",
"expectedStatus": "Erwarteter Statuscode",
"interval": "Prüfintervall",
"timeout": "Timeout",
"maxFailedTimes": "Maximale Anzahl fehlgeschlagener Versuche",
"interfaceName": "Ausgangsschnittstelle",
"routingMark": "Routierungsmarkierung",
"filter": "Knoten filtern",
"excludeFilter": "Knoten ausschließen",
"excludeType": "Typ der auszuschließenden Knoten",
"includeAll": "Alle Ausgangsproxy und Proxy-Sammlungen einführen",
"includeAllProxies": "Alle Ausgangsproxy einführen",
"includeAllProviders": "Alle Proxy-Sammlungen einführen"
"groupsEditor": {
"title": "Proxy-Gruppen bearbeiten",
"errors": {
"nameRequired": "Der Proxy-Gruppenname darf nicht leer sein",
"nameExists": "Der Proxy-Gruppenname existiert bereits"
},
"fields": {
"type": "Proxy-Gruppentyp",
"name": "Proxy-Gruppenname",
"icon": "Proxy-Gruppen-Symbol",
"proxies": "Proxy einführen",
"provider": "Proxy-Sammlung einführen",
"healthCheckUrl": "URL für Gesundheitstest",
"expectedStatus": "Erwarteter Statuscode",
"interval": "Prüfintervall",
"timeout": "Timeout",
"maxFailedTimes": "Maximale Anzahl fehlgeschlagener Versuche",
"interfaceName": "Ausgangsschnittstelle",
"routingMark": "Routierungsmarkierung",
"filter": "Knoten filtern",
"excludeFilter": "Knoten ausschließen",
"excludeType": "Typ der auszuschließenden Knoten",
"includeAll": "Alle Ausgangsproxy und Proxy-Sammlungen einführen",
"includeAllProxies": "Alle Ausgangsproxy einführen",
"includeAllProviders": "Alle Proxy-Sammlungen einführen"
},
"toggles": {
"lazy": "Lazy-Status",
"disableUdp": "UDP deaktivieren",
"hidden": "Proxy-Gruppe ausblenden"
},
"actions": {
"prepend": "Vorherige Proxy-Gruppe hinzufügen",
"append": "Nachfolgende Proxy-Gruppe hinzufügen"
}
},
"toggles": {
"lazy": "Lazy-Status",
"disableUdp": "UDP deaktivieren",
"hidden": "Proxy-Gruppe ausblenden"
"editor": {
"actions": {
"format": "Dokument formatieren"
},
"messages": {
"readOnly": "Bearbeitung im schreibgeschützten Modus nicht möglich"
}
},
"actions": {
"prepend": "Vorherige Proxy-Gruppe hinzufügen",
"append": "Nachfolgende Proxy-Gruppe hinzufügen"
}
},
"fileInput": {
"chooseFile": "Datei auswählen"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Letzte Aktualisierung fehlgeschlagen",
"nextUp": "Nächste Aktualisierung",
"noSchedule": "Kein Zeitplan",
"unknown": "Unbekannt",
"autoUpdateDisabled": "Automatische Aktualisierung deaktiviert"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "Löschung bestätigen",
"message": "Diese Operation kann nicht rückgängig gemacht werden"
}
},
"editor": {
"format": "Dokument formatieren",
"readOnlyMessage": "Bearbeitung im schreibgeschützten Modus nicht möglich"
},
"logViewer": {
"title": "Skript-Konsole-Ausgabe"
},
"card": {
"labels": {
"from": "Von",
"updateTime": "Aktualisierungszeit",
"usedTotal": "Verwendet / Gesamt",
"expireTime": "Ablaufzeit",
"clickToImport": "Klicken Sie hier, um ein Abonnement zu importieren."
},
"logViewer": {
"title": "Skript-Konsole-Ausgabe"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "Maximize",
"minimize": "Minimize"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "Visualization",
"advanced": "Advanced"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "Profile Imported Successfully",
"importSubscriptionSuccess": "Import subscription successful",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "Profiles",
"header": {
"title": "Profiles"
},
"actions": {
"updateAll": "Update All Profiles",
"viewRuntimeConfig": "View Runtime Config",
@@ -82,172 +90,184 @@
"import": "Import"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
"header": {
"title": "Batch Operations"
},
"actions": {
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done"
},
"summary": {
"selected": "Selected",
"items": "items"
}
},
"import": {
"importForm": {
"placeholder": "Profile URL",
"paste": "Paste",
"clear": "Clear"
"actions": {
"paste": "Paste",
"clear": "Clear"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Only YAML Files Supported"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profile Switched",
"profileReactivated": "Profile Reactivated",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Only YAML Files Supported"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profile Switched",
"profileReactivated": "Profile Reactivated",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "Profile Imported Successfully",
"importSubscriptionSuccess": "Import subscription successful",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "Create Profile",
"edit": "Edit Profile"
"components": {
"card": {
"labels": {
"from": "From",
"updateTime": "Update Time",
"usedTotal": "Used / Total",
"expireTime": "Expire Time",
"clickToImport": "Click to import subscription"
}
},
"fields": {
"type": "Type",
"name": "Name",
"description": "Descriptions",
"subscriptionUrl": "Subscription URL",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Update Interval",
"useSystemProxy": "Use System Proxy",
"useClashProxy": "Use Clash Proxy",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "Choose File"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
"menu": {
"home": "Home",
"select": "Select",
"editInfo": "Edit Info",
"editFile": "Edit File",
"editRules": "Edit Rules",
"editProxies": "Edit Proxies",
"editGroups": "Edit Proxy Groups",
"extendConfig": "Extend Config",
"extendScript": "Extend Script",
"openFile": "Open File",
"update": "Update",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
}
},
"menu": {
"home": "Home",
"select": "Select",
"editInfo": "Edit Info",
"editFile": "Edit File",
"editRules": "Edit Rules",
"editProxies": "Edit Proxies",
"editGroups": "Edit Proxy Groups",
"extendConfig": "Extend Config",
"extendScript": "Extend Script",
"openFile": "Open File",
"update": "Update",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "Edit Proxies",
"placeholders": {
"multiUri": "Use newlines for multiple uri(Base64 encoding supported)"
"modals": {
"profileForm": {
"title": {
"create": "Create Profile",
"edit": "Edit Profile"
},
"fields": {
"type": "Type",
"name": "Name",
"description": "Descriptions",
"subscriptionUrl": "Subscription URL",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Update Interval",
"useSystemProxy": "Use System Proxy",
"useClashProxy": "Use Clash Proxy",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
}
},
"actions": {
"prepend": "Prepend Proxy",
"append": "Append Proxy"
}
},
"groupsEditor": {
"title": "Edit Proxy Groups",
"errors": {
"nameRequired": "Group Name Required",
"nameExists": "Group Name Already Exists"
"proxiesEditor": {
"title": "Edit Proxies",
"placeholders": {
"multiUri": "Use newlines for multiple uri(Base64 encoding supported)"
},
"actions": {
"prepend": "Prepend Proxy",
"append": "Append Proxy"
}
},
"fields": {
"type": "Group Type",
"name": "Group Name",
"icon": "Proxy Group Icon",
"proxies": "Use Proxies",
"provider": "Use Provider",
"healthCheckUrl": "Health Check Url",
"expectedStatus": "Expected Status",
"interval": "Interval",
"timeout": "Timeout",
"maxFailedTimes": "Max Failed Times",
"interfaceName": "Interface Name",
"routingMark": "Routing Mark",
"filter": "Filter",
"excludeFilter": "Exclude Filter",
"excludeType": "Exclude Type",
"includeAll": "Include All Proxies and Providers",
"includeAllProxies": "Include All Proxies",
"includeAllProviders": "Include All Providers"
"groupsEditor": {
"title": "Edit Proxy Groups",
"errors": {
"nameRequired": "Group Name Required",
"nameExists": "Group Name Already Exists"
},
"fields": {
"type": "Group Type",
"name": "Group Name",
"icon": "Proxy Group Icon",
"proxies": "Use Proxies",
"provider": "Use Provider",
"healthCheckUrl": "Health Check Url",
"expectedStatus": "Expected Status",
"interval": "Interval",
"timeout": "Timeout",
"maxFailedTimes": "Max Failed Times",
"interfaceName": "Interface Name",
"routingMark": "Routing Mark",
"filter": "Filter",
"excludeFilter": "Exclude Filter",
"excludeType": "Exclude Type",
"includeAll": "Include All Proxies and Providers",
"includeAllProxies": "Include All Proxies",
"includeAllProviders": "Include All Providers"
},
"toggles": {
"lazy": "Lazy",
"disableUdp": "Disable UDP",
"hidden": "Hidden"
},
"actions": {
"prepend": "Prepend Group",
"append": "Append Group"
}
},
"toggles": {
"lazy": "Lazy",
"disableUdp": "Disable UDP",
"hidden": "Hidden"
"editor": {
"actions": {
"format": "Format document"
},
"messages": {
"readOnly": "Cannot edit in read-only editor"
}
},
"actions": {
"prepend": "Prepend Group",
"append": "Append Group"
}
},
"fileInput": {
"chooseFile": "Choose File"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "Confirm deletion",
"message": "This operation is not reversible"
}
},
"editor": {
"format": "Format document",
"readOnlyMessage": "Cannot edit in read-only editor"
},
"logViewer": {
"title": "Script Console"
},
"card": {
"labels": {
"from": "From",
"updateTime": "Update Time",
"usedTotal": "Used / Total",
"expireTime": "Expire Time",
"clickToImport": "Click to import subscription"
},
"logViewer": {
"title": "Script Console"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "Maximizar",
"minimize": "Minimizar"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "Visualización",
"advanced": "Avanzado"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "Suscripción importada con éxito",
"importSubscriptionSuccess": "Suscripción importada con éxito",
"importWithClashProxy": "Suscripción importada con el proxy de Clash",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "Suscripciones",
"header": {
"title": "Suscripciones"
},
"actions": {
"updateAll": "Actualizar todas las suscripciones",
"viewRuntimeConfig": "Ver configuración en tiempo de ejecución",
@@ -82,172 +90,184 @@
"import": "Importar"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
"header": {
"title": "Batch Operations"
},
"actions": {
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done"
},
"summary": {
"selected": "Selected",
"items": "items"
}
},
"import": {
"importForm": {
"placeholder": "Enlace del archivo de suscripción",
"paste": "Pegar",
"clear": "Limpiar"
"actions": {
"paste": "Pegar",
"clear": "Limpiar"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Solo se admiten archivos YAML"
},
"notifications": {
"importRetry": "Error al importar la suscripción. Intentando con el proxy de Clash...",
"importFail": "Error al importar incluso con el proxy de Clash",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Suscripción cambiada",
"profileReactivated": "Suscripción reactivada",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Solo se admiten archivos YAML"
},
"notifications": {
"importRetry": "Error al importar la suscripción. Intentando con el proxy de Clash...",
"importFail": "Error al importar incluso con el proxy de Clash",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Suscripción cambiada",
"profileReactivated": "Suscripción reactivada",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "Suscripción importada con éxito",
"importSubscriptionSuccess": "Suscripción importada con éxito",
"importWithClashProxy": "Suscripción importada con el proxy de Clash",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "Crear configuración",
"edit": "Editar configuración"
"components": {
"card": {
"labels": {
"from": "De",
"updateTime": "Hora de actualización",
"usedTotal": "Utilizado / Total",
"expireTime": "Tiempo de expiración",
"clickToImport": "Haga clic para importar una suscripción"
}
},
"fields": {
"type": "Tipo",
"name": "Nombre",
"description": "Descripción",
"subscriptionUrl": "Enlace de suscripción",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Intervalo de actualización",
"useSystemProxy": "Usar proxy del sistema para actualizar",
"useClashProxy": "Usar proxy del núcleo para actualizar",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "Elegir archivo"
},
"notifications": {
"creationRetry": "Error al crear la suscripción. Intentando con el proxy de Clash...",
"creationSuccess": "Creación de la suscripción con el proxy de Clash exitosa"
"menu": {
"home": "Hogar",
"select": "Usar",
"editInfo": "Editar información",
"editFile": "Editar archivo",
"editRules": "Editar reglas",
"editProxies": "Editar nodos",
"editGroups": "Editar grupos de proxy",
"extendConfig": "Configurar sobrescritura extendida",
"extendScript": "Script extendido",
"openFile": "Abrir archivo",
"update": "Actualizar",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "La última actualización falló",
"nextUp": "Próxima actualización",
"noSchedule": "Sin programación",
"unknown": "Desconocido",
"autoUpdateDisabled": "La actualización automática está deshabilitada"
}
}
},
"menu": {
"home": "Hogar",
"select": "Usar",
"editInfo": "Editar información",
"editFile": "Editar archivo",
"editRules": "Editar reglas",
"editProxies": "Editar nodos",
"editGroups": "Editar grupos de proxy",
"extendConfig": "Configurar sobrescritura extendida",
"extendScript": "Script extendido",
"openFile": "Abrir archivo",
"update": "Actualizar",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "Editar nodos",
"placeholders": {
"multiUri": "Para múltiples URI, utilice saltos de línea (se admite la codificación Base64)"
"modals": {
"profileForm": {
"title": {
"create": "Crear configuración",
"edit": "Editar configuración"
},
"fields": {
"type": "Tipo",
"name": "Nombre",
"description": "Descripción",
"subscriptionUrl": "Enlace de suscripción",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Intervalo de actualización",
"useSystemProxy": "Usar proxy del sistema para actualizar",
"useClashProxy": "Usar proxy del núcleo para actualizar",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Error al crear la suscripción. Intentando con el proxy de Clash...",
"creationSuccess": "Creación de la suscripción con el proxy de Clash exitosa"
}
}
},
"actions": {
"prepend": "Agregar nodo de proxy previo",
"append": "Agregar nodo de proxy posterior"
}
},
"groupsEditor": {
"title": "Editar grupos de proxy",
"errors": {
"nameRequired": "El nombre del grupo de proxy no puede estar vacío",
"nameExists": "El nombre del grupo de proxy ya existe"
"proxiesEditor": {
"title": "Editar nodos",
"placeholders": {
"multiUri": "Para múltiples URI, utilice saltos de línea (se admite la codificación Base64)"
},
"actions": {
"prepend": "Agregar nodo de proxy previo",
"append": "Agregar nodo de proxy posterior"
}
},
"fields": {
"type": "Tipo de grupo de proxy",
"name": "Nombre del grupo de proxy",
"icon": "Icono del grupo de proxy",
"proxies": "Incluir proxies",
"provider": "Incluir proveedor de proxies",
"healthCheckUrl": "URL de prueba de salud",
"expectedStatus": "Código de estado esperado",
"interval": "Intervalo de comprobación",
"timeout": "Tiempo de espera",
"maxFailedTimes": "Número máximo de fallos",
"interfaceName": "Nombre de la interfaz de salida",
"routingMark": "Marca de enrutamiento",
"filter": "Filtrar nodos",
"excludeFilter": "Excluir nodos",
"excludeType": "Tipo de nodo a excluir",
"includeAll": "Incluir todos los proxies de salida y proveedores de proxies",
"includeAllProxies": "Incluir todos los proxies de salida",
"includeAllProviders": "Incluir todos los proveedores de proxies"
"groupsEditor": {
"title": "Editar grupos de proxy",
"errors": {
"nameRequired": "El nombre del grupo de proxy no puede estar vacío",
"nameExists": "El nombre del grupo de proxy ya existe"
},
"fields": {
"type": "Tipo de grupo de proxy",
"name": "Nombre del grupo de proxy",
"icon": "Icono del grupo de proxy",
"proxies": "Incluir proxies",
"provider": "Incluir proveedor de proxies",
"healthCheckUrl": "URL de prueba de salud",
"expectedStatus": "Código de estado esperado",
"interval": "Intervalo de comprobación",
"timeout": "Tiempo de espera",
"maxFailedTimes": "Número máximo de fallos",
"interfaceName": "Nombre de la interfaz de salida",
"routingMark": "Marca de enrutamiento",
"filter": "Filtrar nodos",
"excludeFilter": "Excluir nodos",
"excludeType": "Tipo de nodo a excluir",
"includeAll": "Incluir todos los proxies de salida y proveedores de proxies",
"includeAllProxies": "Incluir todos los proxies de salida",
"includeAllProviders": "Incluir todos los proveedores de proxies"
},
"toggles": {
"lazy": "Estado de inactividad",
"disableUdp": "Deshabilitar UDP",
"hidden": "Ocultar grupo de proxy"
},
"actions": {
"prepend": "Agregar grupo de proxy previo",
"append": "Agregar grupo de proxy posterior"
}
},
"toggles": {
"lazy": "Estado de inactividad",
"disableUdp": "Deshabilitar UDP",
"hidden": "Ocultar grupo de proxy"
"editor": {
"actions": {
"format": "Formatear documento"
},
"messages": {
"readOnly": "No se puede editar en modo de solo lectura"
}
},
"actions": {
"prepend": "Agregar grupo de proxy previo",
"append": "Agregar grupo de proxy posterior"
}
},
"fileInput": {
"chooseFile": "Elegir archivo"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "La última actualización falló",
"nextUp": "Próxima actualización",
"noSchedule": "Sin programación",
"unknown": "Desconocido",
"autoUpdateDisabled": "La actualización automática está deshabilitada"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "Confirmar eliminación",
"message": "Esta operación no se puede deshacer"
}
},
"editor": {
"format": "Formatear documento",
"readOnlyMessage": "No se puede editar en modo de solo lectura"
},
"logViewer": {
"title": "Salida de la consola del script"
},
"card": {
"labels": {
"from": "De",
"updateTime": "Hora de actualización",
"usedTotal": "Utilizado / Total",
"expireTime": "Tiempo de expiración",
"clickToImport": "Haga clic para importar una suscripción"
},
"logViewer": {
"title": "Salida de la consola del script"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "بزرگ‌نمایی",
"minimize": "کوچک‌نمایی"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "تجسم",
"advanced": "پیشرفته"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "پروفایل با موفقیت وارد شد",
"importSubscriptionSuccess": "وارد کردن اشتراک با موفقیت انجام شد",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "پروفایل‌ها",
"header": {
"title": "پروفایل‌ها"
},
"actions": {
"updateAll": "به‌روزرسانی همه پروفایل‌ها",
"viewRuntimeConfig": "مشاهده پیکربندی زمان اجرا",
@@ -82,172 +90,184 @@
"import": "وارد کردن"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
"header": {
"title": "Batch Operations"
},
"actions": {
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done"
},
"summary": {
"selected": "Selected",
"items": "items"
}
},
"import": {
"importForm": {
"placeholder": "آدرس پروفایل",
"paste": "چسباندن",
"clear": "پاک کردن"
"actions": {
"paste": "چسباندن",
"clear": "پاک کردن"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "فقط فایل‌های YAML پشتیبانی می‌شوند"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "پروفایل تغییر یافت",
"profileReactivated": "پروفایل مجدداً فعال شد",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "فقط فایل‌های YAML پشتیبانی می‌شوند"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "پروفایل تغییر یافت",
"profileReactivated": "پروفایل مجدداً فعال شد",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "پروفایل با موفقیت وارد شد",
"importSubscriptionSuccess": "وارد کردن اشتراک با موفقیت انجام شد",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "ایجاد پروفایل",
"edit": "ویرایش پروفایل"
"components": {
"card": {
"labels": {
"from": "از",
"updateTime": "زمان به‌روزرسانی",
"usedTotal": "استفاده‌شده / کل",
"expireTime": "زمان انقضا",
"clickToImport": "Click to import subscription"
}
},
"fields": {
"type": "نوع",
"name": "نام",
"description": "توضیحات",
"subscriptionUrl": "آدرس اشتراک",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "فاصله زمانی به‌روزرسانی",
"useSystemProxy": "استفاده از پراکسی سیستم",
"useClashProxy": "استفاده از پراکسی Clash",
"acceptInvalidCerts": "پذیرش گواهی‌نامه‌های نامعتبر (خطرناک)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "انتخاب فایل"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
"menu": {
"home": "Home",
"select": "انتخاب",
"editInfo": "ویرایش اطلاعات",
"editFile": "ویرایش فایل",
"editRules": "ویرایش قوانین",
"editProxies": "ویرایش پروکسی‌ها",
"editGroups": "ویرایش گروه‌های پروکسی",
"extendConfig": "توسعه پیکربندی",
"extendScript": "ادغام اسکریپت",
"openFile": "باز کردن فایل",
"update": "به‌روزرسانی",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
}
},
"menu": {
"home": "Home",
"select": "انتخاب",
"editInfo": "ویرایش اطلاعات",
"editFile": "ویرایش فایل",
"editRules": "ویرایش قوانین",
"editProxies": "ویرایش پروکسی‌ها",
"editGroups": "ویرایش گروه‌های پروکسی",
"extendConfig": "توسعه پیکربندی",
"extendScript": "ادغام اسکریپت",
"openFile": "باز کردن فایل",
"update": "به‌روزرسانی",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "ویرایش پروکسی‌ها",
"placeholders": {
"multiUri": "استفاده از خطوط جدید برای چندین آدرس (پشتیبانی از رمزگذاری Base64)"
"modals": {
"profileForm": {
"title": {
"create": "ایجاد پروفایل",
"edit": "ویرایش پروفایل"
},
"fields": {
"type": "نوع",
"name": "نام",
"description": "توضیحات",
"subscriptionUrl": "آدرس اشتراک",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "فاصله زمانی به‌روزرسانی",
"useSystemProxy": "استفاده از پراکسی سیستم",
"useClashProxy": "استفاده از پراکسی Clash",
"acceptInvalidCerts": "پذیرش گواهی‌نامه‌های نامعتبر (خطرناک)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
}
},
"actions": {
"prepend": "پیش‌افزودن پراکسی",
"append": "پس‌افزودن پراکسی"
}
},
"groupsEditor": {
"title": "ویرایش گروه‌های پروکسی",
"errors": {
"nameRequired": "نام گروه مورد نیاز است",
"nameExists": "نام گروه قبلا وجود دارد"
"proxiesEditor": {
"title": "ویرایش پروکسیها",
"placeholders": {
"multiUri": "استفاده از خطوط جدید برای چندین آدرس (پشتیبانی از رمزگذاری Base64)"
},
"actions": {
"prepend": "پیش‌افزودن پراکسی",
"append": "پس‌افزودن پراکسی"
}
},
"fields": {
"type": "نوع گروه",
"name": "نام گروه",
"icon": "آیکون گروه پراکسی",
"proxies": "استفاده از پروکسی‌ها",
"provider": "استفاده از ارائه‌دهنده",
"healthCheckUrl": "آدرس بررسی سلامت",
"expectedStatus": "وضعیت مورد انتظار",
"interval": "فاصله زمانی",
"timeout": "زمان قطع",
"maxFailedTimes": "حداکثر تعداد شکستها",
"interfaceName": "نام رابط",
"routingMark": "علامت مسیریابی",
"filter": "فیلتر",
"excludeFilter": "فیلتر استثناء",
"excludeType": "نوع استثناء",
"includeAll": "شامل همه پروکسی‌ها و ارائه‌دهندهها",
"includeAllProxies": "شامل همه پروکسی‌ها",
"includeAllProviders": "شامل همه ارائه‌دهنده‌ها"
"groupsEditor": {
"title": "ویرایش گروه‌های پروکسی",
"errors": {
"nameRequired": ام گروه مورد نیاز است",
"nameExists": "نام گروه قبلا وجود دارد"
},
"fields": {
"type": "نوع گروه",
"name": "نام گروه",
"icon": "آیکون گروه پراکسی",
"proxies": "استفاده از پروکسیها",
"provider": "استفاده از ارائه‌دهنده",
"healthCheckUrl": "آدرس بررسی سلامت",
"expectedStatus": "وضعیت مورد انتظار",
"interval": "فاصله زمانی",
"timeout": "زمان قطع",
"maxFailedTimes": "حداکثر تعداد شکستها",
"interfaceName": "نام رابط",
"routingMark": "علامت مسیریابی",
"filter": "فیلتر",
"excludeFilter": "فیلتر استثناء",
"excludeType": "نوع استثناء",
"includeAll": "شامل همه پروکسی‌ها و ارائه‌دهنده‌ها",
"includeAllProxies": "شامل همه پروکسی‌ها",
"includeAllProviders": "شامل همه ارائه‌دهنده‌ها"
},
"toggles": {
"lazy": "تنبل",
"disableUdp": "غیرفعال کردن UDP",
"hidden": "مخفی"
},
"actions": {
"prepend": "اضافه کردن گروه به ابتدا",
"append": "اضافه کردن گروه به انتها"
}
},
"toggles": {
"lazy": "تنبل",
"disableUdp": "غیرفعال کردن UDP",
"hidden": "مخفی"
"editor": {
"actions": {
"format": "فرمت‌بندی سند"
},
"messages": {
"readOnly": "نمی‌توان در ویرایشگر فقط خواندنی ویرایش کرد"
}
},
"actions": {
"prepend": "اضافه کردن گروه به ابتدا",
"append": "اضافه کردن گروه به انتها"
}
},
"fileInput": {
"chooseFile": "انتخاب فایل"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "تأیید حذف",
"message": "این عملیات قابل برگشت نیست"
}
},
"editor": {
"format": "فرمت‌بندی سند",
"readOnlyMessage": "نمی‌توان در ویرایشگر فقط خواندنی ویرایش کرد"
},
"logViewer": {
"title": "کنسول اسکریپت"
},
"card": {
"labels": {
"from": "از",
"updateTime": "زمان به‌روزرسانی",
"usedTotal": "استفاده‌شده / کل",
"expireTime": "زمان انقضا",
"clickToImport": "Click to import subscription"
},
"logViewer": {
"title": "کنسول اسکریپت"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "Maksimalkan",
"minimize": "Minimalkan"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "Visualisasi",
"advanced": "Lanjutan"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "Profil Berhasil Diimpor",
"importSubscriptionSuccess": "Berlangganan Berhasil Diimpor",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "Profil",
"header": {
"title": "Profil"
},
"actions": {
"updateAll": "Perbarui Semua Profil",
"viewRuntimeConfig": "Lihat Konfigurasi Runtime",
@@ -82,172 +90,184 @@
"import": "Impor"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
"header": {
"title": "Batch Operations"
},
"actions": {
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done"
},
"summary": {
"selected": "Selected",
"items": "items"
}
},
"import": {
"importForm": {
"placeholder": "URL Profil",
"paste": "Tempel",
"clear": "Bersihkan"
"actions": {
"paste": "Tempel",
"clear": "Bersihkan"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Hanya File YAML yang Didukung"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profil Beralih",
"profileReactivated": "Profil Diaktifkan Kembali",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Hanya File YAML yang Didukung"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profil Beralih",
"profileReactivated": "Profil Diaktifkan Kembali",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "Profil Berhasil Diimpor",
"importSubscriptionSuccess": "Berlangganan Berhasil Diimpor",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "Buat Profil",
"edit": "Ubah Profil"
"components": {
"card": {
"labels": {
"from": "Dari",
"updateTime": "Waktu Pembaruan",
"usedTotal": "Digunakan / Total",
"expireTime": "Waktu Kedaluwarsa",
"clickToImport": "Click to import subscription"
}
},
"fields": {
"type": "Jenis",
"name": "Nama",
"description": "Deskripsi",
"subscriptionUrl": "URL Langganan",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Interval Pembaruan",
"useSystemProxy": "Gunakan Proksi Sistem",
"useClashProxy": "Gunakan Proksi Clash",
"acceptInvalidCerts": "Terima Sertifikat Tidak Valid (Bahaya)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "Pilih Berkas"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
"menu": {
"home": "Home",
"select": "Pilih",
"editInfo": "Ubah Info",
"editFile": "Ubah Berkas",
"editRules": "Ubah Aturan",
"editProxies": "Ubah Proksi",
"editGroups": "Ubah Grup Proksi",
"extendConfig": "Perluas Konfigurasi",
"extendScript": "Perluas Skrip",
"openFile": "Buka Berkas",
"update": "Perbarui",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
}
},
"menu": {
"home": "Home",
"select": "Pilih",
"editInfo": "Ubah Info",
"editFile": "Ubah Berkas",
"editRules": "Ubah Aturan",
"editProxies": "Ubah Proksi",
"editGroups": "Ubah Grup Proksi",
"extendConfig": "Perluas Konfigurasi",
"extendScript": "Perluas Skrip",
"openFile": "Buka Berkas",
"update": "Perbarui",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "Ubah Proksi",
"placeholders": {
"multiUri": "Gunakan baris baru untuk beberapa URI (mendukung pengkodean Base64)"
"modals": {
"profileForm": {
"title": {
"create": "Buat Profil",
"edit": "Ubah Profil"
},
"fields": {
"type": "Jenis",
"name": "Nama",
"description": "Deskripsi",
"subscriptionUrl": "URL Langganan",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Interval Pembaruan",
"useSystemProxy": "Gunakan Proksi Sistem",
"useClashProxy": "Gunakan Proksi Clash",
"acceptInvalidCerts": "Terima Sertifikat Tidak Valid (Bahaya)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
}
},
"actions": {
"prepend": "Tambahkan Proksi di Awal",
"append": "Tambahkan Proksi di Akhir"
}
},
"groupsEditor": {
"title": "Ubah Grup Proksi",
"errors": {
"nameRequired": "Nama Grup Diperlukan",
"nameExists": "Nama Grup Sudah Ada"
"proxiesEditor": {
"title": "Ubah Proksi",
"placeholders": {
"multiUri": "Gunakan baris baru untuk beberapa URI (mendukung pengkodean Base64)"
},
"actions": {
"prepend": "Tambahkan Proksi di Awal",
"append": "Tambahkan Proksi di Akhir"
}
},
"fields": {
"type": "Jenis Grup",
"name": "Nama Grup",
"icon": "Ikon Grup Proksi",
"proxies": "Gunakan Proksi",
"provider": "Gunakan Penyedia",
"healthCheckUrl": "URL Pemeriksaan Kesehatan",
"expectedStatus": "Status yang Diharapkan",
"interval": "Interval",
"timeout": "Waktu Habis",
"maxFailedTimes": "Jumlah Gagal Maksimal",
"interfaceName": "Nama Antarmuka",
"routingMark": "Tanda Routing",
"filter": "Filter",
"excludeFilter": "Kecualikan Filter",
"excludeType": "Kecualikan Jenis",
"includeAll": "Sertakan Semua Proksi dan Penyedia",
"includeAllProxies": "Sertakan Semua Proksi",
"includeAllProviders": "Sertakan Semua Penyedia"
"groupsEditor": {
"title": "Ubah Grup Proksi",
"errors": {
"nameRequired": "Nama Grup Diperlukan",
"nameExists": "Nama Grup Sudah Ada"
},
"fields": {
"type": "Jenis Grup",
"name": "Nama Grup",
"icon": "Ikon Grup Proksi",
"proxies": "Gunakan Proksi",
"provider": "Gunakan Penyedia",
"healthCheckUrl": "URL Pemeriksaan Kesehatan",
"expectedStatus": "Status yang Diharapkan",
"interval": "Interval",
"timeout": "Waktu Habis",
"maxFailedTimes": "Jumlah Gagal Maksimal",
"interfaceName": "Nama Antarmuka",
"routingMark": "Tanda Routing",
"filter": "Filter",
"excludeFilter": "Kecualikan Filter",
"excludeType": "Kecualikan Jenis",
"includeAll": "Sertakan Semua Proksi dan Penyedia",
"includeAllProxies": "Sertakan Semua Proksi",
"includeAllProviders": "Sertakan Semua Penyedia"
},
"toggles": {
"lazy": "Malas",
"disableUdp": "Nonaktifkan UDP",
"hidden": "Tersembunyi"
},
"actions": {
"prepend": "Tambahkan Grup di Awal",
"append": "Tambahkan Grup di Akhir"
}
},
"toggles": {
"lazy": "Malas",
"disableUdp": "Nonaktifkan UDP",
"hidden": "Tersembunyi"
"editor": {
"actions": {
"format": "Format dokumen"
},
"messages": {
"readOnly": "Tidak dapat mengedit di editor hanya baca"
}
},
"actions": {
"prepend": "Tambahkan Grup di Awal",
"append": "Tambahkan Grup di Akhir"
}
},
"fileInput": {
"chooseFile": "Pilih Berkas"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "Konfirmasi penghapusan",
"message": "Operasi ini tidak dapat dibatalkan"
}
},
"editor": {
"format": "Format dokumen",
"readOnlyMessage": "Tidak dapat mengedit di editor hanya baca"
},
"logViewer": {
"title": "Konsol Skrip"
},
"card": {
"labels": {
"from": "Dari",
"updateTime": "Waktu Pembaruan",
"usedTotal": "Digunakan / Total",
"expireTime": "Waktu Kedaluwarsa",
"clickToImport": "Click to import subscription"
},
"logViewer": {
"title": "Konsol Skrip"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "最大化",
"minimize": "最小化"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "可視化",
"advanced": "詳細設定"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "プロファイルのインポートに成功しました。",
"importSubscriptionSuccess": "サブスクリプションのインポートに成功しました。",
"importWithClashProxy": "Clashプロキシを使用してプロファイルのインポートに成功しました。",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "プロファイル",
"header": {
"title": "プロファイル"
},
"actions": {
"updateAll": "すべてのプロファイルを更新",
"viewRuntimeConfig": "実行時のプロファイルを表示",
@@ -82,172 +90,184 @@
"import": "インポート"
},
"batch": {
"title": "バッチ操作",
"delete": "選択したプロファイルを削除",
"selectAll": "すべて選択",
"deselectAll": "すべての選択を解除",
"done": "完了",
"selected": "選択済み",
"items": "アイテム"
"header": {
"title": "バッチ操作"
},
"actions": {
"delete": "選択したプロファイルを削除",
"selectAll": "すべて選択",
"deselectAll": "すべての選択を解除",
"done": "完了"
},
"summary": {
"selected": "選択済み",
"items": "アイテム"
}
},
"import": {
"importForm": {
"placeholder": "プロファイルファイルのURL",
"paste": "貼り付け",
"clear": "クリア"
"actions": {
"paste": "貼り付け",
"clear": "クリア"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "YAMLファイルのみサポートされています。"
},
"notifications": {
"importRetry": "インポートに失敗しました。Clashプロキシを使用して再試行します...",
"importFail": "Clashプロキシを使用してもインポートに失敗しました。",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "プロファイルが切り替えられました。",
"profileReactivated": "プロファイルが再アクティブ化されました。",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "選択したプロファイルが正常に削除されました"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "YAMLファイルのみサポートされています。"
},
"notifications": {
"importRetry": "インポートに失敗しました。Clashプロキシを使用して再試行します...",
"importFail": "Clashプロキシを使用してもインポートに失敗しました。",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "プロファイルが切り替えられました。",
"profileReactivated": "プロファイルが再アクティブ化されました。",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "選択したプロファイルが正常に削除されました"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "プロファイルのインポートに成功しました。",
"importSubscriptionSuccess": "サブスクリプションのインポートに成功しました。",
"importWithClashProxy": "Clashプロキシを使用してプロファイルのインポートに成功しました。",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "新規プロファイルを作成",
"edit": "プロファイルを編集"
"components": {
"card": {
"labels": {
"from": "から",
"updateTime": "更新時間",
"usedTotal": "使用済み / 合計",
"expireTime": "有効期限",
"clickToImport": "クリックしてサブスクリプションをインポート"
}
},
"fields": {
"type": "タイプ",
"name": "名前",
"description": "説明",
"subscriptionUrl": "サブスクリプションURL",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "更新間隔",
"useSystemProxy": "システムプロキシを使用して更新",
"useClashProxy": "クラッシュプロキシを使用して更新",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "ファイルを選択"
},
"notifications": {
"creationRetry": "プロファイルの作成に失敗しました。Clashプロキシを使用して再試行します...",
"creationSuccess": "Clashプロキシを使用してプロファイルの作成に成功しました。"
"menu": {
"home": "ホーム",
"select": "使用する",
"editInfo": "情報を編集",
"editFile": "ファイルを編集",
"editRules": "ルールを編集",
"editProxies": "ノードを編集",
"editGroups": "プロキシグループを編集",
"extendConfig": "拡張上書き設定",
"extendScript": "拡張スクリプト",
"openFile": "ファイルを開く",
"update": "更新",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "前回の更新に失敗しました。",
"nextUp": "次回の更新",
"noSchedule": "予定がありません。",
"unknown": "不明",
"autoUpdateDisabled": "自動更新が無効になっています。"
}
}
},
"menu": {
"home": "ホーム",
"select": "使用する",
"editInfo": "情報を編集",
"editFile": "ファイルを編集",
"editRules": "ルールを編集",
"editProxies": "ノードを編集",
"editGroups": "プロキシグループを編集",
"extendConfig": "拡張上書き設定",
"extendScript": "拡張スクリプト",
"openFile": "ファイルを開く",
"update": "更新",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "ノードを編集",
"placeholders": {
"multiUri": "複数のURIは改行で区切ってくださいBase64エンコードに対応"
"modals": {
"profileForm": {
"title": {
"create": "新規プロファイルを作成",
"edit": "プロファイルを編集"
},
"fields": {
"type": "タイプ",
"name": "名前",
"description": "説明",
"subscriptionUrl": "サブスクリプションURL",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "更新間隔",
"useSystemProxy": "システムプロキシを使用して更新",
"useClashProxy": "クラッシュプロキシを使用して更新",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "プロファイルの作成に失敗しました。Clashプロキシを使用して再試行します...",
"creationSuccess": "Clashプロキシを使用してプロファイルの作成に成功しました。"
}
}
},
"actions": {
"prepend": "前置プロキシノードを追加",
"append": "後置プロキシノードを追加"
}
},
"groupsEditor": {
"title": "プロキシグループを編集",
"errors": {
"nameRequired": "プロキシグループ名は必須です",
"nameExists": "プロキシグループ名はすでに存在します"
"proxiesEditor": {
"title": "ノードを編集",
"placeholders": {
"multiUri": "複数のURIは改行で区切ってくださいBase64エンコードに対応"
},
"actions": {
"prepend": "前置プロキシノードを追加",
"append": "後置プロキシノードを追加"
}
},
"fields": {
"type": "プロキシグループタイプ",
"name": "プロキシグループ名",
"icon": "プロキシグループアイコン",
"proxies": "プロキシを導入",
"provider": "プロキシプロバイダーを導入",
"healthCheckUrl": "ヘルスチェックURL",
"expectedStatus": "期待するステータスコード",
"interval": "チェック間隔",
"timeout": "タイムアウト時間",
"maxFailedTimes": "最大失敗回数",
"interfaceName": "出力インターフェース",
"routingMark": "ルーティングマーク",
"filter": "ノードをフィルタリング",
"excludeFilter": "除外ノード",
"excludeType": "除外ノードタイプ",
"includeAll": "すべての出力プロキシ、プロキシプロバイダーを導入",
"includeAllProxies": "すべての出力プロキシを導入",
"includeAllProviders": "すべてのプロキシプロバイダーを導入"
"groupsEditor": {
"title": "プロキシグループを編集",
"errors": {
"nameRequired": "プロキシグループ名は必須です",
"nameExists": "プロキシグループ名はすでに存在します"
},
"fields": {
"type": "プロキシグループタイプ",
"name": "プロキシグループ名",
"icon": "プロキシグループアイコン",
"proxies": "プロキシを導入",
"provider": "プロキシプロバイダーを導入",
"healthCheckUrl": "ヘルスチェックURL",
"expectedStatus": "期待するステータスコード",
"interval": "チェック間隔",
"timeout": "タイムアウト時間",
"maxFailedTimes": "最大失敗回数",
"interfaceName": "出力インターフェース",
"routingMark": "ルーティングマーク",
"filter": "ノードをフィルタリング",
"excludeFilter": "除外ノード",
"excludeType": "除外ノードタイプ",
"includeAll": "すべての出力プロキシ、プロキシプロバイダーを導入",
"includeAllProxies": "すべての出力プロキシを導入",
"includeAllProviders": "すべてのプロキシプロバイダーを導入"
},
"toggles": {
"lazy": "遅延モード",
"disableUdp": "UDPを無効にする",
"hidden": "プロキシグループを隠す"
},
"actions": {
"prepend": "前置プロキシグループを追加",
"append": "後置プロキシグループを追加"
}
},
"toggles": {
"lazy": "遅延モード",
"disableUdp": "UDPを無効にする",
"hidden": "プロキシグループを隠す"
"editor": {
"actions": {
"format": "文書を整形する"
},
"messages": {
"readOnly": "読み取り専用モードでは編集できません。"
}
},
"actions": {
"prepend": "前置プロキシグループを追加",
"append": "後置プロキシグループを追加"
}
},
"fileInput": {
"chooseFile": "ファイルを選択"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "前回の更新に失敗しました。",
"nextUp": "次回の更新",
"noSchedule": "予定がありません。",
"unknown": "不明",
"autoUpdateDisabled": "自動更新が無効になっています。"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "削除を確認",
"message": "この操作は元に戻せません"
}
},
"editor": {
"format": "文書を整形する",
"readOnlyMessage": "読み取り専用モードでは編集できません。"
},
"logViewer": {
"title": "スクリプトコンソール出力"
},
"card": {
"labels": {
"from": "から",
"updateTime": "更新時間",
"usedTotal": "使用済み / 合計",
"expireTime": "有効期限",
"clickToImport": "クリックしてサブスクリプションをインポート"
},
"logViewer": {
"title": "スクリプトコンソール出力"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "최대화",
"minimize": "최소화"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "시각화",
"advanced": "고급"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "Profile Imported Successfully",
"importSubscriptionSuccess": "구독 가져오기 성공",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "프로필",
"header": {
"title": "프로필"
},
"actions": {
"updateAll": "모든 프로필 업데이트",
"viewRuntimeConfig": "런타임 설정 보기",
@@ -82,172 +90,184 @@
"import": "가져오기"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
"header": {
"title": "Batch Operations"
},
"actions": {
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done"
},
"summary": {
"selected": "Selected",
"items": "items"
}
},
"import": {
"importForm": {
"placeholder": "프로필 URL",
"paste": "붙여넣기",
"clear": "지우기"
"actions": {
"paste": "붙여넣기",
"clear": "지우기"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Only YAML Files Supported"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profile Switched",
"profileReactivated": "Profile Reactivated",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Only YAML Files Supported"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profile Switched",
"profileReactivated": "Profile Reactivated",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "Profile Imported Successfully",
"importSubscriptionSuccess": "구독 가져오기 성공",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "프로필 생성",
"edit": "프로필 편집"
"components": {
"card": {
"labels": {
"from": "출처",
"updateTime": "업데이트 시간",
"usedTotal": "사용됨 / 전체",
"expireTime": "만료 시간",
"clickToImport": "Click to import subscription"
}
},
"fields": {
"type": "유형",
"name": "이름",
"description": "설명",
"subscriptionUrl": "구독 URL",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "업데이트 간격",
"useSystemProxy": "시스템 프록시 사용",
"useClashProxy": "Clash 프록시 사용",
"acceptInvalidCerts": "잘못된 인증서 허용(위험)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "파일 선택"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
"menu": {
"home": "홈",
"select": "선택",
"editInfo": "정보 편집",
"editFile": "파일 편집",
"editRules": "규칙 편집",
"editProxies": "프록시 편집",
"editGroups": "프록시 그룹 편집",
"extendConfig": "설정 확장",
"extendScript": "스크립트 확장",
"openFile": "파일 열기",
"update": "업데이트",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
}
},
"menu": {
"home": "홈",
"select": "선택",
"editInfo": "정보 편집",
"editFile": "파일 편집",
"editRules": "규칙 편집",
"editProxies": "프록시 편집",
"editGroups": "프록시 그룹 편집",
"extendConfig": "설정 확장",
"extendScript": "스크립트 확장",
"openFile": "파일 열기",
"update": "업데이트",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "프록시 편집",
"placeholders": {
"multiUri": "여러 URI의 경우 줄바꿈 사용(Base64 인코딩 지원)"
"modals": {
"profileForm": {
"title": {
"create": "프로필 생성",
"edit": "프로필 편집"
},
"fields": {
"type": "유형",
"name": "이름",
"description": "설명",
"subscriptionUrl": "구독 URL",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "업데이트 간격",
"useSystemProxy": "시스템 프록시 사용",
"useClashProxy": "Clash 프록시 사용",
"acceptInvalidCerts": "잘못된 인증서 허용(위험)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
}
},
"actions": {
"prepend": "프록시 앞에 추가",
"append": "프록시 뒤에 추가"
}
},
"groupsEditor": {
"title": "프록시 그룹 편집",
"errors": {
"nameRequired": "그룹 이름 필수",
"nameExists": "그룹 이름이 이미 존재함"
"proxiesEditor": {
"title": "프록시 편집",
"placeholders": {
"multiUri": "여러 URI의 경우 줄바꿈 사용(Base64 인코딩 지원)"
},
"actions": {
"prepend": "프록시 앞에 추가",
"append": "프록시 뒤에 추가"
}
},
"fields": {
"type": "그룹 유형",
"name": "그룹 이름",
"icon": "Proxy Group Icon",
"proxies": "프록시 사용",
"provider": "제공자 사용",
"healthCheckUrl": "상태 확인 URL",
"expectedStatus": "예상 상태",
"interval": "간격",
"timeout": "타임아웃",
"maxFailedTimes": "최대 실패 횟수",
"interfaceName": "인터페이스 이름",
"routingMark": "라우팅 마크",
"filter": "필터",
"excludeFilter": "제외 필터",
"excludeType": "제외 유형",
"includeAll": "모든 프록시 및 제공자 포함",
"includeAllProxies": "모든 프록시 포함",
"includeAllProviders": "모든 제공자 포함"
"groupsEditor": {
"title": "프록시 그룹 편집",
"errors": {
"nameRequired": "그룹 이름 필수",
"nameExists": "그룹 이름이 이미 존재함"
},
"fields": {
"type": "그룹 유형",
"name": "그룹 이름",
"icon": "Proxy Group Icon",
"proxies": "프록시 사용",
"provider": "제공자 사용",
"healthCheckUrl": "상태 확인 URL",
"expectedStatus": "예상 상태",
"interval": "간격",
"timeout": "타임아웃",
"maxFailedTimes": "최대 실패 횟수",
"interfaceName": "인터페이스 이름",
"routingMark": "라우팅 마크",
"filter": "필터",
"excludeFilter": "제외 필터",
"excludeType": "제외 유형",
"includeAll": "모든 프록시 및 제공자 포함",
"includeAllProxies": "모든 프록시 포함",
"includeAllProviders": "모든 제공자 포함"
},
"toggles": {
"lazy": "지연 로딩",
"disableUdp": "UDP 비활성화",
"hidden": "숨김"
},
"actions": {
"prepend": "그룹 앞에 추가",
"append": "그룹 뒤에 추가"
}
},
"toggles": {
"lazy": "지연 로딩",
"disableUdp": "UDP 비활성화",
"hidden": "숨김"
"editor": {
"actions": {
"format": "문서 포맷"
},
"messages": {
"readOnly": "Cannot edit in read-only editor"
}
},
"actions": {
"prepend": "그룹 앞에 추가",
"append": "그룹 뒤에 추가"
}
},
"fileInput": {
"chooseFile": "파일 선택"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "삭제 확인",
"message": "이 작업은 되돌릴 수 없습니다"
}
},
"editor": {
"format": "문서 포맷",
"readOnlyMessage": "Cannot edit in read-only editor"
},
"logViewer": {
"title": "스크립트 콘솔"
},
"card": {
"labels": {
"from": "출처",
"updateTime": "업데이트 시간",
"usedTotal": "사용됨 / 전체",
"expireTime": "만료 시간",
"clickToImport": "Click to import subscription"
},
"logViewer": {
"title": "스크립트 콘솔"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "Развернуть",
"minimize": "Свернуть"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "Визуализация",
"advanced": "Дополнительно"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "Профиль успешно импортирован",
"importSubscriptionSuccess": "Подписка успешно импортирована",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "Профили",
"header": {
"title": "Профили"
},
"actions": {
"updateAll": "Обновить все профили",
"viewRuntimeConfig": "Просмотреть используемый конфиг",
@@ -82,172 +90,184 @@
"import": "Импорт"
},
"batch": {
"title": "Пакетные операции",
"delete": "Удалить выбранные профили",
"selectAll": "Выбрать все",
"deselectAll": "Отменить выбор всех",
"done": "Готово",
"selected": "Выбрано",
"items": "элементы"
"header": {
"title": "Пакетные операции"
},
"actions": {
"delete": "Удалить выбранные профили",
"selectAll": "Выбрать все",
"deselectAll": "Отменить выбор всех",
"done": "Готово"
},
"summary": {
"selected": "Выбрано",
"items": "элементы"
}
},
"import": {
"importForm": {
"placeholder": "URL профиля",
"paste": "Вставить",
"clear": "Очистить"
"actions": {
"paste": "Вставить",
"clear": "Очистить"
}
},
"errors": {
"invalidUrl": "Недопустимая ссылка на профиль, введите адрес, начинающийся с http:// или https://",
"onlyYaml": "Поддерживаются только файлы YAML"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Профиль изменен",
"profileReactivated": "Профиль перезапущен",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Выбранные профили успешно удалены"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Недопустимая ссылка на профиль, введите адрес, начинающийся с http:// или https://",
"onlyYaml": "Поддерживаются только файлы YAML"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Профиль изменен",
"profileReactivated": "Профиль перезапущен",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Выбранные профили успешно удалены"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "Профиль успешно импортирован",
"importSubscriptionSuccess": "Подписка успешно импортирована",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "Создать профиль",
"edit": "Изменить профиль"
"components": {
"card": {
"labels": {
"from": "От",
"updateTime": "Время обновления",
"usedTotal": "Использовано / Всего",
"expireTime": "Время окончания",
"clickToImport": "Нажмите, чтобы импортировать подписку"
}
},
"fields": {
"type": "Тип",
"name": "Название",
"description": "Описание",
"subscriptionUrl": "URL подписки",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Интервал обновления",
"useSystemProxy": "Использовать системный прокси для обновления",
"useClashProxy": "Использовать прокси Clash для обновления",
"acceptInvalidCerts": "Принимать недействительные сертификаты (ОПАСНО)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "Выбрать файл"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
"menu": {
"home": "Главная",
"select": "Выбрать",
"editInfo": "Изменить информацию",
"editFile": "Изменить файл",
"editRules": "Редактировать правила",
"editProxies": "Редактировать прокси",
"editGroups": "Редактировать группы прокси",
"extendConfig": "Изменить Merge",
"extendScript": "Изменить Script",
"openFile": "Открыть файл",
"update": "Обновить",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
}
},
"menu": {
"home": "Главная",
"select": "Выбрать",
"editInfo": "Изменить информацию",
"editFile": "Изменить файл",
"editRules": "Редактировать правила",
"editProxies": "Редактировать прокси",
"editGroups": "Редактировать группы прокси",
"extendConfig": "Изменить Merge",
"extendScript": "Изменить Script",
"openFile": "Открыть файл",
"update": "Обновить",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "Редактировать прокси",
"placeholders": {
"multiUri": "Используйте символы новой строки для нескольких URI (поддерживается кодировка Base64)"
"modals": {
"profileForm": {
"title": {
"create": "Создать профиль",
"edit": "Изменить профиль"
},
"fields": {
"type": "Тип",
"name": "Название",
"description": "Описание",
"subscriptionUrl": "URL подписки",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Интервал обновления",
"useSystemProxy": "Использовать системный прокси для обновления",
"useClashProxy": "Использовать прокси Clash для обновления",
"acceptInvalidCerts": "Принимать недействительные сертификаты (ОПАСНО)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
}
},
"actions": {
"prepend": "Добавить прокси в начало",
"append": "Добавить прокси в конец"
}
},
"groupsEditor": {
"title": "Редактировать группы прокси",
"errors": {
"nameRequired": "Требуется имя группы",
"nameExists": "Имя группы уже существует"
"proxiesEditor": {
"title": "Редактировать прокси",
"placeholders": {
"multiUri": "Используйте символы новой строки для нескольких URI (поддерживается кодировка Base64)"
},
"actions": {
"prepend": "Добавить прокси в начало",
"append": "Добавить прокси в конец"
}
},
"fields": {
"type": "Тип группы",
"name": "Имя группы",
"icon": "Иконка Группы прокси",
"proxies": "Использовать прокси",
"provider": "Использовать провайдера",
"healthCheckUrl": "URL проверки здоровья",
"expectedStatus": "Ожидаемый статус",
"interval": "Интервал",
"timeout": "Таймаут",
"maxFailedTimes": "Максимальное количество неудач",
"interfaceName": "Имя интерфейса",
"routingMark": "Марка маршрутизации",
"filter": "Фильтр",
"excludeFilter": "Исключить фильтр",
"excludeType": "Тип исключения",
"includeAll": "Включить все прокси и провайдеры",
"includeAllProxies": "Включить все прокси",
"includeAllProviders": "Включить всех провайдеров"
"groupsEditor": {
"title": "Редактировать группы прокси",
"errors": {
"nameRequired": "Требуется имя группы",
"nameExists": "Имя группы уже существует"
},
"fields": {
"type": "Тип группы",
"name": "Имя группы",
"icon": "Иконка Группы прокси",
"proxies": "Использовать прокси",
"provider": "Использовать провайдера",
"healthCheckUrl": "URL проверки здоровья",
"expectedStatus": "Ожидаемый статус",
"interval": "Интервал",
"timeout": "Таймаут",
"maxFailedTimes": "Максимальное количество неудач",
"interfaceName": "Имя интерфейса",
"routingMark": "Марка маршрутизации",
"filter": "Фильтр",
"excludeFilter": "Исключить фильтр",
"excludeType": "Тип исключения",
"includeAll": "Включить все прокси и провайдеры",
"includeAllProxies": "Включить все прокси",
"includeAllProviders": "Включить всех провайдеров"
},
"toggles": {
"lazy": "Ленивый",
"disableUdp": "Отключить UDP",
"hidden": "Скрытый"
},
"actions": {
"prepend": "Добавить группу в начало",
"append": "Добавить группу в конец"
}
},
"toggles": {
"lazy": "Ленивый",
"disableUdp": "Отключить UDP",
"hidden": "Скрытый"
"editor": {
"actions": {
"format": "Форматировать документ"
},
"messages": {
"readOnly": "Невозможно редактировать в режиме только для чтения"
}
},
"actions": {
"prepend": "Добавить группу в начало",
"append": "Добавить группу в конец"
}
},
"fileInput": {
"chooseFile": "Выбрать файл"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "Подтвердите удаление",
"message": "Эта операция необратима"
}
},
"editor": {
"format": "Форматировать документ",
"readOnlyMessage": "Невозможно редактировать в режиме только для чтения"
},
"logViewer": {
"title": "Консоль скрипта"
},
"card": {
"labels": {
"from": "От",
"updateTime": "Время обновления",
"usedTotal": "Использовано / Всего",
"expireTime": "Время окончания",
"clickToImport": "Нажмите, чтобы импортировать подписку"
},
"logViewer": {
"title": "Консоль скрипта"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "Büyüt",
"minimize": "Küçült"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "Görselleştirme",
"advanced": "Gelişmiş"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "Profil Başarıyla İçe Aktarıldı",
"importSubscriptionSuccess": "Abonelik içe aktarımı başarılı",
"importWithClashProxy": "Profil Clash vekil ile içe aktarıldı",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "Profiller",
"header": {
"title": "Profiller"
},
"actions": {
"updateAll": "Tüm Profilleri Güncelle",
"viewRuntimeConfig": "Çalışma Zamanı Yapılandırmasını Görüntüle",
@@ -82,172 +90,184 @@
"import": "İçe Aktar"
},
"batch": {
"title": "Toplu İşlemler",
"delete": "Seçili Profilleri Sil",
"selectAll": "Tümünü Seç",
"deselectAll": "Tüm Seçimi Kaldır",
"done": "Tamam",
"selected": "Seçildi",
"items": "öğeler"
"header": {
"title": "Toplu İşlemler"
},
"actions": {
"delete": "Seçili Profilleri Sil",
"selectAll": "Tümünü Seç",
"deselectAll": "Tüm Seçimi Kaldır",
"done": "Tamam"
},
"summary": {
"selected": "Seçildi",
"items": "öğeler"
}
},
"import": {
"importForm": {
"placeholder": "Profil URL'si",
"paste": "Yapıştır",
"clear": "Temizle"
"actions": {
"paste": "Yapıştır",
"clear": "Temizle"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Yalnızca YAML Dosyaları Desteklenir"
},
"notifications": {
"importRetry": "İçe aktarma başarısız oldu, Clash vekil ile yeniden deneniyor...",
"importFail": "Clash vekil ile bile içe aktarma başarısız oldu",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profil Değiştirildi",
"profileReactivated": "Profil Yeniden Etkinleştirildi",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Seçili profiller başarıyla silindi"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Yalnızca YAML Dosyaları Desteklenir"
},
"notifications": {
"importRetry": "İçe aktarma başarısız oldu, Clash vekil ile yeniden deneniyor...",
"importFail": "Clash vekil ile bile içe aktarma başarısız oldu",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profil Değiştirildi",
"profileReactivated": "Profil Yeniden Etkinleştirildi",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Seçili profiller başarıyla silindi"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "Profil Başarıyla İçe Aktarıldı",
"importSubscriptionSuccess": "Abonelik içe aktarımı başarılı",
"importWithClashProxy": "Profil Clash vekil ile içe aktarıldı",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "Profil Oluştur",
"edit": "Profili Düzenle"
"components": {
"card": {
"labels": {
"from": "Kaynak",
"updateTime": "Güncelleme Zamanı",
"usedTotal": "Kullanılan / Toplam",
"expireTime": "Sona Erme Zamanı",
"clickToImport": "Abonelik içe aktarmak için tıklayın"
}
},
"fields": {
"type": "Tip",
"name": "İsim",
"description": "Açıklamalar",
"subscriptionUrl": "Abonelik URL'si",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Güncelleme Aralığı",
"useSystemProxy": "Sistem Vekil'ini Kullan",
"useClashProxy": "Clash Vekil'ini Kullan",
"acceptInvalidCerts": "Geçersiz Sertifikalara İzin Ver (Tehlikeli)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "Dosya Seç"
},
"notifications": {
"creationRetry": "Profil oluşturma başarısız oldu, Clash vekil ile yeniden deneniyor...",
"creationSuccess": "Clash vekil ile profil oluşturma başarılı oldu"
"menu": {
"home": "Ana Sayfa",
"select": "Seç",
"editInfo": "Bilgileri Düzenle",
"editFile": "Dosyayı Düzenle",
"editRules": "Kuralları Düzenle",
"editProxies": "Vekil'leri Düzenle",
"editGroups": "Vekil Gruplarını Düzenle",
"extendConfig": "Yapılandırma Genişletme",
"extendScript": "Betik Genişletme",
"openFile": "Dosyayı Aç",
"update": "Güncelle",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Son güncelleme başarısız oldu",
"nextUp": "Sıradaki",
"noSchedule": "Program yok",
"unknown": "Bilinmiyor",
"autoUpdateDisabled": "Otomatik güncelleme devre dışı"
}
}
},
"menu": {
"home": "Ana Sayfa",
"select": "Seç",
"editInfo": "Bilgileri Düzenle",
"editFile": "Dosyayı Düzenle",
"editRules": "Kuralları Düzenle",
"editProxies": "Vekil'leri Düzenle",
"editGroups": "Vekil Gruplarını Düzenle",
"extendConfig": "Yapılandırma Genişletme",
"extendScript": "Betik Genişletme",
"openFile": "Dosyayı",
"update": "Güncelle",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "Vekil'leri Düzenle",
"placeholders": {
"multiUri": "Birden fazla URI için yeni satırlar kullanın (Base64 kodlaması desteklenir)"
"modals": {
"profileForm": {
"title": {
"create": "Profil Oluştur",
"edit": "Profili Düzenle"
},
"fields": {
"type": "Tip",
"name": "İsim",
"description": "ıklamalar",
"subscriptionUrl": "Abonelik URL'si",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Güncelleme Aralığı",
"useSystemProxy": "Sistem Vekil'ini Kullan",
"useClashProxy": "Clash Vekil'ini Kullan",
"acceptInvalidCerts": "Geçersiz Sertifikalara İzin Ver (Tehlikeli)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Profil oluşturma başarısız oldu, Clash vekil ile yeniden deneniyor...",
"creationSuccess": "Clash vekil ile profil oluşturma başarılı oldu"
}
}
},
"actions": {
"prepend": "Vekil'in Başına Ekle",
"append": "Vekil'in Sonuna Ekle"
}
},
"groupsEditor": {
"title": "Vekil Gruplarını Düzenle",
"errors": {
"nameRequired": "Grup Adı Gerekli",
"nameExists": "Grup Adı Zaten Var"
"proxiesEditor": {
"title": "Vekil'leri Düzenle",
"placeholders": {
"multiUri": "Birden fazla URI için yeni satırlar kullanın (Base64 kodlaması desteklenir)"
},
"actions": {
"prepend": "Vekil'in Başına Ekle",
"append": "Vekil'in Sonuna Ekle"
}
},
"fields": {
"type": "Grup Tipi",
"name": "Grup Adı",
"icon": "Vekil Grup Simgesi",
"proxies": "Vekil'leri Kullan",
"provider": "Sağlayıcı Kullan",
"healthCheckUrl": "Sağlık Kontrolü URL'si",
"expectedStatus": "Beklenen Durum",
"interval": "Aralık",
"timeout": "Zaman Aşımı",
"maxFailedTimes": "Maksimum Başarısız Deneme",
"interfaceName": "Arayüz Adı",
"routingMark": "Yönlendirme İşareti",
"filter": "Filtre",
"excludeFilter": "Hariç Tutma Filtresi",
"excludeType": "Hariç Tutma Tipi",
"includeAll": "Tüm Vekil'leri ve Sağlayıcıları Dahil Et",
"includeAllProxies": "Tüm Vekil'leri Dahil Et",
"includeAllProviders": "Tüm Sağlayıcıları Dahil Et"
"groupsEditor": {
"title": "Vekil Gruplarını Düzenle",
"errors": {
"nameRequired": "Grup Adı Gerekli",
"nameExists": "Grup Adı Zaten Var"
},
"fields": {
"type": "Grup Tipi",
"name": "Grup Adı",
"icon": "Vekil Grup Simgesi",
"proxies": "Vekil'leri Kullan",
"provider": "Sağlayıcı Kullan",
"healthCheckUrl": "Sağlık Kontrolü URL'si",
"expectedStatus": "Beklenen Durum",
"interval": "Aralık",
"timeout": "Zaman Aşımı",
"maxFailedTimes": "Maksimum Başarısız Deneme",
"interfaceName": "Arayüz Adı",
"routingMark": "Yönlendirme İşareti",
"filter": "Filtre",
"excludeFilter": "Hariç Tutma Filtresi",
"excludeType": "Hariç Tutma Tipi",
"includeAll": "Tüm Vekil'leri ve Sağlayıcıları Dahil Et",
"includeAllProxies": "Tüm Vekil'leri Dahil Et",
"includeAllProviders": "Tüm Sağlayıcıları Dahil Et"
},
"toggles": {
"lazy": "Tembel",
"disableUdp": "UDP'yi Devre Dışı Bırak",
"hidden": "Gizli"
},
"actions": {
"prepend": "Grubun Başına Ekle",
"append": "Grubun Sonuna Ekle"
}
},
"toggles": {
"lazy": "Tembel",
"disableUdp": "UDP'yi Devre Dışı Bırak",
"hidden": "Gizli"
"editor": {
"actions": {
"format": "Belgeyi biçimlendir"
},
"messages": {
"readOnly": "Salt okunur düzenleyicide düzenlenemez"
}
},
"actions": {
"prepend": "Grubun Başına Ekle",
"append": "Grubun Sonuna Ekle"
}
},
"fileInput": {
"chooseFile": "Dosya Seç"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Son güncelleme başarısız oldu",
"nextUp": "Sıradaki",
"noSchedule": "Program yok",
"unknown": "Bilinmiyor",
"autoUpdateDisabled": "Otomatik güncelleme devre dışı"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "Silmeyi Onayla",
"message": "Bu işlem geri alınamaz"
}
},
"editor": {
"format": "Belgeyi biçimlendir",
"readOnlyMessage": "Salt okunur düzenleyicide düzenlenemez"
},
"logViewer": {
"title": "Betik Konsolu"
},
"card": {
"labels": {
"from": "Kaynak",
"updateTime": "Güncelleme Zamanı",
"usedTotal": "Kullanılan / Toplam",
"expireTime": "Sona Erme Zamanı",
"clickToImport": "Abonelik içe aktarmak için tıklayın"
},
"logViewer": {
"title": "Betik Konsolu"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "Invalid regular expression"
},
"messages": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "Зурайту",
"minimize": "Кечерәйтү"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "Визуализация",
"advanced": "Өстәмә"
},
"feedback": {
"errors": {
"trafficStats": "Traffic Statistics Error",
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "Профиль уңышлы импортланды",
"importSubscriptionSuccess": "Import subscription successful",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
}
}
},
"profiles": {
"page": {
"title": "Профильләр",
"header": {
"title": "Профильләр"
},
"actions": {
"updateAll": "Барлык профильләрне яңарту",
"viewRuntimeConfig": "Кулланылган конфигурацияне карау",
@@ -82,172 +90,184 @@
"import": "Импорт"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
"header": {
"title": "Batch Operations"
},
"actions": {
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done"
},
"summary": {
"selected": "Selected",
"items": "items"
}
},
"import": {
"importForm": {
"placeholder": "Профиль URL-ы",
"paste": "Кую",
"clear": "Чистарту"
"actions": {
"paste": "Кую",
"clear": "Чистарту"
}
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Фәкать YAML-файллар гына хуплана"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Профиль алмаштырылды",
"profileReactivated": "Профиль яңадан активлаштырылды",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Фәкать YAML-файллар гына хуплана"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Профиль алмаштырылды",
"profileReactivated": "Профиль яңадан активлаштырылды",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "Профиль уңышлы импортланды",
"importSubscriptionSuccess": "Import subscription successful",
"importWithClashProxy": "Profile Imported with Clash proxy",
"saved": "Saved successfully"
},
"viewer": {
"title": {
"create": "Профиль булдыру",
"edit": "Профильне үзгәртү"
"components": {
"card": {
"labels": {
"from": "Каян",
"updateTime": "Яңарту вакыты",
"usedTotal": "Кулланылган / Барлыгы",
"expireTime": "Тамамлану вакыты",
"clickToImport": "Click to import subscription"
}
},
"fields": {
"type": "Төр",
"name": "Исем",
"description": "Тасвирламалар",
"subscriptionUrl": "Подписка URL-ы",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Яңарту интервалы",
"useSystemProxy": "Системалы проксины кулланып яңарту",
"useClashProxy": "Clash прокси кулланып яңарту",
"acceptInvalidCerts": "Дөрес булмаган сертификатларны кабул итү (Куркыныч)",
"allowAutoUpdate": "Allow Auto Update"
"fileInput": {
"chooseFile": "Файл сайлау"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
"menu": {
"home": "Home",
"select": "Сайлау",
"editInfo": "Мәгълүматны үзгәртү",
"editFile": "Файлны үзгәртү",
"editRules": "Кагыйдәләрне үзгәртү",
"editProxies": "Проксины үзгәртү",
"editGroups": "Прокси төркемнәрен үзгәртү",
"extendConfig": "Merge-ны үзгәртергә",
"extendScript": "Script-ны үзгәртергә",
"openFile": "Файлны ачу",
"update": "Яңарту",
"updateViaProxy": "Update via proxy"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
}
},
"menu": {
"home": "Home",
"select": "Сайлау",
"editInfo": "Мәгълүматны үзгәртү",
"editFile": "Файлны үзгәртү",
"editRules": "Кагыйдәләрне үзгәртү",
"editProxies": "Проксины үзгәртү",
"editGroups": "Прокси төркемнәрен үзгәртү",
"extendConfig": "Merge-ны үзгәртергә",
"extendScript": "Script-ны үзгәртергә",
"openFile": "Файлны ачу",
"update": "Яңарту",
"updateViaProxy": "Update via proxy"
},
"proxiesEditor": {
"title": "Проксины үзгәртү",
"placeholders": {
"multiUri": "Берничә URI өчен яңа юл символын кулланыгыз (Base64 кодлавы ярдәм ителә)"
"modals": {
"profileForm": {
"title": {
"create": "Профиль булдыру",
"edit": "Профильне үзгәртү"
},
"fields": {
"type": "Төр",
"name": "Исем",
"description": "Тасвирламалар",
"subscriptionUrl": "Подписка URL-ы",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Яңарту интервалы",
"useSystemProxy": "Системалы проксины кулланып яңарту",
"useClashProxy": "Clash прокси кулланып яңарту",
"acceptInvalidCerts": "Дөрес булмаган сертификатларны кабул итү (Куркыныч)",
"allowAutoUpdate": "Allow Auto Update"
},
"feedback": {
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
}
},
"actions": {
"prepend": "Проксины өскә өстәү",
"append": "Проксины аска өстәү"
}
},
"groupsEditor": {
"title": "Прокси төркемнәрен үзгәртү",
"errors": {
"nameRequired": "Төркем исеме кирәк",
"nameExists": "Әлеге төркем исеме бар инде"
"proxiesEditor": {
"title": "Проксины үзгәртү",
"placeholders": {
"multiUri": "Берничә URI өчен яңа юл символын кулланыгыз (Base64 кодлавы ярдәм ителә)"
},
"actions": {
"prepend": "Проксины өскә өстәү",
"append": "Проксины аска өстәү"
}
},
"fields": {
"type": "Төркем төре",
"name": "Төркем исеме",
"icon": "Прокси төркеме иконкасы",
"proxies": "Прокси куллану",
"provider": "Провайдер куллану",
"healthCheckUrl": "Сәламәтлекне тикшерү URL-ы",
"expectedStatus": "Көтелгән статус коды",
"interval": "Интервал",
"timeout": "Таймаут",
"maxFailedTimes": "Иң күп хаталы тикшерү саны",
"interfaceName": "Интерфейс исеме",
"routingMark": "Маршрут билгесе",
"filter": "Фильтр",
"excludeFilter": "Фильтр аша чыгару",
"excludeType": "Чыгару төре",
"includeAll": "Барлык прокси һәм провайдерларны кертү",
"includeAllProxies": "Барлык проксины кертү",
"includeAllProviders": "Барлык провайдерларны кертү"
"groupsEditor": {
"title": "Прокси төркемнәрен үзгәртү",
"errors": {
"nameRequired": "Төркем исеме кирәк",
"nameExists": "Әлеге төркем исеме бар инде"
},
"fields": {
"type": "Төркем төре",
"name": "Төркем исеме",
"icon": "Прокси төркеме иконкасы",
"proxies": "Прокси куллану",
"provider": "Провайдер куллану",
"healthCheckUrl": "Сәламәтлекне тикшерү URL-ы",
"expectedStatus": "Көтелгән статус коды",
"interval": "Интервал",
"timeout": "Таймаут",
"maxFailedTimes": "Иң күп хаталы тикшерү саны",
"interfaceName": "Интерфейс исеме",
"routingMark": "Маршрут билгесе",
"filter": "Фильтр",
"excludeFilter": "Фильтр аша чыгару",
"excludeType": "Чыгару төре",
"includeAll": "Барлык прокси һәм провайдерларны кертү",
"includeAllProxies": "Барлык проксины кертү",
"includeAllProviders": "Барлык провайдерларны кертү"
},
"toggles": {
"lazy": "Сак режим (lazy)",
"disableUdp": "UDP'ны сүндерү",
"hidden": "Яшерен"
},
"actions": {
"prepend": "Төркемне өскә өстәү",
"append": "Төркемне аска өстәү"
}
},
"toggles": {
"lazy": "Сак режим (lazy)",
"disableUdp": "UDP'ны сүндерү",
"hidden": "Яшерен"
"editor": {
"actions": {
"format": "Документны форматлау"
},
"messages": {
"readOnly": "Уку режимында үзгәртү мөмкин түгел"
}
},
"actions": {
"prepend": "Төркемне өскә өстәү",
"append": "Төркемне аска өстәү"
}
},
"fileInput": {
"chooseFile": "Файл сайлау"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "Last Update failed",
"nextUp": "Next Up",
"noSchedule": "No schedule",
"unknown": "Unknown",
"autoUpdateDisabled": "Auto update disabled"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "Бетерүне раслагыз",
"message": "Бу гамәлне кире кайтарып булмый"
}
},
"editor": {
"format": "Документны форматлау",
"readOnlyMessage": "Уку режимында үзгәртү мөмкин түгел"
},
"logViewer": {
"title": "Скрипт консоле"
},
"card": {
"labels": {
"from": "Каян",
"updateTime": "Яңарту вакыты",
"usedTotal": "Кулланылган / Барлыгы",
"expireTime": "Тамамлану вакыты",
"clickToImport": "Click to import subscription"
},
"logViewer": {
"title": "Скрипт консоле"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "无效的正则表达式"
},
"messages": {
"errors": {
"trafficStats": "流量统计错误",
"trafficStatsDescription": "流量统计组件发生错误,为防止崩溃已暂时停用。"
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "最大化",
"minimize": "最小化"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "可视化",
"advanced": "高级"
},
"feedback": {
"errors": {
"trafficStats": "流量统计错误",
"trafficStatsDescription": "流量统计组件发生错误,为防止崩溃已暂时停用。"
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "导入订阅成功",
"importSubscriptionSuccess": "导入订阅成功",
"importWithClashProxy": "使用 Clash 代理导入订阅成功",
"saved": "保存成功"
}
}
},
"profiles": {
"page": {
"title": "订阅",
"header": {
"title": "订阅"
},
"actions": {
"updateAll": "更新所有订阅",
"viewRuntimeConfig": "查看运行时订阅",
@@ -82,172 +90,184 @@
"import": "导入"
},
"batch": {
"title": "批量操作",
"delete": "删除选中订阅",
"selectAll": "全选",
"deselectAll": "取消全选",
"done": "完成",
"selected": "已选中",
"items": "项目"
"header": {
"title": "批量操作"
},
"actions": {
"delete": "删除选中订阅",
"selectAll": "全选",
"deselectAll": "取消全选",
"done": "完成"
},
"summary": {
"selected": "已选中",
"items": "项目"
}
},
"import": {
"importForm": {
"placeholder": "订阅文件链接",
"paste": "粘贴",
"clear": "清除"
"actions": {
"paste": "粘贴",
"clear": "清除"
}
},
"errors": {
"invalidUrl": "无效的订阅链接,请输入以 http:// 或 https:// 开头的地址",
"onlyYaml": "仅支持 YAML 文件"
},
"notifications": {
"importRetry": "订阅导入失败,尝试使用 Clash 代理导入",
"importFail": "使用 Clash 代理导入订阅也失败",
"importNeedsRefresh": "订阅已导入,但可能需要手动刷新",
"importSuccess": "订阅已成功导入,如未显示请重启应用",
"profileSwitched": "订阅已切换",
"profileReactivated": "订阅已激活",
"switchInterrupted": "订阅切换被新选择中断",
"batchDeleted": "选中的订阅已成功删除"
},
"notices": {
"forceRefreshCompleted": "数据已强制刷新",
"emergencyRefreshFailed": "紧急刷新失败: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "无效的订阅链接,请输入以 http:// 或 https:// 开头的地址",
"onlyYaml": "仅支持 YAML 文件"
},
"notifications": {
"importRetry": "订阅导入失败,尝试使用 Clash 代理导入",
"importFail": "使用 Clash 代理导入订阅也失败",
"importNeedsRefresh": "订阅已导入,但可能需要手动刷新",
"importSuccess": "订阅已成功导入,如未显示请重启应用",
"profileSwitched": "订阅已切换",
"profileReactivated": "订阅已激活",
"switchInterrupted": "订阅切换被新选择中断",
"batchDeleted": "选中的订阅已成功删除"
},
"notices": {
"forceRefreshCompleted": "数据已强制刷新",
"emergencyRefreshFailed": "紧急刷新失败: {{message}}"
}
}
},
"notifications": {
"importSuccess": "导入订阅成功",
"importSubscriptionSuccess": "导入订阅成功",
"importWithClashProxy": "使用 Clash 代理导入订阅成功",
"saved": "保存成功"
},
"viewer": {
"title": {
"create": "新建配置",
"edit": "编辑配置"
"components": {
"card": {
"labels": {
"from": "来自",
"updateTime": "更新时间",
"usedTotal": "已使用 / 总量",
"expireTime": "到期时间",
"clickToImport": "点击导入订阅"
}
},
"fields": {
"type": "类型",
"name": "名称",
"description": "描述",
"subscriptionUrl": "订阅链接",
"httpTimeout": "HTTP 请求超时",
"updateInterval": "更新间隔",
"useSystemProxy": "使用系统代理更新",
"useClashProxy": "使用内核代理更新",
"acceptInvalidCerts": "允许无效证书(危险)",
"allowAutoUpdate": "允许自动更新"
"fileInput": {
"chooseFile": "选择文件"
},
"notifications": {
"creationRetry": "订阅创建失败,尝试使用 Clash 代理创建",
"creationSuccess": "使用 Clash 代理创建订阅成功"
"menu": {
"home": "首 页",
"select": "使用",
"editInfo": "编辑信息",
"editFile": "编辑文件",
"editRules": "编辑规则",
"editProxies": "编辑节点",
"editGroups": "编辑代理组",
"extendConfig": "扩展覆写配置",
"extendScript": "扩展脚本",
"openFile": "打开文件",
"update": "更新",
"updateViaProxy": "更新(代理)"
},
"more": {
"global": {
"merge": "全局扩展覆写配置",
"script": "全局扩展脚本"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "点击查看上次更新时间",
"showNext": "点击查看下一次更新"
},
"status": {
"lastUpdateFailed": "上次更新失败",
"nextUp": "下次更新",
"noSchedule": "没有计划",
"unknown": "未知",
"autoUpdateDisabled": "自动更新已禁用"
}
}
},
"menu": {
"home": "首 页",
"select": "使用",
"editInfo": "编辑信息",
"editFile": "编辑文件",
"editRules": "编辑规则",
"editProxies": "编辑节点",
"editGroups": "编辑代理组",
"extendConfig": "扩展覆写配置",
"extendScript": "扩展脚本",
"openFile": "打开文件",
"update": "更新",
"updateViaProxy": "更新(代理)"
},
"proxiesEditor": {
"title": "编辑节点",
"placeholders": {
"multiUri": "多条 URI 请使用换行分隔(支持 Base64 编码)"
"modals": {
"profileForm": {
"title": {
"create": "新建配置",
"edit": "编辑配置"
},
"fields": {
"type": "类型",
"name": "名称",
"description": "描述",
"subscriptionUrl": "订阅链接",
"httpTimeout": "HTTP 请求超时",
"updateInterval": "更新间隔",
"useSystemProxy": "使用系统代理更新",
"useClashProxy": "使用内核代理更新",
"acceptInvalidCerts": "允许无效证书(危险)",
"allowAutoUpdate": "允许自动更新"
},
"feedback": {
"notifications": {
"creationRetry": "订阅创建失败,尝试使用 Clash 代理创建",
"creationSuccess": "使用 Clash 代理创建订阅成功"
}
}
},
"actions": {
"prepend": "添加前置代理节点",
"append": "添加后置代理节点"
}
},
"groupsEditor": {
"title": "编辑代理组",
"errors": {
"nameRequired": "代理组名称不能为空",
"nameExists": "代理组名称已存在"
"proxiesEditor": {
"title": "编辑节点",
"placeholders": {
"multiUri": "多条 URI 请使用换行分隔(支持 Base64 编码)"
},
"actions": {
"prepend": "添加前置代理节点",
"append": "添加后置代理节点"
}
},
"fields": {
"type": "代理组类型",
"name": "代理组组名",
"icon": "代理组图标",
"proxies": "引入代理",
"provider": "引入代理集合",
"healthCheckUrl": "健康检查测试地址",
"expectedStatus": "期望状态码",
"interval": "检查间隔",
"timeout": "超时时间",
"maxFailedTimes": "最大失败次数",
"interfaceName": "出站接口",
"routingMark": "路由标记",
"filter": "过滤节点",
"excludeFilter": "排除节点",
"excludeType": "排除节点类型",
"includeAll": "引入所有出站代理、代理集合",
"includeAllProxies": "引入所有出站代理",
"includeAllProviders": "引入所有代理集合"
"groupsEditor": {
"title": "编辑代理组",
"errors": {
"nameRequired": "代理组名称不能为空",
"nameExists": "代理组名称已存在"
},
"fields": {
"type": "代理组类型",
"name": "代理组组名",
"icon": "代理组图标",
"proxies": "引入代理",
"provider": "引入代理集合",
"healthCheckUrl": "健康检查测试地址",
"expectedStatus": "期望状态码",
"interval": "检查间隔",
"timeout": "超时时间",
"maxFailedTimes": "最大失败次数",
"interfaceName": "出站接口",
"routingMark": "路由标记",
"filter": "过滤节点",
"excludeFilter": "排除节点",
"excludeType": "排除节点类型",
"includeAll": "引入所有出站代理、代理集合",
"includeAllProxies": "引入所有出站代理",
"includeAllProviders": "引入所有代理集合"
},
"toggles": {
"lazy": "懒惰状态",
"disableUdp": "禁用 UDP",
"hidden": "隐藏代理组"
},
"actions": {
"prepend": "添加前置代理组",
"append": "添加后置代理组"
}
},
"toggles": {
"lazy": "懒惰状态",
"disableUdp": "禁用 UDP",
"hidden": "隐藏代理组"
"editor": {
"actions": {
"format": "格式化文档"
},
"messages": {
"readOnly": "无法在只读模式下编辑"
}
},
"actions": {
"prepend": "添加前置代理组",
"append": "添加后置代理组"
}
},
"fileInput": {
"chooseFile": "选择文件"
},
"more": {
"global": {
"merge": "全局扩展覆写配置",
"script": "全局扩展脚本"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "点击查看上次更新时间",
"showNext": "点击查看下一次更新"
},
"status": {
"lastUpdateFailed": "上次更新失败",
"nextUp": "下次更新",
"noSchedule": "没有计划",
"unknown": "未知",
"autoUpdateDisabled": "自动更新已禁用"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "确认删除",
"message": "此操作不可逆"
}
},
"editor": {
"format": "格式化文档",
"readOnlyMessage": "无法在只读模式下编辑"
},
"logViewer": {
"title": "脚本控制台输出"
},
"card": {
"labels": {
"from": "来自",
"updateTime": "更新时间",
"usedTotal": "已使用 / 总量",
"expireTime": "到期时间",
"clickToImport": "点击导入订阅"
},
"logViewer": {
"title": "脚本控制台输出"
}
}
},

View File

@@ -53,16 +53,6 @@
"validation": {
"invalidRegex": "無效的正規表示式"
},
"messages": {
"errors": {
"trafficStats": "流量統計錯誤",
"trafficStatsDescription": "流量統計元件發生錯誤,已停用以避免當機。"
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
}
},
"window": {
"maximize": "最大化",
"minimize": "最小化"
@@ -70,11 +60,29 @@
"editorModes": {
"visualization": "視覺化",
"advanced": "進階"
},
"feedback": {
"errors": {
"trafficStats": "流量統計錯誤",
"trafficStatsDescription": "流量統計元件發生錯誤,已停用以避免當機。"
},
"notices": {
"raw": "{{message}}",
"prefixedRaw": "{{prefix}} {{message}}"
},
"notifications": {
"importSuccess": "匯入設定檔成功",
"importSubscriptionSuccess": "匯入訂閱成功",
"importWithClashProxy": "使用 Clash 代理匯入訂閱成功",
"saved": "儲存成功"
}
}
},
"profiles": {
"page": {
"title": "訂閱",
"header": {
"title": "訂閱"
},
"actions": {
"updateAll": "更新所有訂閱",
"viewRuntimeConfig": "查看執行時訂閱",
@@ -82,172 +90,184 @@
"import": "匯入"
},
"batch": {
"title": "批次操作",
"delete": "刪除選取訂閱",
"selectAll": "全選",
"deselectAll": "取消選取",
"done": "完成",
"selected": "已選取",
"items": "項目"
"header": {
"title": "批次操作"
},
"actions": {
"delete": "刪除選取訂閱",
"selectAll": "全選",
"deselectAll": "取消選取",
"done": "完成"
},
"summary": {
"selected": "已選取",
"items": "項目"
}
},
"import": {
"importForm": {
"placeholder": "訂閱檔網址",
"paste": "貼上",
"clear": "清除"
"actions": {
"paste": "貼上",
"clear": "清除"
}
},
"errors": {
"invalidUrl": "無效的訂閱網址,請輸入以 http:// 或 https:// 開頭的位址",
"onlyYaml": "僅支援 YAML 檔案"
},
"notifications": {
"importRetry": "訂閱匯入失敗,嘗試使用 Clash 代理匯入",
"importFail": "使用 Clash 代理匯入訂閱也失敗",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "訂閱已切換",
"profileReactivated": "訂閱已啟用",
"switchInterrupted": "配置切換被新的選擇中斷",
"batchDeleted": "選取的訂閱已成功刪除"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
"feedback": {
"errors": {
"invalidUrl": "無效的訂閱網址,請輸入以 http:// 或 https:// 開頭的位址",
"onlyYaml": "僅支援 YAML 檔案"
},
"notifications": {
"importRetry": "訂閱匯入失敗,嘗試使用 Clash 代理匯入",
"importFail": "使用 Clash 代理匯入訂閱也失敗",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "訂閱已切換",
"profileReactivated": "訂閱已啟用",
"switchInterrupted": "配置切換被新的選擇中斷",
"batchDeleted": "選取的訂閱已成功刪除"
},
"notices": {
"forceRefreshCompleted": "Force refresh completed",
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
}
}
},
"notifications": {
"importSuccess": "匯入設定檔成功",
"importSubscriptionSuccess": "匯入訂閱成功",
"importWithClashProxy": "使用 Clash 代理匯入訂閱成功",
"saved": "儲存成功"
},
"viewer": {
"title": {
"create": "新增設定檔",
"edit": "編輯設定檔"
"components": {
"card": {
"labels": {
"from": "來自",
"updateTime": "更新時間",
"usedTotal": "已使用 / 總量",
"expireTime": "到期時間",
"clickToImport": "點擊匯入訂閱"
}
},
"fields": {
"type": "類型",
"name": "名稱",
"description": "描述",
"subscriptionUrl": "訂閱網址",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "更新間隔",
"useSystemProxy": "使用系統代理更新",
"useClashProxy": "使用內核代理更新",
"acceptInvalidCerts": "允許無效憑證(危險)",
"allowAutoUpdate": "允許自動更新"
"fileInput": {
"chooseFile": "選擇檔案"
},
"notifications": {
"creationRetry": "訂閱建立失敗,嘗試使用 Clash 代理建立",
"creationSuccess": "使用 Clash 代理建立訂閱成功"
"menu": {
"home": "首 頁",
"select": "使用",
"editInfo": "編輯資訊",
"editFile": "編輯檔案",
"editRules": "編輯規則",
"editProxies": "編輯節點",
"editGroups": "編輯代理組",
"extendConfig": "擴充覆寫設定",
"extendScript": "擴充指令碼",
"openFile": "開啟檔案",
"update": "更新",
"updateViaProxy": "更新(代理)"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"profileItem": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "上次更新失敗",
"nextUp": "下次更新",
"noSchedule": "沒有排程",
"unknown": "未知",
"autoUpdateDisabled": "自動更新已停用"
}
}
},
"menu": {
"home": "首 頁",
"select": "使用",
"editInfo": "編輯資訊",
"editFile": "編輯檔案",
"editRules": "編輯規則",
"editProxies": "編輯節點",
"editGroups": "編輯代理組",
"extendConfig": "擴充覆寫設定",
"extendScript": "擴充指令碼",
"openFile": "開啟檔案",
"update": "更新",
"updateViaProxy": "更新(代理)"
},
"proxiesEditor": {
"title": "編輯節點",
"placeholders": {
"multiUri": "多條網址,請使用換行分隔(支援 Base64 編碼)"
"modals": {
"profileForm": {
"title": {
"create": "新增設定檔",
"edit": "編輯設定檔"
},
"fields": {
"type": "類型",
"name": "名稱",
"description": "描述",
"subscriptionUrl": "訂閱網址",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "更新間隔",
"useSystemProxy": "使用系統代理更新",
"useClashProxy": "使用內核代理更新",
"acceptInvalidCerts": "允許無效憑證(危險)",
"allowAutoUpdate": "允許自動更新"
},
"feedback": {
"notifications": {
"creationRetry": "訂閱建立失敗,嘗試使用 Clash 代理建立",
"creationSuccess": "使用 Clash 代理建立訂閱成功"
}
}
},
"actions": {
"prepend": "新增前置代理節點",
"append": "新增後置代理節點"
}
},
"groupsEditor": {
"title": "編輯代理組",
"errors": {
"nameRequired": "代理組名稱為必填",
"nameExists": "代理組名稱已存在"
"proxiesEditor": {
"title": "編輯節點",
"placeholders": {
"multiUri": "多條網址,請使用換行分隔(支援 Base64 編碼)"
},
"actions": {
"prepend": "新增前置代理節點",
"append": "新增後置代理節點"
}
},
"fields": {
"type": "代理組類型",
"name": "代理組名稱",
"icon": "代理組圖示",
"proxies": "使用代理",
"provider": "使用代理集合",
"healthCheckUrl": "健康檢查網址",
"expectedStatus": "預期狀態碼",
"interval": "檢查間隔",
"timeout": "逾時",
"maxFailedTimes": "最大失敗次數",
"interfaceName": "輸出介面",
"routingMark": "路由標記",
"filter": "篩選節點",
"excludeFilter": "排除節點",
"excludeType": "排除節點類型",
"includeAll": "包含所有輸出代理、代理集合",
"includeAllProxies": "包含所有輸出代理",
"includeAllProviders": "包含所有代理集合"
"groupsEditor": {
"title": "編輯代理組",
"errors": {
"nameRequired": "代理組名稱為必填",
"nameExists": "代理組名稱已存在"
},
"fields": {
"type": "代理組類型",
"name": "代理組名稱",
"icon": "代理組圖示",
"proxies": "使用代理",
"provider": "使用代理集合",
"healthCheckUrl": "健康檢查網址",
"expectedStatus": "預期狀態碼",
"interval": "檢查間隔",
"timeout": "逾時",
"maxFailedTimes": "最大失敗次數",
"interfaceName": "輸出介面",
"routingMark": "路由標記",
"filter": "篩選節點",
"excludeFilter": "排除節點",
"excludeType": "排除節點類型",
"includeAll": "包含所有輸出代理、代理集合",
"includeAllProxies": "包含所有輸出代理",
"includeAllProviders": "包含所有代理集合"
},
"toggles": {
"lazy": "延遲載入",
"disableUdp": "停用 UDP",
"hidden": "隱藏代理組"
},
"actions": {
"prepend": "新增前置代理組",
"append": "新增後置代理組"
}
},
"toggles": {
"lazy": "延遲載入",
"disableUdp": "停用 UDP",
"hidden": "隱藏代理組"
"editor": {
"actions": {
"format": "格式化文件"
},
"messages": {
"readOnly": "無法在唯讀模式下編輯"
}
},
"actions": {
"prepend": "新增前置代理組",
"append": "新增後置代理組"
}
},
"fileInput": {
"chooseFile": "選擇檔案"
},
"more": {
"global": {
"merge": "Global Merge",
"script": "Global Script"
},
"chips": {
"merge": "Merge",
"script": "Script"
}
},
"item": {
"tooltips": {
"showLast": "Click to show last update time",
"showNext": "Click to show next update"
},
"status": {
"lastUpdateFailed": "上次更新失敗",
"nextUp": "下次更新",
"noSchedule": "沒有排程",
"unknown": "未知",
"autoUpdateDisabled": "自動更新已停用"
}
},
"confirm": {
"delete": {
"confirmDelete": {
"title": "確認刪除",
"message": "此操作無法復原"
}
},
"editor": {
"format": "格式化文件",
"readOnlyMessage": "無法在唯讀模式下編輯"
},
"logViewer": {
"title": "指令碼控制台輸出"
},
"card": {
"labels": {
"from": "來自",
"updateTime": "更新時間",
"usedTotal": "已使用 / 總量",
"expireTime": "到期時間",
"clickToImport": "點擊匯入訂閱"
},
"logViewer": {
"title": "指令碼控制台輸出"
}
}
},

View File

@@ -12,7 +12,9 @@ export const handleNoticeMessage = (
const handlers: Record<string, () => void> = {
"import_sub_url::ok": () => {
navigate("/profile", { state: { current: msg } });
showNotice.success("profiles.notifications.importSubscriptionSuccess");
showNotice.success(
"shared.feedback.notifications.importSubscriptionSuccess",
);
},
"import_sub_url::error": () => {
navigate("/profile");

View File

@@ -146,7 +146,7 @@ const ProfilePage = () => {
setActivatings((prev) => prev.filter((id) => id !== previousSwitching));
showNotice.info(
"profiles.page.notifications.switchInterrupted",
"profiles.page.feedback.notifications.switchInterrupted",
`${previousSwitching}${newProfile}`,
3000,
);
@@ -191,7 +191,7 @@ const ProfilePage = () => {
for (const file of paths) {
if (!file.endsWith(".yaml") && !file.endsWith(".yml")) {
showNotice.error("profiles.page.errors.onlyYaml");
showNotice.error("profiles.page.feedback.errors.onlyYaml");
continue;
}
const item = {
@@ -239,11 +239,14 @@ const ProfilePage = () => {
await new Promise((resolve) => setTimeout(resolve, 500));
await onEnhance(false);
showNotice.success("profiles.page.notices.forceRefreshCompleted", 2000);
showNotice.success(
"profiles.page.feedback.notices.forceRefreshCompleted",
2000,
);
} catch (error) {
console.error("[紧急刷新] 失败:", error);
showNotice.error(
"profiles.page.notices.emergencyRefreshFailed",
"profiles.page.feedback.notices.emergencyRefreshFailed",
{ message: String(error) },
4000,
);
@@ -275,7 +278,7 @@ const ProfilePage = () => {
if (!url) return;
// 校验url是否为http/https
if (!/^https?:\/\//i.test(url)) {
showNotice.error("profiles.page.errors.invalidUrl");
showNotice.error("profiles.page.feedback.errors.invalidUrl");
return;
}
setLoading(true);
@@ -289,11 +292,11 @@ const ProfilePage = () => {
try {
// 尝试正常导入
await importProfile(url);
await handleImportSuccess("profiles.notifications.importSuccess");
await handleImportSuccess("shared.feedback.notifications.importSuccess");
} catch (initialErr) {
console.warn("[订阅导入] 首次导入失败:", initialErr);
showNotice.info("profiles.page.notifications.importRetry");
showNotice.info("profiles.page.feedback.notifications.importRetry");
try {
// 使用自身代理尝试导入
await importProfile(url, {
@@ -301,12 +304,12 @@ const ProfilePage = () => {
self_proxy: true,
});
await handleImportSuccess(
"profiles.notifications.importWithClashProxy",
"shared.feedback.notifications.importWithClashProxy",
);
} catch (retryErr) {
// 回退导入也失败
showNotice.error(
"profiles.page.notifications.importFail",
"profiles.page.feedback.notifications.importFail",
String(retryErr),
);
}
@@ -354,10 +357,16 @@ const ProfilePage = () => {
// 清除SWR缓存并重新获取
await mutate("getProfiles", getProfiles(), { revalidate: true });
await onEnhance(false);
showNotice.error("profiles.page.notifications.importNeedsRefresh", 3000);
showNotice.error(
"profiles.page.feedback.notifications.importNeedsRefresh",
3000,
);
} catch (finalError) {
console.error(`[导入刷新] 最终刷新尝试失败:`, finalError);
showNotice.error("profiles.page.notifications.importSuccess", 5000);
showNotice.error(
"profiles.page.feedback.notifications.importSuccess",
5000,
);
}
};
@@ -475,7 +484,7 @@ const ProfilePage = () => {
if (notifySuccess && success) {
showNotice.success(
"profiles.page.notifications.profileSwitched",
"profiles.page.feedback.notifications.profileSwitched",
1000,
);
}
@@ -574,7 +583,7 @@ const ProfilePage = () => {
mutateLogs();
if (notifySuccess) {
showNotice.success(
"profiles.page.notifications.profileReactivated",
"profiles.page.feedback.notifications.profileReactivated",
1000,
);
}
@@ -715,7 +724,7 @@ const ProfilePage = () => {
setSelectedProfiles(new Set());
setBatchMode(false);
showNotice.success("profiles.page.notifications.batchDeleted");
showNotice.success("profiles.page.feedback.notifications.batchDeleted");
} catch (err: any) {
showNotice.error(err);
} finally {
@@ -795,7 +804,7 @@ const ProfilePage = () => {
return (
<BasePage
full
title={t("profiles.page.title")}
title={t("profiles.page.header.title")}
contentStyle={{ height: "100%" }}
header={
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
@@ -805,7 +814,7 @@ const ProfilePage = () => {
<IconButton
size="small"
color="inherit"
title={t("profiles.page.batch.title")}
title={t("profiles.page.batch.header.title")}
onClick={toggleBatchMode}
>
<CheckBoxOutlineBlankRounded />
@@ -866,8 +875,8 @@ const ProfilePage = () => {
color="inherit"
title={
isAllSelected()
? t("profiles.page.batch.deselectAll")
: t("profiles.page.batch.selectAll")
? t("profiles.page.batch.actions.deselectAll")
: t("profiles.page.batch.actions.selectAll")
}
onClick={
isAllSelected() ? clearAllSelections : selectAllProfiles
@@ -884,20 +893,20 @@ const ProfilePage = () => {
<IconButton
size="small"
color="error"
title={t("profiles.page.batch.delete")}
title={t("profiles.page.batch.actions.delete")}
onClick={deleteSelectedProfiles}
disabled={selectedProfiles.size === 0}
>
<DeleteRounded />
</IconButton>
<Button size="small" variant="outlined" onClick={toggleBatchMode}>
{t("profiles.page.batch.done")}
{t("profiles.page.batch.actions.done")}
</Button>
<Box
sx={{ flex: 1, textAlign: "right", color: "text.secondary" }}
>
{t("profiles.page.batch.selected")} {selectedProfiles.size}{" "}
{t("profiles.page.batch.items")}
{t("profiles.page.batch.summary.selected")}{" "}
{selectedProfiles.size} {t("profiles.page.batch.summary.items")}
</Box>
</Box>
)}
@@ -930,7 +939,7 @@ const ProfilePage = () => {
event.preventDefault();
void onImport();
}}
placeholder={t("profiles.page.import.placeholder")}
placeholder={t("profiles.page.importForm.placeholder")}
slotProps={{
input: {
sx: { pr: 1 },
@@ -938,7 +947,7 @@ const ProfilePage = () => {
<IconButton
size="small"
sx={{ p: 0.5 }}
title={t("profiles.page.import.paste")}
title={t("profiles.page.importForm.actions.paste")}
onClick={onCopyLink}
>
<ContentPasteRounded fontSize="inherit" />
@@ -947,7 +956,7 @@ const ProfilePage = () => {
<IconButton
size="small"
sx={{ p: 0.5 }}
title={t("profiles.page.import.clear")}
title={t("profiles.page.importForm.actions.clear")}
onClick={() => setUrl("")}
>
<ClearRounded fontSize="inherit" />

View File

@@ -152,7 +152,7 @@ function isPlainRecord(value: unknown): value is Record<string, unknown> {
function createRawDescriptor(message: string): NoticeTranslationDescriptor {
return {
key: "shared.messages.notices.raw",
key: "shared.feedback.notices.raw",
params: { message },
};
}
@@ -208,7 +208,7 @@ function normalizeNoticeMessage(
if (rawText !== undefined) {
return {
i18n: {
key: "shared.messages.notices.prefixedRaw",
key: "shared.feedback.notices.prefixedRaw",
params: {
...mergedParams,
prefixKey: message.key,
@@ -232,7 +232,7 @@ function normalizeNoticeMessage(
if (shouldUseTranslationKey(message, params)) {
return {
i18n: {
key: "shared.messages.notices.prefixedRaw",
key: "shared.feedback.notices.prefixedRaw",
params: {
...(params ?? {}),
prefixKey: message,
@@ -244,7 +244,7 @@ function normalizeNoticeMessage(
// Prefer showing the original string while still surfacing the raw details below.
return {
i18n: {
key: "shared.messages.notices.prefixedRaw",
key: "shared.feedback.notices.prefixedRaw",
params: {
...(params ?? {}),
prefix: message,