refactor(i18n): reorganize locale keys for home, proxies, rules, connections, logs, unlock, and tests

This commit is contained in:
Slinetrac
2025-11-05 19:34:08 +08:00
Unverified
parent 725e852ef3
commit 1218e22202
39 changed files with 2414 additions and 1874 deletions

View File

@@ -68,50 +68,50 @@ const InnerConnectionDetail = ({ data, onClose }: InnerProps) => {
: metadata.remoteDestination;
const information = [
{ label: t("connections.fields.host"), value: host },
{ label: t("connections.components.fields.host"), value: host },
{
label: t("connections.fields.downloaded"),
label: t("connections.components.fields.downloaded"),
value: parseTraffic(data.download).join(" "),
},
{
label: t("connections.fields.uploaded"),
label: t("connections.components.fields.uploaded"),
value: parseTraffic(data.upload).join(" "),
},
{
label: t("connections.fields.dlSpeed"),
label: t("connections.components.fields.dlSpeed"),
value: parseTraffic(data.curDownload ?? -1).join(" ") + "/s",
},
{
label: t("connections.fields.ulSpeed"),
label: t("connections.components.fields.ulSpeed"),
value: parseTraffic(data.curUpload ?? -1).join(" ") + "/s",
},
{
label: t("connections.fields.chains"),
label: t("connections.components.fields.chains"),
value: chains,
},
{ label: t("connections.fields.rule"), value: rule },
{ label: t("connections.components.fields.rule"), value: rule },
{
label: t("connections.fields.process"),
label: t("connections.components.fields.process"),
value: `${metadata.process}${metadata.processPath ? `(${metadata.processPath})` : ""}`,
},
{
label: t("connections.fields.time"),
label: t("connections.components.fields.time"),
value: dayjs(data.start).fromNow(),
},
{
label: t("connections.fields.source"),
label: t("connections.components.fields.source"),
value: `${metadata.sourceIP}:${metadata.sourcePort}`,
},
{
label: t("connections.fields.destination"),
label: t("connections.components.fields.destination"),
value: Destination,
},
{
label: t("connections.fields.destinationPort"),
label: t("connections.components.fields.destinationPort"),
value: `${metadata.destinationPort}`,
},
{
label: t("connections.fields.type"),
label: t("connections.components.fields.type"),
value: `${metadata.type}(${metadata.network})`,
},
];
@@ -137,13 +137,13 @@ const InnerConnectionDetail = ({ data, onClose }: InnerProps) => {
<Box sx={{ textAlign: "right" }}>
<Button
variant="contained"
title={t("connections.actions.closeConnection")}
title={t("connections.components.actions.closeConnection")}
onClick={() => {
onDelete();
onClose?.();
}}
>
{t("connections.actions.closeConnection")}
{t("connections.components.actions.closeConnection")}
</Button>
</Box>
</Box>

View File

@@ -48,8 +48,8 @@ export const ConnectionItem = (props: Props) => {
edge="end"
color="inherit"
onClick={onDelete}
title={t("connections.actions.closeConnection")}
aria-label={t("connections.actions.closeConnection")}
title={t("connections.components.actions.closeConnection")}
aria-label={t("connections.components.actions.closeConnection")}
>
<CloseRounded />
</IconButton>

View File

@@ -162,13 +162,13 @@ export const ConnectionTable = (props: Props) => {
return [
{
field: "host",
headerName: t("connections.fields.host"),
headerName: t("connections.components.fields.host"),
width: columnWidths["host"] || 220,
minWidth: 180,
},
{
field: "download",
headerName: t("connections.fields.downloaded"),
headerName: t("connections.components.fields.downloaded"),
width: columnWidths["download"] || 88,
align: "right",
headerAlign: "right",
@@ -176,7 +176,7 @@ export const ConnectionTable = (props: Props) => {
},
{
field: "upload",
headerName: t("connections.fields.uploaded"),
headerName: t("connections.components.fields.uploaded"),
width: columnWidths["upload"] || 88,
align: "right",
headerAlign: "right",
@@ -184,7 +184,7 @@ export const ConnectionTable = (props: Props) => {
},
{
field: "dlSpeed",
headerName: t("connections.fields.dlSpeed"),
headerName: t("connections.components.fields.dlSpeed"),
width: columnWidths["dlSpeed"] || 88,
align: "right",
headerAlign: "right",
@@ -192,7 +192,7 @@ export const ConnectionTable = (props: Props) => {
},
{
field: "ulSpeed",
headerName: t("connections.fields.ulSpeed"),
headerName: t("connections.components.fields.ulSpeed"),
width: columnWidths["ulSpeed"] || 88,
align: "right",
headerAlign: "right",
@@ -200,25 +200,25 @@ export const ConnectionTable = (props: Props) => {
},
{
field: "chains",
headerName: t("connections.fields.chains"),
headerName: t("connections.components.fields.chains"),
width: columnWidths["chains"] || 340,
minWidth: 180,
},
{
field: "rule",
headerName: t("connections.fields.rule"),
headerName: t("connections.components.fields.rule"),
width: columnWidths["rule"] || 280,
minWidth: 180,
},
{
field: "process",
headerName: t("connections.fields.process"),
headerName: t("connections.components.fields.process"),
width: columnWidths["process"] || 220,
minWidth: 180,
},
{
field: "time",
headerName: t("connections.fields.time"),
headerName: t("connections.components.fields.time"),
width: columnWidths["time"] || 120,
minWidth: 100,
align: "right",
@@ -229,19 +229,19 @@ export const ConnectionTable = (props: Props) => {
},
{
field: "source",
headerName: t("connections.fields.source"),
headerName: t("connections.components.fields.source"),
width: columnWidths["source"] || 200,
minWidth: 130,
},
{
field: "remoteDestination",
headerName: t("connections.fields.destination"),
headerName: t("connections.components.fields.destination"),
width: columnWidths["remoteDestination"] || 200,
minWidth: 130,
},
{
field: "type",
headerName: t("connections.fields.type"),
headerName: t("connections.components.fields.type"),
width: columnWidths["type"] || 160,
minWidth: 100,
},

View File

@@ -32,7 +32,7 @@ export const ClashInfoCard = () => {
<Stack spacing={1.5}>
<Stack direction="row" justifyContent="space-between">
<Typography variant="body2" color="text.secondary">
{t("home.cards.clashInfo.fields.coreVersion")}
{t("home.components.clashInfo.fields.coreVersion")}
</Typography>
<Typography variant="body2" fontWeight="medium">
{clashVersion || "-"}
@@ -41,7 +41,7 @@ export const ClashInfoCard = () => {
<Divider />
<Stack direction="row" justifyContent="space-between">
<Typography variant="body2" color="text.secondary">
{t("home.cards.clashInfo.fields.systemProxyAddress")}
{t("home.components.clashInfo.fields.systemProxyAddress")}
</Typography>
<Typography variant="body2" fontWeight="medium">
{systemProxyAddress}
@@ -50,7 +50,7 @@ export const ClashInfoCard = () => {
<Divider />
<Stack direction="row" justifyContent="space-between">
<Typography variant="body2" color="text.secondary">
{t("home.cards.clashInfo.fields.mixedPort")}
{t("home.components.clashInfo.fields.mixedPort")}
</Typography>
<Typography variant="body2" fontWeight="medium">
{clashConfig.mixedPort || "-"}
@@ -59,7 +59,7 @@ export const ClashInfoCard = () => {
<Divider />
<Stack direction="row" justifyContent="space-between">
<Typography variant="body2" color="text.secondary">
{t("home.cards.clashInfo.fields.uptime")}
{t("home.components.clashInfo.fields.uptime")}
</Typography>
<Typography variant="body2" fontWeight="medium">
{formattedUptime}
@@ -68,7 +68,7 @@ export const ClashInfoCard = () => {
<Divider />
<Stack direction="row" justifyContent="space-between">
<Typography variant="body2" color="text.secondary">
{t("home.cards.clashInfo.fields.rulesCount")}
{t("home.components.clashInfo.fields.rulesCount")}
</Typography>
<Typography variant="body2" fontWeight="medium">
{rules.length}
@@ -87,7 +87,7 @@ export const ClashInfoCard = () => {
return (
<EnhancedCard
title={t("home.cards.clashInfo.title")}
title={t("home.components.clashInfo.title")}
icon={<DeveloperBoardOutlined />}
iconColor="warning"
action={null}

View File

@@ -21,16 +21,16 @@ const isClashMode = (mode: string): mode is ClashMode =>
const MODE_META: Record<ClashMode, { label: string; description: string }> = {
rule: {
label: "home.cards.clashMode.labels.rule",
description: "home.cards.clashMode.descriptions.rule",
label: "home.components.clashMode.labels.rule",
description: "home.components.clashMode.descriptions.rule",
},
global: {
label: "home.cards.clashMode.labels.global",
description: "home.cards.clashMode.descriptions.global",
label: "home.components.clashMode.labels.global",
description: "home.components.clashMode.descriptions.global",
},
direct: {
label: "home.cards.clashMode.labels.direct",
description: "home.cards.clashMode.descriptions.direct",
label: "home.components.clashMode.labels.direct",
description: "home.components.clashMode.descriptions.direct",
},
};
@@ -53,7 +53,7 @@ export const ClashModeCard = () => {
if (currentModeKey) {
return t(MODE_META[currentModeKey].description);
}
return t("home.cards.clashMode.errors.communication");
return t("home.components.clashMode.errors.communication");
}, [currentModeKey, t]);
// 模式图标映射

View File

@@ -823,7 +823,7 @@ export const CurrentProxyCard = () => {
return (
<EnhancedCard
title={t("home.cards.currentProxy.title")}
title={t("home.components.currentProxy.title")}
icon={
<Tooltip
title={
@@ -840,7 +840,9 @@ export const CurrentProxyCard = () => {
iconColor={currentProxy ? "primary" : undefined}
action={
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
<Tooltip title={t("home.cards.currentProxy.actions.refreshDelay")}>
<Tooltip
title={t("home.components.currentProxy.actions.refreshDelay")}
>
<span>
<IconButton
size="small"
@@ -906,7 +908,7 @@ export const CurrentProxyCard = () => {
{isGlobalMode && (
<Chip
size="small"
label={t("home.cards.currentProxy.labels.globalMode")}
label={t("home.components.currentProxy.labels.globalMode")}
color="primary"
sx={{ mr: 0.5 }}
/>
@@ -914,7 +916,7 @@ export const CurrentProxyCard = () => {
{isDirectMode && (
<Chip
size="small"
label={t("home.cards.currentProxy.labels.directMode")}
label={t("home.components.currentProxy.labels.directMode")}
color="success"
sx={{ mr: 0.5 }}
/>
@@ -955,13 +957,13 @@ export const CurrentProxyCard = () => {
sx={{ mb: 1.5 }}
>
<InputLabel id="proxy-group-select-label">
{t("home.cards.currentProxy.labels.group")}
{t("home.components.currentProxy.labels.group")}
</InputLabel>
<Select
labelId="proxy-group-select-label"
value={state.selection.group}
onChange={handleGroupChange}
label={t("home.cards.currentProxy.labels.group")}
label={t("home.components.currentProxy.labels.group")}
disabled={isGlobalMode || isDirectMode}
>
{state.proxyData.groups.map((group) => (
@@ -975,13 +977,13 @@ export const CurrentProxyCard = () => {
{/* 代理节点选择器 */}
<FormControl fullWidth variant="outlined" size="small" sx={{ mb: 0 }}>
<InputLabel id="proxy-select-label">
{t("home.cards.currentProxy.labels.proxy")}
{t("home.components.currentProxy.labels.proxy")}
</InputLabel>
<Select
labelId="proxy-select-label"
value={state.selection.proxy}
onChange={handleProxyChange}
label={t("home.cards.currentProxy.labels.proxy")}
label={t("home.components.currentProxy.labels.proxy")}
disabled={isDirectMode}
renderValue={renderProxyValue}
MenuProps={{
@@ -1037,7 +1039,7 @@ export const CurrentProxyCard = () => {
) : (
<Box sx={{ textAlign: "center", py: 4 }}>
<Typography variant="body1" color="text.secondary">
{t("home.cards.currentProxy.labels.noActiveNode")}
{t("home.components.currentProxy.labels.noActiveNode")}
</Typography>
</Box>
)}

View File

@@ -851,7 +851,7 @@ export const EnhancedCanvasTrafficGraph = memo(
// 获取时间范围文本
const getTimeRangeText = useCallback(() => {
return t("home.cards.traffic.patterns.minutes", {
return t("home.components.traffic.patterns.minutes", {
time: timeRange,
});
}, [timeRange, t]);
@@ -936,7 +936,7 @@ export const EnhancedCanvasTrafficGraph = memo(
textAlign: "right",
}}
>
{t("home.cards.traffic.legends.upload")}
{t("home.components.traffic.legends.upload")}
</Box>
<Box
sx={{
@@ -946,7 +946,7 @@ export const EnhancedCanvasTrafficGraph = memo(
textAlign: "right",
}}
>
{t("home.cards.traffic.legends.download")}
{t("home.components.traffic.legends.download")}
</Box>
</Box>

View File

@@ -219,42 +219,42 @@ export const EnhancedTrafficStats = () => {
() => [
{
icon: <ArrowUpwardRounded fontSize="small" />,
title: t("home.cards.traffic.metrics.uploadSpeed"),
title: t("home.components.traffic.metrics.uploadSpeed"),
value: parsedData.up,
unit: `${parsedData.upUnit}/s`,
color: "secondary" as const,
},
{
icon: <ArrowDownwardRounded fontSize="small" />,
title: t("home.cards.traffic.metrics.downloadSpeed"),
title: t("home.components.traffic.metrics.downloadSpeed"),
value: parsedData.down,
unit: `${parsedData.downUnit}/s`,
color: "primary" as const,
},
{
icon: <LinkRounded fontSize="small" />,
title: t("home.cards.traffic.metrics.activeConnections"),
title: t("home.components.traffic.metrics.activeConnections"),
value: parsedData.connectionsCount,
unit: "",
color: "success" as const,
},
{
icon: <CloudUploadRounded fontSize="small" />,
title: t("home.cards.traffic.metrics.uploaded"),
title: t("home.components.traffic.metrics.uploaded"),
value: parsedData.uploadTotal,
unit: parsedData.uploadTotalUnit,
color: "secondary" as const,
},
{
icon: <CloudDownloadRounded fontSize="small" />,
title: t("home.cards.traffic.metrics.downloaded"),
title: t("home.components.traffic.metrics.downloaded"),
value: parsedData.downloadTotal,
unit: parsedData.downloadTotalUnit,
color: "primary" as const,
},
{
icon: <MemoryRounded fontSize="small" />,
title: t("home.cards.traffic.metrics.memoryUsage"),
title: t("home.components.traffic.metrics.memoryUsage"),
value: parsedData.inuse,
unit: parsedData.inuseUnit,
color: "error" as const,

View File

@@ -70,7 +70,9 @@ export const IpInfoCard = () => {
setCountdown(IP_REFRESH_SECONDS);
} catch (err) {
setError(
err instanceof Error ? err.message : t("home.cards.ipInfo.errors.load"),
err instanceof Error
? err.message
: t("home.components.ipInfo.errors.load"),
);
} finally {
setLoading(false);
@@ -116,7 +118,7 @@ export const IpInfoCard = () => {
if (loading) {
return (
<EnhancedCard
title={t("home.cards.ipInfo.title")}
title={t("home.components.ipInfo.title")}
icon={<LocationOnOutlined />}
iconColor="info"
action={
@@ -139,7 +141,7 @@ export const IpInfoCard = () => {
if (error) {
return (
<EnhancedCard
title={t("home.cards.ipInfo.title")}
title={t("home.components.ipInfo.title")}
icon={<LocationOnOutlined />}
iconColor="info"
action={
@@ -172,7 +174,7 @@ export const IpInfoCard = () => {
// 渲染正常数据
return (
<EnhancedCard
title={t("home.cards.ipInfo.title")}
title={t("home.components.ipInfo.title")}
icon={<LocationOnOutlined />}
iconColor="info"
action={
@@ -224,7 +226,7 @@ export const IpInfoCard = () => {
maxWidth: "100%",
}}
>
{ipInfo?.country || t("home.cards.ipInfo.labels.unknown")}
{ipInfo?.country || t("home.components.ipInfo.labels.unknown")}
</Typography>
</Box>
@@ -234,7 +236,7 @@ export const IpInfoCard = () => {
color="text.secondary"
sx={{ flexShrink: 0 }}
>
{t("home.cards.ipInfo.labels.ip")}:
{t("home.components.ipInfo.labels.ip")}:
</Typography>
<Box
sx={{
@@ -268,7 +270,7 @@ export const IpInfoCard = () => {
</Box>
<InfoItem
label={t("home.cards.ipInfo.labels.asn")}
label={t("home.components.ipInfo.labels.asn")}
value={ipInfo?.asn ? `AS${ipInfo.asn}` : "N/A"}
/>
</Box>
@@ -276,19 +278,19 @@ export const IpInfoCard = () => {
{/* 右侧组织、ISP和位置信息 */}
<Box sx={{ width: "60%", overflow: "auto" }}>
<InfoItem
label={t("home.cards.ipInfo.labels.isp")}
label={t("home.components.ipInfo.labels.isp")}
value={ipInfo?.isp}
/>
<InfoItem
label={t("home.cards.ipInfo.labels.org")}
label={t("home.components.ipInfo.labels.org")}
value={ipInfo?.asn_organization}
/>
<InfoItem
label={t("home.cards.ipInfo.labels.location")}
label={t("home.components.ipInfo.labels.location")}
value={[ipInfo?.city, ipInfo?.region].filter(Boolean).join(", ")}
/>
<InfoItem
label={t("home.cards.ipInfo.labels.timezone")}
label={t("home.components.ipInfo.labels.timezone")}
value={ipInfo?.timezone}
/>
</Box>
@@ -308,7 +310,7 @@ export const IpInfoCard = () => {
}}
>
<Typography variant="caption">
{t("home.cards.ipInfo.labels.autoRefresh")}: {countdown}s
{t("home.components.ipInfo.labels.autoRefresh")}: {countdown}s
</Typography>
<Typography
variant="caption"

View File

@@ -160,18 +160,18 @@ export const ProxyTunCard: FC = () => {
if (activeTab === "system") {
return {
text: systemProxyActualState
? t("home.cards.proxyTun.status.systemProxyEnabled")
: t("home.cards.proxyTun.status.systemProxyDisabled"),
tooltip: t("home.cards.proxyTun.tooltips.systemProxy"),
? t("home.components.proxyTun.status.systemProxyEnabled")
: t("home.components.proxyTun.status.systemProxyDisabled"),
tooltip: t("home.components.proxyTun.tooltips.systemProxy"),
};
} else {
return {
text: !isTunModeAvailable
? t("home.cards.proxyTun.status.tunModeServiceRequired")
? t("home.components.proxyTun.status.tunModeServiceRequired")
: enable_tun_mode
? t("home.cards.proxyTun.status.tunModeEnabled")
: t("home.cards.proxyTun.status.tunModeDisabled"),
tooltip: t("home.cards.proxyTun.tooltips.tunMode"),
? t("home.components.proxyTun.status.tunModeEnabled")
: t("home.components.proxyTun.status.tunModeDisabled"),
tooltip: t("home.components.proxyTun.tooltips.tunMode"),
};
}
}, [

View File

@@ -219,11 +219,11 @@ export const SystemInfoCard = () => {
<>
<AdminPanelSettingsOutlined
sx={{ color: "primary.main", fontSize: 16 }}
titleAccess={t("home.cards.systemInfo.badges.adminMode")}
titleAccess={t("home.components.systemInfo.badges.adminMode")}
/>
<DnsOutlined
sx={{ color: "success.main", fontSize: 16, ml: 0.5 }}
titleAccess={t("home.cards.systemInfo.badges.serviceMode")}
titleAccess={t("home.components.systemInfo.badges.serviceMode")}
/>
</>
);
@@ -231,21 +231,21 @@ export const SystemInfoCard = () => {
return (
<AdminPanelSettingsOutlined
sx={{ color: "primary.main", fontSize: 16 }}
titleAccess={t("home.cards.systemInfo.badges.adminMode")}
titleAccess={t("home.components.systemInfo.badges.adminMode")}
/>
);
} else if (isSidecarMode) {
return (
<ExtensionOutlined
sx={{ color: "info.main", fontSize: 16 }}
titleAccess={t("home.cards.systemInfo.badges.sidecarMode")}
titleAccess={t("home.components.systemInfo.badges.sidecarMode")}
/>
);
} else {
return (
<DnsOutlined
sx={{ color: "success.main", fontSize: 16 }}
titleAccess={t("home.cards.systemInfo.badges.serviceMode")}
titleAccess={t("home.components.systemInfo.badges.serviceMode")}
/>
);
}
@@ -256,13 +256,13 @@ export const SystemInfoCard = () => {
if (isAdminMode) {
// 判断是否同时处于服务模式
if (!isSidecarMode) {
return t("home.cards.systemInfo.badges.adminServiceMode");
return t("home.components.systemInfo.badges.adminServiceMode");
}
return t("home.cards.systemInfo.badges.adminMode");
return t("home.components.systemInfo.badges.adminMode");
} else if (isSidecarMode) {
return t("home.cards.systemInfo.badges.sidecarMode");
return t("home.components.systemInfo.badges.sidecarMode");
} else {
return t("home.cards.systemInfo.badges.serviceMode");
return t("home.components.systemInfo.badges.serviceMode");
}
};
@@ -271,14 +271,14 @@ export const SystemInfoCard = () => {
return (
<EnhancedCard
title={t("home.cards.systemInfo.title")}
title={t("home.components.systemInfo.title")}
icon={<InfoOutlined />}
iconColor="error"
action={
<IconButton
size="small"
onClick={goToSettings}
title={t("home.cards.systemInfo.actions.settings")}
title={t("home.components.systemInfo.actions.settings")}
>
<SettingsOutlined fontSize="small" />
</IconButton>
@@ -287,7 +287,7 @@ export const SystemInfoCard = () => {
<Stack spacing={1.5}>
<Stack direction="row" justifyContent="space-between">
<Typography variant="body2" color="text.secondary">
{t("home.cards.systemInfo.fields.osInfo")}
{t("home.components.systemInfo.fields.osInfo")}
</Typography>
<Typography variant="body2" fontWeight="medium">
{systemState.osInfo}
@@ -300,12 +300,12 @@ export const SystemInfoCard = () => {
alignItems="center"
>
<Typography variant="body2" color="text.secondary">
{t("home.cards.systemInfo.fields.autoLaunch")}
{t("home.components.systemInfo.fields.autoLaunch")}
</Typography>
<Stack direction="row" spacing={1} alignItems="center">
{isAdminMode && (
<Tooltip
title={t("home.cards.systemInfo.tooltips.autoLaunchAdmin")}
title={t("home.components.systemInfo.tooltips.autoLaunchAdmin")}
>
<WarningOutlined sx={{ color: "warning.main", fontSize: 20 }} />
</Tooltip>
@@ -331,7 +331,7 @@ export const SystemInfoCard = () => {
alignItems="center"
>
<Typography variant="body2" color="text.secondary">
{t("home.cards.systemInfo.fields.runningMode")}
{t("home.components.systemInfo.fields.runningMode")}
</Typography>
<Typography
variant="body2"
@@ -346,7 +346,7 @@ export const SystemInfoCard = () => {
<Divider />
<Stack direction="row" justifyContent="space-between">
<Typography variant="body2" color="text.secondary">
{t("home.cards.systemInfo.fields.lastCheckUpdate")}
{t("home.components.systemInfo.fields.lastCheckUpdate")}
</Typography>
<Typography
variant="body2"
@@ -364,7 +364,7 @@ export const SystemInfoCard = () => {
<Divider />
<Stack direction="row" justifyContent="space-between">
<Typography variant="body2" color="text.secondary">
{t("home.cards.systemInfo.fields.vergeVersion")}
{t("home.components.systemInfo.fields.vergeVersion")}
</Typography>
<Typography variant="body2" fontWeight="medium">
v{appVersion}

View File

@@ -173,7 +173,7 @@ export const TestCard = () => {
return (
<EnhancedCard
title={t("home.cards.tests.title")}
title={t("home.components.tests.title")}
icon={<NetworkCheck />}
action={
<Box sx={{ display: "flex", gap: 1 }}>
@@ -182,7 +182,7 @@ export const TestCard = () => {
<NetworkCheck fontSize="small" />
</IconButton>
</Tooltip>
<Tooltip title={t("tests.viewer.title.create")} arrow>
<Tooltip title={t("tests.modals.test.title.create")} arrow>
<IconButton size="small" onClick={handleCreateTest}>
<Add fontSize="small" />
</IconButton>

View File

@@ -87,7 +87,7 @@ export const LayoutTraffic = () => {
<Box display="flex" flexDirection="column" gap={0.75}>
<Box
title={`${t("home.cards.traffic.metrics.uploadSpeed")}`}
title={`${t("home.components.traffic.metrics.uploadSpeed")}`}
{...boxStyle}
sx={{
...boxStyle.sx,
@@ -105,7 +105,7 @@ export const LayoutTraffic = () => {
</Box>
<Box
title={`${t("home.cards.traffic.metrics.downloadSpeed")}`}
title={`${t("home.components.traffic.metrics.downloadSpeed")}`}
{...boxStyle}
sx={{
...boxStyle.sx,
@@ -124,7 +124,7 @@ export const LayoutTraffic = () => {
{displayMemory && (
<Box
title={`${t("home.cards.traffic.metrics.memoryUsage")} `}
title={`${t("home.components.traffic.metrics.memoryUsage")} `}
{...boxStyle}
sx={{
cursor: "auto",

View File

@@ -74,17 +74,17 @@ interface Props {
const builtinProxyPolicies = ["DIRECT", "REJECT", "REJECT-DROP", "PASS"];
const PROXY_STRATEGY_LABEL_KEYS: Record<string, string> = {
select: "proxies.enums.strategies.select",
"url-test": "proxies.enums.strategies.url-test",
fallback: "proxies.enums.strategies.fallback",
"load-balance": "proxies.enums.strategies.load-balance",
relay: "proxies.enums.strategies.relay",
select: "proxies.components.enums.strategies.select",
"url-test": "proxies.components.enums.strategies.url-test",
fallback: "proxies.components.enums.strategies.fallback",
"load-balance": "proxies.components.enums.strategies.load-balance",
relay: "proxies.components.enums.strategies.relay",
};
const PROXY_POLICY_LABEL_KEYS: Record<string, string> =
builtinProxyPolicies.reduce(
(acc, policy) => {
acc[policy] = `proxies.enums.policies.${policy}`;
acc[policy] = `proxies.components.enums.policies.${policy}`;
return acc;
},
{} as Record<string, string>,

View File

@@ -241,7 +241,10 @@ const rules: {
];
const RULE_TYPE_LABEL_KEYS: Record<string, string> = Object.fromEntries(
rules.map((rule) => [rule.name, `rules.editor.ruleTypes.${rule.name}`]),
rules.map((rule) => [
rule.name,
`rules.modals.editor.ruleTypes.${rule.name}`,
]),
);
const builtinProxyPolicies = ["DIRECT", "REJECT", "REJECT-DROP", "PASS"];
@@ -475,10 +478,12 @@ export const RulesEditorViewer = (props: Props) => {
const validateRule = () => {
if ((ruleType.required ?? true) && !ruleContent) {
throw new Error(t("rules.editor.form.validation.conditionRequired"));
throw new Error(
t("rules.modals.editor.form.validation.conditionRequired"),
);
}
if (ruleType.validator && !ruleType.validator(ruleContent)) {
throw new Error(t("rules.editor.form.validation.invalidRule"));
throw new Error(t("rules.modals.editor.form.validation.invalidRule"));
}
const condition = (ruleType.required ?? true) ? ruleContent : "";
@@ -503,7 +508,7 @@ export const RulesEditorViewer = (props: Props) => {
<DialogTitle>
{
<Box display="flex" justifyContent="space-between">
{t("rules.editor.title")}
{t("rules.modals.editor.header.title")}
<Box>
<Button
variant="contained"
@@ -533,7 +538,9 @@ export const RulesEditorViewer = (props: Props) => {
}}
>
<Item>
<ListItemText primary={t("rules.editor.form.labels.type")} />
<ListItemText
primary={t("rules.modals.editor.form.labels.type")}
/>
<Autocomplete
size="small"
sx={{ minWidth: "240px" }}
@@ -559,7 +566,9 @@ export const RulesEditorViewer = (props: Props) => {
<Item
sx={{ display: !(ruleType.required ?? true) ? "none" : "" }}
>
<ListItemText primary={t("rules.editor.form.labels.content")} />
<ListItemText
primary={t("rules.modals.editor.form.labels.content")}
/>
{ruleType.name === "RULE-SET" && (
<Autocomplete
@@ -597,7 +606,7 @@ export const RulesEditorViewer = (props: Props) => {
</Item>
<Item>
<ListItemText
primary={t("rules.editor.form.labels.proxyPolicy")}
primary={t("rules.modals.editor.form.labels.proxyPolicy")}
/>
<Autocomplete
size="small"
@@ -622,7 +631,7 @@ export const RulesEditorViewer = (props: Props) => {
{ruleType.noResolve && (
<Item>
<ListItemText
primary={t("rules.editor.form.toggles.noResolve")}
primary={t("rules.modals.editor.form.toggles.noResolve")}
/>
<Switch
checked={noResolve}
@@ -645,7 +654,7 @@ export const RulesEditorViewer = (props: Props) => {
}
}}
>
{t("rules.editor.form.actions.prependRule")}
{t("rules.modals.editor.form.actions.prependRule")}
</Button>
</Item>
<Item>
@@ -663,7 +672,7 @@ export const RulesEditorViewer = (props: Props) => {
}
}}
>
{t("rules.editor.form.actions.appendRule")}
{t("rules.modals.editor.form.actions.appendRule")}
</Button>
</Item>
</List>

View File

@@ -66,11 +66,14 @@ export const ProviderButton = () => {
await refreshProxy();
await refreshProxyProviders();
showNotice.success("proxies.page.provider.notices.updateSuccess", {
name,
});
showNotice.success(
"proxies.feedback.notifications.provider.updateSuccess",
{
name,
},
);
} catch (err) {
showNotice.error("proxies.page.provider.notices.updateFailed", {
showNotice.error("proxies.feedback.notifications.provider.updateFailed", {
name,
message: String(err),
});
@@ -86,7 +89,7 @@ export const ProviderButton = () => {
// 获取所有provider的名称
const allProviders = Object.keys(proxyProviders || {});
if (allProviders.length === 0) {
showNotice.info("proxies.page.provider.notices.none");
showNotice.info("proxies.feedback.notifications.provider.none");
return;
}
@@ -116,9 +119,9 @@ export const ProviderButton = () => {
await refreshProxy();
await refreshProxyProviders();
showNotice.success("proxies.page.provider.notices.allUpdated");
showNotice.success("proxies.feedback.notifications.provider.allUpdated");
} catch (err) {
showNotice.error("proxies.page.provider.notices.genericError", {
showNotice.error("proxies.feedback.notifications.provider.genericError", {
message: String(err),
});
} finally {

View File

@@ -58,11 +58,14 @@ export const ProviderButton = () => {
await refreshRules();
await refreshRuleProviders();
showNotice.success("rules.page.provider.notices.updateSuccess", {
name,
});
showNotice.success(
"rules.feedback.notifications.provider.updateSuccess",
{
name,
},
);
} catch (err) {
showNotice.error("rules.page.provider.notices.updateFailed", {
showNotice.error("rules.feedback.notifications.provider.updateFailed", {
name,
message: String(err),
});
@@ -78,7 +81,7 @@ export const ProviderButton = () => {
// 获取所有provider的名称
const allProviders = Object.keys(ruleProviders || {});
if (allProviders.length === 0) {
showNotice.info("rules.page.provider.notices.none");
showNotice.info("rules.feedback.notifications.provider.none");
return;
}
@@ -108,9 +111,9 @@ export const ProviderButton = () => {
await refreshRules();
await refreshRuleProviders();
showNotice.success("rules.page.provider.notices.allUpdated");
showNotice.success("rules.feedback.notifications.provider.allUpdated");
} catch (err) {
showNotice.error("rules.page.provider.notices.genericError", {
showNotice.error("rules.feedback.notifications.provider.genericError", {
message: String(err),
});
} finally {

View File

@@ -192,7 +192,7 @@ export const TestItem = ({
":hover": { bgcolor: alpha(palette.primary.main, 0.15) },
})}
>
{t("tests.item.actions.test")}
{t("tests.components.item.actions.test")}
</Widget>
)}

View File

@@ -126,8 +126,8 @@ export const TestViewer = forwardRef<TestViewerRef, Props>((props, ref) => {
open={open}
title={
openType === "new"
? t("tests.viewer.title.create")
: t("tests.viewer.title.edit")
? t("tests.modals.test.title.create")
: t("tests.modals.test.title.edit")
}
contentSx={{ width: 375, pb: 0, maxHeight: "80%" }}
okBtn={t("shared.actions.save")}
@@ -166,7 +166,7 @@ export const TestViewer = forwardRef<TestViewerRef, Props>((props, ref) => {
{...field}
multiline
maxRows={3}
label={t("tests.viewer.fields.url")}
label={t("tests.modals.test.fields.url")}
/>
)}
/>

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "مجموعات الوكلاء",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "تحديث الكل",
"update": "تحديث"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "الوضع المباشر"
},
"header": {
"title": {
"default": "مجموعات الوكلاء",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "اختيار الوكيل يدويًا",
"url-test": "اختيار الوكيل بناءً على تأخير اختبار الرابط",
"fallback": "التبديل إلى وكيل آخر عند حدوث خطأ",
"load-balance": "توزيع التحميل بين الوكلاء",
"relay": "التمرير عبر سلسلة الوكلاء المحددة"
},
"policies": {
"DIRECT": "البيانات تخرج مباشرة",
"REJECT": "رفض الطلبات",
"REJECT-DROP": "تجاهل الطلبات",
"PASS": "تخطي هذه القاعدة عند المطابقة"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "اختيار الوكيل يدويًا",
"url-test": "اختيار الوكيل بناءً على تأخير اختبار الرابط",
"fallback": "التبديل إلى وكيل آخر عند حدوث خطأ",
"load-balance": "توزيع التحميل بين الوكلاء",
"relay": "التمرير عبر سلسلة الوكلاء المحددة"
},
"policies": {
"DIRECT": "البيانات تخرج مباشرة",
"REJECT": "رفض الطلبات",
"REJECT-DROP": "تجاهل الطلبات",
"PASS": "تخطي هذه القاعدة عند المطابقة"
}
}
}
},
"connections": {
"page": {
"title": "الاتصالات",
"summary": {
"downloaded": "تم التنزيل",
"uploaded": "تم الرفع"
@@ -396,69 +403,83 @@
"pause": "إيقاف مؤقت",
"resume": "استأنف",
"closeAll": "إغلاق الكل"
},
"header": {
"title": "الاتصالات"
}
},
"fields": {
"host": "المضيف",
"downloaded": "تم التنزيل",
"uploaded": "تم الرفع",
"dlSpeed": "سرعة التنزيل",
"ulSpeed": "سرعة الرفع",
"chains": "السلاسل",
"rule": "قاعدة",
"process": "عملية",
"time": "الوقت",
"source": "المصدر",
"destination": "عنوان IP الوجهة",
"destinationPort": "ميناء الوجهة",
"type": "النوع"
},
"order": {
"default": "Default",
"uploadSpeed": "سرعة الرفع",
"downloadSpeed": "سرعة التنزيل"
},
"actions": {
"closeConnection": "إغلاق الاتصال"
"components": {
"fields": {
"host": "المضيف",
"downloaded": "تم التنزيل",
"uploaded": "تم الرفع",
"dlSpeed": "سرعة التنزيل",
"ulSpeed": "سرعة الرفع",
"chains": "السلاسل",
"rule": "قاعدة",
"process": "عملية",
"time": "الوقت",
"source": "المصدر",
"destination": "عنوان IP الوجهة",
"destinationPort": "ميناء الوجهة",
"type": "النوع"
},
"order": {
"default": "Default",
"uploadSpeed": "سرعة الرفع",
"downloadSpeed": "سرعة التنزيل"
},
"actions": {
"closeConnection": "إغلاق الاتصال"
}
}
},
"tests": {
"item": {
"actions": {
"test": "اختبار"
}
},
"viewer": {
"title": {
"create": "إنشاء اختبار",
"edit": "تعديل الاختبار"
},
"fields": {
"url": "رابط الاختبار"
}
},
"page": {
"title": "اختبار",
"actions": {
"testAll": "اختبار الكل"
},
"header": {
"title": "اختبار"
}
},
"statuses": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
"components": {
"item": {
"actions": {
"test": "اختبار"
}
}
},
"modals": {
"test": {
"title": {
"create": "إنشاء اختبار",
"edit": "تعديل الاختبار"
},
"fields": {
"url": "رابط الاختبار"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
}
}
}
},
"logs": {
"page": {
"title": "السجلات",
"actions": {
"pause": "إيقاف مؤقت",
"resume": "استأنف",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "السجلات"
}
}
},
"rules": {
"page": {
"title": "القواعد",
"provider": {
"trigger": "مزود القواعد",
"dialogTitle": "مزود القواعد",
"actions": {
"updateAll": "تحديث الكل",
"update": "تحديث"
},
"notices": {
}
},
"header": {
"title": "القواعد"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "تعديل القواعد",
"form": {
"labels": {
"type": "نوع القاعدة",
"content": "محتوى القاعدة",
"proxyPolicy": "سياسة الوكيل"
"modals": {
"editor": {
"form": {
"labels": {
"type": "نوع القاعدة",
"content": "محتوى القاعدة",
"proxyPolicy": "سياسة الوكيل"
},
"toggles": {
"noResolve": "لا يوجد حل"
},
"actions": {
"prependRule": "إضافة قاعدة في البداية",
"appendRule": "إضافة قاعدة في النهاية"
},
"validation": {
"conditionRequired": "شرط القاعدة مطلوب",
"invalidRule": "قاعدة غير صالحة"
}
},
"toggles": {
"noResolve": "لا يوجد حل"
"ruleTypes": {
"DOMAIN": "مطابقة اسم المجال الكامل",
"DOMAIN-SUFFIX": "مطابقة لاحقة المجال",
"DOMAIN-KEYWORD": "مطابقة كلمة مفتاحية في المجال",
"DOMAIN-REGEX": "مطابقة المجال باستخدام التعبيرات العادية",
"GEOSITE": "مطابقة المجالات ضمن Geosite",
"GEOIP": "مطابقة رمز البلد لعنوان IP",
"SRC-GEOIP": "مطابقة رمز البلد لعنوان IP المصدر",
"IP-ASN": "مطابقة ASN لعنوان IP",
"SRC-IP-ASN": "مطابقة ASN لعنوان IP المصدر",
"IP-CIDR": "مطابقة نطاق عنوان IP",
"IP-CIDR6": "مطابقة نطاق عناوين IPv6",
"SRC-IP-CIDR": "مطابقة نطاق عنوان IP المصدر",
"IP-SUFFIX": "مطابقة لاحقة عنوان IP",
"SRC-IP-SUFFIX": "مطابقة لاحقة عنوان IP المصدر",
"SRC-PORT": "مطابقة نطاق المنفذ المصدر",
"DST-PORT": "مطابقة نطاق المنفذ الوجهة",
"IN-PORT": "مطابقة المنفذ الوارد",
"DSCP": "علامة DSCP (لـ tproxy على UDP فقط)",
"PROCESS-NAME": "مطابقة اسم العملية (اسم حزمة Android)",
"PROCESS-PATH": "مطابقة المسار الكامل للعملية",
"PROCESS-NAME-REGEX": "مطابقة اسم العملية باستخدام التعبيرات العادية (اسم حزمة Android)",
"PROCESS-PATH-REGEX": "مطابقة المسار الكامل للعملية باستخدام التعبيرات العادية",
"NETWORK": "مطابقة بروتوكول النقل (TCP/UDP)",
"UID": "مطابقة معرف المستخدم في Linux",
"IN-TYPE": "مطابقة نوع الإدخال",
"IN-USER": "مطابقة اسم المستخدم للإدخال",
"IN-NAME": "مطابقة اسم الإدخال",
"SUB-RULE": "قاعدة فرعية",
"RULE-SET": "مطابقة مجموعة القواعد",
"AND": "منطقي AND",
"OR": "منطقي OR",
"NOT": "منطقي NOT",
"MATCH": "مطابقة جميع الطلبات"
},
"actions": {
"prependRule": "إضافة قاعدة في البداية",
"appendRule": "إضافة قاعدة في النهاية"
},
"validation": {
"conditionRequired": "شرط القاعدة مطلوب",
"invalidRule": "قاعدة غير صالحة"
"header": {
"title": "تعديل القواعد"
}
},
"ruleTypes": {
"DOMAIN": "مطابقة اسم المجال الكامل",
"DOMAIN-SUFFIX": "مطابقة لاحقة المجال",
"DOMAIN-KEYWORD": "مطابقة كلمة مفتاحية في المجال",
"DOMAIN-REGEX": "مطابقة المجال باستخدام التعبيرات العادية",
"GEOSITE": "مطابقة المجالات ضمن Geosite",
"GEOIP": "مطابقة رمز البلد لعنوان IP",
"SRC-GEOIP": "مطابقة رمز البلد لعنوان IP المصدر",
"IP-ASN": "مطابقة ASN لعنوان IP",
"SRC-IP-ASN": "مطابقة ASN لعنوان IP المصدر",
"IP-CIDR": "مطابقة نطاق عنوان IP",
"IP-CIDR6": "مطابقة نطاق عناوين IPv6",
"SRC-IP-CIDR": "مطابقة نطاق عنوان IP المصدر",
"IP-SUFFIX": "مطابقة لاحقة عنوان IP",
"SRC-IP-SUFFIX": "مطابقة لاحقة عنوان IP المصدر",
"SRC-PORT": "مطابقة نطاق المنفذ المصدر",
"DST-PORT": "مطابقة نطاق المنفذ الوجهة",
"IN-PORT": "مطابقة المنفذ الوارد",
"DSCP": "علامة DSCP (لـ tproxy على UDP فقط)",
"PROCESS-NAME": "مطابقة اسم العملية (اسم حزمة Android)",
"PROCESS-PATH": "مطابقة المسار الكامل للعملية",
"PROCESS-NAME-REGEX": "مطابقة اسم العملية باستخدام التعبيرات العادية (اسم حزمة Android)",
"PROCESS-PATH-REGEX": "مطابقة المسار الكامل للعملية باستخدام التعبيرات العادية",
"NETWORK": "مطابقة بروتوكول النقل (TCP/UDP)",
"UID": "مطابقة معرف المستخدم في Linux",
"IN-TYPE": "مطابقة نوع الإدخال",
"IN-USER": "مطابقة اسم المستخدم للإدخال",
"IN-NAME": "مطابقة اسم الإدخال",
"SUB-RULE": "قاعدة فرعية",
"RULE-SET": "مطابقة مجموعة القواعد",
"AND": "منطقي AND",
"OR": "منطقي OR",
"NOT": "منطقي NOT",
"MATCH": "مطابقة جميع الطلبات"
}
}
},
"home": {
"page": {
"title": "Home",
"tooltips": {
"lightweightMode": "وضع الأداء الخفيف",
"manual": "دليل",
@@ -563,7 +596,6 @@
"proxyMode": "Proxy Mode"
},
"settings": {
"title": "Home Settings",
"cards": {
"profile": "Profile Card",
"currentProxy": "Current Proxy Card",
@@ -574,10 +606,16 @@
"ip": "IP Information Card",
"clashInfo": "Clash Info Cards",
"systemInfo": "System Info Cards"
},
"header": {
"title": "Home Settings"
}
},
"header": {
"title": "Home"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "System proxy is enabled, your applications will access the network through the proxy",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Unlock Test",
"actions": {
"testing": "Testing..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Unlock Test"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "Proxy-Gruppen",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "Alle aktualisieren",
"update": "Aktualisieren"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "Direktverbindungs-Modus"
},
"header": {
"title": {
"default": "Proxy-Gruppen",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "Proxy manuell auswählen",
"url-test": "Proxy basierend auf URL-Latenztest auswählen",
"fallback": "Bei Nichtverfügbarkeit zu einem anderen Proxy wechseln",
"load-balance": "Proxy basierend auf Lastverteilung zuweisen",
"relay": "Basierend auf definiertem Proxy-Kette weiterleiten"
},
"policies": {
"DIRECT": "Direktverbindung",
"REJECT": "Anfrage ablehnen",
"REJECT-DROP": "Anfrage verwerfen",
"PASS": "Diese Regel überspringen"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "Proxy manuell auswählen",
"url-test": "Proxy basierend auf URL-Latenztest auswählen",
"fallback": "Bei Nichtverfügbarkeit zu einem anderen Proxy wechseln",
"load-balance": "Proxy basierend auf Lastverteilung zuweisen",
"relay": "Basierend auf definiertem Proxy-Kette weiterleiten"
},
"policies": {
"DIRECT": "Direktverbindung",
"REJECT": "Anfrage ablehnen",
"REJECT-DROP": "Anfrage verwerfen",
"PASS": "Diese Regel überspringen"
}
}
}
},
"connections": {
"page": {
"title": "Verbindungen",
"summary": {
"downloaded": "Heruntergeladen",
"uploaded": "Hochgeladen"
@@ -396,69 +403,83 @@
"pause": "Pausieren",
"resume": "Fortsetzen",
"closeAll": "Alle schließen"
},
"header": {
"title": "Verbindungen"
}
},
"fields": {
"host": "Host",
"downloaded": "Heruntergeladen",
"uploaded": "Hochgeladen",
"dlSpeed": "Download-Geschwindigkeit",
"ulSpeed": "Upload-Geschwindigkeit",
"chains": "Ketten",
"rule": "Regel",
"process": "Prozess",
"time": "Verbindungszeit",
"source": "Quelladresse",
"destination": "Zieladresse",
"destinationPort": "Zielport",
"type": "Typ"
},
"order": {
"default": "Default",
"uploadSpeed": "Upload-Geschwindigkeit",
"downloadSpeed": "Download-Geschwindigkeit"
},
"actions": {
"closeConnection": "Verbindung schließen"
"components": {
"fields": {
"host": "Host",
"downloaded": "Heruntergeladen",
"uploaded": "Hochgeladen",
"dlSpeed": "Download-Geschwindigkeit",
"ulSpeed": "Upload-Geschwindigkeit",
"chains": "Ketten",
"rule": "Regel",
"process": "Prozess",
"time": "Verbindungszeit",
"source": "Quelladresse",
"destination": "Zieladresse",
"destinationPort": "Zielport",
"type": "Typ"
},
"order": {
"default": "Default",
"uploadSpeed": "Upload-Geschwindigkeit",
"downloadSpeed": "Download-Geschwindigkeit"
},
"actions": {
"closeConnection": "Verbindung schließen"
}
}
},
"tests": {
"item": {
"actions": {
"test": "Testen"
}
},
"viewer": {
"title": {
"create": "Neuen Test erstellen",
"edit": "Test bearbeiten"
},
"fields": {
"url": "Test-URL"
}
},
"page": {
"title": "Testen",
"actions": {
"testAll": "Alle testen"
},
"header": {
"title": "Testen"
}
},
"statuses": {
"pending": "Wartend auf Prüfung",
"yes": "Unterstützt",
"no": "Nicht unterstützt",
"failed": "Test fehlgeschlagen",
"completed": "Prüfung abgeschlossen",
"disallowedIsp": "Nicht zugelassener Internetdienstanbieter",
"originalsOnly": "Nur Original",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Nicht unterstütztes Land/Region",
"failedNetwork": "Failed (Network Connection)"
"components": {
"item": {
"actions": {
"test": "Testen"
}
}
},
"modals": {
"test": {
"title": {
"create": "Neuen Test erstellen",
"edit": "Test bearbeiten"
},
"fields": {
"url": "Test-URL"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "Wartend auf Prüfung",
"yes": "Unterstützt",
"no": "Nicht unterstützt",
"failed": "Test fehlgeschlagen",
"completed": "Prüfung abgeschlossen",
"disallowedIsp": "Nicht zugelassener Internetdienstanbieter",
"originalsOnly": "Nur Original",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Nicht unterstütztes Land/Region",
"failedNetwork": "Failed (Network Connection)"
}
}
}
},
"logs": {
"page": {
"title": "Protokolle",
"actions": {
"pause": "Pausieren",
"resume": "Fortsetzen",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "Protokolle"
}
}
},
"rules": {
"page": {
"title": "Regeln",
"provider": {
"trigger": "Regelsammlung",
"dialogTitle": "Regelsammlung",
"actions": {
"updateAll": "Alle aktualisieren",
"update": "Aktualisieren"
},
"notices": {
}
},
"header": {
"title": "Regeln"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "Regeln bearbeiten",
"form": {
"labels": {
"type": "Regeltyp",
"content": "Regelinhalt",
"proxyPolicy": "Proxy-Strategie"
"modals": {
"editor": {
"form": {
"labels": {
"type": "Regeltyp",
"content": "Regelinhalt",
"proxyPolicy": "Proxy-Strategie"
},
"toggles": {
"noResolve": "DNS-Auflösung überspringen"
},
"actions": {
"prependRule": "Vorherige Regel hinzufügen",
"appendRule": "Nachfolgende Regel hinzufügen"
},
"validation": {
"conditionRequired": "Regelbedingung fehlt",
"invalidRule": "Ungültige Regel"
}
},
"toggles": {
"noResolve": "DNS-Auflösung überspringen"
"ruleTypes": {
"DOMAIN": "Vollständigen Domainnamen übereinstimmen",
"DOMAIN-SUFFIX": "Domain-Suffix übereinstimmen",
"DOMAIN-KEYWORD": "Domain-Schlüsselwort übereinstimmen",
"DOMAIN-REGEX": "Domain-Regulärer Ausdruck übereinstimmen",
"GEOSITE": "Domainnamen in Geosite übereinstimmen",
"GEOIP": "IP-Ländercode übereinstimmen",
"SRC-GEOIP": "Quell-IP-Ländercode übereinstimmen",
"IP-ASN": "IP-ASN übereinstimmen",
"SRC-IP-ASN": "Quell-IP-ASN übereinstimmen",
"IP-CIDR": "IP-Adressbereich übereinstimmen",
"IP-CIDR6": "IP-Adressbereich übereinstimmen",
"SRC-IP-CIDR": "Quell-IP-Adressbereich übereinstimmen",
"IP-SUFFIX": "IP-Suffix-Bereich übereinstimmen",
"SRC-IP-SUFFIX": "Quell-IP-Suffix-Bereich übereinstimmen",
"SRC-PORT": "Quellportbereich der Anfrage übereinstimmen",
"DST-PORT": "Zielportbereich der Anfrage übereinstimmen",
"IN-PORT": "Eingangsport übereinstimmen",
"DSCP": "DSCP-Markierung (nur für TPROXY UDP-Eingang)",
"PROCESS-NAME": "Prozessnamen übereinstimmen (Android-Paketname)",
"PROCESS-PATH": "Vollständigen Prozesspfad übereinstimmen",
"PROCESS-NAME-REGEX": "Regulärer Ausdruck für vollständigen Prozessnamen übereinstimmen (Android-Paketname)",
"PROCESS-PATH-REGEX": "Regulärer Ausdruck für vollständigen Prozesspfad übereinstimmen",
"NETWORK": "Übertragungsprotokoll übereinstimmen (TCP/UDP)",
"UID": "Linux-USER-ID übereinstimmen",
"IN-TYPE": "Eingangstyp übereinstimmen",
"IN-USER": "Eingangsbenutzername übereinstimmen",
"IN-NAME": "Eingangsname übereinstimmen",
"SUB-RULE": "Unterregel",
"RULE-SET": "Regelsatz übereinstimmen",
"AND": "Logisches UND",
"OR": "Logisches ODER",
"NOT": "Logisches NICHT",
"MATCH": "Alle Anfragen übereinstimmen"
},
"actions": {
"prependRule": "Vorherige Regel hinzufügen",
"appendRule": "Nachfolgende Regel hinzufügen"
},
"validation": {
"conditionRequired": "Regelbedingung fehlt",
"invalidRule": "Ungültige Regel"
"header": {
"title": "Regeln bearbeiten"
}
},
"ruleTypes": {
"DOMAIN": "Vollständigen Domainnamen übereinstimmen",
"DOMAIN-SUFFIX": "Domain-Suffix übereinstimmen",
"DOMAIN-KEYWORD": "Domain-Schlüsselwort übereinstimmen",
"DOMAIN-REGEX": "Domain-Regulärer Ausdruck übereinstimmen",
"GEOSITE": "Domainnamen in Geosite übereinstimmen",
"GEOIP": "IP-Ländercode übereinstimmen",
"SRC-GEOIP": "Quell-IP-Ländercode übereinstimmen",
"IP-ASN": "IP-ASN übereinstimmen",
"SRC-IP-ASN": "Quell-IP-ASN übereinstimmen",
"IP-CIDR": "IP-Adressbereich übereinstimmen",
"IP-CIDR6": "IP-Adressbereich übereinstimmen",
"SRC-IP-CIDR": "Quell-IP-Adressbereich übereinstimmen",
"IP-SUFFIX": "IP-Suffix-Bereich übereinstimmen",
"SRC-IP-SUFFIX": "Quell-IP-Suffix-Bereich übereinstimmen",
"SRC-PORT": "Quellportbereich der Anfrage übereinstimmen",
"DST-PORT": "Zielportbereich der Anfrage übereinstimmen",
"IN-PORT": "Eingangsport übereinstimmen",
"DSCP": "DSCP-Markierung (nur für TPROXY UDP-Eingang)",
"PROCESS-NAME": "Prozessnamen übereinstimmen (Android-Paketname)",
"PROCESS-PATH": "Vollständigen Prozesspfad übereinstimmen",
"PROCESS-NAME-REGEX": "Regulärer Ausdruck für vollständigen Prozessnamen übereinstimmen (Android-Paketname)",
"PROCESS-PATH-REGEX": "Regulärer Ausdruck für vollständigen Prozesspfad übereinstimmen",
"NETWORK": "Übertragungsprotokoll übereinstimmen (TCP/UDP)",
"UID": "Linux-USER-ID übereinstimmen",
"IN-TYPE": "Eingangstyp übereinstimmen",
"IN-USER": "Eingangsbenutzername übereinstimmen",
"IN-NAME": "Eingangsname übereinstimmen",
"SUB-RULE": "Unterregel",
"RULE-SET": "Regelsatz übereinstimmen",
"AND": "Logisches UND",
"OR": "Logisches ODER",
"NOT": "Logisches NICHT",
"MATCH": "Alle Anfragen übereinstimmen"
}
}
},
"home": {
"page": {
"title": "Startseite",
"tooltips": {
"lightweightMode": "Leichtgewichtiger Modus",
"manual": "Bedienungsanleitung",
@@ -563,7 +596,6 @@
"proxyMode": "Proxy-Modus"
},
"settings": {
"title": "Startseite-Einstellungen",
"cards": {
"profile": "Abonnement-Karte",
"currentProxy": "Aktueller Proxy-Karte",
@@ -574,10 +606,16 @@
"ip": "IP-Informationen-Karte",
"clashInfo": "Clash-Informationen-Karten",
"systemInfo": "Systeminformationen-Karten"
},
"header": {
"title": "Startseite-Einstellungen"
}
},
"header": {
"title": "Startseite"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "Der Systemproxy ist aktiviert. Ihre Anwendungen werden über den Proxy auf das Netzwerk zugreifen.",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Entsperrungstest",
"actions": {
"testing": "Wird getestet..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Entsperrungstest"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "Proxy Groups",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "Update All",
"update": "Update"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "Direct Mode"
},
"header": {
"title": {
"default": "Proxy Groups",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "Select proxy manually",
"url-test": "Select proxy based on URL test delay",
"fallback": "Switch to another proxy on error",
"load-balance": "Distribute proxy based on load balancing",
"relay": "Pass through the defined proxy chain"
},
"policies": {
"DIRECT": "Data goes directly outbound (DIRECT)",
"REJECT": "Intercepts requests (REJECT)",
"REJECT-DROP": "Discards requests (REJECT-DROP)",
"PASS": "Skips this rule when matched (PASS)"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "Select proxy manually",
"url-test": "Select proxy based on URL test delay",
"fallback": "Switch to another proxy on error",
"load-balance": "Distribute proxy based on load balancing",
"relay": "Pass through the defined proxy chain"
},
"policies": {
"DIRECT": "Data goes directly outbound (DIRECT)",
"REJECT": "Intercepts requests (REJECT)",
"REJECT-DROP": "Discards requests (REJECT-DROP)",
"PASS": "Skips this rule when matched (PASS)"
}
}
}
},
"connections": {
"page": {
"title": "Connections",
"summary": {
"downloaded": "Downloaded",
"uploaded": "Uploaded"
@@ -396,69 +403,83 @@
"pause": "Pause",
"resume": "Resume",
"closeAll": "Close All"
},
"header": {
"title": "Connections"
}
},
"fields": {
"host": "Host",
"downloaded": "Downloaded",
"uploaded": "Uploaded",
"dlSpeed": "DL Speed",
"ulSpeed": "UL Speed",
"chains": "Chains",
"rule": "Rule",
"process": "Process",
"time": "Time",
"source": "Source",
"destination": "Destination",
"destinationPort": "Destination Port",
"type": "Type"
},
"order": {
"default": "Default",
"uploadSpeed": "Upload Speed",
"downloadSpeed": "Download Speed"
},
"actions": {
"closeConnection": "Close Connection"
"components": {
"fields": {
"host": "Host",
"downloaded": "Downloaded",
"uploaded": "Uploaded",
"dlSpeed": "DL Speed",
"ulSpeed": "UL Speed",
"chains": "Chains",
"rule": "Rule",
"process": "Process",
"time": "Time",
"source": "Source",
"destination": "Destination",
"destinationPort": "Destination Port",
"type": "Type"
},
"order": {
"default": "Default",
"uploadSpeed": "Upload Speed",
"downloadSpeed": "Download Speed"
},
"actions": {
"closeConnection": "Close Connection"
}
}
},
"tests": {
"item": {
"actions": {
"test": "Test"
}
},
"viewer": {
"title": {
"create": "Create Test",
"edit": "Edit Test"
},
"fields": {
"url": "Test URL"
}
},
"page": {
"title": "Test",
"actions": {
"testAll": "Test All"
},
"header": {
"title": "Test"
}
},
"statuses": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
"components": {
"item": {
"actions": {
"test": "Test"
}
}
},
"modals": {
"test": {
"title": {
"create": "Create Test",
"edit": "Edit Test"
},
"fields": {
"url": "Test URL"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
}
}
}
},
"logs": {
"page": {
"title": "Logs",
"actions": {
"pause": "Pause",
"resume": "Resume",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "Logs"
}
}
},
"rules": {
"page": {
"title": "Rules",
"provider": {
"trigger": "Rule Provider",
"dialogTitle": "Rule Providers",
"actions": {
"updateAll": "Update All",
"update": "Update"
},
"notices": {
}
},
"header": {
"title": "Rules"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "Edit Rules",
"form": {
"labels": {
"type": "Rule Type",
"content": "Rule Content",
"proxyPolicy": "Proxy Policy"
"modals": {
"editor": {
"form": {
"labels": {
"type": "Rule Type",
"content": "Rule Content",
"proxyPolicy": "Proxy Policy"
},
"toggles": {
"noResolve": "No Resolve"
},
"actions": {
"prependRule": "Prepend Rule",
"appendRule": "Append Rule"
},
"validation": {
"conditionRequired": "Rule Condition Required",
"invalidRule": "Invalid Rule"
}
},
"toggles": {
"noResolve": "No Resolve"
"ruleTypes": {
"DOMAIN": "Match full domain (DOMAIN)",
"DOMAIN-SUFFIX": "Match domain suffix (DOMAIN-SUFFIX)",
"DOMAIN-KEYWORD": "Match domain keyword (DOMAIN-KEYWORD)",
"DOMAIN-REGEX": "Match domain using regex (DOMAIN-REGEX)",
"GEOSITE": "Match domains in Geosite (GEOSITE)",
"GEOIP": "Match IP country code (GEOIP)",
"SRC-GEOIP": "Match source IP country code (SRC-GEOIP)",
"IP-ASN": "Match IP ASN (IP-ASN)",
"SRC-IP-ASN": "Match source IP ASN (SRC-IP-ASN)",
"IP-CIDR": "Match IP address range (IP-CIDR)",
"IP-CIDR6": "Match IPv6 address range (IP-CIDR6)",
"SRC-IP-CIDR": "Match source IP address range (SRC-IP-CIDR)",
"IP-SUFFIX": "Match IP suffix range (IP-SUFFIX)",
"SRC-IP-SUFFIX": "Match source IP suffix range (SRC-IP-SUFFIX)",
"SRC-PORT": "Match source port range (SRC-PORT)",
"DST-PORT": "Match destination port range (DST-PORT)",
"IN-PORT": "Match inbound port (IN-PORT)",
"DSCP": "DSCP tag (TPROXY UDP inbound only) (DSCP)",
"PROCESS-NAME": "Match process name (PROCESS-NAME)",
"PROCESS-PATH": "Match full process path (PROCESS-PATH)",
"PROCESS-NAME-REGEX": "Match process name using regex (PROCESS-NAME-REGEX)",
"PROCESS-PATH-REGEX": "Match full process path using regex (PROCESS-PATH-REGEX)",
"NETWORK": "Match network protocol (TCP/UDP) (NETWORK)",
"UID": "Match Linux user ID (UID)",
"IN-TYPE": "Match inbound type (IN-TYPE)",
"IN-USER": "Match inbound username (IN-USER)",
"IN-NAME": "Match inbound name (IN-NAME)",
"SUB-RULE": "Sub-rule (SUB-RULE)",
"RULE-SET": "Match rule set (RULE-SET)",
"AND": "Logical AND (AND)",
"OR": "Logical OR (OR)",
"NOT": "Logical NOT (NOT)",
"MATCH": "Match all requests (MATCH)"
},
"actions": {
"prependRule": "Prepend Rule",
"appendRule": "Append Rule"
},
"validation": {
"conditionRequired": "Rule Condition Required",
"invalidRule": "Invalid Rule"
"header": {
"title": "Edit Rules"
}
},
"ruleTypes": {
"DOMAIN": "Match full domain (DOMAIN)",
"DOMAIN-SUFFIX": "Match domain suffix (DOMAIN-SUFFIX)",
"DOMAIN-KEYWORD": "Match domain keyword (DOMAIN-KEYWORD)",
"DOMAIN-REGEX": "Match domain using regex (DOMAIN-REGEX)",
"GEOSITE": "Match domains in Geosite (GEOSITE)",
"GEOIP": "Match IP country code (GEOIP)",
"SRC-GEOIP": "Match source IP country code (SRC-GEOIP)",
"IP-ASN": "Match IP ASN (IP-ASN)",
"SRC-IP-ASN": "Match source IP ASN (SRC-IP-ASN)",
"IP-CIDR": "Match IP address range (IP-CIDR)",
"IP-CIDR6": "Match IPv6 address range (IP-CIDR6)",
"SRC-IP-CIDR": "Match source IP address range (SRC-IP-CIDR)",
"IP-SUFFIX": "Match IP suffix range (IP-SUFFIX)",
"SRC-IP-SUFFIX": "Match source IP suffix range (SRC-IP-SUFFIX)",
"SRC-PORT": "Match source port range (SRC-PORT)",
"DST-PORT": "Match destination port range (DST-PORT)",
"IN-PORT": "Match inbound port (IN-PORT)",
"DSCP": "DSCP tag (TPROXY UDP inbound only) (DSCP)",
"PROCESS-NAME": "Match process name (PROCESS-NAME)",
"PROCESS-PATH": "Match full process path (PROCESS-PATH)",
"PROCESS-NAME-REGEX": "Match process name using regex (PROCESS-NAME-REGEX)",
"PROCESS-PATH-REGEX": "Match full process path using regex (PROCESS-PATH-REGEX)",
"NETWORK": "Match network protocol (TCP/UDP) (NETWORK)",
"UID": "Match Linux user ID (UID)",
"IN-TYPE": "Match inbound type (IN-TYPE)",
"IN-USER": "Match inbound username (IN-USER)",
"IN-NAME": "Match inbound name (IN-NAME)",
"SUB-RULE": "Sub-rule (SUB-RULE)",
"RULE-SET": "Match rule set (RULE-SET)",
"AND": "Logical AND (AND)",
"OR": "Logical OR (OR)",
"NOT": "Logical NOT (NOT)",
"MATCH": "Match all requests (MATCH)"
}
}
},
"home": {
"page": {
"title": "Home",
"tooltips": {
"lightweightMode": "Lightweight Mode",
"manual": "Manual",
@@ -563,7 +596,6 @@
"proxyMode": "Proxy Mode"
},
"settings": {
"title": "Home Settings",
"cards": {
"profile": "Profile Card",
"currentProxy": "Current Proxy Card",
@@ -574,10 +606,16 @@
"ip": "IP Information Card",
"clashInfo": "Clash Info Cards",
"systemInfo": "System Info Cards"
},
"header": {
"title": "Home Settings"
}
},
"header": {
"title": "Home"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "System Proxy Enabled",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Unlock Test",
"actions": {
"testing": "Testing..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Unlock Test"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "Grupos de proxies",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "Actualizar todo",
"update": "Actualizar"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "Modo de conexión directa"
},
"header": {
"title": {
"default": "Grupos de proxies",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "Seleccionar proxy manualmente",
"url-test": "Seleccionar proxy según la prueba de latencia de la URL",
"fallback": "Cambiar a otro proxy cuando no esté disponible",
"load-balance": "Asignar proxy según el equilibrio de carga",
"relay": "Transferir según la cadena de proxy definida"
},
"policies": {
"DIRECT": "Conexión directa",
"REJECT": "Rechazar solicitud",
"REJECT-DROP": "Descartar solicitud",
"PASS": "Saltar esta regla"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "Seleccionar proxy manualmente",
"url-test": "Seleccionar proxy según la prueba de latencia de la URL",
"fallback": "Cambiar a otro proxy cuando no esté disponible",
"load-balance": "Asignar proxy según el equilibrio de carga",
"relay": "Transferir según la cadena de proxy definida"
},
"policies": {
"DIRECT": "Conexión directa",
"REJECT": "Rechazar solicitud",
"REJECT-DROP": "Descartar solicitud",
"PASS": "Saltar esta regla"
}
}
}
},
"connections": {
"page": {
"title": "Conexiones",
"summary": {
"downloaded": "Descargado",
"uploaded": "Subido"
@@ -396,69 +403,83 @@
"pause": "Pausar",
"resume": "Reanudar",
"closeAll": "Cerrar todas"
},
"header": {
"title": "Conexiones"
}
},
"fields": {
"host": "Host",
"downloaded": "Descargado",
"uploaded": "Subido",
"dlSpeed": "Velocidad de descarga",
"ulSpeed": "Velocidad de subida",
"chains": "Cadenas",
"rule": "Regla",
"process": "Proceso",
"time": "Tiempo de conexión",
"source": "Dirección de origen",
"destination": "Dirección de destino",
"destinationPort": "Puerto de destino",
"type": "Tipo"
},
"order": {
"default": "Default",
"uploadSpeed": "Velocidad de subida",
"downloadSpeed": "Velocidad de descarga"
},
"actions": {
"closeConnection": "Cerrar conexión"
"components": {
"fields": {
"host": "Host",
"downloaded": "Descargado",
"uploaded": "Subido",
"dlSpeed": "Velocidad de descarga",
"ulSpeed": "Velocidad de subida",
"chains": "Cadenas",
"rule": "Regla",
"process": "Proceso",
"time": "Tiempo de conexión",
"source": "Dirección de origen",
"destination": "Dirección de destino",
"destinationPort": "Puerto de destino",
"type": "Tipo"
},
"order": {
"default": "Default",
"uploadSpeed": "Velocidad de subida",
"downloadSpeed": "Velocidad de descarga"
},
"actions": {
"closeConnection": "Cerrar conexión"
}
}
},
"tests": {
"item": {
"actions": {
"test": "Prueba"
}
},
"viewer": {
"title": {
"create": "Crear prueba",
"edit": "Editar prueba"
},
"fields": {
"url": "URL de prueba"
}
},
"page": {
"title": "Prueba",
"actions": {
"testAll": "Probar todo"
},
"header": {
"title": "Prueba"
}
},
"statuses": {
"pending": "Pendiente de detección",
"yes": "Soportado",
"no": "No soportado",
"failed": "Prueba fallida",
"completed": "Detección completada",
"disallowedIsp": "Proveedor de servicios de Internet no permitido",
"originalsOnly": "Solo originales",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "País/región no soportado",
"failedNetwork": "Failed (Network Connection)"
"components": {
"item": {
"actions": {
"test": "Prueba"
}
}
},
"modals": {
"test": {
"title": {
"create": "Crear prueba",
"edit": "Editar prueba"
},
"fields": {
"url": "URL de prueba"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "Pendiente de detección",
"yes": "Soportado",
"no": "No soportado",
"failed": "Prueba fallida",
"completed": "Detección completada",
"disallowedIsp": "Proveedor de servicios de Internet no permitido",
"originalsOnly": "Solo originales",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "País/región no soportado",
"failedNetwork": "Failed (Network Connection)"
}
}
}
},
"logs": {
"page": {
"title": "Registros",
"actions": {
"pause": "Pausar",
"resume": "Reanudar",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "Registros"
}
}
},
"rules": {
"page": {
"title": "Reglas",
"provider": {
"trigger": "Proveedor de reglas",
"dialogTitle": "Proveedor de reglas",
"actions": {
"updateAll": "Actualizar todo",
"update": "Actualizar"
},
"notices": {
}
},
"header": {
"title": "Reglas"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "Editar reglas",
"form": {
"labels": {
"type": "Tipo de regla",
"content": "Contenido de la regla",
"proxyPolicy": "Política de proxy"
"modals": {
"editor": {
"form": {
"labels": {
"type": "Tipo de regla",
"content": "Contenido de la regla",
"proxyPolicy": "Política de proxy"
},
"toggles": {
"noResolve": "Omitir resolución DNS"
},
"actions": {
"prependRule": "Agregar regla previa",
"appendRule": "Agregar regla posterior"
},
"validation": {
"conditionRequired": "Falta la condición de la regla",
"invalidRule": "Regla no válida"
}
},
"toggles": {
"noResolve": "Omitir resolución DNS"
"ruleTypes": {
"DOMAIN": "Coincidir con el nombre de dominio completo",
"DOMAIN-SUFFIX": "Coincidir con el sufijo del nombre de dominio",
"DOMAIN-KEYWORD": "Coincidir con la palabra clave del nombre de dominio",
"DOMAIN-REGEX": "Coincidir con la expresión regular del nombre de dominio",
"GEOSITE": "Coincidir con los nombres de dominio en Geosite",
"GEOIP": "Coincidir con el código de país del IP",
"SRC-GEOIP": "Coincidir con el código de país del IP de origen",
"IP-ASN": "Coincidir con el ASN del IP",
"SRC-IP-ASN": "Coincidir con el ASN del IP de origen",
"IP-CIDR": "Coincidir con el rango de direcciones IP",
"IP-CIDR6": "Coincidir con el rango de direcciones IP",
"SRC-IP-CIDR": "Coincidir con el rango de direcciones IP de origen",
"IP-SUFFIX": "Coincidir con el rango de sufijos de IP",
"SRC-IP-SUFFIX": "Coincidir con el rango de sufijos de IP de origen",
"SRC-PORT": "Coincidir con el rango de puertos de origen de la solicitud",
"DST-PORT": "Coincidir con el rango de puertos de destino de la solicitud",
"IN-PORT": "Coincidir con el puerto de entrada",
"DSCP": "Etiqueta DSCP (solo para entradas UDP TPROXY)",
"PROCESS-NAME": "Coincidir con el nombre del proceso (nombre del paquete de Android)",
"PROCESS-PATH": "Coincidir con la ruta completa del proceso",
"PROCESS-NAME-REGEX": "Coincidir con el nombre completo del proceso mediante expresiones regulares (nombre del paquete de Android)",
"PROCESS-PATH-REGEX": "Coincidir con la ruta completa del proceso mediante expresiones regulares",
"NETWORK": "Coincidir con el protocolo de transporte (TCP/UDP)",
"UID": "Coincidir con el ID de usuario de Linux",
"IN-TYPE": "Coincidir con el tipo de entrada",
"IN-USER": "Coincidir con el nombre de usuario de entrada",
"IN-NAME": "Coincidir con el nombre de entrada",
"SUB-RULE": "Subregla",
"RULE-SET": "Coincidir con el conjunto de reglas",
"AND": "Y lógico",
"OR": "O lógico",
"NOT": "No lógico",
"MATCH": "Coincidir con todas las solicitudes"
},
"actions": {
"prependRule": "Agregar regla previa",
"appendRule": "Agregar regla posterior"
},
"validation": {
"conditionRequired": "Falta la condición de la regla",
"invalidRule": "Regla no válida"
"header": {
"title": "Editar reglas"
}
},
"ruleTypes": {
"DOMAIN": "Coincidir con el nombre de dominio completo",
"DOMAIN-SUFFIX": "Coincidir con el sufijo del nombre de dominio",
"DOMAIN-KEYWORD": "Coincidir con la palabra clave del nombre de dominio",
"DOMAIN-REGEX": "Coincidir con la expresión regular del nombre de dominio",
"GEOSITE": "Coincidir con los nombres de dominio en Geosite",
"GEOIP": "Coincidir con el código de país del IP",
"SRC-GEOIP": "Coincidir con el código de país del IP de origen",
"IP-ASN": "Coincidir con el ASN del IP",
"SRC-IP-ASN": "Coincidir con el ASN del IP de origen",
"IP-CIDR": "Coincidir con el rango de direcciones IP",
"IP-CIDR6": "Coincidir con el rango de direcciones IP",
"SRC-IP-CIDR": "Coincidir con el rango de direcciones IP de origen",
"IP-SUFFIX": "Coincidir con el rango de sufijos de IP",
"SRC-IP-SUFFIX": "Coincidir con el rango de sufijos de IP de origen",
"SRC-PORT": "Coincidir con el rango de puertos de origen de la solicitud",
"DST-PORT": "Coincidir con el rango de puertos de destino de la solicitud",
"IN-PORT": "Coincidir con el puerto de entrada",
"DSCP": "Etiqueta DSCP (solo para entradas UDP TPROXY)",
"PROCESS-NAME": "Coincidir con el nombre del proceso (nombre del paquete de Android)",
"PROCESS-PATH": "Coincidir con la ruta completa del proceso",
"PROCESS-NAME-REGEX": "Coincidir con el nombre completo del proceso mediante expresiones regulares (nombre del paquete de Android)",
"PROCESS-PATH-REGEX": "Coincidir con la ruta completa del proceso mediante expresiones regulares",
"NETWORK": "Coincidir con el protocolo de transporte (TCP/UDP)",
"UID": "Coincidir con el ID de usuario de Linux",
"IN-TYPE": "Coincidir con el tipo de entrada",
"IN-USER": "Coincidir con el nombre de usuario de entrada",
"IN-NAME": "Coincidir con el nombre de entrada",
"SUB-RULE": "Subregla",
"RULE-SET": "Coincidir con el conjunto de reglas",
"AND": "Y lógico",
"OR": "O lógico",
"NOT": "No lógico",
"MATCH": "Coincidir con todas las solicitudes"
}
}
},
"home": {
"page": {
"title": "Hogar",
"tooltips": {
"lightweightMode": "Modo ligero",
"manual": "Manual de uso",
@@ -563,7 +596,6 @@
"proxyMode": "Modo de proxy"
},
"settings": {
"title": "Configuración de la página de inicio",
"cards": {
"profile": "Tarjeta de suscripción",
"currentProxy": "Tarjeta de proxy actual",
@@ -574,10 +606,16 @@
"ip": "Tarjeta de información de IP",
"clashInfo": "Tarjetas de información de Clash",
"systemInfo": "Tarjetas de información del sistema"
},
"header": {
"title": "Configuración de la página de inicio"
}
},
"header": {
"title": "Hogar"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "El proxy del sistema está habilitado. Sus aplicaciones accederán a Internet a través del proxy.",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Prueba de desbloqueo",
"actions": {
"testing": "Probando..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Prueba de desbloqueo"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "گروه‌های پراکسی",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "به‌روزرسانی همه",
"update": "به‌روزرسانی"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "حالت مستقیم"
},
"header": {
"title": {
"default": "گروه‌های پراکسی",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "انتخاب پروکسی به صورت دستی",
"url-test": "انتخاب پروکسی بر اساس تأخیر آزمایش URL",
"fallback": "تعویض به پروکسی دیگر در صورت بروز خطا",
"load-balance": "توزیع پراکسی بر اساس توازن بار",
"relay": "عبور از زنجیره پروکسی تعریف شده"
},
"policies": {
"DIRECT": "داده‌ها به صورت مستقیم خروجی می‌شوند",
"REJECT": "درخواست‌ها را متوقف می‌کند",
"REJECT-DROP": "درخواست‌ها را نادیده می‌گیرد",
"PASS": "این قانون را در صورت تطابق نادیده می‌گیرد"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "انتخاب پروکسی به صورت دستی",
"url-test": "انتخاب پروکسی بر اساس تأخیر آزمایش URL",
"fallback": "تعویض به پروکسی دیگر در صورت بروز خطا",
"load-balance": "توزیع پراکسی بر اساس توازن بار",
"relay": "عبور از زنجیره پروکسی تعریف شده"
},
"policies": {
"DIRECT": "داده‌ها به صورت مستقیم خروجی می‌شوند",
"REJECT": "درخواست‌ها را متوقف می‌کند",
"REJECT-DROP": "درخواست‌ها را نادیده می‌گیرد",
"PASS": "این قانون را در صورت تطابق نادیده می‌گیرد"
}
}
}
},
"connections": {
"page": {
"title": "اتصالات",
"summary": {
"downloaded": "دانلود شده",
"uploaded": "بارگذاری شده"
@@ -396,69 +403,83 @@
"pause": "توقف",
"resume": "از سرگیری",
"closeAll": "بستن همه"
},
"header": {
"title": "اتصالات"
}
},
"fields": {
"host": "میزبان",
"downloaded": "دانلود شده",
"uploaded": "بارگذاری شده",
"dlSpeed": "سرعت دانلود",
"ulSpeed": "سرعت بارگذاری",
"chains": "زنجیره‌ها",
"rule": "قانون",
"process": "فرآیند",
"time": "زمان",
"source": "منبع",
"destination": "آدرس IP مقصد",
"destinationPort": "بندر هدف",
"type": "نوع"
},
"order": {
"default": "Default",
"uploadSpeed": "سرعت بارگذاری",
"downloadSpeed": "سرعت دانلود"
},
"actions": {
"closeConnection": "بستن اتصال"
"components": {
"fields": {
"host": "میزبان",
"downloaded": "دانلود شده",
"uploaded": "بارگذاری شده",
"dlSpeed": "سرعت دانلود",
"ulSpeed": "سرعت بارگذاری",
"chains": "زنجیره‌ها",
"rule": "قانون",
"process": "فرآیند",
"time": "زمان",
"source": "منبع",
"destination": "آدرس IP مقصد",
"destinationPort": "بندر هدف",
"type": "نوع"
},
"order": {
"default": "Default",
"uploadSpeed": "سرعت بارگذاری",
"downloadSpeed": "سرعت دانلود"
},
"actions": {
"closeConnection": "بستن اتصال"
}
}
},
"tests": {
"item": {
"actions": {
"test": "آزمون"
}
},
"viewer": {
"title": {
"create": "ایجاد آزمون",
"edit": "ویرایش آزمون"
},
"fields": {
"url": "آدرس آزمون"
}
},
"page": {
"title": "آزمون",
"actions": {
"testAll": "آزمون همه"
},
"header": {
"title": "آزمون"
}
},
"statuses": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
"components": {
"item": {
"actions": {
"test": "آزمون"
}
}
},
"modals": {
"test": {
"title": {
"create": "ایجاد آزمون",
"edit": "ویرایش آزمون"
},
"fields": {
"url": "آدرس آزمون"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
}
}
}
},
"logs": {
"page": {
"title": "لاگ‌ها",
"actions": {
"pause": "توقف",
"resume": "از سرگیری",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "لاگ‌ها"
}
}
},
"rules": {
"page": {
"title": "قوانین",
"provider": {
"trigger": "تأمین‌کننده قانون",
"dialogTitle": "تأمین‌کننده قانون",
"actions": {
"updateAll": "به‌روزرسانی همه",
"update": "به‌روزرسانی"
},
"notices": {
}
},
"header": {
"title": "قوانین"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "ویرایش قوانین",
"form": {
"labels": {
"type": "نوع قانون",
"content": "محتوای قانون",
"proxyPolicy": "سیاست پروکسی"
"modals": {
"editor": {
"form": {
"labels": {
"type": "نوع قانون",
"content": "محتوای قانون",
"proxyPolicy": "سیاست پروکسی"
},
"toggles": {
"noResolve": "بدون حل"
},
"actions": {
"prependRule": "اضافه کردن قانون به ابتدا",
"appendRule": "اضافه کردن قانون به انتها"
},
"validation": {
"conditionRequired": "شرط قانون الزامی است",
"invalidRule": "قانون نامعتبر"
}
},
"toggles": {
"noResolve": "بدون حل"
"ruleTypes": {
"DOMAIN": "مطابقت با نام کامل دامنه",
"DOMAIN-SUFFIX": "مطابقت با پسوند دامنه",
"DOMAIN-KEYWORD": "مطابقت با کلمه کلیدی دامنه",
"DOMAIN-REGEX": "مطابقت با دامنه با استفاده از عبارات منظم",
"GEOSITE": "مطابقت با دامنه‌های درون Geosite",
"GEOIP": "مطابقت با کد کشور IP",
"SRC-GEOIP": "مطابقت با کد کشور IP مبدا",
"IP-ASN": "مطابقت با ASN آدرس IP",
"SRC-IP-ASN": "مطابقت با ASN آدرس IP مبدا",
"IP-CIDR": "مطابقت با محدوده آدرس IP",
"IP-CIDR6": "مطابقت با محدوده آدرس IPv6",
"SRC-IP-CIDR": "مطابقت با محدوده آدرس IP مبدا",
"IP-SUFFIX": "مطابقت با محدوده پسوند آدرس IP",
"SRC-IP-SUFFIX": "مطابقت با محدوده پسوند آدرس IP مبدا",
"SRC-PORT": "مطابقت با محدوده پورت مبدا",
"DST-PORT": "مطابقت با محدوده پورت مقصد",
"IN-PORT": "مطابقت با پورت ورودی",
"DSCP": "علامت‌گذاری DSCP (فقط برای tproxy UDP ورودی)",
"PROCESS-NAME": "مطابقت با نام فرآیند (نام بسته Android)",
"PROCESS-PATH": "مطابقت با مسیر کامل فرآیند",
"PROCESS-NAME-REGEX": "مطابقت با نام فرآیند با استفاده از عبارات منظم (نام بسته Android)",
"PROCESS-PATH-REGEX": "مطابقت با مسیر کامل فرآیند با استفاده از عبارات منظم",
"NETWORK": "مطابقت با پروتکل انتقال (tcp/udp)",
"UID": "مطابقت با شناسه کاربری Linux",
"IN-TYPE": "مطابقت با نوع ورودی",
"IN-USER": "مطابقت با نام کاربری ورودی",
"IN-NAME": "مطابقت با نام ورودی",
"SUB-RULE": "قانون فرعی",
"RULE-SET": "مطابقت با مجموعه قوانین",
"AND": "منطق AND",
"OR": "منطق OR",
"NOT": "منطق NOT",
"MATCH": "مطابقت با تمام درخواست‌ها"
},
"actions": {
"prependRule": "اضافه کردن قانون به ابتدا",
"appendRule": "اضافه کردن قانون به انتها"
},
"validation": {
"conditionRequired": "شرط قانون الزامی است",
"invalidRule": "قانون نامعتبر"
"header": {
"title": "ویرایش قوانین"
}
},
"ruleTypes": {
"DOMAIN": "مطابقت با نام کامل دامنه",
"DOMAIN-SUFFIX": "مطابقت با پسوند دامنه",
"DOMAIN-KEYWORD": "مطابقت با کلمه کلیدی دامنه",
"DOMAIN-REGEX": "مطابقت با دامنه با استفاده از عبارات منظم",
"GEOSITE": "مطابقت با دامنه‌های درون Geosite",
"GEOIP": "مطابقت با کد کشور IP",
"SRC-GEOIP": "مطابقت با کد کشور IP مبدا",
"IP-ASN": "مطابقت با ASN آدرس IP",
"SRC-IP-ASN": "مطابقت با ASN آدرس IP مبدا",
"IP-CIDR": "مطابقت با محدوده آدرس IP",
"IP-CIDR6": "مطابقت با محدوده آدرس IPv6",
"SRC-IP-CIDR": "مطابقت با محدوده آدرس IP مبدا",
"IP-SUFFIX": "مطابقت با محدوده پسوند آدرس IP",
"SRC-IP-SUFFIX": "مطابقت با محدوده پسوند آدرس IP مبدا",
"SRC-PORT": "مطابقت با محدوده پورت مبدا",
"DST-PORT": "مطابقت با محدوده پورت مقصد",
"IN-PORT": "مطابقت با پورت ورودی",
"DSCP": "علامت‌گذاری DSCP (فقط برای tproxy UDP ورودی)",
"PROCESS-NAME": "مطابقت با نام فرآیند (نام بسته Android)",
"PROCESS-PATH": "مطابقت با مسیر کامل فرآیند",
"PROCESS-NAME-REGEX": "مطابقت با نام فرآیند با استفاده از عبارات منظم (نام بسته Android)",
"PROCESS-PATH-REGEX": "مطابقت با مسیر کامل فرآیند با استفاده از عبارات منظم",
"NETWORK": "مطابقت با پروتکل انتقال (tcp/udp)",
"UID": "مطابقت با شناسه کاربری Linux",
"IN-TYPE": "مطابقت با نوع ورودی",
"IN-USER": "مطابقت با نام کاربری ورودی",
"IN-NAME": "مطابقت با نام ورودی",
"SUB-RULE": "قانون فرعی",
"RULE-SET": "مطابقت با مجموعه قوانین",
"AND": "منطق AND",
"OR": "منطق OR",
"NOT": "منطق NOT",
"MATCH": "مطابقت با تمام درخواست‌ها"
}
}
},
"home": {
"page": {
"title": "Home",
"tooltips": {
"lightweightMode": "در فارسی",
"manual": "راهنما",
@@ -563,7 +596,6 @@
"proxyMode": "Proxy Mode"
},
"settings": {
"title": "Home Settings",
"cards": {
"profile": "Profile Card",
"currentProxy": "Current Proxy Card",
@@ -574,10 +606,16 @@
"ip": "IP Information Card",
"clashInfo": "Clash Info Cards",
"systemInfo": "System Info Cards"
},
"header": {
"title": "Home Settings"
}
},
"header": {
"title": "Home"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "System proxy is enabled, your applications will access the network through the proxy",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Unlock Test",
"actions": {
"testing": "Testing..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Unlock Test"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "Grup Proksi",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "Perbarui Semua",
"update": "Perbarui"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "Mode Langsung"
},
"header": {
"title": {
"default": "Grup Proksi",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "Pilih proksi secara manual",
"url-test": "Pilih proksi berdasarkan keterlambatan tes URL",
"fallback": "Beralih ke proksi lain saat terjadi kesalahan",
"load-balance": "Distribusikan proksi berdasarkan penyeimbangan beban",
"relay": "Lewatkan melalui rantai proksi yang ditentukan"
},
"policies": {
"DIRECT": "Data langsung keluar",
"REJECT": "Mencegat permintaan",
"REJECT-DROP": "Membuang permintaan",
"PASS": "Lewati aturan ini saat cocok"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "Pilih proksi secara manual",
"url-test": "Pilih proksi berdasarkan keterlambatan tes URL",
"fallback": "Beralih ke proksi lain saat terjadi kesalahan",
"load-balance": "Distribusikan proksi berdasarkan penyeimbangan beban",
"relay": "Lewatkan melalui rantai proksi yang ditentukan"
},
"policies": {
"DIRECT": "Data langsung keluar",
"REJECT": "Mencegat permintaan",
"REJECT-DROP": "Membuang permintaan",
"PASS": "Lewati aturan ini saat cocok"
}
}
}
},
"connections": {
"page": {
"title": "Koneksi",
"summary": {
"downloaded": "Diunduh",
"uploaded": "Diunggah"
@@ -396,69 +403,83 @@
"pause": "Jeda",
"resume": "Lanjut",
"closeAll": "Tutup Semua"
},
"header": {
"title": "Koneksi"
}
},
"fields": {
"host": "Host",
"downloaded": "Diunduh",
"uploaded": "Diunggah",
"dlSpeed": "Kecepatan Unduh",
"ulSpeed": "Kecepatan Unggah",
"chains": "Rantai",
"rule": "Aturan",
"process": "Proses",
"time": "Waktu",
"source": "Sumber",
"destination": "IP Tujuan",
"destinationPort": "Port Tujuan",
"type": "Jenis"
},
"order": {
"default": "Default",
"uploadSpeed": "Kecepatan Unggah",
"downloadSpeed": "Kecepatan Unduh"
},
"actions": {
"closeConnection": "Tutup Koneksi"
"components": {
"fields": {
"host": "Host",
"downloaded": "Diunduh",
"uploaded": "Diunggah",
"dlSpeed": "Kecepatan Unduh",
"ulSpeed": "Kecepatan Unggah",
"chains": "Rantai",
"rule": "Aturan",
"process": "Proses",
"time": "Waktu",
"source": "Sumber",
"destination": "IP Tujuan",
"destinationPort": "Port Tujuan",
"type": "Jenis"
},
"order": {
"default": "Default",
"uploadSpeed": "Kecepatan Unggah",
"downloadSpeed": "Kecepatan Unduh"
},
"actions": {
"closeConnection": "Tutup Koneksi"
}
}
},
"tests": {
"item": {
"actions": {
"test": "Tes"
}
},
"viewer": {
"title": {
"create": "Buat Tes",
"edit": "Ubah Tes"
},
"fields": {
"url": "URL Tes"
}
},
"page": {
"title": "Tes",
"actions": {
"testAll": "Tes Semua"
},
"header": {
"title": "Tes"
}
},
"statuses": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
"components": {
"item": {
"actions": {
"test": "Tes"
}
}
},
"modals": {
"test": {
"title": {
"create": "Buat Tes",
"edit": "Ubah Tes"
},
"fields": {
"url": "URL Tes"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
}
}
}
},
"logs": {
"page": {
"title": "Log",
"actions": {
"pause": "Jeda",
"resume": "Lanjut",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "Log"
}
}
},
"rules": {
"page": {
"title": "Aturan",
"provider": {
"trigger": "Penyedia Aturan",
"dialogTitle": "Penyedia Aturan",
"actions": {
"updateAll": "Perbarui Semua",
"update": "Perbarui"
},
"notices": {
}
},
"header": {
"title": "Aturan"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "Ubah Aturan",
"form": {
"labels": {
"type": "Jenis Aturan",
"content": "Konten Aturan",
"proxyPolicy": "Kebijakan Proksi"
"modals": {
"editor": {
"form": {
"labels": {
"type": "Jenis Aturan",
"content": "Konten Aturan",
"proxyPolicy": "Kebijakan Proksi"
},
"toggles": {
"noResolve": "Tidak Menyelesaikan"
},
"actions": {
"prependRule": "Tambahkan Aturan di Awal",
"appendRule": "Tambahkan Aturan di Akhir"
},
"validation": {
"conditionRequired": "Kondisi Aturan Diperlukan",
"invalidRule": "Aturan Tidak Valid"
}
},
"toggles": {
"noResolve": "Tidak Menyelesaikan"
"ruleTypes": {
"DOMAIN": "Cocok dengan nama domain lengkap",
"DOMAIN-SUFFIX": "Cocok dengan sufiks domain",
"DOMAIN-KEYWORD": "Cocok dengan kata kunci domain",
"DOMAIN-REGEX": "Cocok dengan domain menggunakan ekspresi reguler",
"GEOSITE": "Cocok dengan domain dalam Geosite",
"GEOIP": "Cocok dengan kode negara alamat IP",
"SRC-GEOIP": "Cocok dengan kode negara alamat IP sumber",
"IP-ASN": "Cocok dengan ASN alamat IP",
"SRC-IP-ASN": "Cocok dengan ASN alamat IP sumber",
"IP-CIDR": "Cocok dengan rentang alamat IP",
"IP-CIDR6": "Cocok dengan rentang alamat IPv6",
"SRC-IP-CIDR": "Cocok dengan rentang alamat IP sumber",
"IP-SUFFIX": "Cocok dengan rentang sufiks alamat IP",
"SRC-IP-SUFFIX": "Cocok dengan rentang sufiks alamat IP sumber",
"SRC-PORT": "Cocok dengan rentang port sumber",
"DST-PORT": "Cocok dengan rentang port tujuan",
"IN-PORT": "Cocok dengan port masuk",
"DSCP": "Penandaan DSCP (hanya untuk tproxy UDP masuk)",
"PROCESS-NAME": "Cocok dengan nama proses (nama paket Android)",
"PROCESS-PATH": "Cocok dengan jalur proses lengkap",
"PROCESS-NAME-REGEX": "Cocok dengan nama proses lengkap menggunakan ekspresi reguler (nama paket Android)",
"PROCESS-PATH-REGEX": "Cocok dengan jalur proses lengkap menggunakan ekspresi reguler",
"NETWORK": "Cocok dengan protokol transportasi (tcp/udp)",
"UID": "Cocok dengan ID PENGGUNA Linux",
"IN-TYPE": "Cocok dengan jenis masuk",
"IN-USER": "Cocok dengan nama pengguna masuk",
"IN-NAME": "Cocok dengan nama masuk",
"SUB-RULE": "Sub-aturan",
"RULE-SET": "Cocok dengan set aturan",
"AND": "Logika DAN",
"OR": "Logika ATAU",
"NOT": "Logika TIDAK",
"MATCH": "Cocok dengan semua permintaan"
},
"actions": {
"prependRule": "Tambahkan Aturan di Awal",
"appendRule": "Tambahkan Aturan di Akhir"
},
"validation": {
"conditionRequired": "Kondisi Aturan Diperlukan",
"invalidRule": "Aturan Tidak Valid"
"header": {
"title": "Ubah Aturan"
}
},
"ruleTypes": {
"DOMAIN": "Cocok dengan nama domain lengkap",
"DOMAIN-SUFFIX": "Cocok dengan sufiks domain",
"DOMAIN-KEYWORD": "Cocok dengan kata kunci domain",
"DOMAIN-REGEX": "Cocok dengan domain menggunakan ekspresi reguler",
"GEOSITE": "Cocok dengan domain dalam Geosite",
"GEOIP": "Cocok dengan kode negara alamat IP",
"SRC-GEOIP": "Cocok dengan kode negara alamat IP sumber",
"IP-ASN": "Cocok dengan ASN alamat IP",
"SRC-IP-ASN": "Cocok dengan ASN alamat IP sumber",
"IP-CIDR": "Cocok dengan rentang alamat IP",
"IP-CIDR6": "Cocok dengan rentang alamat IPv6",
"SRC-IP-CIDR": "Cocok dengan rentang alamat IP sumber",
"IP-SUFFIX": "Cocok dengan rentang sufiks alamat IP",
"SRC-IP-SUFFIX": "Cocok dengan rentang sufiks alamat IP sumber",
"SRC-PORT": "Cocok dengan rentang port sumber",
"DST-PORT": "Cocok dengan rentang port tujuan",
"IN-PORT": "Cocok dengan port masuk",
"DSCP": "Penandaan DSCP (hanya untuk tproxy UDP masuk)",
"PROCESS-NAME": "Cocok dengan nama proses (nama paket Android)",
"PROCESS-PATH": "Cocok dengan jalur proses lengkap",
"PROCESS-NAME-REGEX": "Cocok dengan nama proses lengkap menggunakan ekspresi reguler (nama paket Android)",
"PROCESS-PATH-REGEX": "Cocok dengan jalur proses lengkap menggunakan ekspresi reguler",
"NETWORK": "Cocok dengan protokol transportasi (tcp/udp)",
"UID": "Cocok dengan ID PENGGUNA Linux",
"IN-TYPE": "Cocok dengan jenis masuk",
"IN-USER": "Cocok dengan nama pengguna masuk",
"IN-NAME": "Cocok dengan nama masuk",
"SUB-RULE": "Sub-aturan",
"RULE-SET": "Cocok dengan set aturan",
"AND": "Logika DAN",
"OR": "Logika ATAU",
"NOT": "Logika TIDAK",
"MATCH": "Cocok dengan semua permintaan"
}
}
},
"home": {
"page": {
"title": "Home",
"tooltips": {
"lightweightMode": "Mode Ringan",
"manual": "Manual",
@@ -563,7 +596,6 @@
"proxyMode": "Proxy Mode"
},
"settings": {
"title": "Home Settings",
"cards": {
"profile": "Profile Card",
"currentProxy": "Current Proxy Card",
@@ -574,10 +606,16 @@
"ip": "IP Information Card",
"clashInfo": "Clash Info Cards",
"systemInfo": "System Info Cards"
},
"header": {
"title": "Home Settings"
}
},
"header": {
"title": "Home"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "System proxy is enabled, your applications will access the network through the proxy",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Unlock Test",
"actions": {
"testing": "Testing..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Unlock Test"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "プロキシグループ",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "すべて更新",
"update": "更新"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "直接接続モード"
},
"header": {
"title": {
"default": "プロキシグループ",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "手動でプロキシを選択",
"url-test": "URLテストによる遅延でプロキシを選択",
"fallback": "利用不可の場合は別のプロキシに切り替える",
"load-balance": "負荷分散によりプロキシを割り当てる",
"relay": "定義されたプロキシチェーンに沿って転送する"
},
"policies": {
"DIRECT": "直接接続",
"REJECT": "リクエストを拒否",
"REJECT-DROP": "リクエストを破棄",
"PASS": "このルールをスキップ"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "手動でプロキシを選択",
"url-test": "URLテストによる遅延でプロキシを選択",
"fallback": "利用不可の場合は別のプロキシに切り替える",
"load-balance": "負荷分散によりプロキシを割り当てる",
"relay": "定義されたプロキシチェーンに沿って転送する"
},
"policies": {
"DIRECT": "直接接続",
"REJECT": "リクエストを拒否",
"REJECT-DROP": "リクエストを破棄",
"PASS": "このルールをスキップ"
}
}
}
},
"connections": {
"page": {
"title": "接続",
"summary": {
"downloaded": "ダウンロード量",
"uploaded": "アップロード量"
@@ -396,69 +403,83 @@
"pause": "一時停止",
"resume": "再開",
"closeAll": "すべて閉じる"
},
"header": {
"title": "接続"
}
},
"fields": {
"host": "ホスト",
"downloaded": "ダウンロード量",
"uploaded": "アップロード量",
"dlSpeed": "ダウンロード速度",
"ulSpeed": "アップロード速度",
"chains": "チェーン",
"rule": "ルール",
"process": "プロセス",
"time": "接続時間",
"source": "送信元アドレス",
"destination": "宛先アドレス",
"destinationPort": "宛先ポート",
"type": "タイプ"
},
"order": {
"default": "Default",
"uploadSpeed": "アップロード速度",
"downloadSpeed": "ダウンロード速度"
},
"actions": {
"closeConnection": "接続を閉じる"
"components": {
"fields": {
"host": "ホスト",
"downloaded": "ダウンロード量",
"uploaded": "アップロード",
"dlSpeed": "ダウンロード速度",
"ulSpeed": "アップロード速度",
"chains": "チェーン",
"rule": "ルール",
"process": "プロセス",
"time": "接続時間",
"source": "送信元アドレス",
"destination": "宛先アドレス",
"destinationPort": "宛先ポート",
"type": "タイプ"
},
"order": {
"default": "Default",
"uploadSpeed": "アップロード速度",
"downloadSpeed": "ダウンロード速度"
},
"actions": {
"closeConnection": "接続を閉じる"
}
}
},
"tests": {
"item": {
"actions": {
"test": "テスト"
}
},
"viewer": {
"title": {
"create": "新規テストを作成",
"edit": "テストを編集"
},
"fields": {
"url": "テストURL"
}
},
"page": {
"title": "テスト",
"actions": {
"testAll": "すべてテスト"
},
"header": {
"title": "テスト"
}
},
"statuses": {
"pending": "検査待ち",
"yes": "サポートする",
"no": "サポートしない",
"failed": "テストに失敗しました。",
"completed": "検査完了",
"disallowedIsp": "許可されていないインターネットサービスプロバイダー",
"originalsOnly": "オリジナルのみ",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "サポートされていない国/地域",
"failedNetwork": "Failed (Network Connection)"
"components": {
"item": {
"actions": {
"test": "テスト"
}
}
},
"modals": {
"test": {
"title": {
"create": "新規テストを作成",
"edit": "テストを編集"
},
"fields": {
"url": "テストURL"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "検査待ち",
"yes": "サポートする",
"no": "サポートしない",
"failed": "テストに失敗しました。",
"completed": "検査完了",
"disallowedIsp": "許可されていないインターネットサービスプロバイダー",
"originalsOnly": "オリジナルのみ",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "サポートされていない国/地域",
"failedNetwork": "Failed (Network Connection)"
}
}
}
},
"logs": {
"page": {
"title": "ログ",
"actions": {
"pause": "一時停止",
"resume": "再開",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "ログ"
}
}
},
"rules": {
"page": {
"title": "ルール",
"provider": {
"trigger": "ルールプロバイダー",
"dialogTitle": "ルールプロバイダー",
"actions": {
"updateAll": "すべて更新",
"update": "更新"
},
"notices": {
}
},
"header": {
"title": "ルール"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "ルールを編集",
"form": {
"labels": {
"type": "ルールタイプ",
"content": "ルール内容",
"proxyPolicy": "プロキシポリシー"
"modals": {
"editor": {
"form": {
"labels": {
"type": "ルールタイプ",
"content": "ルール内容",
"proxyPolicy": "プロキシポリシー"
},
"toggles": {
"noResolve": "DNS解決をスキップ"
},
"actions": {
"prependRule": "前置ルールを追加",
"appendRule": "後置ルールを追加"
},
"validation": {
"conditionRequired": "ルール条件が必要です",
"invalidRule": "無効なルール"
}
},
"toggles": {
"noResolve": "DNS解決をスキップ"
"ruleTypes": {
"DOMAIN": "完全なドメイン名を一致させる",
"DOMAIN-SUFFIX": "ドメインサフィックスを一致させる",
"DOMAIN-KEYWORD": "ドメインキーワードを一致させる",
"DOMAIN-REGEX": "ドメイン正規表現を一致させる",
"GEOSITE": "Geosite内のドメインを一致させる",
"GEOIP": "IPの所属国コードを一致させる",
"SRC-GEOIP": "送信元IPの所属国コードを一致させる",
"IP-ASN": "IPの所属ASNを一致させる",
"SRC-IP-ASN": "送信元IPの所属ASNを一致させる",
"IP-CIDR": "IPアドレス範囲を一致させる",
"IP-CIDR6": "IPアドレス範囲を一致させる",
"SRC-IP-CIDR": "送信元IPアドレス範囲を一致させる",
"IP-SUFFIX": "IPサフィックス範囲を一致させる",
"SRC-IP-SUFFIX": "送信元IPサフィックス範囲を一致させる",
"SRC-PORT": "送信元ポート範囲を一致させる",
"DST-PORT": "宛先ポート範囲を一致させる",
"IN-PORT": "入力ポートを一致させる",
"DSCP": "DSCPマークTPROXY UDP入力のみ",
"PROCESS-NAME": "プロセス名を一致させるAndroidパッケージ名",
"PROCESS-PATH": "完全なプロセスパスを一致させる",
"PROCESS-NAME-REGEX": "完全なプロセス名を正規表現で一致させるAndroidパッケージ名",
"PROCESS-PATH-REGEX": "完全なプロセスパスを正規表現で一致させる",
"NETWORK": "トランスポートプロトコルを一致させる (TCP/UDP)",
"UID": "LinuxユーザーIDを一致させる",
"IN-TYPE": "入力タイプを一致させる",
"IN-USER": "入力ユーザー名を一致させる",
"IN-NAME": "入力名を一致させる",
"SUB-RULE": "サブルール",
"RULE-SET": "ルールセットを一致させる",
"AND": "論理積",
"OR": "論理和",
"NOT": "論理否定",
"MATCH": "すべてのリクエストを一致させる"
},
"actions": {
"prependRule": "前置ルールを追加",
"appendRule": "後置ルールを追加"
},
"validation": {
"conditionRequired": "ルール条件が必要です",
"invalidRule": "無効なルール"
"header": {
"title": "ルールを編集"
}
},
"ruleTypes": {
"DOMAIN": "完全なドメイン名を一致させる",
"DOMAIN-SUFFIX": "ドメインサフィックスを一致させる",
"DOMAIN-KEYWORD": "ドメインキーワードを一致させる",
"DOMAIN-REGEX": "ドメイン正規表現を一致させる",
"GEOSITE": "Geosite内のドメインを一致させる",
"GEOIP": "IPの所属国コードを一致させる",
"SRC-GEOIP": "送信元IPの所属国コードを一致させる",
"IP-ASN": "IPの所属ASNを一致させる",
"SRC-IP-ASN": "送信元IPの所属ASNを一致させる",
"IP-CIDR": "IPアドレス範囲を一致させる",
"IP-CIDR6": "IPアドレス範囲を一致させる",
"SRC-IP-CIDR": "送信元IPアドレス範囲を一致させる",
"IP-SUFFIX": "IPサフィックス範囲を一致させる",
"SRC-IP-SUFFIX": "送信元IPサフィックス範囲を一致させる",
"SRC-PORT": "送信元ポート範囲を一致させる",
"DST-PORT": "宛先ポート範囲を一致させる",
"IN-PORT": "入力ポートを一致させる",
"DSCP": "DSCPマークTPROXY UDP入力のみ",
"PROCESS-NAME": "プロセス名を一致させるAndroidパッケージ名",
"PROCESS-PATH": "完全なプロセスパスを一致させる",
"PROCESS-NAME-REGEX": "完全なプロセス名を正規表現で一致させるAndroidパッケージ名",
"PROCESS-PATH-REGEX": "完全なプロセスパスを正規表現で一致させる",
"NETWORK": "トランスポートプロトコルを一致させる (TCP/UDP)",
"UID": "LinuxユーザーIDを一致させる",
"IN-TYPE": "入力タイプを一致させる",
"IN-USER": "入力ユーザー名を一致させる",
"IN-NAME": "入力名を一致させる",
"SUB-RULE": "サブルール",
"RULE-SET": "ルールセットを一致させる",
"AND": "論理積",
"OR": "論理和",
"NOT": "論理否定",
"MATCH": "すべてのリクエストを一致させる"
}
}
},
"home": {
"page": {
"title": "ホーム",
"tooltips": {
"lightweightMode": "軽量モード",
"manual": "マニュアル",
@@ -563,7 +596,6 @@
"proxyMode": "プロキシモード"
},
"settings": {
"title": "ホーム設定",
"cards": {
"profile": "プロファイルカード",
"currentProxy": "現在のプロキシカード",
@@ -574,10 +606,16 @@
"ip": "IP情報カード",
"clashInfo": "Clash情報カード",
"systemInfo": "システム情報カード"
},
"header": {
"title": "ホーム設定"
}
},
"header": {
"title": "ホーム"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "システムプロキシが有効になっています。アプリケーションはプロキシを通じてネットワークにアクセスします。",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "ロック解除テスト",
"actions": {
"testing": "テスト中..."
},
"empty": "アンロックテスト項目はありません",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "ロック解除テスト"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "프록시 그룹",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "모두 업데이트",
"update": "업데이트"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "Direct Mode"
},
"header": {
"title": {
"default": "프록시 그룹",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "수동으로 프록시 선택",
"url-test": "URL 테스트 지연을 기준으로 프록시 선택",
"fallback": "오류 발생 시 다른 프록시로 전환",
"load-balance": "부하 분산에 따라 프록시 분배",
"relay": "정의된 프록시 체인을 통과"
},
"policies": {
"DIRECT": "데이터가 직접 아웃바운드로 이동",
"REJECT": "요청 차단",
"REJECT-DROP": "요청 폐기",
"PASS": "일치할 경우 이 규칙 건너뛰기"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "수동으로 프록시 선택",
"url-test": "URL 테스트 지연을 기준으로 프록시 선택",
"fallback": "오류 발생 시 다른 프록시로 전환",
"load-balance": "부하 분산에 따라 프록시 분배",
"relay": "정의된 프록시 체인을 통과"
},
"policies": {
"DIRECT": "데이터가 직접 아웃바운드로 이동",
"REJECT": "요청 차단",
"REJECT-DROP": "요청 폐기",
"PASS": "일치할 경우 이 규칙 건너뛰기"
}
}
}
},
"connections": {
"page": {
"title": "연결",
"summary": {
"downloaded": "다운로드됨",
"uploaded": "업로드됨"
@@ -396,69 +403,83 @@
"pause": "일시 정지",
"resume": "재개",
"closeAll": "모두 닫기"
},
"header": {
"title": "연결"
}
},
"fields": {
"host": "호스트",
"downloaded": "다운로드됨",
"uploaded": "로드됨",
"dlSpeed": "다운로드 속도",
"ulSpeed": "로드 속도",
"chains": "체인",
"rule": "규칙",
"process": "프로세스",
"time": "시간",
"source": "소스",
"destination": "목적지",
"destinationPort": "목적지 포트",
"type": "유형"
},
"order": {
"default": "Default",
"uploadSpeed": "업로드 속도",
"downloadSpeed": "다운로드 속도"
},
"actions": {
"closeConnection": "연결 닫기"
"components": {
"fields": {
"host": "호스트",
"downloaded": "다운로드됨",
"uploaded": "업로드됨",
"dlSpeed": "다운로드 속도",
"ulSpeed": "업로드 속도",
"chains": "체인",
"rule": "규칙",
"process": "프로세스",
"time": "시간",
"source": "소스",
"destination": "목적지",
"destinationPort": "목적지 포트",
"type": "유형"
},
"order": {
"default": "Default",
"uploadSpeed": "로드 속도",
"downloadSpeed": "다운로드 속도"
},
"actions": {
"closeConnection": "연결 닫기"
}
}
},
"tests": {
"item": {
"actions": {
"test": "테스트"
}
},
"viewer": {
"title": {
"create": "테스트 생성",
"edit": "테스트 편집"
},
"fields": {
"url": "테스트 URL"
}
},
"page": {
"title": "테스트",
"actions": {
"testAll": "모두 테스트"
},
"header": {
"title": "테스트"
}
},
"statuses": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "실패",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
"components": {
"item": {
"actions": {
"test": "테스트"
}
}
},
"modals": {
"test": {
"title": {
"create": "테스트 생성",
"edit": "테스트 편집"
},
"fields": {
"url": "테스트 URL"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "실패",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
}
}
}
},
"logs": {
"page": {
"title": "로그",
"actions": {
"pause": "일시 정지",
"resume": "재개",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "로그"
}
}
},
"rules": {
"page": {
"title": "규칙",
"provider": {
"trigger": "규칙 제공자",
"dialogTitle": "규칙 제공자",
"actions": {
"updateAll": "모두 업데이트",
"update": "업데이트"
},
"notices": {
}
},
"header": {
"title": "규칙"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "규칙 편집",
"form": {
"labels": {
"type": "규칙 유형",
"content": "규칙 내용",
"proxyPolicy": "프록시 정책"
"modals": {
"editor": {
"form": {
"labels": {
"type": "규칙 유형",
"content": "규칙 내용",
"proxyPolicy": "프록시 정책"
},
"toggles": {
"noResolve": "해석 안함"
},
"actions": {
"prependRule": "규칙 앞에 추가",
"appendRule": "규칙 뒤에 추가"
},
"validation": {
"conditionRequired": "규칙 조건 필요",
"invalidRule": "잘못된 규칙"
}
},
"toggles": {
"noResolve": "해석 안함"
"ruleTypes": {
"DOMAIN": "전체 도메인 이름과 일치",
"DOMAIN-SUFFIX": "도메인 접미사와 일치",
"DOMAIN-KEYWORD": "도메인 키워드와 일치",
"DOMAIN-REGEX": "정규 표현식을 사용한 도메인 일치",
"GEOSITE": "Geosite 내의 도메인과 일치",
"GEOIP": "IP 주소의 국가 코드와 일치",
"SRC-GEOIP": "소스 IP 주소의 국가 코드와 일치",
"IP-ASN": "IP 주소의 ASN과 일치",
"SRC-IP-ASN": "소스 IP 주소의 ASN과 일치",
"IP-CIDR": "IP 주소 범위와 일치",
"IP-CIDR6": "IPv6 주소 범위와 일치",
"SRC-IP-CIDR": "소스 IP 주소 범위와 일치",
"IP-SUFFIX": "IP 주소 접미사 범위와 일치",
"SRC-IP-SUFFIX": "소스 IP 주소 접미사 범위와 일치",
"SRC-PORT": "소스 포트 범위와 일치",
"DST-PORT": "대상 포트 범위와 일치",
"IN-PORT": "인바운드 포트와 일치",
"DSCP": "DSCP 마킹(tproxy UDP 인바운드만 해당)",
"PROCESS-NAME": "프로세스 이름과 일치(안드로이드 패키지 이름)",
"PROCESS-PATH": "전체 프로세스 경로와 일치",
"PROCESS-NAME-REGEX": "정규 표현식을 사용한 전체 프로세스 이름 일치(안드로이드 패키지 이름)",
"PROCESS-PATH-REGEX": "정규 표현식을 사용한 전체 프로세스 경로 일치",
"NETWORK": "전송 프로토콜과 일치(tcp/udp)",
"UID": "Linux 사용자 ID와 일치",
"IN-TYPE": "인바운드 유형과 일치",
"IN-USER": "인바운드 사용자 이름과 일치",
"IN-NAME": "인바운드 이름과 일치",
"SUB-RULE": "하위 규칙",
"RULE-SET": "규칙 세트와 일치",
"AND": "논리 AND",
"OR": "논리 OR",
"NOT": "논리 NOT",
"MATCH": "모든 요청과 일치"
},
"actions": {
"prependRule": "규칙 앞에 추가",
"appendRule": "규칙 뒤에 추가"
},
"validation": {
"conditionRequired": "규칙 조건 필요",
"invalidRule": "잘못된 규칙"
"header": {
"title": "규칙 편집"
}
},
"ruleTypes": {
"DOMAIN": "전체 도메인 이름과 일치",
"DOMAIN-SUFFIX": "도메인 접미사와 일치",
"DOMAIN-KEYWORD": "도메인 키워드와 일치",
"DOMAIN-REGEX": "정규 표현식을 사용한 도메인 일치",
"GEOSITE": "Geosite 내의 도메인과 일치",
"GEOIP": "IP 주소의 국가 코드와 일치",
"SRC-GEOIP": "소스 IP 주소의 국가 코드와 일치",
"IP-ASN": "IP 주소의 ASN과 일치",
"SRC-IP-ASN": "소스 IP 주소의 ASN과 일치",
"IP-CIDR": "IP 주소 범위와 일치",
"IP-CIDR6": "IPv6 주소 범위와 일치",
"SRC-IP-CIDR": "소스 IP 주소 범위와 일치",
"IP-SUFFIX": "IP 주소 접미사 범위와 일치",
"SRC-IP-SUFFIX": "소스 IP 주소 접미사 범위와 일치",
"SRC-PORT": "소스 포트 범위와 일치",
"DST-PORT": "대상 포트 범위와 일치",
"IN-PORT": "인바운드 포트와 일치",
"DSCP": "DSCP 마킹(tproxy UDP 인바운드만 해당)",
"PROCESS-NAME": "프로세스 이름과 일치(안드로이드 패키지 이름)",
"PROCESS-PATH": "전체 프로세스 경로와 일치",
"PROCESS-NAME-REGEX": "정규 표현식을 사용한 전체 프로세스 이름 일치(안드로이드 패키지 이름)",
"PROCESS-PATH-REGEX": "정규 표현식을 사용한 전체 프로세스 경로 일치",
"NETWORK": "전송 프로토콜과 일치(tcp/udp)",
"UID": "Linux 사용자 ID와 일치",
"IN-TYPE": "인바운드 유형과 일치",
"IN-USER": "인바운드 사용자 이름과 일치",
"IN-NAME": "인바운드 이름과 일치",
"SUB-RULE": "하위 규칙",
"RULE-SET": "규칙 세트와 일치",
"AND": "논리 AND",
"OR": "논리 OR",
"NOT": "논리 NOT",
"MATCH": "모든 요청과 일치"
}
}
},
"home": {
"page": {
"title": "홈",
"tooltips": {
"lightweightMode": "Lightweight Mode",
"manual": "Manual",
@@ -563,7 +596,6 @@
"proxyMode": "Proxy Mode"
},
"settings": {
"title": "Home Settings",
"cards": {
"profile": "Profile Card",
"currentProxy": "Current Proxy Card",
@@ -574,10 +606,16 @@
"ip": "IP Information Card",
"clashInfo": "Clash Info Cards",
"systemInfo": "System Info Cards"
},
"header": {
"title": "Home Settings"
}
},
"header": {
"title": "홈"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "System proxy is enabled, your applications will access the network through the proxy",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Unlock Test",
"actions": {
"testing": "테스트 중..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Unlock Test"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "Группы прокси",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "Обновить все",
"update": "Обновить"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "Прямой режим"
},
"header": {
"title": {
"default": "Группы прокси",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "Выбор прокси вручную",
"url-test": "Выбор прокси на основе задержки теста URL",
"fallback": "Переключение на другой прокси при ошибке",
"load-balance": "Распределение прокси на основе балансировки нагрузки",
"relay": "Передача через определенную цепочку прокси"
},
"policies": {
"DIRECT": "Данные направляются напрямую наружу",
"REJECT": "Перехватывает запросы",
"REJECT-DROP": "Отклоняет запросы",
"PASS": "Пропускает это правило при совпадении"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "Выбор прокси вручную",
"url-test": "Выбор прокси на основе задержки теста URL",
"fallback": "Переключение на другой прокси при ошибке",
"load-balance": "Распределение прокси на основе балансировки нагрузки",
"relay": "Передача через определенную цепочку прокси"
},
"policies": {
"DIRECT": "Данные направляются напрямую наружу",
"REJECT": "Перехватывает запросы",
"REJECT-DROP": "Отклоняет запросы",
"PASS": "Пропускает это правило при совпадении"
}
}
}
},
"connections": {
"page": {
"title": "Соединения",
"summary": {
"downloaded": "Скачано",
"uploaded": "Загружено"
@@ -396,69 +403,83 @@
"pause": "Пауза",
"resume": "Возобновить",
"closeAll": "Закрыть всё"
},
"header": {
"title": "Соединения"
}
},
"fields": {
"host": "Хост",
"downloaded": "Скачано",
"uploaded": "Загружено",
"dlSpeed": "Скорость скачивания",
"ulSpeed": "Скорость загрузки",
"chains": "Цепочки",
"rule": "Правило",
"process": "Процесс",
"time": "Время подключения",
"source": "Исходный адрес",
"destination": "IP-адрес назначения",
"destinationPort": "Целевой порт",
"type": "Тип"
},
"order": {
"default": "Default",
"uploadSpeed": "Скорость загрузки",
"downloadSpeed": "Скорость скачивания"
},
"actions": {
"closeConnection": "Закрыть соединение"
"components": {
"fields": {
"host": "Хост",
"downloaded": "Скачано",
"uploaded": "Загружено",
"dlSpeed": "Скорость скачивания",
"ulSpeed": "Скорость загрузки",
"chains": "Цепочки",
"rule": "Правило",
"process": "Процесс",
"time": "Время подключения",
"source": "Исходный адрес",
"destination": "IP-адрес назначения",
"destinationPort": "Целевой порт",
"type": "Тип"
},
"order": {
"default": "Default",
"uploadSpeed": "Скорость загрузки",
"downloadSpeed": "Скорость скачивания"
},
"actions": {
"closeConnection": "Закрыть соединение"
}
}
},
"tests": {
"item": {
"actions": {
"test": "Тест"
}
},
"viewer": {
"title": {
"create": "Создать тест",
"edit": "Редактировать тест"
},
"fields": {
"url": "URL проверка"
}
},
"page": {
"title": "Тест",
"actions": {
"testAll": "Тестировать все"
},
"header": {
"title": "Тест"
}
},
"statuses": {
"pending": "В ожидании",
"yes": "Да",
"no": "Нет",
"failed": "Ошибка",
"completed": "Завершено",
"disallowedIsp": "ISP заблокирован",
"originalsOnly": "Только Originals",
"noDisney": "Нет (IP забанен Disney+)",
"unsupportedRegion": "Страна/регион не поддерживается",
"failedNetwork": "Ошибка подключения"
"components": {
"item": {
"actions": {
"test": "Тест"
}
}
},
"modals": {
"test": {
"title": {
"create": "Создать тест",
"edit": "Редактировать тест"
},
"fields": {
"url": "URL проверка"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "В ожидании",
"yes": "Да",
"no": "Нет",
"failed": "Ошибка",
"completed": "Завершено",
"disallowedIsp": "ISP заблокирован",
"originalsOnly": "Только Originals",
"noDisney": "Нет (IP забанен Disney+)",
"unsupportedRegion": "Страна/регион не поддерживается",
"failedNetwork": "Ошибка подключения"
}
}
}
},
"logs": {
"page": {
"title": "Логи",
"actions": {
"pause": "Пауза",
"resume": "Возобновить",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "Логи"
}
}
},
"rules": {
"page": {
"title": "Правила",
"provider": {
"trigger": "Провайдеры правил",
"dialogTitle": "Провайдеры правил",
"actions": {
"updateAll": "Обновить все",
"update": "Обновить"
},
"notices": {
}
},
"header": {
"title": "Правила"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "Редактировать правила",
"form": {
"labels": {
"type": "Тип правила",
"content": "Содержимое правила",
"proxyPolicy": "Политика прокси"
"modals": {
"editor": {
"form": {
"labels": {
"type": "Тип правила",
"content": "Содержимое правила",
"proxyPolicy": "Политика прокси"
},
"toggles": {
"noResolve": "Без разрешения"
},
"actions": {
"prependRule": "Добавить правило в начало",
"appendRule": "Добавить правило в конец"
},
"validation": {
"conditionRequired": "Требуется условие правила",
"invalidRule": "Недействительное правило"
}
},
"toggles": {
"noResolve": "Без разрешения"
"ruleTypes": {
"DOMAIN": "Соответствует полному доменному имени",
"DOMAIN-SUFFIX": "Соответствует суффиксу домена",
"DOMAIN-KEYWORD": "Соответствует ключевому слову домена",
"DOMAIN-REGEX": "Соответствует домену с использованием регулярных выражений",
"GEOSITE": "Соответствует доменам в Geosite",
"GEOIP": "Соответствует коду страны IP-адреса",
"SRC-GEOIP": "Соответствует коду страны исходного IP-адреса",
"IP-ASN": "Соответствует ASN IP-адреса",
"SRC-IP-ASN": "Соответствует ASN исходного IP-адреса",
"IP-CIDR": "Соответствует диапазону IP-адресов",
"IP-CIDR6": "Соответствует диапазону IPv6-адресов",
"SRC-IP-CIDR": "Соответствует диапазону исходных IP-адресов",
"IP-SUFFIX": "Соответствует диапазону суффиксов IP-адресов",
"SRC-IP-SUFFIX": "Соответствует диапазону суффиксов исходных IP-адресов",
"SRC-PORT": "Соответствует диапазону исходных портов",
"DST-PORT": "Соответствует диапазону целевых портов",
"IN-PORT": "Соответствует входящему порту",
"DSCP": "Маркировка DSCP (только для tproxy UDP входящего)",
"PROCESS-NAME": "Соответствует имени процесса (имя пакета Android)",
"PROCESS-PATH": "Соответствует полному пути процесса",
"PROCESS-NAME-REGEX": "Соответствует имени процесса с использованием регулярных выражений (имя пакета Android)",
"PROCESS-PATH-REGEX": "Соответствует полному пути процесса с использованием регулярных выражений",
"NETWORK": "Соответствует транспортному протоколу (tcp/udp)",
"UID": "Соответствует USER ID в Linux",
"IN-TYPE": "Соответствует типу входящего соединения",
"IN-USER": "Соответствует имени пользователя входящего соединения",
"IN-NAME": "Соответствует имени входящего соединения",
"SUB-RULE": "Подправило",
"RULE-SET": "Соответствует набору правил",
"AND": "Логическое И",
"OR": "Логическое ИЛИ",
"NOT": "Логическое НЕ",
"MATCH": "Соответствует всем запросам"
},
"actions": {
"prependRule": "Добавить правило в начало",
"appendRule": "Добавить правило в конец"
},
"validation": {
"conditionRequired": "Требуется условие правила",
"invalidRule": "Недействительное правило"
"header": {
"title": "Редактировать правила"
}
},
"ruleTypes": {
"DOMAIN": "Соответствует полному доменному имени",
"DOMAIN-SUFFIX": "Соответствует суффиксу домена",
"DOMAIN-KEYWORD": "Соответствует ключевому слову домена",
"DOMAIN-REGEX": "Соответствует домену с использованием регулярных выражений",
"GEOSITE": "Соответствует доменам в Geosite",
"GEOIP": "Соответствует коду страны IP-адреса",
"SRC-GEOIP": "Соответствует коду страны исходного IP-адреса",
"IP-ASN": "Соответствует ASN IP-адреса",
"SRC-IP-ASN": "Соответствует ASN исходного IP-адреса",
"IP-CIDR": "Соответствует диапазону IP-адресов",
"IP-CIDR6": "Соответствует диапазону IPv6-адресов",
"SRC-IP-CIDR": "Соответствует диапазону исходных IP-адресов",
"IP-SUFFIX": "Соответствует диапазону суффиксов IP-адресов",
"SRC-IP-SUFFIX": "Соответствует диапазону суффиксов исходных IP-адресов",
"SRC-PORT": "Соответствует диапазону исходных портов",
"DST-PORT": "Соответствует диапазону целевых портов",
"IN-PORT": "Соответствует входящему порту",
"DSCP": "Маркировка DSCP (только для tproxy UDP входящего)",
"PROCESS-NAME": "Соответствует имени процесса (имя пакета Android)",
"PROCESS-PATH": "Соответствует полному пути процесса",
"PROCESS-NAME-REGEX": "Соответствует имени процесса с использованием регулярных выражений (имя пакета Android)",
"PROCESS-PATH-REGEX": "Соответствует полному пути процесса с использованием регулярных выражений",
"NETWORK": "Соответствует транспортному протоколу (tcp/udp)",
"UID": "Соответствует USER ID в Linux",
"IN-TYPE": "Соответствует типу входящего соединения",
"IN-USER": "Соответствует имени пользователя входящего соединения",
"IN-NAME": "Соответствует имени входящего соединения",
"SUB-RULE": "Подправило",
"RULE-SET": "Соответствует набору правил",
"AND": "Логическое И",
"OR": "Логическое ИЛИ",
"NOT": "Логическое НЕ",
"MATCH": "Соответствует всем запросам"
}
}
},
"home": {
"page": {
"title": "Главная",
"tooltips": {
"lightweightMode": "LightWeight Mode",
"manual": "Документация",
@@ -563,7 +596,6 @@
"proxyMode": "Режим работы"
},
"settings": {
"title": "Настройки главной страницы",
"cards": {
"profile": "Карточка профиля",
"currentProxy": "Карточка текущего прокси",
@@ -574,10 +606,16 @@
"ip": "Информация об IP",
"clashInfo": "Информация о Clash",
"systemInfo": "Информация о системе"
},
"header": {
"title": "Настройки главной страницы"
}
},
"header": {
"title": "Главная"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "Системный прокси включен, ваши приложения будут получать доступ к сети через него",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Тест доступности веб-сайтов",
"actions": {
"testing": "Тестирование ..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Тест доступности веб-сайтов"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "Vekil Grupları",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "Tümünü Güncelle",
"update": "Güncelle"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "Doğrudan Mod"
},
"header": {
"title": {
"default": "Vekil Grupları",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "Vekil'i manuel olarak seçin",
"url-test": "URL testi gecikmesine göre vekil seçin",
"fallback": "Hata durumunda başka bir vekil'e geçin",
"load-balance": "Yük dengelemeye göre vekil dağıtın",
"relay": "Tanımlanan vekil zincirinden geçirin"
},
"policies": {
"DIRECT": "Veri doğrudan dışarı gider",
"REJECT": "İstekleri engeller",
"REJECT-DROP": "İstekleri atar",
"PASS": "Eşleştiğinde bu kuralı atlar"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "Vekil'i manuel olarak seçin",
"url-test": "URL testi gecikmesine göre vekil seçin",
"fallback": "Hata durumunda başka bir vekil'e geçin",
"load-balance": "Yük dengelemeye göre vekil dağıtın",
"relay": "Tanımlanan vekil zincirinden geçirin"
},
"policies": {
"DIRECT": "Veri doğrudan dışarı gider",
"REJECT": "İstekleri engeller",
"REJECT-DROP": "İstekleri atar",
"PASS": "Eşleştiğinde bu kuralı atlar"
}
}
}
},
"connections": {
"page": {
"title": "Bağlantılar",
"summary": {
"downloaded": "İndirilen",
"uploaded": "Yüklenen"
@@ -396,69 +403,83 @@
"pause": "Duraklat",
"resume": "Sürdür",
"closeAll": "Tümünü Kapat"
},
"header": {
"title": "Bağlantılar"
}
},
"fields": {
"host": "Ana Bilgisayar",
"downloaded": "İndirilen",
"uploaded": "Yüklenen",
"dlSpeed": "İndirme Hızı",
"ulSpeed": "Yükleme Hızı",
"chains": "Zincirler",
"rule": "Kural",
"process": "İşlem",
"time": "Zaman",
"source": "Kaynak",
"destination": "Hedef",
"destinationPort": "Hedef Port",
"type": "Tip"
},
"order": {
"default": "Default",
"uploadSpeed": "Yükleme Hızı",
"downloadSpeed": "İndirme Hızı"
},
"actions": {
"closeConnection": "Bağlantıyı Kapat"
"components": {
"fields": {
"host": "Ana Bilgisayar",
"downloaded": "İndirilen",
"uploaded": "Yüklenen",
"dlSpeed": "İndirme Hızı",
"ulSpeed": "Yükleme Hızı",
"chains": "Zincirler",
"rule": "Kural",
"process": "İşlem",
"time": "Zaman",
"source": "Kaynak",
"destination": "Hedef",
"destinationPort": "Hedef Port",
"type": "Tip"
},
"order": {
"default": "Default",
"uploadSpeed": "Yükleme Hızı",
"downloadSpeed": "İndirme Hızı"
},
"actions": {
"closeConnection": "Bağlantıyı Kapat"
}
}
},
"tests": {
"item": {
"actions": {
"test": "Test"
}
},
"viewer": {
"title": {
"create": "Test Oluştur",
"edit": "Testi Düzenle"
},
"fields": {
"url": "Test URL'si"
}
},
"page": {
"title": "Test",
"actions": {
"testAll": "Tümünü Test Et"
},
"header": {
"title": "Test"
}
},
"statuses": {
"pending": "Beklemede",
"yes": "Evet",
"no": "Hayır",
"failed": "Başarısız",
"completed": "Tamamlandı",
"disallowedIsp": "İzin Verilmeyen ISP",
"originalsOnly": "Yalnızca Orijinaller",
"noDisney": "Hayır (IP Disney+ Tarafından Yasaklandı)",
"unsupportedRegion": "Desteklenmeyen Ülke/Bölge",
"failedNetwork": "Başarısız (Ağ Bağlantısı)"
"components": {
"item": {
"actions": {
"test": "Test"
}
}
},
"modals": {
"test": {
"title": {
"create": "Test Oluştur",
"edit": "Testi Düzenle"
},
"fields": {
"url": "Test URL'si"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "Beklemede",
"yes": "Evet",
"no": "Hayır",
"failed": "Başarısız",
"completed": "Tamamlandı",
"disallowedIsp": "İzin Verilmeyen ISP",
"originalsOnly": "Yalnızca Orijinaller",
"noDisney": "Hayır (IP Disney+ Tarafından Yasaklandı)",
"unsupportedRegion": "Desteklenmeyen Ülke/Bölge",
"failedNetwork": "Başarısız (Ağ Bağlantısı)"
}
}
}
},
"logs": {
"page": {
"title": "Günlükler",
"actions": {
"pause": "Duraklat",
"resume": "Sürdür",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "Günlükler"
}
}
},
"rules": {
"page": {
"title": "Kurallar",
"provider": {
"trigger": "Kural Sağlayıcısı",
"dialogTitle": "Kural Sağlayıcısı",
"actions": {
"updateAll": "Tümünü Güncelle",
"update": "Güncelle"
},
"notices": {
}
},
"header": {
"title": "Kurallar"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "Kuralları Düzenle",
"form": {
"labels": {
"type": "Kural Tipi",
"content": "Kural İçeriği",
"proxyPolicy": "Vekil Politikası"
"modals": {
"editor": {
"form": {
"labels": {
"type": "Kural Tipi",
"content": "Kural İçeriği",
"proxyPolicy": "Vekil Politikası"
},
"toggles": {
"noResolve": "Çözümleme Yok"
},
"actions": {
"prependRule": "Kuralın Başına Ekle",
"appendRule": "Kuralın Sonuna Ekle"
},
"validation": {
"conditionRequired": "Kural Koşulu Gerekli",
"invalidRule": "Geçersiz Kural"
}
},
"toggles": {
"noResolve": "Çözümleme Yok"
"ruleTypes": {
"DOMAIN": "Tam alan adıyla eşleşir",
"DOMAIN-SUFFIX": "Alan adı sonekiyle eşleşir",
"DOMAIN-KEYWORD": "Alan adı anahtar kelimesiyle eşleşir",
"DOMAIN-REGEX": "Alan adını düzenli ifadeler kullanarak eşleştirir",
"GEOSITE": "Geosite içindeki alan adlarıyla eşleşir",
"GEOIP": "IP adresinin ülke koduyla eşleşir",
"SRC-GEOIP": "Kaynak IP adresinin ülke koduyla eşleşir",
"IP-ASN": "IP adresinin ASN'siyle eşleşir",
"SRC-IP-ASN": "Kaynak IP adresinin ASN'siyle eşleşir",
"IP-CIDR": "IP adresi aralığıyla eşleşir",
"IP-CIDR6": "IPv6 adresi aralığıyla eşleşir",
"SRC-IP-CIDR": "Kaynak IP adresi aralığıyla eşleşir",
"IP-SUFFIX": "IP adresi sonek aralığıyla eşleşir",
"SRC-IP-SUFFIX": "Kaynak IP adresi sonek aralığıyla eşleşir",
"SRC-PORT": "Kaynak port aralığıyla eşleşir",
"DST-PORT": "Hedef port aralığıyla eşleşir",
"IN-PORT": "Gelen port ile eşleşir",
"DSCP": "DSCP işaretlemesi (sadece tvekil UDP girişi için)",
"PROCESS-NAME": "İşlem adıyla eşleşir (Android paket adı)",
"PROCESS-PATH": "Tam işlem yoluyla eşleşir",
"PROCESS-NAME-REGEX": "Tam işlem adını düzenli ifadeler kullanarak eşleştirir (Android paket adı)",
"PROCESS-PATH-REGEX": "Tam işlem yolunu düzenli ifadeler kullanarak eşleştirir",
"NETWORK": "Taşıma protokolüyle eşleşir (tcp/udp)",
"UID": "Linux KULLANICI ID'siyle eşleşir",
"IN-TYPE": "Gelen bağlantı tipiyle eşleşir",
"IN-USER": "Gelen bağlantı kullanıcı adıyla eşleşir",
"IN-NAME": "Gelen bağlantı adıyla eşleşir",
"SUB-RULE": "Alt kural",
"RULE-SET": "Kural setiyle eşleşir",
"AND": "Mantıksal VE",
"OR": "Mantıksal VEYA",
"NOT": "Mantıksal DEĞİL",
"MATCH": "Tüm isteklerle eşleşir"
},
"actions": {
"prependRule": "Kuralın Başına Ekle",
"appendRule": "Kuralın Sonuna Ekle"
},
"validation": {
"conditionRequired": "Kural Koşulu Gerekli",
"invalidRule": "Geçersiz Kural"
"header": {
"title": "Kuralları Düzenle"
}
},
"ruleTypes": {
"DOMAIN": "Tam alan adıyla eşleşir",
"DOMAIN-SUFFIX": "Alan adı sonekiyle eşleşir",
"DOMAIN-KEYWORD": "Alan adı anahtar kelimesiyle eşleşir",
"DOMAIN-REGEX": "Alan adını düzenli ifadeler kullanarak eşleştirir",
"GEOSITE": "Geosite içindeki alan adlarıyla eşleşir",
"GEOIP": "IP adresinin ülke koduyla eşleşir",
"SRC-GEOIP": "Kaynak IP adresinin ülke koduyla eşleşir",
"IP-ASN": "IP adresinin ASN'siyle eşleşir",
"SRC-IP-ASN": "Kaynak IP adresinin ASN'siyle eşleşir",
"IP-CIDR": "IP adresi aralığıyla eşleşir",
"IP-CIDR6": "IPv6 adresi aralığıyla eşleşir",
"SRC-IP-CIDR": "Kaynak IP adresi aralığıyla eşleşir",
"IP-SUFFIX": "IP adresi sonek aralığıyla eşleşir",
"SRC-IP-SUFFIX": "Kaynak IP adresi sonek aralığıyla eşleşir",
"SRC-PORT": "Kaynak port aralığıyla eşleşir",
"DST-PORT": "Hedef port aralığıyla eşleşir",
"IN-PORT": "Gelen port ile eşleşir",
"DSCP": "DSCP işaretlemesi (sadece tvekil UDP girişi için)",
"PROCESS-NAME": "İşlem adıyla eşleşir (Android paket adı)",
"PROCESS-PATH": "Tam işlem yoluyla eşleşir",
"PROCESS-NAME-REGEX": "Tam işlem adını düzenli ifadeler kullanarak eşleştirir (Android paket adı)",
"PROCESS-PATH-REGEX": "Tam işlem yolunu düzenli ifadeler kullanarak eşleştirir",
"NETWORK": "Taşıma protokolüyle eşleşir (tcp/udp)",
"UID": "Linux KULLANICI ID'siyle eşleşir",
"IN-TYPE": "Gelen bağlantı tipiyle eşleşir",
"IN-USER": "Gelen bağlantı kullanıcı adıyla eşleşir",
"IN-NAME": "Gelen bağlantı adıyla eşleşir",
"SUB-RULE": "Alt kural",
"RULE-SET": "Kural setiyle eşleşir",
"AND": "Mantıksal VE",
"OR": "Mantıksal VEYA",
"NOT": "Mantıksal DEĞİL",
"MATCH": "Tüm isteklerle eşleşir"
}
}
},
"home": {
"page": {
"title": "Ana Sayfa",
"tooltips": {
"lightweightMode": "Hafif Mod",
"manual": "Kılavuz",
@@ -563,7 +596,6 @@
"proxyMode": "Vekil Modu"
},
"settings": {
"title": "Ana Sayfa Ayarları",
"cards": {
"profile": "Profil Kartı",
"currentProxy": "Geçerli Vekil Kartı",
@@ -574,10 +606,16 @@
"ip": "IP Bilgi Kartı",
"clashInfo": "Clash Bilgi Kartları",
"systemInfo": "Sistem Bilgi Kartları"
},
"header": {
"title": "Ana Sayfa Ayarları"
}
},
"header": {
"title": "Ana Sayfa"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "Sistem vekil'i etkinleştirildi, uygulamalarınız vekil üzerinden ağa erişecek",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Kilit Açma Testi",
"actions": {
"testing": "Test Ediliyor..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Kilit Açma Testi"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "Прокси төркемнәре",
"chainMode": "Proxy Chain Mode"
},
"modes": {
"rule": "Rule",
"global": "Global",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "Барысын да яңарту",
"update": "Яңарту"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "Туры режим"
},
"header": {
"title": {
"default": "Прокси төркемнәре",
"chainMode": "Proxy Chain Mode"
}
}
},
"enums": {
"strategies": {
"select": "Проксины кулдан сайлау",
"url-test": "URL-тест задержкасына карап прокси сайлау",
"fallback": "Хата булган очракта башка проксига күчү",
"load-balance": "Трафикны баланслау нигезендә прокси тарату",
"relay": "Билгеле прокси чылбыры аша тапшыру"
},
"policies": {
"DIRECT": "Туры чыгу",
"REJECT": "Сорауларны тоткарлау",
"REJECT-DROP": "Сорауларны кире кагу",
"PASS": "Туры килсә дә, бу кагыйдәне урап узу"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "Проксины кулдан сайлау",
"url-test": "URL-тест задержкасына карап прокси сайлау",
"fallback": "Хата булган очракта башка проксига күчү",
"load-balance": "Трафикны баланслау нигезендә прокси тарату",
"relay": "Билгеле прокси чылбыры аша тапшыру"
},
"policies": {
"DIRECT": "Туры чыгу",
"REJECT": "Сорауларны тоткарлау",
"REJECT-DROP": "Сорауларны кире кагу",
"PASS": "Туры килсә дә, бу кагыйдәне урап узу"
}
}
}
},
"connections": {
"page": {
"title": "Тоташулар",
"summary": {
"downloaded": "Йөкләнгән",
"uploaded": "Чыгарылган"
@@ -396,69 +403,83 @@
"pause": "Туктау",
"resume": "Дәвам",
"closeAll": "Барысын да ябу"
},
"header": {
"title": "Тоташулар"
}
},
"fields": {
"host": "Хост",
"downloaded": "Йөкләнгән",
"uploaded": "Чыгарылган",
"dlSpeed": "Йөкләү тизл.",
"ulSpeed": "Чыгару тизл.",
"chains": "Чылбырлар",
"rule": "Кагыйдә",
"process": "Процесс",
"time": "Тоташу вакыты",
"source": "Чыганак адресы",
"destination": "Максат IP-адресы",
"destinationPort": "Барасы порты",
"type": "Төр"
},
"order": {
"default": "Default",
"uploadSpeed": "Йөкләү (чыгару) тизлеге",
"downloadSpeed": "Йөкләү тизлеге"
},
"actions": {
"closeConnection": "Тоташуны ябу"
"components": {
"fields": {
"host": "Хост",
"downloaded": "Йөкләнгән",
"uploaded": "Чыгарылган",
"dlSpeed": "Йөкләү тизл.",
"ulSpeed": "Чыгару тизл.",
"chains": "Чылбырлар",
"rule": "Кагыйдә",
"process": "Процесс",
"time": "Тоташу вакыты",
"source": "Чыганак адресы",
"destination": "Максат IP-адресы",
"destinationPort": "Барасы порты",
"type": "Төр"
},
"order": {
"default": "Default",
"uploadSpeed": "Йөкләү (чыгару) тизлеге",
"downloadSpeed": "Йөкләү тизлеге"
},
"actions": {
"closeConnection": "Тоташуны ябу"
}
}
},
"tests": {
"item": {
"actions": {
"test": "Тест"
}
},
"viewer": {
"title": {
"create": "Тест булдыру",
"edit": "Тестны үзгәртү"
},
"fields": {
"url": "Тест URL-ы"
}
},
"page": {
"title": "Тест",
"actions": {
"testAll": "Барчасын тестлау"
},
"header": {
"title": "Тест"
}
},
"statuses": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
"components": {
"item": {
"actions": {
"test": "Тест"
}
}
},
"modals": {
"test": {
"title": {
"create": "Тест булдыру",
"edit": "Тестны үзгәртү"
},
"fields": {
"url": "Тест URL-ы"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "Pending",
"yes": "Yes",
"no": "No",
"failed": "Failed",
"completed": "Completed",
"disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only",
"noDisney": "No (IP Banned By Disney+)",
"unsupportedRegion": "Unsupported Country/Region",
"failedNetwork": "Failed (Network Connection)"
}
}
}
},
"logs": {
"page": {
"title": "Логлар",
"actions": {
"pause": "Туктау",
"resume": "Дәвам",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "Логлар"
}
}
},
"rules": {
"page": {
"title": "Кагыйдәләр",
"provider": {
"trigger": "Кагыйдә провайдеры",
"dialogTitle": "Кагыйдә провайдеры",
"actions": {
"updateAll": "Барысын да яңарту",
"update": "Яңарту"
},
"notices": {
}
},
"header": {
"title": "Кагыйдәләр"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "Кагыйдәләрне үзгәртү",
"form": {
"labels": {
"type": "Кагыйдә төре",
"content": "Кагыйдә эчтәлеге",
"proxyPolicy": "Прокси сәясәте"
"modals": {
"editor": {
"form": {
"labels": {
"type": "Кагыйдә төре",
"content": "Кагыйдә эчтәлеге",
"proxyPolicy": "Прокси сәясәте"
},
"toggles": {
"noResolve": "Резолвсыз"
},
"actions": {
"prependRule": "Кагыйдәне өскә өстәү",
"appendRule": "Кагыйдәне аска өстәү"
},
"validation": {
"conditionRequired": "Кагыйдә шарты кирәк",
"invalidRule": "Яраксыз кагыйдә"
}
},
"toggles": {
"noResolve": "Резолвсыз"
"ruleTypes": {
"DOMAIN": "Домен исеменең тулы туры килүе",
"DOMAIN-SUFFIX": "Домен суффиксына туры килү",
"DOMAIN-KEYWORD": "Доменда төп сүзгә туры килү",
"DOMAIN-REGEX": "Доменны регекс аша туры китерү",
"GEOSITE": "Geosite исемлегендәге доменга туры килү",
"GEOIP": "IP-адресның ил коды буенча туры килү",
"SRC-GEOIP": "Чыганак IP-адресның ил коды буенча туры килү",
"IP-ASN": "IP-адрес ASN'ы буенча туры килү",
"SRC-IP-ASN": "Чыганак IP-адрес ASN'ы буенча туры килү",
"IP-CIDR": "IP-адреслар диапазонына туры килү",
"IP-CIDR6": "IPv6 адреслар диапазонына туры килү",
"SRC-IP-CIDR": "Чыганак IP-адреслар диапазонына туры килү",
"IP-SUFFIX": "IP-адрес суффиксына туры килү",
"SRC-IP-SUFFIX": "Чыганак IP-адрес суффиксына туры килү",
"SRC-PORT": "Чыганак портлар диапазонына туры килү",
"DST-PORT": "Максат портлар диапазонына туры килү",
"IN-PORT": "Керүче портка туры килү",
"DSCP": "DSCP тамгалавы (tproxy UDP өчен)",
"PROCESS-NAME": "Процесс исеменә туры килү (Android пакет исеме)",
"PROCESS-PATH": "Процесс юлына туры килү",
"PROCESS-NAME-REGEX": "Процесс исемен регекс белән туры китерү (Android пакет исеме)",
"PROCESS-PATH-REGEX": "Процесс юлын регекс белән туры китерү",
"NETWORK": "Транспорт протоколына (tcp/udp) туры килү",
"UID": "Linux USER ID'га туры килү",
"IN-TYPE": "Керүче тоташу төренә туры килү",
"IN-USER": "Керүче тоташу кулланучысына туры килү",
"IN-NAME": "Керүче тоташу исеменә туры килү",
"SUB-RULE": "Кушымча кагыйдә",
"RULE-SET": "Кагыйдәләр тупланмасына туры килү",
"AND": "Логик ҺӘМ",
"OR": "Логик ЯКИ",
"NOT": "Логик ТҮГЕЛ",
"MATCH": "Барлык сорауларга туры килә"
},
"actions": {
"prependRule": "Кагыйдәне өскә өстәү",
"appendRule": "Кагыйдәне аска өстәү"
},
"validation": {
"conditionRequired": "Кагыйдә шарты кирәк",
"invalidRule": "Яраксыз кагыйдә"
"header": {
"title": "Кагыйдәләрне үзгәртү"
}
},
"ruleTypes": {
"DOMAIN": "Домен исеменең тулы туры килүе",
"DOMAIN-SUFFIX": "Домен суффиксына туры килү",
"DOMAIN-KEYWORD": "Доменда төп сүзгә туры килү",
"DOMAIN-REGEX": "Доменны регекс аша туры китерү",
"GEOSITE": "Geosite исемлегендәге доменга туры килү",
"GEOIP": "IP-адресның ил коды буенча туры килү",
"SRC-GEOIP": "Чыганак IP-адресның ил коды буенча туры килү",
"IP-ASN": "IP-адрес ASN'ы буенча туры килү",
"SRC-IP-ASN": "Чыганак IP-адрес ASN'ы буенча туры килү",
"IP-CIDR": "IP-адреслар диапазонына туры килү",
"IP-CIDR6": "IPv6 адреслар диапазонына туры килү",
"SRC-IP-CIDR": "Чыганак IP-адреслар диапазонына туры килү",
"IP-SUFFIX": "IP-адрес суффиксына туры килү",
"SRC-IP-SUFFIX": "Чыганак IP-адрес суффиксына туры килү",
"SRC-PORT": "Чыганак портлар диапазонына туры килү",
"DST-PORT": "Максат портлар диапазонына туры килү",
"IN-PORT": "Керүче портка туры килү",
"DSCP": "DSCP тамгалавы (tproxy UDP өчен)",
"PROCESS-NAME": "Процесс исеменә туры килү (Android пакет исеме)",
"PROCESS-PATH": "Процесс юлына туры килү",
"PROCESS-NAME-REGEX": "Процесс исемен регекс белән туры китерү (Android пакет исеме)",
"PROCESS-PATH-REGEX": "Процесс юлын регекс белән туры китерү",
"NETWORK": "Транспорт протоколына (tcp/udp) туры килү",
"UID": "Linux USER ID'га туры килү",
"IN-TYPE": "Керүче тоташу төренә туры килү",
"IN-USER": "Керүче тоташу кулланучысына туры килү",
"IN-NAME": "Керүче тоташу исеменә туры килү",
"SUB-RULE": "Кушымча кагыйдә",
"RULE-SET": "Кагыйдәләр тупланмасына туры килү",
"AND": "Логик ҺӘМ",
"OR": "Логик ЯКИ",
"NOT": "Логик ТҮГЕЛ",
"MATCH": "Барлык сорауларга туры килә"
}
}
},
"home": {
"page": {
"title": "Home",
"tooltips": {
"lightweightMode": "Җиңел Режим",
"manual": "Документация",
@@ -563,7 +596,6 @@
"proxyMode": "Proxy Mode"
},
"settings": {
"title": "Home Settings",
"cards": {
"profile": "Profile Card",
"currentProxy": "Current Proxy Card",
@@ -574,10 +606,16 @@
"ip": "IP Information Card",
"clashInfo": "Clash Info Cards",
"systemInfo": "System Info Cards"
},
"header": {
"title": "Home Settings"
}
},
"header": {
"title": "Home"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "System proxy is enabled, your applications will access the network through the proxy",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "Unlock Test",
"actions": {
"testing": "Testing..."
},
"empty": "No unlock test items",
"messages": {
"detectionTimeout": "Detection timeout or failed"
},
"header": {
"title": "Unlock Test"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "代理组",
"chainMode": "链式代理模式"
},
"modes": {
"rule": "规则",
"global": "全局",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "更新全部",
"update": "更新"
},
"notices": {
"updateSuccess": "{{name}} 更新成功",
"updateFailed": "{{name}} 更新失败: {{message}}",
"genericError": "更新失败: {{message}}",
"none": "没有可更新的 provider",
"allUpdated": "所有 provider 均已更新"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "直连模式"
},
"header": {
"title": {
"default": "代理组",
"chainMode": "链式代理模式"
}
}
},
"enums": {
"strategies": {
"select": "手动选择代理",
"url-test": "根据 URL 测试延迟选择代理",
"fallback": "不可用时切换到另一个代理",
"load-balance": "根据负载均衡分配代理",
"relay": "根据定义的代理链传递"
},
"policies": {
"DIRECT": "直连 (DIRECT)",
"REJECT": "拦截请求 (REJECT)",
"REJECT-DROP": "抛弃请求 (REJECT-DROP)",
"PASS": "跳过此规则 (PASS)"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} 更新成功",
"updateFailed": "{{name}} 更新失败: {{message}}",
"genericError": "更新失败: {{message}}",
"none": "没有可更新的 provider",
"allUpdated": "所有 provider 均已更新"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "手动选择代理",
"url-test": "根据 URL 测试延迟选择代理",
"fallback": "不可用时切换到另一个代理",
"load-balance": "根据负载均衡分配代理",
"relay": "根据定义的代理链传递"
},
"policies": {
"DIRECT": "直连 (DIRECT)",
"REJECT": "拦截请求 (REJECT)",
"REJECT-DROP": "抛弃请求 (REJECT-DROP)",
"PASS": "跳过此规则 (PASS)"
}
}
}
},
"connections": {
"page": {
"title": "连接",
"summary": {
"downloaded": "下载量",
"uploaded": "上传量"
@@ -396,69 +403,83 @@
"pause": "暂停",
"resume": "继续",
"closeAll": "关闭全部"
},
"header": {
"title": "连接"
}
},
"fields": {
"host": "主机",
"downloaded": "下载量",
"uploaded": "上传量",
"dlSpeed": "下载速度",
"ulSpeed": "上传速度",
"chains": "链路",
"rule": "规则",
"process": "进程",
"time": "连接时间",
"source": "源地址",
"destination": "目标地址",
"destinationPort": "目标端口",
"type": "类型"
},
"order": {
"default": "默认",
"uploadSpeed": "上传速度",
"downloadSpeed": "下载速度"
},
"actions": {
"closeConnection": "关闭连接"
"components": {
"fields": {
"host": "主机",
"downloaded": "下载量",
"uploaded": "上传量",
"dlSpeed": "下载速度",
"ulSpeed": "上传速度",
"chains": "链路",
"rule": "规则",
"process": "进程",
"time": "连接时间",
"source": "地址",
"destination": "目标地址",
"destinationPort": "目标端口",
"type": "类型"
},
"order": {
"default": "默认",
"uploadSpeed": "上传速度",
"downloadSpeed": "下载速度"
},
"actions": {
"closeConnection": "关闭连接"
}
}
},
"tests": {
"item": {
"actions": {
"test": "测试"
}
},
"viewer": {
"title": {
"create": "新建测试",
"edit": "编辑测试"
},
"fields": {
"url": "测试地址"
}
},
"page": {
"title": "测试",
"actions": {
"testAll": "测试全部"
},
"header": {
"title": "测试"
}
},
"statuses": {
"pending": "待检测",
"yes": "支持",
"no": "不支持",
"failed": "测试失败",
"completed": "检测完成",
"disallowedIsp": "不允许的 ISP",
"originalsOnly": "仅限原创",
"noDisney": "不支持IP被Disney+禁止)",
"unsupportedRegion": "不支持的国家/地区",
"failedNetwork": "测试失败(网络连接问题)"
"components": {
"item": {
"actions": {
"test": "测试"
}
}
},
"modals": {
"test": {
"title": {
"create": "新建测试",
"edit": "编辑测试"
},
"fields": {
"url": "测试地址"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "待检测",
"yes": "支持",
"no": "不支持",
"failed": "测试失败",
"completed": "检测完成",
"disallowedIsp": "不允许的 ISP",
"originalsOnly": "仅限原创",
"noDisney": "不支持IP被Disney+禁止)",
"unsupportedRegion": "不支持的国家/地区",
"failedNetwork": "测试失败(网络连接问题)"
}
}
}
},
"logs": {
"page": {
"title": "日志",
"actions": {
"pause": "暂停",
"resume": "继续",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "日志"
}
}
},
"rules": {
"page": {
"title": "规则",
"provider": {
"trigger": "规则集合",
"dialogTitle": "规则集合",
"actions": {
"updateAll": "更新全部",
"update": "更新"
},
"notices": {
}
},
"header": {
"title": "规则"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} 更新成功",
"updateFailed": "{{name}} 更新失败: {{message}}",
"genericError": "更新失败: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "编辑规则",
"form": {
"labels": {
"type": "规则类型",
"content": "规则内容",
"proxyPolicy": "代理策略"
"modals": {
"editor": {
"form": {
"labels": {
"type": "规则类型",
"content": "规则内容",
"proxyPolicy": "代理策略"
},
"toggles": {
"noResolve": "跳过 DNS 解析"
},
"actions": {
"prependRule": "添加前置规则",
"appendRule": "添加后置规则"
},
"validation": {
"conditionRequired": "规则条件缺失",
"invalidRule": "无效规则"
}
},
"toggles": {
"noResolve": "跳过 DNS 解析"
"ruleTypes": {
"DOMAIN": "匹配完整域名 (DOMAIN)",
"DOMAIN-SUFFIX": "匹配域名后缀 (DOMAIN-SUFFIX)",
"DOMAIN-KEYWORD": "匹配域名关键字 (DOMAIN-KEYWORD)",
"DOMAIN-REGEX": "匹配域名正则表达式 (DOMAIN-REGEX)",
"GEOSITE": "匹配 Geosite 内的域名 (GEOSITE)",
"GEOIP": "匹配 IP 所属国家代码 (GEOIP)",
"SRC-GEOIP": "匹配来源 IP 所属国家代码 (SRC-GEOIP)",
"IP-ASN": "匹配 IP 所属 ASN (IP-ASN)",
"SRC-IP-ASN": "匹配来源 IP 所属 ASN (SRC-IP-ASN)",
"IP-CIDR": "匹配 IP 地址范围 (IP-CIDR)",
"IP-CIDR6": "匹配 IP 地址范围 (IP-CIDR6)",
"SRC-IP-CIDR": "匹配来源 IP 地址范围 (SRC-IP-CIDR)",
"IP-SUFFIX": "匹配 IP 后缀范围 (IP-SUFFIX)",
"SRC-IP-SUFFIX": "匹配来源 IP 后缀范围 (SRC-IP-SUFFIX)",
"SRC-PORT": "匹配请求来源端口范围 (SRC-PORT)",
"DST-PORT": "匹配请求目标端口范围 (DST-PORT)",
"IN-PORT": "匹配入站端口 (IN-PORT)",
"DSCP": "DSCP 标记(仅限 TPROXY UDP 入站)(DSCP)",
"PROCESS-NAME": "匹配进程名称 (PROCESS-NAME)",
"PROCESS-PATH": "匹配完整进程路径 (PROCESS-PATH)",
"PROCESS-NAME-REGEX": "正则匹配完整进程名称 (PROCESS-NAME-REGEX)",
"PROCESS-PATH-REGEX": "正则匹配完整进程路径 (PROCESS-PATH-REGEX)",
"NETWORK": "匹配传输协议 (TCP/UDP) (NETWORK)",
"UID": "匹配 Linux USER ID (UID)",
"IN-TYPE": "匹配入站类型 (IN-TYPE)",
"IN-USER": "匹配入站用户名 (IN-USER)",
"IN-NAME": "匹配入站名称 (IN-NAME)",
"SUB-RULE": "子规则 (SUB-RULE)",
"RULE-SET": "匹配规则集 (RULE-SET)",
"AND": "逻辑与 (AND)",
"OR": "逻辑或 (OR)",
"NOT": "逻辑非 (NOT)",
"MATCH": "匹配所有请求 (MATCH)"
},
"actions": {
"prependRule": "添加前置规则",
"appendRule": "添加后置规则"
},
"validation": {
"conditionRequired": "规则条件缺失",
"invalidRule": "无效规则"
"header": {
"title": "编辑规则"
}
},
"ruleTypes": {
"DOMAIN": "匹配完整域名 (DOMAIN)",
"DOMAIN-SUFFIX": "匹配域名后缀 (DOMAIN-SUFFIX)",
"DOMAIN-KEYWORD": "匹配域名关键字 (DOMAIN-KEYWORD)",
"DOMAIN-REGEX": "匹配域名正则表达式 (DOMAIN-REGEX)",
"GEOSITE": "匹配 Geosite 内的域名 (GEOSITE)",
"GEOIP": "匹配 IP 所属国家代码 (GEOIP)",
"SRC-GEOIP": "匹配来源 IP 所属国家代码 (SRC-GEOIP)",
"IP-ASN": "匹配 IP 所属 ASN (IP-ASN)",
"SRC-IP-ASN": "匹配来源 IP 所属 ASN (SRC-IP-ASN)",
"IP-CIDR": "匹配 IP 地址范围 (IP-CIDR)",
"IP-CIDR6": "匹配 IP 地址范围 (IP-CIDR6)",
"SRC-IP-CIDR": "匹配来源 IP 地址范围 (SRC-IP-CIDR)",
"IP-SUFFIX": "匹配 IP 后缀范围 (IP-SUFFIX)",
"SRC-IP-SUFFIX": "匹配来源 IP 后缀范围 (SRC-IP-SUFFIX)",
"SRC-PORT": "匹配请求来源端口范围 (SRC-PORT)",
"DST-PORT": "匹配请求目标端口范围 (DST-PORT)",
"IN-PORT": "匹配入站端口 (IN-PORT)",
"DSCP": "DSCP 标记(仅限 TPROXY UDP 入站)(DSCP)",
"PROCESS-NAME": "匹配进程名称 (PROCESS-NAME)",
"PROCESS-PATH": "匹配完整进程路径 (PROCESS-PATH)",
"PROCESS-NAME-REGEX": "正则匹配完整进程名称 (PROCESS-NAME-REGEX)",
"PROCESS-PATH-REGEX": "正则匹配完整进程路径 (PROCESS-PATH-REGEX)",
"NETWORK": "匹配传输协议 (TCP/UDP) (NETWORK)",
"UID": "匹配 Linux USER ID (UID)",
"IN-TYPE": "匹配入站类型 (IN-TYPE)",
"IN-USER": "匹配入站用户名 (IN-USER)",
"IN-NAME": "匹配入站名称 (IN-NAME)",
"SUB-RULE": "子规则 (SUB-RULE)",
"RULE-SET": "匹配规则集 (RULE-SET)",
"AND": "逻辑与 (AND)",
"OR": "逻辑或 (OR)",
"NOT": "逻辑非 (NOT)",
"MATCH": "匹配所有请求 (MATCH)"
}
}
},
"home": {
"page": {
"title": "首页",
"tooltips": {
"lightweightMode": "轻量模式",
"manual": "使用手册",
@@ -563,7 +596,6 @@
"proxyMode": "代理模式"
},
"settings": {
"title": "首页设置",
"cards": {
"profile": "订阅卡",
"currentProxy": "当前代理卡",
@@ -574,10 +606,16 @@
"ip": "IP 信息卡",
"clashInfo": "Clash 信息卡",
"systemInfo": "系统信息卡"
},
"header": {
"title": "首页设置"
}
},
"header": {
"title": "首页"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "系统代理已启用,您的应用将通过代理访问网络",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "解锁测试",
"actions": {
"testing": "测试中..."
},
"empty": "暂无解锁测试项目",
"messages": {
"detectionTimeout": "检测超时或失败"
},
"header": {
"title": "解锁测试"
}
}
},

View File

@@ -300,10 +300,6 @@
},
"proxies": {
"page": {
"title": {
"default": "代理組",
"chainMode": "鏈式代理模式"
},
"modes": {
"rule": "規則",
"global": "全局",
@@ -321,13 +317,6 @@
"actions": {
"updateAll": "全部更新",
"update": "更新"
},
"notices": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
},
"rules": {
@@ -365,27 +354,45 @@
},
"messages": {
"directMode": "直連模式"
},
"header": {
"title": {
"default": "代理組",
"chainMode": "鏈式代理模式"
}
}
},
"enums": {
"strategies": {
"select": "手動選擇代理",
"url-test": "根據網址測試延遲選擇代理",
"fallback": "切換至另一個備用代理",
"load-balance": "根據負載平衡分配代理",
"relay": "根據定義的代理鏈傳送"
},
"policies": {
"DIRECT": "直連 (DIRECT)",
"REJECT": "拒絕請求 (REJECT)",
"REJECT-DROP": "丟棄請求 (REJECT-DROP)",
"PASS": "跳過此規則 (PASS)"
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
"none": "No providers available to update",
"allUpdated": "All providers updated successfully"
}
}
},
"components": {
"enums": {
"strategies": {
"select": "手動選擇代理",
"url-test": "根據網址測試延遲選擇代理",
"fallback": "切換至另一個備用代理",
"load-balance": "根據負載平衡分配代理",
"relay": "根據定義的代理鏈傳送"
},
"policies": {
"DIRECT": "直連 (DIRECT)",
"REJECT": "拒絕請求 (REJECT)",
"REJECT-DROP": "丟棄請求 (REJECT-DROP)",
"PASS": "跳過此規則 (PASS)"
}
}
}
},
"connections": {
"page": {
"title": "連線",
"summary": {
"downloaded": "下載量",
"uploaded": "上傳量"
@@ -396,69 +403,83 @@
"pause": "暫停",
"resume": "繼續",
"closeAll": "關閉全部"
},
"header": {
"title": "連線"
}
},
"fields": {
"host": "主機",
"downloaded": "下載量",
"uploaded": "上傳量",
"dlSpeed": "下載速度",
"ulSpeed": "上傳速度",
"chains": "鏈路",
"rule": "規則",
"process": "處理程序",
"time": "連線時間",
"source": "來源位址",
"destination": "目標位址",
"destinationPort": "目標連接埠",
"type": "類型"
},
"order": {
"default": "Default",
"uploadSpeed": "上傳速度",
"downloadSpeed": "下載速度"
},
"actions": {
"closeConnection": "關閉連線"
"components": {
"fields": {
"host": "主機",
"downloaded": "下載量",
"uploaded": "上傳量",
"dlSpeed": "下載速度",
"ulSpeed": "上傳速度",
"chains": "鏈路",
"rule": "規則",
"process": "處理程序",
"time": "連線時間",
"source": "來源位址",
"destination": "目標位址",
"destinationPort": "目標連接埠",
"type": "類型"
},
"order": {
"default": "Default",
"uploadSpeed": "上傳速度",
"downloadSpeed": "下載速度"
},
"actions": {
"closeConnection": "關閉連線"
}
}
},
"tests": {
"item": {
"actions": {
"test": "測試"
}
},
"viewer": {
"title": {
"create": "新增測試",
"edit": "編輯測試"
},
"fields": {
"url": "測試網址"
}
},
"page": {
"title": "測試",
"actions": {
"testAll": "測試全部"
},
"header": {
"title": "測試"
}
},
"statuses": {
"pending": "待檢測",
"yes": "支援",
"no": "不支援",
"failed": "測試失敗",
"completed": "檢測完成",
"disallowedIsp": "不允許的網際網路服務供應商",
"originalsOnly": "僅限原創",
"noDisney": "不支援IP被Disney+禁止)",
"unsupportedRegion": "不支援的國家/地區",
"failedNetwork": "測試失敗(網路連線問題)"
"components": {
"item": {
"actions": {
"test": "測試"
}
}
},
"modals": {
"test": {
"title": {
"create": "新增測試",
"edit": "編輯測試"
},
"fields": {
"url": "測試網址"
}
}
},
"feedback": {
"statuses": {
"test": {
"pending": "待檢測",
"yes": "支援",
"no": "不支援",
"failed": "測試失敗",
"completed": "檢測完成",
"disallowedIsp": "不允許的網際網路服務供應商",
"originalsOnly": "僅限原創",
"noDisney": "不支援IP被Disney+禁止)",
"unsupportedRegion": "不支援的國家/地區",
"failedNetwork": "測試失敗(網路連線問題)"
}
}
}
},
"logs": {
"page": {
"title": "日誌",
"actions": {
"pause": "暫停",
"resume": "繼續",
@@ -470,20 +491,29 @@
"info": "INFO",
"warn": "WARN",
"error": "ERROR"
},
"header": {
"title": "日誌"
}
}
},
"rules": {
"page": {
"title": "規則",
"provider": {
"trigger": "規則集合",
"dialogTitle": "規則集合",
"actions": {
"updateAll": "全部更新",
"update": "更新"
},
"notices": {
}
},
"header": {
"title": "規則"
}
},
"feedback": {
"notifications": {
"provider": {
"updateSuccess": "{{name}} updated successfully",
"updateFailed": "Failed to update {{name}}: {{message}}",
"genericError": "Update failed: {{message}}",
@@ -492,66 +522,69 @@
}
}
},
"editor": {
"title": "編輯規則",
"form": {
"labels": {
"type": "規則類型",
"content": "規則內容",
"proxyPolicy": "代理策略"
"modals": {
"editor": {
"form": {
"labels": {
"type": "規則類型",
"content": "規則內容",
"proxyPolicy": "代理策略"
},
"toggles": {
"noResolve": "跳過 DNS 解析"
},
"actions": {
"prependRule": "新增前置規則",
"appendRule": "新增後置規則"
},
"validation": {
"conditionRequired": "規則條件為必填",
"invalidRule": "無效規則"
}
},
"toggles": {
"noResolve": "跳過 DNS 解析"
"ruleTypes": {
"DOMAIN": "配對完整網域 (DOMAIN)",
"DOMAIN-SUFFIX": "配對網域後綴 (DOMAIN-SUFFIX)",
"DOMAIN-KEYWORD": "配對網域關鍵字 (DOMAIN-KEYWORD)",
"DOMAIN-REGEX": "配對網域正規表示式 (DOMAIN-REGEX)",
"GEOSITE": "配對 Geosite 內的網域 (GEOSITE)",
"GEOIP": "配對 IP 所屬國家代碼 (GEOIP)",
"SRC-GEOIP": "配對來源 IP 所屬國家代碼 (SRC-GEOIP)",
"IP-ASN": "配對 IP 所屬 ASN (IP-ASN)",
"SRC-IP-ASN": "配對來源 IP 所屬 ASN (SRC-IP-ASN)",
"IP-CIDR": "配對 IP 位址範圍 (IP-CIDR)",
"IP-CIDR6": "配對 IP 位址範圍 (IP-CIDR6)",
"SRC-IP-CIDR": "配對來源 IP 位址範圍 (SRC-IP-CIDR)",
"IP-SUFFIX": "配對 IP 後綴範圍 (IP-SUFFIX)",
"SRC-IP-SUFFIX": "配對來源 IP 後綴範圍 (SRC-IP-SUFFIX)",
"SRC-PORT": "配對請求來源連接埠範圍 (SRC-PORT)",
"DST-PORT": "配對請求目標連接埠範圍 (DST-PORT)",
"IN-PORT": "配對傳入連接埠 (IN-PORT)",
"DSCP": "DSCP標記僅限 TPROXY UDP 傳入)(DSCP)",
"PROCESS-NAME": "配對程序名稱 (PROCESS-NAME)",
"PROCESS-PATH": "配對完整程序路徑 (PROCESS-PATH)",
"PROCESS-NAME-REGEX": "正規表示式配對完整程序名稱 (PROCESS-NAME-REGEX)",
"PROCESS-PATH-REGEX": "正規表示式配對完整程序路徑 (PROCESS-PATH-REGEX)",
"NETWORK": "配對傳輸協定 (TCP/UDP) (NETWORK)",
"UID": "配對 Linux 使用者 ID (UID)",
"IN-TYPE": "配對傳入類型 (IN-TYPE)",
"IN-USER": "配對傳入使用者名稱 (IN-USER)",
"IN-NAME": "配對傳入名稱 (IN-NAME)",
"SUB-RULE": "子規則 (SUB-RULE)",
"RULE-SET": "配對規則集 (RULE-SET)",
"AND": "邏輯與 (AND)",
"OR": "邏輯或 (OR)",
"NOT": "邏輯非 (NOT)",
"MATCH": "配對所有請求 (MATCH)"
},
"actions": {
"prependRule": "新增前置規則",
"appendRule": "新增後置規則"
},
"validation": {
"conditionRequired": "規則條件為必填",
"invalidRule": "無效規則"
"header": {
"title": "編輯規則"
}
},
"ruleTypes": {
"DOMAIN": "配對完整網域 (DOMAIN)",
"DOMAIN-SUFFIX": "配對網域後綴 (DOMAIN-SUFFIX)",
"DOMAIN-KEYWORD": "配對網域關鍵字 (DOMAIN-KEYWORD)",
"DOMAIN-REGEX": "配對網域正規表示式 (DOMAIN-REGEX)",
"GEOSITE": "配對 Geosite 內的網域 (GEOSITE)",
"GEOIP": "配對 IP 所屬國家代碼 (GEOIP)",
"SRC-GEOIP": "配對來源 IP 所屬國家代碼 (SRC-GEOIP)",
"IP-ASN": "配對 IP 所屬 ASN (IP-ASN)",
"SRC-IP-ASN": "配對來源 IP 所屬 ASN (SRC-IP-ASN)",
"IP-CIDR": "配對 IP 位址範圍 (IP-CIDR)",
"IP-CIDR6": "配對 IP 位址範圍 (IP-CIDR6)",
"SRC-IP-CIDR": "配對來源 IP 位址範圍 (SRC-IP-CIDR)",
"IP-SUFFIX": "配對 IP 後綴範圍 (IP-SUFFIX)",
"SRC-IP-SUFFIX": "配對來源 IP 後綴範圍 (SRC-IP-SUFFIX)",
"SRC-PORT": "配對請求來源連接埠範圍 (SRC-PORT)",
"DST-PORT": "配對請求目標連接埠範圍 (DST-PORT)",
"IN-PORT": "配對傳入連接埠 (IN-PORT)",
"DSCP": "DSCP標記僅限 TPROXY UDP 傳入)(DSCP)",
"PROCESS-NAME": "配對程序名稱 (PROCESS-NAME)",
"PROCESS-PATH": "配對完整程序路徑 (PROCESS-PATH)",
"PROCESS-NAME-REGEX": "正規表示式配對完整程序名稱 (PROCESS-NAME-REGEX)",
"PROCESS-PATH-REGEX": "正規表示式配對完整程序路徑 (PROCESS-PATH-REGEX)",
"NETWORK": "配對傳輸協定 (TCP/UDP) (NETWORK)",
"UID": "配對 Linux 使用者 ID (UID)",
"IN-TYPE": "配對傳入類型 (IN-TYPE)",
"IN-USER": "配對傳入使用者名稱 (IN-USER)",
"IN-NAME": "配對傳入名稱 (IN-NAME)",
"SUB-RULE": "子規則 (SUB-RULE)",
"RULE-SET": "配對規則集 (RULE-SET)",
"AND": "邏輯與 (AND)",
"OR": "邏輯或 (OR)",
"NOT": "邏輯非 (NOT)",
"MATCH": "配對所有請求 (MATCH)"
}
}
},
"home": {
"page": {
"title": "首頁",
"tooltips": {
"lightweightMode": "輕量模式",
"manual": "使用手冊",
@@ -563,7 +596,6 @@
"proxyMode": "代理模式"
},
"settings": {
"title": "首頁設定",
"cards": {
"profile": "訂閱卡",
"currentProxy": "目前代理卡",
@@ -574,10 +606,16 @@
"ip": "IP資訊卡",
"clashInfo": "Clash 資訊卡",
"systemInfo": "系統資訊卡"
},
"header": {
"title": "首頁設定"
}
},
"header": {
"title": "首頁"
}
},
"cards": {
"components": {
"proxyTun": {
"status": {
"systemProxyEnabled": "系統代理已啟用,您的應用程式將透過代理存取網路",
@@ -691,13 +729,15 @@
},
"unlock": {
"page": {
"title": "解鎖測試",
"actions": {
"testing": "測試中..."
},
"empty": "目前沒有解鎖測試項目",
"messages": {
"detectionTimeout": "檢測逾時或失敗"
},
"header": {
"title": "解鎖測試"
}
}
},

View File

@@ -36,7 +36,7 @@ type OrderFunc = (list: IConnectionsItem[]) => IConnectionsItem[];
const ORDER_OPTIONS = [
{
id: "default",
labelKey: "connections.order.default",
labelKey: "connections.components.order.default",
fn: (list: IConnectionsItem[]) =>
list.sort(
(a, b) =>
@@ -46,13 +46,13 @@ const ORDER_OPTIONS = [
},
{
id: "uploadSpeed",
labelKey: "connections.order.uploadSpeed",
labelKey: "connections.components.order.uploadSpeed",
fn: (list: IConnectionsItem[]) =>
list.sort((a, b) => b.curUpload! - a.curUpload!),
},
{
id: "downloadSpeed",
labelKey: "connections.order.downloadSpeed",
labelKey: "connections.components.order.downloadSpeed",
fn: (list: IConnectionsItem[]) =>
list.sort((a, b) => b.curDownload! - a.curDownload!),
},
@@ -150,7 +150,7 @@ const ConnectionsPage = () => {
full
title={
<span style={{ whiteSpace: "nowrap" }}>
{t("connections.page.title")}
{t("connections.page.header.title")}
</span>
}
contentStyle={{

View File

@@ -112,7 +112,7 @@ const HomeSettingsDialog = ({
return (
<Dialog open={open} onClose={onClose} maxWidth="xs" fullWidth>
<DialogTitle>{t("home.page.settings.title")}</DialogTitle>
<DialogTitle>{t("home.page.settings.header.title")}</DialogTitle>
<DialogContent>
<FormGroup>
<FormControlLabel
@@ -364,7 +364,7 @@ const HomePage = () => {
);
return (
<BasePage
title={t("home.page.title")}
title={t("home.page.header.title")}
contentStyle={{ padding: 2 }}
header={
<Box sx={{ display: "flex", alignItems: "center" }}>

View File

@@ -60,7 +60,7 @@ const LogPage = () => {
return (
<BasePage
full
title={t("logs.page.title")}
title={t("logs.page.header.title")}
contentStyle={{
height: "100%",
display: "flex",

View File

@@ -142,8 +142,8 @@ const ProxyPage = () => {
contentStyle={{ height: "101.5%" }}
title={
isChainMode
? t("proxies.page.title.chainMode")
: t("proxies.page.title.default")
? t("proxies.page.header.title.chainMode")
: t("proxies.page.header.title.default")
}
header={
<Box display="flex" alignItems="center" gap={1}>

View File

@@ -48,7 +48,7 @@ const RulesPage = () => {
return (
<BasePage
full
title={t("rules.page.title")}
title={t("rules.page.header.title")}
contentStyle={{
height: "100%",
display: "flex",

View File

@@ -141,7 +141,7 @@ const TestPage = () => {
return (
<BasePage
full
title={t("tests.page.title")}
title={t("tests.page.header.title")}
header={
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
<Button

View File

@@ -38,16 +38,17 @@ const UNLOCK_RESULTS_STORAGE_KEY = "clash_verge_unlock_results";
const UNLOCK_RESULTS_TIME_KEY = "clash_verge_unlock_time";
const STATUS_LABEL_KEYS: Record<string, string> = {
Pending: "tests.statuses.pending",
Yes: "tests.statuses.yes",
No: "tests.statuses.no",
Failed: "tests.statuses.failed",
Completed: "tests.statuses.completed",
"Disallowed ISP": "tests.statuses.disallowedIsp",
"Originals Only": "tests.statuses.originalsOnly",
"No (IP Banned By Disney+)": "tests.statuses.noDisney",
"Unsupported Country/Region": "tests.statuses.unsupportedRegion",
"Failed (Network Connection)": "tests.statuses.failedNetwork",
Pending: "tests.feedback.statuses.test.pending",
Yes: "tests.feedback.statuses.test.yes",
No: "tests.feedback.statuses.test.no",
Failed: "tests.feedback.statuses.test.failed",
Completed: "tests.feedback.statuses.test.completed",
"Disallowed ISP": "tests.feedback.statuses.test.disallowedIsp",
"Originals Only": "tests.feedback.statuses.test.originalsOnly",
"No (IP Banned By Disney+)": "tests.feedback.statuses.test.noDisney",
"Unsupported Country/Region":
"tests.feedback.statuses.test.unsupportedRegion",
"Failed (Network Connection)": "tests.feedback.statuses.test.failedNetwork",
};
const UnlockPage = () => {
@@ -263,7 +264,7 @@ const UnlockPage = () => {
return (
<BasePage
title={t("unlock.page.title")}
title={t("unlock.page.header.title")}
header={
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
<Button
@@ -337,7 +338,7 @@ const UnlockPage = () => {
>
{item.name}
</Typography>
<Tooltip title={t("tests.item.actions.test")}>
<Tooltip title={t("tests.components.item.actions.test")}>
<span>
<Button
size="small"