mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-04-18 08:21:34 +08:00
feat(notice): persist toast position preference (#5621)
* feat(notice): persist toast position preference * docs: Changelog.md
This commit is contained in:
parent
bd8eccdcea
commit
fc84dc561c
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
- 允许代理页面允许高级过滤搜索
|
- 允许代理页面允许高级过滤搜索
|
||||||
- 备份设置页面新增导入备份按钮
|
- 备份设置页面新增导入备份按钮
|
||||||
|
- 允许修改通知弹窗位置(「界面设置」->「通知位置」)
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|||||||
@ -66,6 +66,10 @@ pub struct IVerge {
|
|||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub menu_order: Option<Vec<String>>,
|
pub menu_order: Option<Vec<String>>,
|
||||||
|
|
||||||
|
/// toast / notice position on screen
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub notice_position: Option<String>,
|
||||||
|
|
||||||
/// sysproxy tray icon
|
/// sysproxy tray icon
|
||||||
pub sysproxy_tray_icon: Option<bool>,
|
pub sysproxy_tray_icon: Option<bool>,
|
||||||
|
|
||||||
@ -391,6 +395,7 @@ impl IVerge {
|
|||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
tray_icon: Some("monochrome".into()),
|
tray_icon: Some("monochrome".into()),
|
||||||
menu_icon: Some("monochrome".into()),
|
menu_icon: Some("monochrome".into()),
|
||||||
|
notice_position: Some("top-right".into()),
|
||||||
common_tray_icon: Some(false),
|
common_tray_icon: Some(false),
|
||||||
sysproxy_tray_icon: Some(false),
|
sysproxy_tray_icon: Some(false),
|
||||||
tun_tray_icon: Some(false),
|
tun_tray_icon: Some(false),
|
||||||
@ -475,6 +480,7 @@ impl IVerge {
|
|||||||
patch!(tray_icon);
|
patch!(tray_icon);
|
||||||
patch!(menu_icon);
|
patch!(menu_icon);
|
||||||
patch!(menu_order);
|
patch!(menu_order);
|
||||||
|
patch!(notice_position);
|
||||||
patch!(common_tray_icon);
|
patch!(common_tray_icon);
|
||||||
patch!(sysproxy_tray_icon);
|
patch!(sysproxy_tray_icon);
|
||||||
patch!(tun_tray_icon);
|
patch!(tun_tray_icon);
|
||||||
|
|||||||
@ -1,6 +1,12 @@
|
|||||||
import { CloseRounded } from "@mui/icons-material";
|
import { CloseRounded } from "@mui/icons-material";
|
||||||
import { Snackbar, Alert, IconButton, Box } from "@mui/material";
|
import {
|
||||||
import React, { useSyncExternalStore } from "react";
|
Snackbar,
|
||||||
|
Alert,
|
||||||
|
IconButton,
|
||||||
|
Box,
|
||||||
|
type SnackbarOrigin,
|
||||||
|
} from "@mui/material";
|
||||||
|
import React, { useMemo, useSyncExternalStore } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -10,8 +16,41 @@ import {
|
|||||||
} from "@/services/notice-service";
|
} from "@/services/notice-service";
|
||||||
import type { TranslationKey } from "@/types/generated/i18n-keys";
|
import type { TranslationKey } from "@/types/generated/i18n-keys";
|
||||||
|
|
||||||
export const NoticeManager: React.FC = () => {
|
type NoticePosition = NonNullable<IVergeConfig["notice_position"]>;
|
||||||
|
|
||||||
|
const VALID_POSITIONS: NoticePosition[] = [
|
||||||
|
"top-left",
|
||||||
|
"top-right",
|
||||||
|
"bottom-left",
|
||||||
|
"bottom-right",
|
||||||
|
];
|
||||||
|
|
||||||
|
const resolvePosition = (position?: NoticePosition | null): NoticePosition => {
|
||||||
|
if (position && VALID_POSITIONS.includes(position)) {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
return "top-right";
|
||||||
|
};
|
||||||
|
|
||||||
|
const getAnchorOrigin = (position: NoticePosition): SnackbarOrigin => {
|
||||||
|
const [vertical, horizontal] = position.split("-") as [
|
||||||
|
SnackbarOrigin["vertical"],
|
||||||
|
SnackbarOrigin["horizontal"],
|
||||||
|
];
|
||||||
|
return { vertical, horizontal };
|
||||||
|
};
|
||||||
|
|
||||||
|
interface NoticeManagerProps {
|
||||||
|
position?: NoticePosition | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const NoticeManager: React.FC<NoticeManagerProps> = ({ position }) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const resolvedPosition = useMemo(() => resolvePosition(position), [position]);
|
||||||
|
const anchorOrigin = useMemo(
|
||||||
|
() => getAnchorOrigin(resolvedPosition),
|
||||||
|
[resolvedPosition],
|
||||||
|
);
|
||||||
const currentNotices = useSyncExternalStore(
|
const currentNotices = useSyncExternalStore(
|
||||||
subscribeNotices,
|
subscribeNotices,
|
||||||
getSnapshotNotices,
|
getSnapshotNotices,
|
||||||
@ -25,8 +64,10 @@ export const NoticeManager: React.FC = () => {
|
|||||||
<Box
|
<Box
|
||||||
sx={{
|
sx={{
|
||||||
position: "fixed",
|
position: "fixed",
|
||||||
top: "20px",
|
top: anchorOrigin.vertical === "top" ? "20px" : "auto",
|
||||||
right: "20px",
|
bottom: anchorOrigin.vertical === "bottom" ? "20px" : "auto",
|
||||||
|
left: anchorOrigin.horizontal === "left" ? "20px" : "auto",
|
||||||
|
right: anchorOrigin.horizontal === "right" ? "20px" : "auto",
|
||||||
zIndex: 1500,
|
zIndex: 1500,
|
||||||
display: "flex",
|
display: "flex",
|
||||||
flexDirection: "column",
|
flexDirection: "column",
|
||||||
@ -38,7 +79,7 @@ export const NoticeManager: React.FC = () => {
|
|||||||
<Snackbar
|
<Snackbar
|
||||||
key={notice.id}
|
key={notice.id}
|
||||||
open={true}
|
open={true}
|
||||||
anchorOrigin={{ vertical: "top", horizontal: "right" }}
|
anchorOrigin={anchorOrigin}
|
||||||
sx={{
|
sx={{
|
||||||
position: "relative",
|
position: "relative",
|
||||||
transform: "none",
|
transform: "none",
|
||||||
|
|||||||
@ -190,6 +190,42 @@ export const LayoutViewer = forwardRef<DialogRef>((_, ref) => {
|
|||||||
</GuardState>
|
</GuardState>
|
||||||
</Item>
|
</Item>
|
||||||
|
|
||||||
|
<Item>
|
||||||
|
<ListItemText
|
||||||
|
primary={t("settings.components.verge.layout.fields.toastPosition")}
|
||||||
|
/>
|
||||||
|
<GuardState
|
||||||
|
value={verge?.notice_position ?? "top-right"}
|
||||||
|
onCatch={onError}
|
||||||
|
onFormat={(e: any) => e.target.value}
|
||||||
|
onChange={(value) => onChangeData({ notice_position: value })}
|
||||||
|
onGuard={(value) => patchVerge({ notice_position: value })}
|
||||||
|
>
|
||||||
|
<Select size="small" sx={{ width: 180, "> div": { py: "7.5px" } }}>
|
||||||
|
<MenuItem value="top-right">
|
||||||
|
{t(
|
||||||
|
"settings.components.verge.layout.options.toastPosition.topRight",
|
||||||
|
)}
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem value="top-left">
|
||||||
|
{t(
|
||||||
|
"settings.components.verge.layout.options.toastPosition.topLeft",
|
||||||
|
)}
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem value="bottom-right">
|
||||||
|
{t(
|
||||||
|
"settings.components.verge.layout.options.toastPosition.bottomRight",
|
||||||
|
)}
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem value="bottom-left">
|
||||||
|
{t(
|
||||||
|
"settings.components.verge.layout.options.toastPosition.bottomLeft",
|
||||||
|
)}
|
||||||
|
</MenuItem>
|
||||||
|
</Select>
|
||||||
|
</GuardState>
|
||||||
|
</Item>
|
||||||
|
|
||||||
<Item>
|
<Item>
|
||||||
<ListItemText
|
<ListItemText
|
||||||
primary={
|
primary={
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "مخطط حركة المرور",
|
"trafficGraph": "مخطط حركة المرور",
|
||||||
"memoryUsage": "استهلاك الذاكرة",
|
"memoryUsage": "استهلاك الذاكرة",
|
||||||
"proxyGroupIcon": "أيقونة مجموعة الوكلاء",
|
"proxyGroupIcon": "أيقونة مجموعة الوكلاء",
|
||||||
|
"toastPosition": "Toast Position",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "أيقونة التنقل",
|
"navIcon": "أيقونة التنقل",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "أحادي اللون",
|
"monochrome": "أحادي اللون",
|
||||||
"colorful": "ملون",
|
"colorful": "ملون",
|
||||||
"disable": "تعطيل"
|
"disable": "تعطيل"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "Top Left",
|
||||||
|
"topRight": "Top Right",
|
||||||
|
"bottomLeft": "Bottom Left",
|
||||||
|
"bottomRight": "Bottom Right"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "Verkehrsdiagramm",
|
"trafficGraph": "Verkehrsdiagramm",
|
||||||
"memoryUsage": "Kern-Speichernutzung",
|
"memoryUsage": "Kern-Speichernutzung",
|
||||||
"proxyGroupIcon": "Proxy-Gruppen-Symbol",
|
"proxyGroupIcon": "Proxy-Gruppen-Symbol",
|
||||||
|
"toastPosition": "Toast-Position",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "Navigationsleiste-Symbol",
|
"navIcon": "Navigationsleiste-Symbol",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "Monochromes Symbol",
|
"monochrome": "Monochromes Symbol",
|
||||||
"colorful": "Farbiges Symbol",
|
"colorful": "Farbiges Symbol",
|
||||||
"disable": "Deaktivieren"
|
"disable": "Deaktivieren"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "Oben links",
|
||||||
|
"topRight": "Oben rechts",
|
||||||
|
"bottomLeft": "Unten links",
|
||||||
|
"bottomRight": "Unten rechts"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "Traffic Graph",
|
"trafficGraph": "Traffic Graph",
|
||||||
"memoryUsage": "Core Usage",
|
"memoryUsage": "Core Usage",
|
||||||
"proxyGroupIcon": "Proxy Group Icon",
|
"proxyGroupIcon": "Proxy Group Icon",
|
||||||
|
"toastPosition": "Toast Position",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "Nav Icon",
|
"navIcon": "Nav Icon",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "Monochrome",
|
"monochrome": "Monochrome",
|
||||||
"colorful": "Colorful",
|
"colorful": "Colorful",
|
||||||
"disable": "Disable"
|
"disable": "Disable"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "Top Left",
|
||||||
|
"topRight": "Top Right",
|
||||||
|
"bottomLeft": "Bottom Left",
|
||||||
|
"bottomRight": "Bottom Right"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "Gráfico de tráfico",
|
"trafficGraph": "Gráfico de tráfico",
|
||||||
"memoryUsage": "Uso de memoria del núcleo",
|
"memoryUsage": "Uso de memoria del núcleo",
|
||||||
"proxyGroupIcon": "Icono del grupo de proxy",
|
"proxyGroupIcon": "Icono del grupo de proxy",
|
||||||
|
"toastPosition": "Posición del aviso",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "Icono de la barra de navegación",
|
"navIcon": "Icono de la barra de navegación",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "Icono monocromo",
|
"monochrome": "Icono monocromo",
|
||||||
"colorful": "Icono colorido",
|
"colorful": "Icono colorido",
|
||||||
"disable": "Deshabilitar"
|
"disable": "Deshabilitar"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "Arriba a la izquierda",
|
||||||
|
"topRight": "Arriba a la derecha",
|
||||||
|
"bottomLeft": "Abajo a la izquierda",
|
||||||
|
"bottomRight": "Abajo a la derecha"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "نمودار ترافیک",
|
"trafficGraph": "نمودار ترافیک",
|
||||||
"memoryUsage": "استفاده از حافظه",
|
"memoryUsage": "استفاده از حافظه",
|
||||||
"proxyGroupIcon": "آیکون گروه پراکسی",
|
"proxyGroupIcon": "آیکون گروه پراکسی",
|
||||||
|
"toastPosition": "Toast Position",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "آیکون ناوبری",
|
"navIcon": "آیکون ناوبری",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "تک رنگ",
|
"monochrome": "تک رنگ",
|
||||||
"colorful": "رنگارنگ",
|
"colorful": "رنگارنگ",
|
||||||
"disable": "غیرفعال کردن"
|
"disable": "غیرفعال کردن"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "Top Left",
|
||||||
|
"topRight": "Top Right",
|
||||||
|
"bottomLeft": "Bottom Left",
|
||||||
|
"bottomRight": "Bottom Right"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "Grafik Lalu Lintas",
|
"trafficGraph": "Grafik Lalu Lintas",
|
||||||
"memoryUsage": "Penggunaan Memori",
|
"memoryUsage": "Penggunaan Memori",
|
||||||
"proxyGroupIcon": "Ikon Grup Proksi",
|
"proxyGroupIcon": "Ikon Grup Proksi",
|
||||||
|
"toastPosition": "Posisi toast",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "Ikon Navigasi",
|
"navIcon": "Ikon Navigasi",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "Monokrom",
|
"monochrome": "Monokrom",
|
||||||
"colorful": "Berwarna",
|
"colorful": "Berwarna",
|
||||||
"disable": "Nonaktifkan"
|
"disable": "Nonaktifkan"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "Kiri atas",
|
||||||
|
"topRight": "Kanan atas",
|
||||||
|
"bottomLeft": "Kiri bawah",
|
||||||
|
"bottomRight": "Kanan bawah"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "トラフィックグラフ",
|
"trafficGraph": "トラフィックグラフ",
|
||||||
"memoryUsage": "コアメモリ使用量",
|
"memoryUsage": "コアメモリ使用量",
|
||||||
"proxyGroupIcon": "プロキシグループアイコン",
|
"proxyGroupIcon": "プロキシグループアイコン",
|
||||||
|
"toastPosition": "トーストの表示位置",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "ナビゲーションバーアイコン",
|
"navIcon": "ナビゲーションバーアイコン",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "モノクロアイコン",
|
"monochrome": "モノクロアイコン",
|
||||||
"colorful": "カラーアイコン",
|
"colorful": "カラーアイコン",
|
||||||
"disable": "無効にする"
|
"disable": "無効にする"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "左上",
|
||||||
|
"topRight": "右上",
|
||||||
|
"bottomLeft": "左下",
|
||||||
|
"bottomRight": "右下"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "트래픽 그래프",
|
"trafficGraph": "트래픽 그래프",
|
||||||
"memoryUsage": "메모리 사용량",
|
"memoryUsage": "메모리 사용량",
|
||||||
"proxyGroupIcon": "프록시 그룹 아이콘",
|
"proxyGroupIcon": "프록시 그룹 아이콘",
|
||||||
|
"toastPosition": "토스트 위치",
|
||||||
"hoverNavigator": "호버 점프 내비게이터",
|
"hoverNavigator": "호버 점프 내비게이터",
|
||||||
"hoverNavigatorDelay": "호버 점프 내비게이터 지연",
|
"hoverNavigatorDelay": "호버 점프 내비게이터 지연",
|
||||||
"navIcon": "내비게이션 아이콘",
|
"navIcon": "내비게이션 아이콘",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "단색",
|
"monochrome": "단색",
|
||||||
"colorful": "컬러",
|
"colorful": "컬러",
|
||||||
"disable": "비활성화"
|
"disable": "비활성화"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "왼쪽 상단",
|
||||||
|
"topRight": "오른쪽 상단",
|
||||||
|
"bottomLeft": "왼쪽 하단",
|
||||||
|
"bottomRight": "오른쪽 하단"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "График трафика",
|
"trafficGraph": "График трафика",
|
||||||
"memoryUsage": "Использование памяти",
|
"memoryUsage": "Использование памяти",
|
||||||
"proxyGroupIcon": "Иконка Группы прокси",
|
"proxyGroupIcon": "Иконка Группы прокси",
|
||||||
|
"toastPosition": "Расположение уведомлений",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "Иконки навигации",
|
"navIcon": "Иконки навигации",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "Монохромные",
|
"monochrome": "Монохромные",
|
||||||
"colorful": "Цветные",
|
"colorful": "Цветные",
|
||||||
"disable": "Отключить"
|
"disable": "Отключить"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "Сверху слева",
|
||||||
|
"topRight": "Сверху справа",
|
||||||
|
"bottomLeft": "Снизу слева",
|
||||||
|
"bottomRight": "Снизу справа"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "Trafik Grafiği",
|
"trafficGraph": "Trafik Grafiği",
|
||||||
"memoryUsage": "Çekirdek Kullanımı",
|
"memoryUsage": "Çekirdek Kullanımı",
|
||||||
"proxyGroupIcon": "Vekil Grup Simgesi",
|
"proxyGroupIcon": "Vekil Grup Simgesi",
|
||||||
|
"toastPosition": "Toast konumu",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "Gezinme Simgesi",
|
"navIcon": "Gezinme Simgesi",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "Tek Renkli",
|
"monochrome": "Tek Renkli",
|
||||||
"colorful": "Renkli",
|
"colorful": "Renkli",
|
||||||
"disable": "Devre Dışı Bırak"
|
"disable": "Devre Dışı Bırak"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "Sol üst",
|
||||||
|
"topRight": "Sağ üst",
|
||||||
|
"bottomLeft": "Sol alt",
|
||||||
|
"bottomRight": "Sağ alt"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "Трафик графигы",
|
"trafficGraph": "Трафик графигы",
|
||||||
"memoryUsage": "Хәтер куллану",
|
"memoryUsage": "Хәтер куллану",
|
||||||
"proxyGroupIcon": "Прокси төркеме иконкасы",
|
"proxyGroupIcon": "Прокси төркеме иконкасы",
|
||||||
|
"toastPosition": "Toast Position",
|
||||||
"hoverNavigator": "Hover Jump Navigator",
|
"hoverNavigator": "Hover Jump Navigator",
|
||||||
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
"hoverNavigatorDelay": "Hover Jump Navigator Delay",
|
||||||
"navIcon": "Навигация иконкасы",
|
"navIcon": "Навигация иконкасы",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "Монохром",
|
"monochrome": "Монохром",
|
||||||
"colorful": "Төсле",
|
"colorful": "Төсле",
|
||||||
"disable": "Сүндерү"
|
"disable": "Сүндерү"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "Top Left",
|
||||||
|
"topRight": "Top Right",
|
||||||
|
"bottomLeft": "Bottom Left",
|
||||||
|
"bottomRight": "Bottom Right"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "流量图显",
|
"trafficGraph": "流量图显",
|
||||||
"memoryUsage": "内核占用",
|
"memoryUsage": "内核占用",
|
||||||
"proxyGroupIcon": "代理组图标",
|
"proxyGroupIcon": "代理组图标",
|
||||||
|
"toastPosition": "通知位置",
|
||||||
"hoverNavigator": "悬浮跳转导航",
|
"hoverNavigator": "悬浮跳转导航",
|
||||||
"hoverNavigatorDelay": "悬浮跳转导航延迟",
|
"hoverNavigatorDelay": "悬浮跳转导航延迟",
|
||||||
"navIcon": "导航栏图标",
|
"navIcon": "导航栏图标",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "单色图标",
|
"monochrome": "单色图标",
|
||||||
"colorful": "彩色图标",
|
"colorful": "彩色图标",
|
||||||
"disable": "禁用"
|
"disable": "禁用"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "左上角",
|
||||||
|
"topRight": "右上角",
|
||||||
|
"bottomLeft": "左下角",
|
||||||
|
"bottomRight": "右下角"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -205,6 +205,7 @@
|
|||||||
"trafficGraph": "流量圖表",
|
"trafficGraph": "流量圖表",
|
||||||
"memoryUsage": "內核佔用",
|
"memoryUsage": "內核佔用",
|
||||||
"proxyGroupIcon": "代理組圖示",
|
"proxyGroupIcon": "代理組圖示",
|
||||||
|
"toastPosition": "通知位置",
|
||||||
"hoverNavigator": "懸浮跳轉導航",
|
"hoverNavigator": "懸浮跳轉導航",
|
||||||
"hoverNavigatorDelay": "懸浮跳轉導航延遲",
|
"hoverNavigatorDelay": "懸浮跳轉導航延遲",
|
||||||
"navIcon": "導覽列圖示",
|
"navIcon": "導覽列圖示",
|
||||||
@ -225,6 +226,12 @@
|
|||||||
"monochrome": "單色圖示",
|
"monochrome": "單色圖示",
|
||||||
"colorful": "彩色圖示",
|
"colorful": "彩色圖示",
|
||||||
"disable": "停用"
|
"disable": "停用"
|
||||||
|
},
|
||||||
|
"toastPosition": {
|
||||||
|
"topLeft": "左上角",
|
||||||
|
"topRight": "右上角",
|
||||||
|
"bottomLeft": "左下角",
|
||||||
|
"bottomRight": "右下角"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -263,7 +263,7 @@ const Layout = () => {
|
|||||||
>
|
>
|
||||||
<ThemeProvider theme={theme}>
|
<ThemeProvider theme={theme}>
|
||||||
{/* 左侧底部窗口控制按钮 */}
|
{/* 左侧底部窗口控制按钮 */}
|
||||||
<NoticeManager />
|
<NoticeManager position={verge?.notice_position} />
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
animation: "fadeIn 0.5s",
|
animation: "fadeIn 0.5s",
|
||||||
|
|||||||
@ -425,6 +425,7 @@ export const translationKeys = [
|
|||||||
"settings.components.verge.layout.fields.trafficGraph",
|
"settings.components.verge.layout.fields.trafficGraph",
|
||||||
"settings.components.verge.layout.fields.memoryUsage",
|
"settings.components.verge.layout.fields.memoryUsage",
|
||||||
"settings.components.verge.layout.fields.proxyGroupIcon",
|
"settings.components.verge.layout.fields.proxyGroupIcon",
|
||||||
|
"settings.components.verge.layout.fields.toastPosition",
|
||||||
"settings.components.verge.layout.fields.hoverNavigator",
|
"settings.components.verge.layout.fields.hoverNavigator",
|
||||||
"settings.components.verge.layout.fields.hoverNavigatorDelay",
|
"settings.components.verge.layout.fields.hoverNavigatorDelay",
|
||||||
"settings.components.verge.layout.fields.navIcon",
|
"settings.components.verge.layout.fields.navIcon",
|
||||||
@ -440,6 +441,10 @@ export const translationKeys = [
|
|||||||
"settings.components.verge.layout.options.icon.monochrome",
|
"settings.components.verge.layout.options.icon.monochrome",
|
||||||
"settings.components.verge.layout.options.icon.colorful",
|
"settings.components.verge.layout.options.icon.colorful",
|
||||||
"settings.components.verge.layout.options.icon.disable",
|
"settings.components.verge.layout.options.icon.disable",
|
||||||
|
"settings.components.verge.layout.options.toastPosition.topLeft",
|
||||||
|
"settings.components.verge.layout.options.toastPosition.topRight",
|
||||||
|
"settings.components.verge.layout.options.toastPosition.bottomLeft",
|
||||||
|
"settings.components.verge.layout.options.toastPosition.bottomRight",
|
||||||
"settings.modals.clashPort.title",
|
"settings.modals.clashPort.title",
|
||||||
"settings.modals.clashPort.fields.mixed",
|
"settings.modals.clashPort.fields.mixed",
|
||||||
"settings.modals.clashPort.fields.socks",
|
"settings.modals.clashPort.fields.socks",
|
||||||
|
|||||||
@ -627,6 +627,7 @@ export interface TranslationResources {
|
|||||||
proxyGroupIcon: string;
|
proxyGroupIcon: string;
|
||||||
showProxyGroupsInline: string;
|
showProxyGroupsInline: string;
|
||||||
systemProxyTrayIcon: string;
|
systemProxyTrayIcon: string;
|
||||||
|
toastPosition: string;
|
||||||
trafficGraph: string;
|
trafficGraph: string;
|
||||||
trayIcon: string;
|
trayIcon: string;
|
||||||
tunTrayIcon: string;
|
tunTrayIcon: string;
|
||||||
@ -637,6 +638,12 @@ export interface TranslationResources {
|
|||||||
disable: string;
|
disable: string;
|
||||||
monochrome: string;
|
monochrome: string;
|
||||||
};
|
};
|
||||||
|
toastPosition: {
|
||||||
|
bottomLeft: string;
|
||||||
|
bottomRight: string;
|
||||||
|
topLeft: string;
|
||||||
|
topRight: string;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
title: string;
|
title: string;
|
||||||
tooltips: {
|
tooltips: {
|
||||||
|
|||||||
1
src/types/global.d.ts
vendored
1
src/types/global.d.ts
vendored
@ -814,6 +814,7 @@ interface IVergeConfig {
|
|||||||
enable_group_icon?: boolean;
|
enable_group_icon?: boolean;
|
||||||
menu_icon?: "monochrome" | "colorful" | "disable";
|
menu_icon?: "monochrome" | "colorful" | "disable";
|
||||||
menu_order?: string[];
|
menu_order?: string[];
|
||||||
|
notice_position?: "top-left" | "top-right" | "bottom-left" | "bottom-right";
|
||||||
tray_icon?: "monochrome" | "colorful";
|
tray_icon?: "monochrome" | "colorful";
|
||||||
common_tray_icon?: boolean;
|
common_tray_icon?: boolean;
|
||||||
sysproxy_tray_icon?: boolean;
|
sysproxy_tray_icon?: boolean;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user