diff --git a/src/components/connection/connection-detail.tsx b/src/components/connection/connection-detail.tsx
index c39bb56d..014905bd 100644
--- a/src/components/connection/connection-detail.tsx
+++ b/src/components/connection/connection-detail.tsx
@@ -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) => {
diff --git a/src/components/connection/connection-item.tsx b/src/components/connection/connection-item.tsx
index 9c5cf737..d978733d 100644
--- a/src/components/connection/connection-item.tsx
+++ b/src/components/connection/connection-item.tsx
@@ -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")}
>
diff --git a/src/components/connection/connection-table.tsx b/src/components/connection/connection-table.tsx
index c7c4d436..8b7cec1d 100644
--- a/src/components/connection/connection-table.tsx
+++ b/src/components/connection/connection-table.tsx
@@ -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,
},
diff --git a/src/components/home/clash-info-card.tsx b/src/components/home/clash-info-card.tsx
index c68f33fa..ed62732f 100644
--- a/src/components/home/clash-info-card.tsx
+++ b/src/components/home/clash-info-card.tsx
@@ -32,7 +32,7 @@ export const ClashInfoCard = () => {
- {t("home.cards.clashInfo.fields.coreVersion")}
+ {t("home.components.clashInfo.fields.coreVersion")}
{clashVersion || "-"}
@@ -41,7 +41,7 @@ export const ClashInfoCard = () => {
- {t("home.cards.clashInfo.fields.systemProxyAddress")}
+ {t("home.components.clashInfo.fields.systemProxyAddress")}
{systemProxyAddress}
@@ -50,7 +50,7 @@ export const ClashInfoCard = () => {
- {t("home.cards.clashInfo.fields.mixedPort")}
+ {t("home.components.clashInfo.fields.mixedPort")}
{clashConfig.mixedPort || "-"}
@@ -59,7 +59,7 @@ export const ClashInfoCard = () => {
- {t("home.cards.clashInfo.fields.uptime")}
+ {t("home.components.clashInfo.fields.uptime")}
{formattedUptime}
@@ -68,7 +68,7 @@ export const ClashInfoCard = () => {
- {t("home.cards.clashInfo.fields.rulesCount")}
+ {t("home.components.clashInfo.fields.rulesCount")}
{rules.length}
@@ -87,7 +87,7 @@ export const ClashInfoCard = () => {
return (
}
iconColor="warning"
action={null}
diff --git a/src/components/home/clash-mode-card.tsx b/src/components/home/clash-mode-card.tsx
index b74a21a5..b16f4cb5 100644
--- a/src/components/home/clash-mode-card.tsx
+++ b/src/components/home/clash-mode-card.tsx
@@ -21,16 +21,16 @@ const isClashMode = (mode: string): mode is ClashMode =>
const MODE_META: Record = {
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]);
// 模式图标映射
diff --git a/src/components/home/current-proxy-card.tsx b/src/components/home/current-proxy-card.tsx
index 6af57e14..1e1f6cc9 100644
--- a/src/components/home/current-proxy-card.tsx
+++ b/src/components/home/current-proxy-card.tsx
@@ -823,7 +823,7 @@ export const CurrentProxyCard = () => {
return (
{
iconColor={currentProxy ? "primary" : undefined}
action={
-
+
{
{isGlobalMode && (
@@ -914,7 +916,7 @@ export const CurrentProxyCard = () => {
{isDirectMode && (
@@ -955,13 +957,13 @@ export const CurrentProxyCard = () => {
sx={{ mb: 1.5 }}
>
- {t("home.cards.currentProxy.labels.group")}
+ {t("home.components.currentProxy.labels.group")}
- {t("home.cards.traffic.legends.download")}
+ {t("home.components.traffic.legends.download")}
diff --git a/src/components/home/enhanced-traffic-stats.tsx b/src/components/home/enhanced-traffic-stats.tsx
index b2dc13f8..25840cc8 100644
--- a/src/components/home/enhanced-traffic-stats.tsx
+++ b/src/components/home/enhanced-traffic-stats.tsx
@@ -219,42 +219,42 @@ export const EnhancedTrafficStats = () => {
() => [
{
icon: ,
- 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: ,
- 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: ,
- title: t("home.cards.traffic.metrics.activeConnections"),
+ title: t("home.components.traffic.metrics.activeConnections"),
value: parsedData.connectionsCount,
unit: "",
color: "success" as const,
},
{
icon: ,
- 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: ,
- 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: ,
- title: t("home.cards.traffic.metrics.memoryUsage"),
+ title: t("home.components.traffic.metrics.memoryUsage"),
value: parsedData.inuse,
unit: parsedData.inuseUnit,
color: "error" as const,
diff --git a/src/components/home/ip-info-card.tsx b/src/components/home/ip-info-card.tsx
index 0858ed9c..a8f81d38 100644
--- a/src/components/home/ip-info-card.tsx
+++ b/src/components/home/ip-info-card.tsx
@@ -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 (
}
iconColor="info"
action={
@@ -139,7 +141,7 @@ export const IpInfoCard = () => {
if (error) {
return (
}
iconColor="info"
action={
@@ -172,7 +174,7 @@ export const IpInfoCard = () => {
// 渲染正常数据
return (
}
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")}
@@ -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")}:
{
@@ -276,19 +278,19 @@ export const IpInfoCard = () => {
{/* 右侧:组织、ISP和位置信息 */}
@@ -308,7 +310,7 @@ export const IpInfoCard = () => {
}}
>
- {t("home.cards.ipInfo.labels.autoRefresh")}: {countdown}s
+ {t("home.components.ipInfo.labels.autoRefresh")}: {countdown}s
{
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"),
};
}
}, [
diff --git a/src/components/home/system-info-card.tsx b/src/components/home/system-info-card.tsx
index 8f0b0fef..69e2ca72 100644
--- a/src/components/home/system-info-card.tsx
+++ b/src/components/home/system-info-card.tsx
@@ -219,11 +219,11 @@ export const SystemInfoCard = () => {
<>
>
);
@@ -231,21 +231,21 @@ export const SystemInfoCard = () => {
return (
);
} else if (isSidecarMode) {
return (
);
} else {
return (
);
}
@@ -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 (
}
iconColor="error"
action={
@@ -287,7 +287,7 @@ export const SystemInfoCard = () => {
- {t("home.cards.systemInfo.fields.osInfo")}
+ {t("home.components.systemInfo.fields.osInfo")}
{systemState.osInfo}
@@ -300,12 +300,12 @@ export const SystemInfoCard = () => {
alignItems="center"
>
- {t("home.cards.systemInfo.fields.autoLaunch")}
+ {t("home.components.systemInfo.fields.autoLaunch")}
{isAdminMode && (
@@ -331,7 +331,7 @@ export const SystemInfoCard = () => {
alignItems="center"
>
- {t("home.cards.systemInfo.fields.runningMode")}
+ {t("home.components.systemInfo.fields.runningMode")}
{
- {t("home.cards.systemInfo.fields.lastCheckUpdate")}
+ {t("home.components.systemInfo.fields.lastCheckUpdate")}
{
- {t("home.cards.systemInfo.fields.vergeVersion")}
+ {t("home.components.systemInfo.fields.vergeVersion")}
v{appVersion}
diff --git a/src/components/home/test-card.tsx b/src/components/home/test-card.tsx
index d16cb183..903f3c7c 100644
--- a/src/components/home/test-card.tsx
+++ b/src/components/home/test-card.tsx
@@ -173,7 +173,7 @@ export const TestCard = () => {
return (
}
action={
@@ -182,7 +182,7 @@ export const TestCard = () => {
-
+
diff --git a/src/components/layout/layout-traffic.tsx b/src/components/layout/layout-traffic.tsx
index 790eeab4..36c35ac2 100644
--- a/src/components/layout/layout-traffic.tsx
+++ b/src/components/layout/layout-traffic.tsx
@@ -87,7 +87,7 @@ export const LayoutTraffic = () => {
{
{
{displayMemory && (
= {
- 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 =
builtinProxyPolicies.reduce(
(acc, policy) => {
- acc[policy] = `proxies.enums.policies.${policy}`;
+ acc[policy] = `proxies.components.enums.policies.${policy}`;
return acc;
},
{} as Record,
diff --git a/src/components/profile/rules-editor-viewer.tsx b/src/components/profile/rules-editor-viewer.tsx
index 88df1dbf..0ba66264 100644
--- a/src/components/profile/rules-editor-viewer.tsx
+++ b/src/components/profile/rules-editor-viewer.tsx
@@ -241,7 +241,10 @@ const rules: {
];
const RULE_TYPE_LABEL_KEYS: Record = 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) => {
{
- {t("rules.editor.title")}
+ {t("rules.modals.editor.header.title")}
-
@@ -663,7 +672,7 @@ export const RulesEditorViewer = (props: Props) => {
}
}}
>
- {t("rules.editor.form.actions.appendRule")}
+ {t("rules.modals.editor.form.actions.appendRule")}
diff --git a/src/components/proxy/provider-button.tsx b/src/components/proxy/provider-button.tsx
index 01a96f46..43551638 100644
--- a/src/components/proxy/provider-button.tsx
+++ b/src/components/proxy/provider-button.tsx
@@ -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 {
diff --git a/src/components/rule/provider-button.tsx b/src/components/rule/provider-button.tsx
index e34a3398..367fa3d6 100644
--- a/src/components/rule/provider-button.tsx
+++ b/src/components/rule/provider-button.tsx
@@ -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 {
diff --git a/src/components/test/test-item.tsx b/src/components/test/test-item.tsx
index daa96ee1..738c41c0 100644
--- a/src/components/test/test-item.tsx
+++ b/src/components/test/test-item.tsx
@@ -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")}
)}
diff --git a/src/components/test/test-viewer.tsx b/src/components/test/test-viewer.tsx
index 9319cfa8..0ca2ebc6 100644
--- a/src/components/test/test-viewer.tsx
+++ b/src/components/test/test-viewer.tsx
@@ -126,8 +126,8 @@ export const TestViewer = forwardRef((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((props, ref) => {
{...field}
multiline
maxRows={3}
- label={t("tests.viewer.fields.url")}
+ label={t("tests.modals.test.fields.url")}
/>
)}
/>
diff --git a/src/locales/ar.json b/src/locales/ar.json
index bc3e4754..19bd3e82 100644
--- a/src/locales/ar.json
+++ b/src/locales/ar.json
@@ -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"
}
}
},
diff --git a/src/locales/de.json b/src/locales/de.json
index 322d474a..e0e60028 100644
--- a/src/locales/de.json
+++ b/src/locales/de.json
@@ -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"
}
}
},
diff --git a/src/locales/en.json b/src/locales/en.json
index 7d186794..45310811 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -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"
}
}
},
diff --git a/src/locales/es.json b/src/locales/es.json
index 040a1e77..27f8a96d 100644
--- a/src/locales/es.json
+++ b/src/locales/es.json
@@ -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"
}
}
},
diff --git a/src/locales/fa.json b/src/locales/fa.json
index 16c1387f..0e0b6434 100644
--- a/src/locales/fa.json
+++ b/src/locales/fa.json
@@ -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"
}
}
},
diff --git a/src/locales/id.json b/src/locales/id.json
index 465941ac..29ac39bb 100644
--- a/src/locales/id.json
+++ b/src/locales/id.json
@@ -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"
}
}
},
diff --git a/src/locales/jp.json b/src/locales/jp.json
index 5dfc85da..3fb98352 100644
--- a/src/locales/jp.json
+++ b/src/locales/jp.json
@@ -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": "ロック解除テスト"
}
}
},
diff --git a/src/locales/ko.json b/src/locales/ko.json
index 65742aa8..127135c5 100644
--- a/src/locales/ko.json
+++ b/src/locales/ko.json
@@ -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"
}
}
},
diff --git a/src/locales/ru.json b/src/locales/ru.json
index e09d5abb..b6ba4c09 100644
--- a/src/locales/ru.json
+++ b/src/locales/ru.json
@@ -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": "Тест доступности веб-сайтов"
}
}
},
diff --git a/src/locales/tr.json b/src/locales/tr.json
index ac3e2fba..97fff019 100644
--- a/src/locales/tr.json
+++ b/src/locales/tr.json
@@ -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"
}
}
},
diff --git a/src/locales/tt.json b/src/locales/tt.json
index cd3d5475..3dbf3d71 100644
--- a/src/locales/tt.json
+++ b/src/locales/tt.json
@@ -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"
}
}
},
diff --git a/src/locales/zh.json b/src/locales/zh.json
index 35f3c762..30f444df 100644
--- a/src/locales/zh.json
+++ b/src/locales/zh.json
@@ -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": "解锁测试"
}
}
},
diff --git a/src/locales/zhtw.json b/src/locales/zhtw.json
index 178eba8a..e2c85705 100644
--- a/src/locales/zhtw.json
+++ b/src/locales/zhtw.json
@@ -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": "解鎖測試"
}
}
},
diff --git a/src/pages/connections.tsx b/src/pages/connections.tsx
index 9de2e4c9..6d4d1feb 100644
--- a/src/pages/connections.tsx
+++ b/src/pages/connections.tsx
@@ -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={
- {t("connections.page.title")}
+ {t("connections.page.header.title")}
}
contentStyle={{
diff --git a/src/pages/home.tsx b/src/pages/home.tsx
index efb4b906..15c8ac33 100644
--- a/src/pages/home.tsx
+++ b/src/pages/home.tsx
@@ -112,7 +112,7 @@ const HomeSettingsDialog = ({
return (
-
+