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.currentProxy.labels.noActiveNode")} + {t("home.components.currentProxy.labels.noActiveNode")} )} diff --git a/src/components/home/enhanced-canvas-traffic-graph.tsx b/src/components/home/enhanced-canvas-traffic-graph.tsx index 2e6c03ca..a77f4db8 100644 --- a/src/components/home/enhanced-canvas-traffic-graph.tsx +++ b/src/components/home/enhanced-canvas-traffic-graph.tsx @@ -851,7 +851,7 @@ export const EnhancedCanvasTrafficGraph = memo( // 获取时间范围文本 const getTimeRangeText = useCallback(() => { - return t("home.cards.traffic.patterns.minutes", { + return t("home.components.traffic.patterns.minutes", { time: timeRange, }); }, [timeRange, t]); @@ -936,7 +936,7 @@ export const EnhancedCanvasTrafficGraph = memo( textAlign: "right", }} > - {t("home.cards.traffic.legends.upload")} + {t("home.components.traffic.legends.upload")} - {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 ( - {t("home.page.settings.title")} + {t("home.page.settings.header.title")} { ); return ( diff --git a/src/pages/logs.tsx b/src/pages/logs.tsx index efb30f3e..846bcdb5 100644 --- a/src/pages/logs.tsx +++ b/src/pages/logs.tsx @@ -60,7 +60,7 @@ const LogPage = () => { return ( { contentStyle={{ height: "101.5%" }} title={ isChainMode - ? t("proxies.page.title.chainMode") - : t("proxies.page.title.default") + ? t("proxies.page.header.title.chainMode") + : t("proxies.page.header.title.default") } header={ diff --git a/src/pages/rules.tsx b/src/pages/rules.tsx index 66e7a569..3214d42b 100644 --- a/src/pages/rules.tsx +++ b/src/pages/rules.tsx @@ -48,7 +48,7 @@ const RulesPage = () => { return ( { return (