chore: i18n for profile module

This commit is contained in:
Slinetrac
2025-10-31 18:51:00 +08:00
Unverified
parent f8cb88c3dd
commit 0938862b91
16 changed files with 977 additions and 41 deletions

View File

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

View File

@@ -146,7 +146,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
// 首次创建/更新失败,尝试使用自身代理
showNotice(
"info",
t("Profile creation failed, retrying with Clash proxy..."),
t("components.profile.viewer.notifications.creationRetry"),
);
// 使用自身代理的配置
@@ -172,7 +172,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
showNotice(
"success",
t("Profile creation succeeded with Clash proxy"),
t("components.profile.viewer.notifications.creationSuccess"),
);
}
}
@@ -220,10 +220,14 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
return (
<BaseDialog
open={open}
title={openType === "new" ? t("Create Profile") : t("Edit Profile")}
title={
openType === "new"
? t("components.profile.viewer.title.create")
: t("components.profile.viewer.title.edit")
}
contentSx={{ width: 375, pb: 0, maxHeight: "80%" }}
okBtn={t("Save")}
cancelBtn={t("Cancel")}
okBtn={t("components.profile.viewer.buttons.save")}
cancelBtn={t("components.profile.viewer.buttons.cancel")}
onClose={handleClose}
onCancel={handleClose}
onOk={handleOk}
@@ -234,8 +238,14 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
control={control}
render={({ field }) => (
<FormControl size="small" fullWidth sx={{ mt: 1, mb: 1 }}>
<InputLabel>{t("Type")}</InputLabel>
<Select {...field} autoFocus label={t("Type")}>
<InputLabel>
{t("components.profile.viewer.fields.type")}
</InputLabel>
<Select
{...field}
autoFocus
label={t("components.profile.viewer.fields.type")}
>
<MenuItem value="remote">Remote</MenuItem>
<MenuItem value="local">Local</MenuItem>
</Select>
@@ -247,7 +257,11 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
name="name"
control={control}
render={({ field }) => (
<TextField {...text} {...field} label={t("Name")} />
<TextField
{...text}
{...field}
label={t("components.profile.viewer.fields.name")}
/>
)}
/>
@@ -255,7 +269,11 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
name="desc"
control={control}
render={({ field }) => (
<TextField {...text} {...field} label={t("Descriptions")} />
<TextField
{...text}
{...field}
label={t("components.profile.viewer.fields.description")}
/>
)}
/>
@@ -269,7 +287,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
{...text}
{...field}
multiline
label={t("Subscription URL")}
label={t("components.profile.viewer.fields.subscriptionUrl")}
/>
)}
/>
@@ -296,7 +314,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
{...field}
type="number"
placeholder="60"
label={t("HTTP Request Timeout")}
label={t("components.profile.viewer.fields.httpTimeout")}
slotProps={{
input: {
endAdornment: (
@@ -321,7 +339,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
{...text}
{...field}
type="number"
label={t("Update Interval")}
label={t("components.profile.viewer.fields.updateInterval")}
slotProps={{
input: {
endAdornment: (
@@ -350,7 +368,9 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
control={control}
render={({ field }) => (
<StyledBox>
<InputLabel>{t("Use System Proxy")}</InputLabel>
<InputLabel>
{t("components.profile.viewer.fields.useSystemProxy")}
</InputLabel>
<Switch checked={field.value} {...field} color="primary" />
</StyledBox>
)}
@@ -361,7 +381,9 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
control={control}
render={({ field }) => (
<StyledBox>
<InputLabel>{t("Use Clash Proxy")}</InputLabel>
<InputLabel>
{t("components.profile.viewer.fields.useClashProxy")}
</InputLabel>
<Switch checked={field.value} {...field} color="primary" />
</StyledBox>
)}
@@ -372,7 +394,9 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
control={control}
render={({ field }) => (
<StyledBox>
<InputLabel>{t("Accept Invalid Certs (Danger)")}</InputLabel>
<InputLabel>
{t("components.profile.viewer.fields.acceptInvalidCerts")}
</InputLabel>
<Switch checked={field.value} {...field} color="primary" />
</StyledBox>
)}
@@ -383,7 +407,9 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
control={control}
render={({ field }) => (
<StyledBox>
<InputLabel>{t("Allow Auto Update")}</InputLabel>
<InputLabel>
{t("components.profile.viewer.fields.allowAutoUpdate")}
</InputLabel>
<Switch checked={field.value} {...field} color="primary" />
</StyledBox>
)}

View File

@@ -72,6 +72,44 @@
"trigger": "مزود القواعد",
"dialogTitle": "مزود القواعد"
}
},
"profiles": {
"title": "الملفات الشخصية",
"actions": {
"updateAll": "تحديث جميع الملفات الشخصية",
"viewRuntimeConfig": "عرض تكوين وقت التشغيل",
"reactivate": "إعادة تنشيط الملفات الشخصية",
"import": "استيراد",
"new": "جديد"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
},
"import": {
"placeholder": "رابط الملف الشخصي",
"paste": "لصق",
"clear": "مسح"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "لا يتم دعم سوى ملفات YAML"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "تم التبديل إلى الملف الشخصي",
"profileReactivated": "تم إعادة تنشيط الملف الشخصي",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
}
}
},
"Label-Home": "Home",
@@ -802,6 +840,37 @@
"invalidRule": "قاعدة غير صالحة"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "إنشاء ملف شخصي",
"edit": "تعديل الملف الشخصي"
},
"buttons": {
"save": "حفظ",
"cancel": "إلغاء"
},
"fields": {
"type": "النوع",
"name": "الاسم",
"description": "الوصف",
"subscriptionUrl": "رابط الاشتراك",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "فاصل التحديث",
"useSystemProxy": "استخدام وكيل النظام",
"useClashProxy": "استخدام وكيل Clash",
"acceptInvalidCerts": "قبول الشهادات غير الصالحة (خطر)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
},
"fileInput": {
"chooseFile": "اختر ملف"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "Regelsammlung",
"dialogTitle": "Regelsammlung"
}
},
"profiles": {
"title": "Abonnement",
"actions": {
"updateAll": "Alle Abonnements aktualisieren",
"viewRuntimeConfig": "Laufzeit-Abonnement anzeigen",
"reactivate": "Abonnement erneut aktivieren",
"import": "Importieren",
"new": "Neu"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
},
"import": {
"placeholder": "Abonnement-Datei-Link",
"paste": "Einfügen",
"clear": "Löschen"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Nur YAML-Dateien werden unterstützt"
},
"notifications": {
"importRetry": "Import des Abonnements fehlgeschlagen. Versuche es mit dem Clash-Proxy erneut...",
"importFail": "Import des Abonnements auch mit Clash-Proxy fehlgeschlagen",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Abonnement gewechselt",
"profileReactivated": "Abonnement erneut aktiviert",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
}
}
},
"Label-Home": "Startseite",
@@ -802,6 +840,37 @@
"invalidRule": "Ungültige Regel"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "Neue Konfiguration erstellen",
"edit": "Konfiguration bearbeiten"
},
"buttons": {
"save": "Speichern",
"cancel": "Abbrechen"
},
"fields": {
"type": "Typ",
"name": "Name",
"description": "Beschreibung",
"subscriptionUrl": "Abonnement-Link",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Aktualisierungsintervall",
"useSystemProxy": "Systemproxy zur Aktualisierung verwenden",
"useClashProxy": "Kernel-Proxy zur Aktualisierung verwenden",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Erstellung des Abonnements fehlgeschlagen. Versuche es mit dem Clash-Proxy erneut...",
"creationSuccess": "Erstellung des Abonnements mit Clash-Proxy erfolgreich"
}
},
"fileInput": {
"chooseFile": "Datei auswählen"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "Rule Provider",
"dialogTitle": "Rule Providers"
}
},
"profiles": {
"title": "Profiles",
"actions": {
"updateAll": "Update All Profiles",
"viewRuntimeConfig": "View Runtime Config",
"reactivate": "Reactivate Profiles",
"import": "Import",
"new": "New"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
},
"import": {
"placeholder": "Profile URL",
"paste": "Paste",
"clear": "Clear"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Only YAML Files Supported"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profile Switched",
"profileReactivated": "Profile Reactivated",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
}
}
},
"Label-Home": "Home",
@@ -802,6 +840,37 @@
"invalidRule": "Invalid Rule"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "Create Profile",
"edit": "Edit Profile"
},
"buttons": {
"save": "Save",
"cancel": "Cancel"
},
"fields": {
"type": "Type",
"name": "Name",
"description": "Descriptions",
"subscriptionUrl": "Subscription URL",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Update Interval",
"useSystemProxy": "Use System Proxy",
"useClashProxy": "Use Clash Proxy",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
},
"fileInput": {
"chooseFile": "Choose File"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "Proveedor de reglas",
"dialogTitle": "Proveedor de reglas"
}
},
"profiles": {
"title": "Suscripciones",
"actions": {
"updateAll": "Actualizar todas las suscripciones",
"viewRuntimeConfig": "Ver configuración en tiempo de ejecución",
"reactivate": "Reactivar suscripciones",
"import": "Importar",
"new": "Nuevo"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
},
"import": {
"placeholder": "Enlace del archivo de suscripción",
"paste": "Pegar",
"clear": "Limpiar"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Solo se admiten archivos YAML"
},
"notifications": {
"importRetry": "Error al importar la suscripción. Intentando con el proxy de Clash...",
"importFail": "Error al importar incluso con el proxy de Clash",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Suscripción cambiada",
"profileReactivated": "Suscripción reactivada",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
}
}
},
"Label-Home": "Hogar",
@@ -802,6 +840,37 @@
"invalidRule": "Regla no válida"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "Crear configuración",
"edit": "Editar configuración"
},
"buttons": {
"save": "Guardar",
"cancel": "Cancelar"
},
"fields": {
"type": "Tipo",
"name": "Nombre",
"description": "Descripción",
"subscriptionUrl": "Enlace de suscripción",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Intervalo de actualización",
"useSystemProxy": "Usar proxy del sistema para actualizar",
"useClashProxy": "Usar proxy del núcleo para actualizar",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Error al crear la suscripción. Intentando con el proxy de Clash...",
"creationSuccess": "Creación de la suscripción con el proxy de Clash exitosa"
}
},
"fileInput": {
"chooseFile": "Elegir archivo"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "تأمین‌کننده قانون",
"dialogTitle": "تأمین‌کننده قانون"
}
},
"profiles": {
"title": "پروفایل‌ها",
"actions": {
"updateAll": "به‌روزرسانی همه پروفایل‌ها",
"viewRuntimeConfig": "مشاهده پیکربندی زمان اجرا",
"reactivate": "فعال‌سازی مجدد پروفایل‌ها",
"import": "وارد کردن",
"new": "جدید"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
},
"import": {
"placeholder": "آدرس پروفایل",
"paste": "چسباندن",
"clear": "پاک کردن"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "فقط فایل‌های YAML پشتیبانی می‌شوند"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "پروفایل تغییر یافت",
"profileReactivated": "پروفایل مجدداً فعال شد",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
}
}
},
"Label-Home": "Home",
@@ -802,6 +840,37 @@
"invalidRule": "قانون نامعتبر"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "ایجاد پروفایل",
"edit": "ویرایش پروفایل"
},
"buttons": {
"save": "ذخیره",
"cancel": "لغو"
},
"fields": {
"type": "نوع",
"name": "نام",
"description": "توضیحات",
"subscriptionUrl": "آدرس اشتراک",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "فاصله زمانی به‌روزرسانی",
"useSystemProxy": "استفاده از پراکسی سیستم",
"useClashProxy": "استفاده از پراکسی Clash",
"acceptInvalidCerts": "پذیرش گواهی‌نامه‌های نامعتبر (خطرناک)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
},
"fileInput": {
"chooseFile": "انتخاب فایل"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "Penyedia Aturan",
"dialogTitle": "Penyedia Aturan"
}
},
"profiles": {
"title": "Profil",
"actions": {
"updateAll": "Perbarui Semua Profil",
"viewRuntimeConfig": "Lihat Konfigurasi Runtime",
"reactivate": "Reaktivasi Profil",
"import": "Impor",
"new": "Baru"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
},
"import": {
"placeholder": "URL Profil",
"paste": "Tempel",
"clear": "Bersihkan"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Hanya File YAML yang Didukung"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profil Beralih",
"profileReactivated": "Profil Diaktifkan Kembali",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
}
}
},
"Label-Home": "Home",
@@ -802,6 +840,37 @@
"invalidRule": "Aturan Tidak Valid"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "Buat Profil",
"edit": "Ubah Profil"
},
"buttons": {
"save": "Simpan",
"cancel": "Batal"
},
"fields": {
"type": "Jenis",
"name": "Nama",
"description": "Deskripsi",
"subscriptionUrl": "URL Langganan",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Interval Pembaruan",
"useSystemProxy": "Gunakan Proksi Sistem",
"useClashProxy": "Gunakan Proksi Clash",
"acceptInvalidCerts": "Terima Sertifikat Tidak Valid (Bahaya)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
},
"fileInput": {
"chooseFile": "Pilih Berkas"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "ルールプロバイダー",
"dialogTitle": "ルールプロバイダー"
}
},
"profiles": {
"title": "プロファイル",
"actions": {
"updateAll": "すべてのプロファイルを更新",
"viewRuntimeConfig": "実行時のプロファイルを表示",
"reactivate": "プロファイルを再アクティブ化",
"import": "インポート",
"new": "新規作成"
},
"batch": {
"title": "バッチ操作",
"delete": "選択したプロファイルを削除",
"selectAll": "すべて選択",
"deselectAll": "すべての選択を解除",
"done": "完了",
"selected": "選択済み",
"items": "アイテム"
},
"import": {
"placeholder": "プロファイルファイルのURL",
"paste": "貼り付け",
"clear": "クリア"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "YAMLファイルのみサポートされています。"
},
"notifications": {
"importRetry": "インポートに失敗しました。Clashプロキシを使用して再試行します...",
"importFail": "Clashプロキシを使用してもインポートに失敗しました。",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "プロファイルが切り替えられました。",
"profileReactivated": "プロファイルが再アクティブ化されました。",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "選択したプロファイルが正常に削除されました"
}
}
},
"Label-Home": "ホーム",
@@ -802,6 +840,37 @@
"invalidRule": "無効なルール"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "新規プロファイルを作成",
"edit": "プロファイルを編集"
},
"buttons": {
"save": "保存",
"cancel": "キャンセル"
},
"fields": {
"type": "タイプ",
"name": "名前",
"description": "説明",
"subscriptionUrl": "サブスクリプションURL",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "更新間隔",
"useSystemProxy": "システムプロキシを使用して更新",
"useClashProxy": "クラッシュプロキシを使用して更新",
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "プロファイルの作成に失敗しました。Clashプロキシを使用して再試行します...",
"creationSuccess": "Clashプロキシを使用してプロファイルの作成に成功しました。"
}
},
"fileInput": {
"chooseFile": "ファイルを選択"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "규칙 제공자",
"dialogTitle": "규칙 제공자"
}
},
"profiles": {
"title": "프로필",
"actions": {
"updateAll": "모든 프로필 업데이트",
"viewRuntimeConfig": "런타임 설정 보기",
"reactivate": "프로필 재활성화",
"import": "가져오기",
"new": "새로 만들기"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
},
"import": {
"placeholder": "프로필 URL",
"paste": "붙여넣기",
"clear": "지우기"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Only YAML Files Supported"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profile Switched",
"profileReactivated": "Profile Reactivated",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
}
}
},
"Label-Home": "홈",
@@ -802,6 +840,37 @@
"invalidRule": "잘못된 규칙"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "프로필 생성",
"edit": "프로필 편집"
},
"buttons": {
"save": "저장",
"cancel": "취소"
},
"fields": {
"type": "유형",
"name": "이름",
"description": "설명",
"subscriptionUrl": "구독 URL",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "업데이트 간격",
"useSystemProxy": "시스템 프록시 사용",
"useClashProxy": "Clash 프록시 사용",
"acceptInvalidCerts": "잘못된 인증서 허용(위험)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
},
"fileInput": {
"chooseFile": "파일 선택"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "Провайдеры правил",
"dialogTitle": "Провайдеры правил"
}
},
"profiles": {
"title": "Профили",
"actions": {
"updateAll": "Обновить все профили",
"viewRuntimeConfig": "Просмотреть используемый конфиг",
"reactivate": "Перезапустить профиль",
"import": "Импорт",
"new": "Новый"
},
"batch": {
"title": "Пакетные операции",
"delete": "Удалить выбранные профили",
"selectAll": "Выбрать все",
"deselectAll": "Отменить выбор всех",
"done": "Готово",
"selected": "Выбрано",
"items": "элементы"
},
"import": {
"placeholder": "URL профиля",
"paste": "Вставить",
"clear": "Очистить"
},
"errors": {
"invalidUrl": "Недопустимая ссылка на профиль, введите адрес, начинающийся с http:// или https://",
"onlyYaml": "Поддерживаются только файлы YAML"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Профиль изменен",
"profileReactivated": "Профиль перезапущен",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Выбранные профили успешно удалены"
}
}
},
"Label-Home": "Главная",
@@ -802,6 +840,37 @@
"invalidRule": "Недействительное правило"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "Создать профиль",
"edit": "Изменить профиль"
},
"buttons": {
"save": "Сохранить",
"cancel": "Отмена"
},
"fields": {
"type": "Тип",
"name": "Название",
"description": "Описание",
"subscriptionUrl": "URL подписки",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Интервал обновления",
"useSystemProxy": "Использовать системный прокси для обновления",
"useClashProxy": "Использовать прокси Clash для обновления",
"acceptInvalidCerts": "Принимать недействительные сертификаты (ОПАСНО)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
},
"fileInput": {
"chooseFile": "Выбрать файл"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "Kural Sağlayıcısı",
"dialogTitle": "Kural Sağlayıcısı"
}
},
"profiles": {
"title": "Profiller",
"actions": {
"updateAll": "Tüm Profilleri Güncelle",
"viewRuntimeConfig": "Çalışma Zamanı Yapılandırmasını Görüntüle",
"reactivate": "Profilleri Yeniden Etkinleştir",
"import": "İçe Aktar",
"new": "Yeni"
},
"batch": {
"title": "Toplu İşlemler",
"delete": "Seçili Profilleri Sil",
"selectAll": "Tümünü Seç",
"deselectAll": "Tüm Seçimi Kaldır",
"done": "Tamam",
"selected": "Seçildi",
"items": "öğeler"
},
"import": {
"placeholder": "Profil URL'si",
"paste": "Yapıştır",
"clear": "Temizle"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Yalnızca YAML Dosyaları Desteklenir"
},
"notifications": {
"importRetry": "İçe aktarma başarısız oldu, Clash vekil ile yeniden deneniyor...",
"importFail": "Clash vekil ile bile içe aktarma başarısız oldu",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Profil Değiştirildi",
"profileReactivated": "Profil Yeniden Etkinleştirildi",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Seçili profiller başarıyla silindi"
}
}
},
"Label-Home": "Ana Sayfa",
@@ -802,6 +840,37 @@
"invalidRule": "Geçersiz Kural"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "Profil Oluştur",
"edit": "Profili Düzenle"
},
"buttons": {
"save": "Kaydet",
"cancel": "İptal"
},
"fields": {
"type": "Tip",
"name": "İsim",
"description": "Açıklamalar",
"subscriptionUrl": "Abonelik URL'si",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Güncelleme Aralığı",
"useSystemProxy": "Sistem Vekil'ini Kullan",
"useClashProxy": "Clash Vekil'ini Kullan",
"acceptInvalidCerts": "Geçersiz Sertifikalara İzin Ver (Tehlikeli)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Profil oluşturma başarısız oldu, Clash vekil ile yeniden deneniyor...",
"creationSuccess": "Clash vekil ile profil oluşturma başarılı oldu"
}
},
"fileInput": {
"chooseFile": "Dosya Seç"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "Кагыйдә провайдеры",
"dialogTitle": "Кагыйдә провайдеры"
}
},
"profiles": {
"title": "Профильләр",
"actions": {
"updateAll": "Барлык профильләрне яңарту",
"viewRuntimeConfig": "Кулланылган конфигурацияне карау",
"reactivate": "Профильләрне янәдән активлаштыру",
"import": "Импорт",
"new": "Яңа"
},
"batch": {
"title": "Batch Operations",
"delete": "Delete Selected Profiles",
"selectAll": "Select All",
"deselectAll": "Deselect All",
"done": "Done",
"selected": "Selected",
"items": "items"
},
"import": {
"placeholder": "Профиль URL-ы",
"paste": "Кую",
"clear": "Чистарту"
},
"errors": {
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
"onlyYaml": "Фәкать YAML-файллар гына хуплана"
},
"notifications": {
"importRetry": "Import failed, retrying with Clash proxy...",
"importFail": "Import failed even with Clash proxy",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "Профиль алмаштырылды",
"profileReactivated": "Профиль яңадан активлаштырылды",
"switchInterrupted": "Profile switch interrupted by new selection",
"batchDeleted": "Selected profiles deleted successfully"
}
}
},
"Label-Home": "Home",
@@ -802,6 +840,37 @@
"invalidRule": "Яраксыз кагыйдә"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "Профиль булдыру",
"edit": "Профильне үзгәртү"
},
"buttons": {
"save": "Саклау",
"cancel": "Баш тарту"
},
"fields": {
"type": "Төр",
"name": "Исем",
"description": "Тасвирламалар",
"subscriptionUrl": "Подписка URL-ы",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "Яңарту интервалы",
"useSystemProxy": "Системалы проксины кулланып яңарту",
"useClashProxy": "Clash прокси кулланып яңарту",
"acceptInvalidCerts": "Дөрес булмаган сертификатларны кабул итү (Куркыныч)",
"allowAutoUpdate": "Allow Auto Update"
},
"notifications": {
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
"creationSuccess": "Profile creation succeeded with Clash proxy"
}
},
"fileInput": {
"chooseFile": "Файл сайлау"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "规则集合",
"dialogTitle": "规则集合"
}
},
"profiles": {
"title": "订阅",
"actions": {
"updateAll": "更新所有订阅",
"viewRuntimeConfig": "查看运行时订阅",
"reactivate": "重新激活订阅",
"import": "导入",
"new": "新建"
},
"batch": {
"title": "批量操作",
"delete": "删除选中订阅",
"selectAll": "全选",
"deselectAll": "取消全选",
"done": "完成",
"selected": "已选中",
"items": "项目"
},
"import": {
"placeholder": "订阅文件链接",
"paste": "粘贴",
"clear": "清除"
},
"errors": {
"invalidUrl": "无效的订阅链接,请输入以 http:// 或 https:// 开头的地址",
"onlyYaml": "仅支持 YAML 文件"
},
"notifications": {
"importRetry": "订阅导入失败,尝试使用 Clash 代理导入",
"importFail": "使用 Clash 代理导入订阅也失败",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "订阅已切换",
"profileReactivated": "订阅已激活",
"switchInterrupted": "配置切换被新选择中断",
"batchDeleted": "选中的订阅已成功删除"
}
}
},
"Label-Home": "首 页",
@@ -802,6 +840,37 @@
"invalidRule": "无效规则"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "新建配置",
"edit": "编辑配置"
},
"buttons": {
"save": "保存",
"cancel": "取消"
},
"fields": {
"type": "类型",
"name": "名称",
"description": "描述",
"subscriptionUrl": "订阅链接",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "更新间隔",
"useSystemProxy": "使用系统代理更新",
"useClashProxy": "使用内核代理更新",
"acceptInvalidCerts": "允许无效证书(危险)",
"allowAutoUpdate": "允许自动更新"
},
"notifications": {
"creationRetry": "订阅创建失败,尝试使用 Clash 代理创建",
"creationSuccess": "使用 Clash 代理创建订阅成功"
}
},
"fileInput": {
"chooseFile": "选择文件"
}
}
}
}

View File

@@ -72,6 +72,44 @@
"trigger": "規則集合",
"dialogTitle": "規則集合"
}
},
"profiles": {
"title": "訂閱",
"actions": {
"updateAll": "更新所有訂閱",
"viewRuntimeConfig": "查看執行時訂閱",
"reactivate": "重新啟用訂閱",
"import": "匯入",
"new": "新增"
},
"batch": {
"title": "批次操作",
"delete": "刪除選取訂閱",
"selectAll": "全選",
"deselectAll": "取消選取",
"done": "完成",
"selected": "已選取",
"items": "項目"
},
"import": {
"placeholder": "訂閱檔網址",
"paste": "貼上",
"clear": "清除"
},
"errors": {
"invalidUrl": "無效的訂閱網址,請輸入以 http:// 或 https:// 開頭的位址",
"onlyYaml": "僅支援 YAML 檔案"
},
"notifications": {
"importRetry": "訂閱匯入失敗,嘗試使用 Clash 代理匯入",
"importFail": "使用 Clash 代理匯入訂閱也失敗",
"importNeedsRefresh": "Profile imported but may need manual refresh",
"importSuccess": "Profile imported successfully, please restart if not visible",
"profileSwitched": "訂閱已切換",
"profileReactivated": "訂閱已啟用",
"switchInterrupted": "配置切換被新的選擇中斷",
"batchDeleted": "選取的訂閱已成功刪除"
}
}
},
"Label-Home": "首 頁",
@@ -802,6 +840,37 @@
"invalidRule": "無效規則"
}
}
},
"profile": {
"viewer": {
"title": {
"create": "新增設定檔",
"edit": "編輯設定檔"
},
"buttons": {
"save": "儲存",
"cancel": "取消"
},
"fields": {
"type": "類型",
"name": "名稱",
"description": "描述",
"subscriptionUrl": "訂閱網址",
"httpTimeout": "HTTP Request Timeout",
"updateInterval": "更新間隔",
"useSystemProxy": "使用系統代理更新",
"useClashProxy": "使用內核代理更新",
"acceptInvalidCerts": "允許無效憑證(危險)",
"allowAutoUpdate": "允許自動更新"
},
"notifications": {
"creationRetry": "訂閱建立失敗,嘗試使用 Clash 代理建立",
"creationSuccess": "使用 Clash 代理建立訂閱成功"
}
},
"fileInput": {
"chooseFile": "選擇檔案"
}
}
}
}

View File

@@ -253,7 +253,7 @@ const ProfilePage = () => {
setActivatings((prev) => prev.filter((id) => id !== previousSwitching));
showNotice(
"info",
`${t("Profile switch interrupted by new selection")}: ${previousSwitching}${newProfile}`,
`${t("pages.profiles.notifications.switchInterrupted")}: ${previousSwitching}${newProfile}`,
3000,
);
},
@@ -297,7 +297,7 @@ const ProfilePage = () => {
for (const file of paths) {
if (!file.endsWith(".yaml") && !file.endsWith(".yml")) {
showNotice("error", t("Only YAML Files Supported"));
showNotice("error", t("pages.profiles.errors.onlyYaml"));
continue;
}
const item = {
@@ -385,7 +385,7 @@ const ProfilePage = () => {
if (!url) return;
// 校验url是否为http/https
if (!/^https?:\/\//i.test(url)) {
showNotice("error", t("Invalid Profile URL"));
showNotice("error", t("pages.profiles.errors.invalidUrl"));
return;
}
setLoading(true);
@@ -439,7 +439,7 @@ const ProfilePage = () => {
}
// 首次导入失败且未检测到数据变更,尝试使用自身代理
showNotice("info", t("Import failed, retrying with Clash proxy..."));
showNotice("info", t("pages.profiles.notifications.importRetry"));
try {
// 使用自身代理尝试导入
await importProfile(url, {
@@ -452,7 +452,7 @@ const ProfilePage = () => {
const retryErrmsg = retryErr?.message || retryErr.toString();
showNotice(
"error",
`${t("Import failed even with Clash proxy")}: ${retryErrmsg}`,
`${t("pages.profiles.notifications.importFail")}: ${retryErrmsg}`,
);
}
} finally {
@@ -524,14 +524,14 @@ const ProfilePage = () => {
await onEnhance(false);
showNotice(
"error",
t("Profile imported but may need manual refresh"),
t("pages.profiles.notifications.importNeedsRefresh"),
3000,
);
} catch (finalError) {
console.error(`[导入刷新] 最终刷新尝试失败:`, finalError);
showNotice(
"error",
t("Profile imported successfully, please restart if not visible"),
t("pages.profiles.notifications.importSuccess"),
5000,
);
}
@@ -650,7 +650,11 @@ const ProfilePage = () => {
closeAllConnections();
if (notifySuccess && success) {
showNotice("success", t("Profile Switched"), 1000);
showNotice(
"success",
t("pages.profiles.notifications.profileSwitched"),
1000,
);
}
console.log(
@@ -747,7 +751,11 @@ const ProfilePage = () => {
await enhanceProfiles();
mutateLogs();
if (notifySuccess) {
showNotice("success", t("Profile Reactivated"), 1000);
showNotice(
"success",
t("pages.profiles.notifications.profileReactivated"),
1000,
);
}
} catch (err: any) {
showNotice("error", err.message || err.toString(), 3000);
@@ -886,7 +894,7 @@ const ProfilePage = () => {
setSelectedProfiles(new Set());
setBatchMode(false);
showNotice("success", t("Selected profiles deleted successfully"));
showNotice("success", t("pages.profiles.notifications.batchDeleted"));
} catch (err: any) {
showNotice("error", err?.message || err.toString());
} finally {
@@ -966,7 +974,7 @@ const ProfilePage = () => {
return (
<BasePage
full
title={t("Profiles")}
title={t("pages.profiles.title")}
contentStyle={{ height: "100%" }}
header={
<Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
@@ -976,7 +984,7 @@ const ProfilePage = () => {
<IconButton
size="small"
color="inherit"
title={t("Batch Operations")}
title={t("pages.profiles.batch.title")}
onClick={toggleBatchMode}
>
<CheckBoxOutlineBlankRounded />
@@ -985,7 +993,7 @@ const ProfilePage = () => {
<IconButton
size="small"
color="inherit"
title={t("Update All Profiles")}
title={t("pages.profiles.actions.updateAll")}
onClick={onUpdateAll}
>
<RefreshRounded />
@@ -994,7 +1002,7 @@ const ProfilePage = () => {
<IconButton
size="small"
color="inherit"
title={t("View Runtime Config")}
title={t("pages.profiles.actions.viewRuntimeConfig")}
onClick={() => configRef.current?.open()}
>
<TextSnippetOutlined />
@@ -1003,7 +1011,7 @@ const ProfilePage = () => {
<IconButton
size="small"
color="primary"
title={t("Reactivate Profiles")}
title={t("pages.profiles.actions.reactivate")}
onClick={() => onEnhance(true)}
>
<LocalFireDepartmentRounded />
@@ -1035,7 +1043,11 @@ const ProfilePage = () => {
<IconButton
size="small"
color="inherit"
title={isAllSelected() ? t("Deselect All") : t("Select All")}
title={
isAllSelected()
? t("pages.profiles.batch.deselectAll")
: t("pages.profiles.batch.selectAll")
}
onClick={
isAllSelected() ? clearAllSelections : selectAllProfiles
}
@@ -1051,19 +1063,20 @@ const ProfilePage = () => {
<IconButton
size="small"
color="error"
title={t("Delete Selected Profiles")}
title={t("pages.profiles.batch.delete")}
onClick={deleteSelectedProfiles}
disabled={selectedProfiles.size === 0}
>
<DeleteRounded />
</IconButton>
<Button size="small" variant="outlined" onClick={toggleBatchMode}>
{t("Done")}
{t("pages.profiles.batch.done")}
</Button>
<Box
sx={{ flex: 1, textAlign: "right", color: "text.secondary" }}
>
{t("Selected")} {selectedProfiles.size} {t("items")}
{t("pages.profiles.batch.selected")} {selectedProfiles.size}{" "}
{t("pages.profiles.batch.items")}
</Box>
</Box>
)}
@@ -1096,7 +1109,7 @@ const ProfilePage = () => {
event.preventDefault();
void onImport();
}}
placeholder={t("Profile URL")}
placeholder={t("pages.profiles.import.placeholder")}
slotProps={{
input: {
sx: { pr: 1 },
@@ -1104,7 +1117,7 @@ const ProfilePage = () => {
<IconButton
size="small"
sx={{ p: 0.5 }}
title={t("Paste")}
title={t("pages.profiles.import.paste")}
onClick={onCopyLink}
>
<ContentPasteRounded fontSize="inherit" />
@@ -1113,7 +1126,7 @@ const ProfilePage = () => {
<IconButton
size="small"
sx={{ p: 0.5 }}
title={t("Clear")}
title={t("pages.profiles.import.clear")}
onClick={() => setUrl("")}
>
<ClearRounded fontSize="inherit" />
@@ -1130,7 +1143,7 @@ const ProfilePage = () => {
sx={{ borderRadius: "6px" }}
onClick={onImport}
>
{t("Import")}
{t("pages.profiles.actions.import")}
</LoadingButton>
<Button
variant="contained"
@@ -1138,7 +1151,7 @@ const ProfilePage = () => {
sx={{ borderRadius: "6px" }}
onClick={() => viewerRef.current?.create()}
>
{t("New")}
{t("pages.profiles.actions.new")}
</Button>
</Stack>