mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-10-30 18:52:12 +08:00
chore: update i18n
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use super::CmdResult;
|
||||
use super::{CmdResult, WithErrorCode as _, coded_error};
|
||||
use crate::feat;
|
||||
use crate::utils::{dirs, yaml_emitter};
|
||||
use crate::{
|
||||
@@ -32,7 +32,9 @@ pub async fn get_clash_info() -> CmdResult<ClashInfo> {
|
||||
/// 修改Clash配置
|
||||
#[tauri::command]
|
||||
pub async fn patch_clash_config(payload: Mapping) -> CmdResult {
|
||||
feat::patch_clash(&payload).await.stringify_err()
|
||||
feat::patch_clash(&payload)
|
||||
.await
|
||||
.with_error_code("CLASH_CONFIG_UPDATE_FAILED")
|
||||
}
|
||||
|
||||
/// 修改Clash模式
|
||||
@@ -41,7 +43,9 @@ pub async fn patch_clash_config(payload: Mapping) -> CmdResult {
|
||||
/// 并提示用户(此前命令始终返回 `Ok(())`,吞掉了后端错误)。
|
||||
#[tauri::command]
|
||||
pub async fn patch_clash_mode(payload: String) -> CmdResult {
|
||||
feat::change_clash_mode(payload).await
|
||||
feat::change_clash_mode(payload)
|
||||
.await
|
||||
.with_error_code("CLASH_MODE_UPDATE_FAILED")
|
||||
}
|
||||
|
||||
/// 获取当前 Clash 模式(容错读取)
|
||||
@@ -74,7 +78,7 @@ pub async fn change_clash_core(clash_core: String) -> CmdResult<Option<String>>
|
||||
let error_msg: String = format!("Core changed but failed to restart: {err}").into();
|
||||
handle::Handle::notice_message("config_core::change_error", error_msg.clone());
|
||||
logging!(error, Type::Core, "{error_msg}");
|
||||
Ok(Some(error_msg))
|
||||
Ok(Some(coded_error("CORE_CHANGE_FAILED", error_msg)))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,7 +86,7 @@ pub async fn change_clash_core(clash_core: String) -> CmdResult<Option<String>>
|
||||
let error_msg: String = err;
|
||||
logging!(error, Type::Core, "failed to change core: {error_msg}");
|
||||
handle::Handle::notice_message("config_core::change_error", error_msg.clone());
|
||||
Ok(Some(error_msg))
|
||||
Ok(Some(coded_error("CORE_CHANGE_FAILED", error_msg)))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -90,7 +94,10 @@ pub async fn change_clash_core(clash_core: String) -> CmdResult<Option<String>>
|
||||
/// 启动核心
|
||||
#[tauri::command]
|
||||
pub async fn start_core() -> CmdResult {
|
||||
let result = CoreManager::global().start_core().await.stringify_err();
|
||||
let result = CoreManager::global()
|
||||
.start_core()
|
||||
.await
|
||||
.with_error_code("CORE_START_FAILED");
|
||||
if result.is_ok() {
|
||||
handle::Handle::refresh_clash();
|
||||
}
|
||||
@@ -101,7 +108,10 @@ pub async fn start_core() -> CmdResult {
|
||||
#[tauri::command]
|
||||
pub async fn stop_core() -> CmdResult {
|
||||
logging_error!(Type::Core, Config::profiles().await.data_arc().save_file().await);
|
||||
let result = CoreManager::global().stop_core().await.stringify_err();
|
||||
let result = CoreManager::global()
|
||||
.stop_core()
|
||||
.await
|
||||
.with_error_code("CORE_STOP_FAILED");
|
||||
if result.is_ok() {
|
||||
handle::Handle::refresh_clash();
|
||||
}
|
||||
@@ -112,7 +122,10 @@ pub async fn stop_core() -> CmdResult {
|
||||
#[tauri::command]
|
||||
pub async fn restart_core() -> CmdResult {
|
||||
logging_error!(Type::Core, Config::profiles().await.data_arc().save_file().await);
|
||||
let result = CoreManager::global().restart_core().await.stringify_err();
|
||||
let result = CoreManager::global()
|
||||
.restart_core()
|
||||
.await
|
||||
.with_error_code("CORE_RESTART_FAILED");
|
||||
if result.is_ok() {
|
||||
handle::Handle::refresh_clash();
|
||||
}
|
||||
|
||||
@@ -3,6 +3,12 @@ use smartstring::alias::String;
|
||||
|
||||
pub type CmdResult<T = ()> = Result<T, String>;
|
||||
|
||||
const USER_ERROR_PREFIX: &str = "CVR_ERROR:";
|
||||
|
||||
pub fn coded_error(code: &str, detail: impl std::fmt::Display) -> String {
|
||||
format!("{USER_ERROR_PREFIX}{code}\n{detail}").into()
|
||||
}
|
||||
|
||||
// Command modules
|
||||
pub mod app;
|
||||
pub mod backup;
|
||||
@@ -46,6 +52,10 @@ pub trait StringifyErr<T> {
|
||||
F: Fn(&str);
|
||||
}
|
||||
|
||||
pub trait WithErrorCode<T> {
|
||||
fn with_error_code(self, code: &str) -> CmdResult<T>;
|
||||
}
|
||||
|
||||
impl<T, E: std::fmt::Display> StringifyErr<T> for Result<T, E> {
|
||||
fn stringify_err(self) -> CmdResult<T> {
|
||||
self.map_err(|e| e.to_string().into())
|
||||
@@ -62,3 +72,22 @@ impl<T, E: std::fmt::Display> StringifyErr<T> for Result<T, E> {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, E: std::fmt::Display> WithErrorCode<T> for Result<T, E> {
|
||||
fn with_error_code(self, code: &str) -> CmdResult<T> {
|
||||
self.map_err(|error| coded_error(code, error))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::coded_error;
|
||||
|
||||
#[test]
|
||||
fn coded_error_preserves_stable_code_and_diagnostic_detail() {
|
||||
assert_eq!(
|
||||
coded_error("CORE_RESTART_FAILED", "connection refused"),
|
||||
"CVR_ERROR:CORE_RESTART_FAILED\nconnection refused"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
use super::CmdResult;
|
||||
use super::StringifyErr as _;
|
||||
use super::{CmdResult, StringifyErr as _, WithErrorCode as _, coded_error};
|
||||
use crate::cmd::validate::{ValidationNoticeTarget, handle_validation_notice};
|
||||
use crate::config::profiles;
|
||||
use crate::utils::window_manager::WindowManager;
|
||||
@@ -60,7 +59,7 @@ pub async fn enhance_profiles() -> CmdResult<ValidationOutcome> {
|
||||
}
|
||||
Err(e) => {
|
||||
logging!(error, Type::Cmd, "{}", e);
|
||||
Err(e.to_string().into())
|
||||
Err(coded_error("PROFILE_ENHANCE_FAILED", e))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,18 +77,18 @@ pub async fn import_profile(url: std::string::String, option: Option<PrfOption>)
|
||||
}
|
||||
Err(e) => {
|
||||
logging!(error, Type::Cmd, "[导入订阅] 下载失败: {}", e);
|
||||
return Err(profile_import_error(&e).into());
|
||||
return Err(coded_error("PROFILE_IMPORT_FAILED", profile_import_error(&e)));
|
||||
}
|
||||
};
|
||||
|
||||
if let Err(e) = profiles_append_item_safe(item).await {
|
||||
logging!(error, Type::Cmd, "[导入订阅] 保存配置失败: {}", e);
|
||||
return Err(format!("导入订阅失败: {}", e).into());
|
||||
return Err(coded_error("PROFILE_IMPORT_FAILED", e));
|
||||
}
|
||||
|
||||
if let Err(e) = profiles_save_file_safe().await {
|
||||
logging!(error, Type::Cmd, "[导入订阅] 保存配置文件失败: {}", e);
|
||||
return Err(format!("导入订阅失败: {}", e).into());
|
||||
return Err(coded_error("PROFILE_IMPORT_FAILED", e));
|
||||
}
|
||||
logging!(info, Type::Cmd, "[导入订阅] 配置文件保存成功");
|
||||
logging_error!(Type::Timer, Timer::global().refresh().await);
|
||||
@@ -113,7 +112,7 @@ pub async fn reorder_profile(active_id: String, over_id: String) -> CmdResult {
|
||||
}
|
||||
Err(err) => {
|
||||
logging!(error, Type::Cmd, "重新排序配置文件失败: {}", err);
|
||||
Err(format!("重新排序配置文件失败: {}", err).into())
|
||||
Err(coded_error("PROFILE_REORDER_FAILED", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -124,7 +123,9 @@ pub async fn reorder_profile(active_id: String, over_id: String) -> CmdResult {
|
||||
pub async fn create_profile(item: PrfItem, file_data: Option<String>) -> CmdResult {
|
||||
match profiles_append_item_with_filedata_safe(&item, file_data).await {
|
||||
Ok(_) => {
|
||||
profiles_save_file_safe().await.stringify_err()?;
|
||||
profiles_save_file_safe()
|
||||
.await
|
||||
.with_error_code("PROFILE_CREATE_FAILED")?;
|
||||
logging_error!(Type::Timer, Timer::global().refresh().await);
|
||||
// 发送配置变更通知
|
||||
if let Some(uid) = &item.uid {
|
||||
@@ -133,10 +134,7 @@ pub async fn create_profile(item: PrfItem, file_data: Option<String>) -> CmdResu
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
Err(err) => match err.to_string().as_str() {
|
||||
"the file already exists" => Err("the file already exists".into()),
|
||||
_ => Err(format!("add profile error: {err}").into()),
|
||||
},
|
||||
Err(err) => Err(coded_error("PROFILE_CREATE_FAILED", err)),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,7 +145,7 @@ pub async fn update_profile(index: String, option: Option<PrfOption>) -> CmdResu
|
||||
Ok(_) => Ok(()),
|
||||
Err(e) => {
|
||||
logging!(error, Type::Cmd, "{}", e);
|
||||
Err(e.to_string().into())
|
||||
Err(coded_error("PROFILE_UPDATE_FAILED", e))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -156,8 +154,12 @@ pub async fn update_profile(index: String, option: Option<PrfOption>) -> CmdResu
|
||||
#[tauri::command]
|
||||
pub async fn delete_profile(index: String) -> CmdResult {
|
||||
// 使用Send-safe helper函数
|
||||
let should_update = profiles_delete_item_safe(&index).await.stringify_err()?;
|
||||
profiles_save_file_safe().await.stringify_err()?;
|
||||
let should_update = profiles_delete_item_safe(&index)
|
||||
.await
|
||||
.with_error_code("PROFILE_DELETE_FAILED")?;
|
||||
profiles_save_file_safe()
|
||||
.await
|
||||
.with_error_code("PROFILE_DELETE_FAILED")?;
|
||||
if let Err(e) = Tray::global().update_tooltip().await {
|
||||
logging!(warn, Type::Cmd, "Warning: 异步更新托盘提示失败: {e}");
|
||||
}
|
||||
@@ -176,15 +178,18 @@ pub async fn delete_profile(index: String) -> CmdResult {
|
||||
Ok(outcome) => {
|
||||
logging!(warn, Type::Cmd, "删除订阅后更新配置失败: {}", outcome);
|
||||
handle_validation_notice(&outcome, ValidationNoticeTarget::Runtime, "运行时配置");
|
||||
return Err(outcome.to_string().into());
|
||||
return Err(coded_error("PROFILE_DELETE_FAILED", outcome));
|
||||
}
|
||||
Err(e) => {
|
||||
logging!(error, Type::Cmd, "{}", e);
|
||||
return Err(e.to_string().into());
|
||||
return Err(coded_error("PROFILE_DELETE_FAILED", e));
|
||||
}
|
||||
}
|
||||
}
|
||||
Timer::global().refresh().await.stringify_err()?;
|
||||
Timer::global()
|
||||
.refresh()
|
||||
.await
|
||||
.with_error_code("PROFILE_DELETE_FAILED")?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -322,7 +327,9 @@ pub async fn patch_profiles_config(profiles: IProfiles) -> CmdResult<ValidationO
|
||||
|
||||
Config::profiles().await.edit_draft(|d| d.patch_config(&profiles));
|
||||
|
||||
perform_config_update(target_profile, previous_profile.as_ref()).await
|
||||
perform_config_update(target_profile, previous_profile.as_ref())
|
||||
.await
|
||||
.map_err(|error| coded_error("PROFILE_SWITCH_FAILED", error))
|
||||
}
|
||||
|
||||
/// 根据profile name修改profiles
|
||||
@@ -354,7 +361,9 @@ pub async fn patch_profile(index: String, profile: PrfItem) -> CmdResult {
|
||||
false
|
||||
};
|
||||
|
||||
profiles_patch_item_safe(&index, &profile).await.stringify_err()?;
|
||||
profiles_patch_item_safe(&index, &profile)
|
||||
.await
|
||||
.with_error_code("PROFILE_UPDATE_FAILED")?;
|
||||
|
||||
// 如果更新间隔或允许自动更新变更,异步刷新定时器
|
||||
if should_refresh_timer {
|
||||
@@ -379,17 +388,22 @@ pub async fn view_profile(index: String) -> CmdResult {
|
||||
let profiles_ref = profiles.latest_arc();
|
||||
let file = profiles_ref
|
||||
.get_item(&index)
|
||||
.stringify_err()?
|
||||
.with_error_code("PROFILE_OPEN_FAILED")?
|
||||
.file
|
||||
.as_ref()
|
||||
.ok_or("the file field is null")?;
|
||||
.ok_or_else(|| coded_error("PROFILE_OPEN_FAILED", "the file field is null"))?;
|
||||
|
||||
let path = dirs::app_profiles_dir().stringify_err()?.join(file.as_str());
|
||||
let path = dirs::app_profiles_dir()
|
||||
.with_error_code("PROFILE_OPEN_FAILED")?
|
||||
.join(file.as_str());
|
||||
if !path.exists() {
|
||||
return CmdResult::Err(format!("file not found \"{}\"", path.display()).into());
|
||||
return CmdResult::Err(coded_error(
|
||||
"PROFILE_OPEN_FAILED",
|
||||
format!("file not found \"{}\"", path.display()),
|
||||
));
|
||||
}
|
||||
|
||||
help::open_file(path).stringify_err()
|
||||
help::open_file(path).with_error_code("PROFILE_OPEN_FAILED")
|
||||
}
|
||||
|
||||
/// 读取配置文件内容
|
||||
@@ -399,23 +413,32 @@ pub async fn read_profile_file(index: String) -> CmdResult<String> {
|
||||
let profiles = Config::profiles().await;
|
||||
let profiles_ref = profiles.latest_arc();
|
||||
PrfItem {
|
||||
file: profiles_ref.get_item(&index).stringify_err()?.file.to_owned(),
|
||||
file: profiles_ref
|
||||
.get_item(&index)
|
||||
.with_error_code("PROFILE_READ_FAILED")?
|
||||
.file
|
||||
.to_owned(),
|
||||
..Default::default()
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(file) = item.file.as_ref() {
|
||||
let path = dirs::app_profiles_dir().stringify_err()?.join(file.as_str());
|
||||
let path = dirs::app_profiles_dir()
|
||||
.with_error_code("PROFILE_READ_FAILED")?
|
||||
.join(file.as_str());
|
||||
match tokio::fs::try_exists(&path).await {
|
||||
Ok(true) => {}
|
||||
Ok(false) => return Ok(String::new()),
|
||||
Err(err) => {
|
||||
return Err(format!("failed to check profile file \"{}\": {err}", path.display()).into());
|
||||
return Err(coded_error(
|
||||
"PROFILE_READ_FAILED",
|
||||
format!("failed to check profile file \"{}\": {err}", path.display()),
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let data = item.read_file().await.stringify_err()?;
|
||||
let data = item.read_file().await.with_error_code("PROFILE_READ_FAILED")?;
|
||||
Ok(data)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,30 +1,27 @@
|
||||
use super::{CmdResult, StringifyErr as _};
|
||||
use super::{CmdResult, WithErrorCode as _};
|
||||
use crate::core::{
|
||||
CoreManager,
|
||||
service::{self, SERVICE_MANAGER, ServiceStatus},
|
||||
};
|
||||
|
||||
async fn execute_service_operation_sync(status: ServiceStatus, op_type: &str) -> CmdResult {
|
||||
async fn execute_service_operation_sync(status: ServiceStatus, error_code: &str) -> CmdResult {
|
||||
let manager = CoreManager::global();
|
||||
let _lifecycle = manager.lifecycle_lock.lock().await;
|
||||
if matches!(
|
||||
&status,
|
||||
ServiceStatus::ReinstallRequired | ServiceStatus::ForceReinstallRequired
|
||||
) {
|
||||
manager
|
||||
.controlled_stop_core_inner()
|
||||
.await
|
||||
.map_err(|error| format!("{op_type} Service failed: {error:#}"))?;
|
||||
manager.controlled_stop_core_inner().await.with_error_code(error_code)?;
|
||||
}
|
||||
SERVICE_MANAGER
|
||||
.handle_service_status(status)
|
||||
.await
|
||||
.map_err(|e| format!("{op_type} Service failed: {e}").into())
|
||||
.with_error_code(error_code)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn install_service() -> CmdResult {
|
||||
execute_service_operation_sync(ServiceStatus::InstallRequired, "Install").await
|
||||
execute_service_operation_sync(ServiceStatus::InstallRequired, "SERVICE_INSTALL_FAILED").await
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
@@ -32,17 +29,17 @@ pub async fn uninstall_service() -> CmdResult {
|
||||
CoreManager::global()
|
||||
.uninstall_service_and_start_sidecar()
|
||||
.await
|
||||
.map_err(|error| format!("Uninstall Service failed: {error:#}").into())
|
||||
.with_error_code("SERVICE_UNINSTALL_FAILED")
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn reinstall_service() -> CmdResult {
|
||||
execute_service_operation_sync(ServiceStatus::ReinstallRequired, "Reinstall").await
|
||||
execute_service_operation_sync(ServiceStatus::ReinstallRequired, "SERVICE_REINSTALL_FAILED").await
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn repair_service() -> CmdResult {
|
||||
execute_service_operation_sync(ServiceStatus::ForceReinstallRequired, "Repair").await
|
||||
execute_service_operation_sync(ServiceStatus::ForceReinstallRequired, "SERVICE_REPAIR_FAILED").await
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
@@ -60,5 +57,5 @@ pub async fn continue_with_sidecar() -> CmdResult {
|
||||
crate::core::CoreManager::global()
|
||||
.continue_with_sidecar()
|
||||
.await
|
||||
.stringify_err()
|
||||
.with_error_code("SERVICE_SIDECAR_FAILED")
|
||||
}
|
||||
|
||||
@@ -57,10 +57,7 @@ pub async fn restart_app() {
|
||||
|
||||
if !cleanup_result.core_stopped {
|
||||
handle::Handle::global().clear_is_exiting();
|
||||
handle::Handle::notice_message(
|
||||
"set_config::error",
|
||||
"Failed to stop the core safely; restart was cancelled",
|
||||
);
|
||||
handle::Handle::notice_message("app_restart::core_stop_failed", "");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -128,10 +128,7 @@ pub async fn quit() -> clash_verge_signal::ShutdownOutcome {
|
||||
|
||||
if should_abort_exit_after_cleanup(cleanup_result.core_stopped) {
|
||||
handle::Handle::global().clear_is_exiting();
|
||||
handle::Handle::notice_message(
|
||||
"set_config::error",
|
||||
"Failed to stop the core safely; quit was cancelled",
|
||||
);
|
||||
handle::Handle::notice_message("app_quit::core_stop_failed", "");
|
||||
return clash_verge_signal::ShutdownOutcome::Canceled;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,18 +1,20 @@
|
||||
import { ReactNode } from 'react'
|
||||
import { ErrorBoundary, FallbackProps } from 'react-error-boundary'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
|
||||
function ErrorFallback({ error }: FallbackProps) {
|
||||
const { t } = useTranslation()
|
||||
const errorMessage = error instanceof Error ? error.message : String(error)
|
||||
const errorStack = error instanceof Error ? error.stack : undefined
|
||||
|
||||
return (
|
||||
<div role="alert" style={{ padding: 16 }}>
|
||||
<h4>Something went wrong:(</h4>
|
||||
<h4>{t('shared.feedback.errors.unexpected')}</h4>
|
||||
|
||||
<pre>{errorMessage}</pre>
|
||||
|
||||
<details title="Error Stack">
|
||||
<summary>Error Stack</summary>
|
||||
<details title={t('shared.feedback.errors.stack')}>
|
||||
<summary>{t('shared.feedback.errors.stack')}</summary>
|
||||
<pre>{errorStack}</pre>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
@@ -92,26 +92,61 @@ function convertDelayColor(
|
||||
}
|
||||
}
|
||||
|
||||
function getSignalIcon(delay: number): {
|
||||
function getSignalIcon(
|
||||
delay: number,
|
||||
translate: (key: string) => string,
|
||||
): {
|
||||
icon: React.ReactElement
|
||||
text: string
|
||||
color: string
|
||||
} {
|
||||
if (delay === -2)
|
||||
return { icon: <SignalNone />, text: '测试中', color: 'text.secondary' }
|
||||
return {
|
||||
icon: <SignalNone />,
|
||||
text: translate('home.components.currentProxy.status.testing'),
|
||||
color: 'text.secondary',
|
||||
}
|
||||
if (delay === -1)
|
||||
return { icon: <SignalNone />, text: '未测试', color: 'text.secondary' }
|
||||
return {
|
||||
icon: <SignalNone />,
|
||||
text: translate('home.components.currentProxy.status.untested'),
|
||||
color: 'text.secondary',
|
||||
}
|
||||
if (delay > 1e5)
|
||||
return { icon: <SignalError />, text: '错误', color: 'error.main' }
|
||||
return {
|
||||
icon: <SignalError />,
|
||||
text: translate('home.components.currentProxy.status.error'),
|
||||
color: 'error.main',
|
||||
}
|
||||
if (delay === 0 || delay >= 10000)
|
||||
return { icon: <SignalError />, text: '超时', color: 'error.main' }
|
||||
return {
|
||||
icon: <SignalError />,
|
||||
text: translate('home.components.currentProxy.status.timeout'),
|
||||
color: 'error.main',
|
||||
}
|
||||
if (delay >= 500)
|
||||
return { icon: <SignalWeak />, text: '延迟较高', color: 'error.main' }
|
||||
return {
|
||||
icon: <SignalWeak />,
|
||||
text: translate('home.components.currentProxy.status.latencyHigh'),
|
||||
color: 'error.main',
|
||||
}
|
||||
if (delay >= 300)
|
||||
return { icon: <SignalMedium />, text: '延迟中等', color: 'warning.main' }
|
||||
return {
|
||||
icon: <SignalMedium />,
|
||||
text: translate('home.components.currentProxy.status.latencyMedium'),
|
||||
color: 'warning.main',
|
||||
}
|
||||
if (delay >= 200)
|
||||
return { icon: <SignalGood />, text: '延迟良好', color: 'info.main' }
|
||||
return { icon: <SignalStrong />, text: '延迟极佳', color: 'success.main' }
|
||||
return {
|
||||
icon: <SignalGood />,
|
||||
text: translate('home.components.currentProxy.status.latencyGood'),
|
||||
color: 'info.main',
|
||||
}
|
||||
return {
|
||||
icon: <SignalStrong />,
|
||||
text: translate('home.components.currentProxy.status.latencyExcellent'),
|
||||
color: 'success.main',
|
||||
}
|
||||
}
|
||||
|
||||
export const CurrentProxyCard = () => {
|
||||
@@ -378,8 +413,12 @@ export const CurrentProxyCard = () => {
|
||||
// 信号图标(增加非空校验)
|
||||
const signalInfo =
|
||||
currentProxy && selectedGroupName
|
||||
? getSignalIcon(currentDelay)
|
||||
: { icon: <SignalNone />, text: '未初始化', color: 'text.secondary' }
|
||||
? getSignalIcon(currentDelay, t)
|
||||
: {
|
||||
icon: <SignalNone />,
|
||||
text: t('home.components.currentProxy.status.uninitialized'),
|
||||
color: 'text.secondary',
|
||||
}
|
||||
|
||||
const checkCurrentProxyDelay = useCallback(async () => {
|
||||
if (autoCheckInProgressRef.current) return
|
||||
@@ -617,7 +656,7 @@ export const CurrentProxyCard = () => {
|
||||
title={
|
||||
currentProxy
|
||||
? `${signalInfo.text}: ${delayManager.formatDelay(currentDelay)}`
|
||||
: '无代理节点'
|
||||
: t('home.components.currentProxy.status.noProxyNode')
|
||||
}
|
||||
>
|
||||
<Box sx={{ color: signalInfo.color }}>
|
||||
|
||||
@@ -380,7 +380,7 @@ export const EnhancedCanvasTrafficGraph = memo(
|
||||
// 格式化时间戳
|
||||
const timeStr = dataPoint.timestamp
|
||||
? formatTrafficName(dataPoint.timestamp)
|
||||
: '未知时间'
|
||||
: t('home.components.traffic.unknownTime')
|
||||
|
||||
// 计算数据点对应的Y坐标位置(用于高亮)
|
||||
const { topValue: tvH, bottomValue: bvH } = yScale
|
||||
@@ -420,7 +420,7 @@ export const EnhancedCanvasTrafficGraph = memo(
|
||||
})
|
||||
})
|
||||
},
|
||||
[displayData, calculateY, yScale],
|
||||
[displayData, calculateY, yScale, t],
|
||||
)
|
||||
|
||||
// 鼠标离开处理
|
||||
@@ -1205,7 +1205,11 @@ export const EnhancedCanvasTrafficGraph = memo(
|
||||
opacity: 0.7,
|
||||
}}
|
||||
>
|
||||
{chartStyle === 'bezier' ? 'Smooth' : 'Linear'}
|
||||
{t(
|
||||
chartStyle === 'bezier'
|
||||
? 'home.components.traffic.chartStyles.smooth'
|
||||
: 'home.components.traffic.chartStyles.linear',
|
||||
)}
|
||||
</Box>
|
||||
|
||||
{/* 数据统计指示器(左下角) */}
|
||||
@@ -1220,8 +1224,11 @@ export const EnhancedCanvasTrafficGraph = memo(
|
||||
lineHeight: 1.2,
|
||||
}}
|
||||
>
|
||||
Points: {displayData.length} | Compressed:{' '}
|
||||
{samplerStats.compressedBufferSize} | FPS: {currentFPS}
|
||||
{t('home.components.traffic.diagnostics', {
|
||||
points: displayData.length,
|
||||
compressed: samplerStats.compressedBufferSize,
|
||||
fps: currentFPS,
|
||||
})}
|
||||
</Box>
|
||||
|
||||
{/* 悬浮提示框 */}
|
||||
|
||||
@@ -86,7 +86,10 @@ export const ServiceMigrationDialog = () => {
|
||||
}
|
||||
actionSucceeded = true
|
||||
} catch (error) {
|
||||
showNotice.error(error)
|
||||
showNotice.error(
|
||||
'layout.components.serviceMigration.errors.actionFailed',
|
||||
error,
|
||||
)
|
||||
}
|
||||
|
||||
let initialRefreshSucceeded = false
|
||||
@@ -94,7 +97,10 @@ export const ServiceMigrationDialog = () => {
|
||||
await refreshInstallState()
|
||||
initialRefreshSucceeded = true
|
||||
} catch (error) {
|
||||
showNotice.error(error)
|
||||
showNotice.error(
|
||||
'layout.components.serviceMigration.errors.stateRefreshFailed',
|
||||
error,
|
||||
)
|
||||
}
|
||||
if (!actionSucceeded || !initialRefreshSucceeded) {
|
||||
setLoading(false)
|
||||
@@ -106,7 +112,10 @@ export const ServiceMigrationDialog = () => {
|
||||
await restartCore()
|
||||
restartSucceeded = true
|
||||
} catch (error) {
|
||||
showNotice.error(error)
|
||||
showNotice.error(
|
||||
'layout.components.serviceMigration.errors.restartFailed',
|
||||
error,
|
||||
)
|
||||
}
|
||||
|
||||
let finalRefreshSucceeded = false
|
||||
@@ -114,14 +123,20 @@ export const ServiceMigrationDialog = () => {
|
||||
await refreshInstallState()
|
||||
finalRefreshSucceeded = true
|
||||
} catch (error) {
|
||||
showNotice.error(error)
|
||||
showNotice.error(
|
||||
'layout.components.serviceMigration.errors.stateRefreshFailed',
|
||||
error,
|
||||
)
|
||||
}
|
||||
let revalidationSucceeded = false
|
||||
try {
|
||||
await refreshSystemAndRunning()
|
||||
revalidationSucceeded = true
|
||||
} catch (error) {
|
||||
showNotice.error(error)
|
||||
showNotice.error(
|
||||
'layout.components.serviceMigration.errors.revalidationFailed',
|
||||
error,
|
||||
)
|
||||
}
|
||||
if (restartSucceeded && finalRefreshSucceeded && revalidationSucceeded) {
|
||||
setWorkflowIncomplete(false)
|
||||
@@ -145,17 +160,26 @@ export const ServiceMigrationDialog = () => {
|
||||
await refreshInstallState()
|
||||
installRefreshSucceeded = true
|
||||
} catch (error) {
|
||||
showNotice.error(error)
|
||||
showNotice.error(
|
||||
'layout.components.serviceMigration.errors.stateRefreshFailed',
|
||||
error,
|
||||
)
|
||||
}
|
||||
let revalidationSucceeded = false
|
||||
try {
|
||||
await refreshSystemAndRunning()
|
||||
revalidationSucceeded = true
|
||||
} catch (error) {
|
||||
showNotice.error(error)
|
||||
showNotice.error(
|
||||
'layout.components.serviceMigration.errors.revalidationFailed',
|
||||
error,
|
||||
)
|
||||
}
|
||||
if (startupError) {
|
||||
showNotice.error(startupError)
|
||||
showNotice.error(
|
||||
'layout.components.serviceMigration.errors.sidecarFailed',
|
||||
startupError,
|
||||
)
|
||||
} else if (installRefreshSucceeded && revalidationSucceeded) {
|
||||
setWorkflowIncomplete(false)
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Button } from '@mui/material'
|
||||
import { useRef } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
|
||||
import { DialogRef } from '@/components/base'
|
||||
import { useUpdate } from '@/hooks/use-update'
|
||||
@@ -12,6 +13,7 @@ interface Props {
|
||||
|
||||
export const UpdateButton = (props: Props) => {
|
||||
const { className } = props
|
||||
const { t } = useTranslation()
|
||||
const viewerRef = useRef<DialogRef>(null)
|
||||
|
||||
const { updateInfo } = useUpdate()
|
||||
@@ -29,7 +31,7 @@ export const UpdateButton = (props: Props) => {
|
||||
className={className}
|
||||
onClick={() => viewerRef.current?.open()}
|
||||
>
|
||||
New
|
||||
{t('shared.actions.new')}
|
||||
</Button>
|
||||
</>
|
||||
)
|
||||
|
||||
@@ -54,7 +54,7 @@ export const FileInput = (props: Props) => {
|
||||
/>
|
||||
|
||||
<Typography noWrap sx={{ ml: 1 }}>
|
||||
{loading ? 'Loading...' : fileName}
|
||||
{loading ? t('shared.statuses.loading') : fileName}
|
||||
</Typography>
|
||||
</Box>
|
||||
)
|
||||
|
||||
@@ -91,9 +91,11 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
|
||||
setLoading(true)
|
||||
try {
|
||||
// 基本验证
|
||||
if (!form.type) throw new Error('`Type` should not be null')
|
||||
if (!form.type) {
|
||||
throw new Error(t('profiles.modals.profileForm.errors.typeRequired'))
|
||||
}
|
||||
if (form.type === 'remote' && !form.url) {
|
||||
throw new Error('The URL should not be null')
|
||||
throw new Error(t('profiles.modals.profileForm.errors.urlRequired'))
|
||||
}
|
||||
|
||||
// 处理表单数据
|
||||
@@ -131,7 +133,11 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
|
||||
if (openType === 'new') {
|
||||
await createProfile(item, fileDataRef.current)
|
||||
} else {
|
||||
if (!form.uid) throw new Error('UID not found')
|
||||
if (!form.uid) {
|
||||
throw new Error(
|
||||
t('profiles.modals.profileForm.errors.uidMissing'),
|
||||
)
|
||||
}
|
||||
await patchProfile(form.uid, item)
|
||||
}
|
||||
} else {
|
||||
@@ -141,7 +147,11 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
|
||||
if (openType === 'new') {
|
||||
await createProfile(item, fileDataRef.current)
|
||||
} else {
|
||||
if (!form.uid) throw new Error('UID not found')
|
||||
if (!form.uid) {
|
||||
throw new Error(
|
||||
t('profiles.modals.profileForm.errors.uidMissing'),
|
||||
)
|
||||
}
|
||||
await patchProfile(form.uid, item)
|
||||
}
|
||||
} catch {
|
||||
@@ -164,7 +174,11 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
|
||||
if (openType === 'new') {
|
||||
await createProfile(retryItem, fileDataRef.current)
|
||||
} else {
|
||||
if (!form.uid) throw new Error('UID not found')
|
||||
if (!form.uid) {
|
||||
throw new Error(
|
||||
t('profiles.modals.profileForm.errors.uidMissing'),
|
||||
)
|
||||
}
|
||||
await patchProfile(form.uid, retryItem)
|
||||
|
||||
// 编辑模式下恢复原始代理设置
|
||||
@@ -187,7 +201,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
|
||||
onChange(isActivating)
|
||||
}, 0)
|
||||
} catch (err) {
|
||||
showNotice.error(err)
|
||||
showNotice.error('profiles.modals.profileForm.errors.saveFailed', err)
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
@@ -246,8 +260,12 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
|
||||
autoFocus
|
||||
label={t('profiles.modals.profileForm.fields.type')}
|
||||
>
|
||||
<MenuItem value="remote">Remote</MenuItem>
|
||||
<MenuItem value="local">Local</MenuItem>
|
||||
<MenuItem value="remote">
|
||||
{t('profiles.modals.profileForm.types.remote')}
|
||||
</MenuItem>
|
||||
<MenuItem value="local">
|
||||
{t('profiles.modals.profileForm.types.local')}
|
||||
</MenuItem>
|
||||
</Select>
|
||||
</FormControl>
|
||||
)}
|
||||
@@ -305,7 +323,7 @@ export function ProfileViewer({ onChange, ref }: ProfileViewerProps) {
|
||||
{...text}
|
||||
{...field}
|
||||
placeholder={`clash-verge/v${version}`}
|
||||
label="User Agent"
|
||||
label={t('profiles.modals.profileForm.fields.userAgent')}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
|
||||
@@ -214,9 +214,7 @@ const SortableItem = ({
|
||||
{proxy.delay !== undefined && (
|
||||
<Chip
|
||||
label={
|
||||
proxy.delay > 0
|
||||
? `${proxy.delay}ms`
|
||||
: t('shared.labels.timeout') || '超时'
|
||||
proxy.delay > 0 ? `${proxy.delay}ms` : t('shared.labels.timeout')
|
||||
}
|
||||
size="small"
|
||||
color={
|
||||
@@ -402,7 +400,7 @@ export const ProxyChain = ({
|
||||
onUpdateChain([])
|
||||
} catch (error) {
|
||||
console.error('Failed to disconnect from proxy chain:', error)
|
||||
alert(t('proxies.page.chain.disconnectFailed') || '断开链式代理失败')
|
||||
alert(t('proxies.page.chain.disconnectFailed'))
|
||||
} finally {
|
||||
setIsConnecting(false)
|
||||
}
|
||||
@@ -410,7 +408,7 @@ export const ProxyChain = ({
|
||||
}
|
||||
|
||||
if (mode === 'global' && proxyView?.global === null) {
|
||||
alert(t('proxies.page.chain.connectFailed') || '连接链式代理失败')
|
||||
alert(t('proxies.page.chain.connectFailed'))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -418,7 +416,7 @@ export const ProxyChain = ({
|
||||
currentProxyChain.length < 2 ||
|
||||
currentProxyChain.some(({ recordId }) => !recordId)
|
||||
) {
|
||||
alert(t('proxies.page.chain.minimumNodes') || '链式代理至少需要2个节点')
|
||||
alert(t('proxies.page.chain.minimumNodes'))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -450,7 +448,7 @@ export const ProxyChain = ({
|
||||
debugLog('Successfully connected to proxy chain')
|
||||
} catch (error) {
|
||||
console.error('Failed to connect to proxy chain:', error)
|
||||
alert(t('proxies.page.chain.connectFailed') || '连接链式代理失败')
|
||||
alert(t('proxies.page.chain.connectFailed'))
|
||||
} finally {
|
||||
setIsConnecting(false)
|
||||
}
|
||||
@@ -526,9 +524,7 @@ export const ProxyChain = ({
|
||||
backgroundColor: theme.palette.error.light + '20',
|
||||
},
|
||||
}}
|
||||
title={
|
||||
t('proxies.page.actions.clearChainConfig') || '删除链式配置'
|
||||
}
|
||||
title={t('proxies.page.actions.clearChainConfig')}
|
||||
>
|
||||
<DeleteIcon fontSize="small" />
|
||||
</IconButton>
|
||||
@@ -554,16 +550,15 @@ export const ProxyChain = ({
|
||||
}}
|
||||
title={
|
||||
!isConnected && currentProxyChain.length < 2
|
||||
? t('proxies.page.chain.minimumNodes') ||
|
||||
'链式代理至少需要2个节点'
|
||||
? t('proxies.page.chain.minimumNodes')
|
||||
: undefined
|
||||
}
|
||||
>
|
||||
{isConnecting
|
||||
? t('proxies.page.actions.connecting') || '连接中...'
|
||||
? t('proxies.page.actions.connecting')
|
||||
: isConnected
|
||||
? t('proxies.page.actions.disconnect') || '断开'
|
||||
: t('proxies.page.actions.connect') || '连接'}
|
||||
? t('proxies.page.actions.disconnect')
|
||||
: t('proxies.page.actions.connect')}
|
||||
</Button>
|
||||
</Box>
|
||||
</Box>
|
||||
@@ -573,10 +568,8 @@ export const ProxyChain = ({
|
||||
sx={{ mb: 2 }}
|
||||
>
|
||||
{currentProxyChain.length === 1
|
||||
? t('proxies.page.chain.minimumNodesHint') ||
|
||||
'链式代理至少需要2个节点,请再添加一个节点。'
|
||||
: t('proxies.page.chain.instruction') ||
|
||||
'按顺序点击节点添加到代理链中'}
|
||||
? t('proxies.page.chain.minimumNodesHint')
|
||||
: t('proxies.page.chain.instruction')}
|
||||
</Alert>
|
||||
|
||||
<Box sx={{ flex: 1, overflow: 'auto' }}>
|
||||
|
||||
@@ -63,6 +63,7 @@ interface GroupSelectMenuProps {
|
||||
groups: ProxyGroupOption[]
|
||||
selectedGroup: string | null
|
||||
emptyText: string
|
||||
nodeCountLabel: (count: number) => string
|
||||
onClose: () => void
|
||||
onSelect: (groupName: string) => void
|
||||
}
|
||||
@@ -162,6 +163,7 @@ function GroupSelectMenu({
|
||||
groups,
|
||||
selectedGroup,
|
||||
emptyText,
|
||||
nodeCountLabel,
|
||||
onClose,
|
||||
onSelect,
|
||||
}: GroupSelectMenuProps) {
|
||||
@@ -197,7 +199,7 @@ function GroupSelectMenu({
|
||||
{group.name}
|
||||
</Typography>
|
||||
<Typography variant="caption" color="text.secondary">
|
||||
{group.type} · {group.members.length} 节点
|
||||
{group.type} · {nodeCountLabel(group.members.length)}
|
||||
</Typography>
|
||||
</Box>
|
||||
</MenuItem>
|
||||
@@ -521,7 +523,10 @@ export function ProxyGroupsChain(props: ProxyGroupsChainProps) {
|
||||
anchorEl={ruleMenuAnchor}
|
||||
groups={availableGroups}
|
||||
selectedGroup={activeSelectedGroup}
|
||||
emptyText="暂无可用代理组"
|
||||
emptyText={t('proxies.page.empty.noAvailableGroups')}
|
||||
nodeCountLabel={(count) =>
|
||||
t('proxies.page.labels.nodeCount', { count })
|
||||
}
|
||||
onClose={handleGroupMenuClose}
|
||||
onSelect={handleGroupSelect}
|
||||
/>
|
||||
|
||||
@@ -183,7 +183,7 @@ export const ProxyItemMini = (props: Props) => {
|
||||
':hover': { bgcolor: alpha(palette.primary.main, 0.15) },
|
||||
})}
|
||||
>
|
||||
Check
|
||||
{t('shared.actions.check')}
|
||||
</Widget>
|
||||
)}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
type SxProps,
|
||||
type Theme,
|
||||
} from '@mui/material'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
|
||||
import { BaseLoading } from '@/components/base'
|
||||
import { useProxyDelayState } from '@/hooks/use-proxy-delay-state'
|
||||
@@ -49,6 +50,7 @@ const TypeBox = styled('span')(({ theme }) => ({
|
||||
}))
|
||||
|
||||
export const ProxyItem = (props: Props) => {
|
||||
const { t } = useTranslation()
|
||||
const { group, member, selected, showType = true, sx, onClick } = props
|
||||
const details = memberDetails(member)
|
||||
const unresolved = member.kind === 'unresolved'
|
||||
@@ -160,7 +162,7 @@ export const ProxyItem = (props: Props) => {
|
||||
':hover': { bgcolor: alpha(palette.primary.main, 0.15) },
|
||||
})}
|
||||
>
|
||||
Check
|
||||
{t('shared.actions.check')}
|
||||
</Widget>
|
||||
)}
|
||||
|
||||
|
||||
@@ -262,7 +262,9 @@ export const ProxyRender = memo(function ProxyRender(props: RenderProps) {
|
||||
}}
|
||||
>
|
||||
<InboxRounded sx={{ fontSize: '2.5em', color: 'inherit' }} />
|
||||
<Typography sx={{ color: 'inherit' }}>No Proxies</Typography>
|
||||
<Typography sx={{ color: 'inherit' }}>
|
||||
{t('proxies.page.empty.noProxies')}
|
||||
</Typography>
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -583,7 +583,7 @@ export function DnsViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
setOpen(false)
|
||||
showNotice.success('settings.modals.dns.messages.saved')
|
||||
} catch (err) {
|
||||
showNotice.error(err)
|
||||
showNotice.error('settings.modals.dns.messages.configError', err)
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -30,11 +30,26 @@ type MarkdownNode = {
|
||||
}
|
||||
|
||||
const GITHUB_ALERTS = {
|
||||
note: { label: 'Note', color: '#0969da' },
|
||||
tip: { label: 'Tip', color: '#1a7f37' },
|
||||
important: { label: 'Important', color: '#8250df' },
|
||||
warning: { label: 'Warning', color: '#9a6700' },
|
||||
caution: { label: 'Caution', color: '#cf222e' },
|
||||
note: {
|
||||
labelKey: 'settings.modals.update.alerts.note',
|
||||
color: '#0969da',
|
||||
},
|
||||
tip: {
|
||||
labelKey: 'settings.modals.update.alerts.tip',
|
||||
color: '#1a7f37',
|
||||
},
|
||||
important: {
|
||||
labelKey: 'settings.modals.update.alerts.important',
|
||||
color: '#8250df',
|
||||
},
|
||||
warning: {
|
||||
labelKey: 'settings.modals.update.alerts.warning',
|
||||
color: '#9a6700',
|
||||
},
|
||||
caution: {
|
||||
labelKey: 'settings.modals.update.alerts.caution',
|
||||
color: '#cf222e',
|
||||
},
|
||||
} as const
|
||||
|
||||
type GitHubAlertType = keyof typeof GITHUB_ALERTS
|
||||
@@ -76,7 +91,7 @@ const findFirstTextNode = (node: MarkdownNode): MarkdownNode | null => {
|
||||
return null
|
||||
}
|
||||
|
||||
const remarkGitHubAlerts = () => {
|
||||
const remarkGitHubAlerts = (labels: Record<GitHubAlertType, string>) => {
|
||||
const visit = (node: MarkdownNode) => {
|
||||
for (const child of node.children ?? []) {
|
||||
visit(child)
|
||||
@@ -111,7 +126,7 @@ const remarkGitHubAlerts = () => {
|
||||
children: [
|
||||
{
|
||||
type: 'text',
|
||||
value: GITHUB_ALERTS[alertType].label,
|
||||
value: labels[alertType],
|
||||
},
|
||||
],
|
||||
})
|
||||
@@ -144,12 +159,27 @@ export function UpdateViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
close: () => setOpen(false),
|
||||
}))
|
||||
|
||||
const githubAlertLabels = useMemo(
|
||||
() =>
|
||||
Object.fromEntries(
|
||||
Object.entries(GITHUB_ALERTS).map(([type, alert]) => [
|
||||
type,
|
||||
t(alert.labelKey),
|
||||
]),
|
||||
) as Record<GitHubAlertType, string>,
|
||||
[t],
|
||||
)
|
||||
const remarkGitHubAlertsPlugin = useMemo(
|
||||
() => () => remarkGitHubAlerts(githubAlertLabels),
|
||||
[githubAlertLabels],
|
||||
)
|
||||
|
||||
const markdownContent = useMemo(() => {
|
||||
if (!updateInfo?.body) {
|
||||
return 'New Version is available'
|
||||
return t('settings.modals.update.messages.available')
|
||||
}
|
||||
return updateInfo?.body
|
||||
}, [updateInfo])
|
||||
}, [t, updateInfo])
|
||||
|
||||
const breakChangeFlag = useMemo(() => {
|
||||
if (!updateInfo?.body) {
|
||||
@@ -382,7 +412,7 @@ export function UpdateViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
{open && (
|
||||
<Suspense fallback={<LinearProgress />}>
|
||||
<LazyReactMarkdown
|
||||
remarkPlugins={[remarkGitHubAlerts]}
|
||||
remarkPlugins={[remarkGitHubAlertsPlugin]}
|
||||
components={{
|
||||
a: ({ ...props }) => {
|
||||
const { children } = props
|
||||
|
||||
@@ -74,9 +74,17 @@ export function WebUIViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
let url = value.trim().replaceAll('%host', '127.0.0.1')
|
||||
|
||||
if (url.includes('%port') || url.includes('%secret')) {
|
||||
if (!clashInfo) throw new Error('failed to get clash info')
|
||||
if (!clashInfo) {
|
||||
throw new Error(
|
||||
t('settings.modals.webUI.errors.clashInfoUnavailable'),
|
||||
)
|
||||
}
|
||||
if (!clashInfo.server?.includes(':')) {
|
||||
throw new Error(`failed to parse the server "${clashInfo.server}"`)
|
||||
throw new Error(
|
||||
t('settings.modals.webUI.errors.invalidServer', {
|
||||
server: clashInfo.server,
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
const port = clashInfo.server
|
||||
@@ -92,7 +100,7 @@ export function WebUIViewer({ ref }: { ref?: Ref<DialogRef> }) {
|
||||
|
||||
await openWebUrl(url)
|
||||
} catch (e: any) {
|
||||
showNotice.error(e)
|
||||
showNotice.error('settings.modals.webUI.errors.openFailed', e)
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -189,8 +189,10 @@ const TrafficErrorFallback: React.FC<TrafficErrorFallbackProps> = ({
|
||||
|
||||
<Alert severity="error" sx={{ mb: 2, maxWidth: 400 }}>
|
||||
<Typography variant="body2">
|
||||
<strong>Error:</strong>{' '}
|
||||
{error instanceof Error ? error.message : 'Unknown error'}
|
||||
<strong>{t('shared.feedback.errors.label')}:</strong>{' '}
|
||||
{error instanceof Error
|
||||
? error.message
|
||||
: t('shared.feedback.errors.unknown')}
|
||||
</Typography>
|
||||
{retryCount > 0 && (
|
||||
<Typography variant="caption" sx={{ mt: 1, display: 'block' }}>
|
||||
@@ -239,7 +241,7 @@ const TrafficErrorFallback: React.FC<TrafficErrorFallbackProps> = ({
|
||||
}}
|
||||
>
|
||||
<Typography variant="subtitle2" gutterBottom>
|
||||
Error Details:
|
||||
{t('shared.feedback.errors.details')}:
|
||||
</Typography>
|
||||
<Typography
|
||||
variant="caption"
|
||||
@@ -258,7 +260,7 @@ const TrafficErrorFallback: React.FC<TrafficErrorFallbackProps> = ({
|
||||
{errorInfo?.componentStack && (
|
||||
<>
|
||||
<Typography variant="subtitle2" gutterBottom sx={{ mt: 2 }}>
|
||||
Component Stack:
|
||||
{t('shared.feedback.errors.componentStack')}:
|
||||
</Typography>
|
||||
<Typography
|
||||
variant="caption"
|
||||
@@ -288,6 +290,8 @@ const TrafficErrorFallback: React.FC<TrafficErrorFallbackProps> = ({
|
||||
export const LightweightTrafficErrorBoundary: React.FC<{
|
||||
children: ReactNode
|
||||
}> = ({ children }) => {
|
||||
const { t } = useTranslation()
|
||||
|
||||
return (
|
||||
<TrafficErrorBoundary
|
||||
fallbackComponent={
|
||||
@@ -304,7 +308,9 @@ export const LightweightTrafficErrorBoundary: React.FC<{
|
||||
}}
|
||||
>
|
||||
<ErrorOutlineRounded sx={{ mr: 1, fontSize: 20 }} />
|
||||
<Typography variant="caption">Traffic data unavailable</Typography>
|
||||
<Typography variant="caption">
|
||||
{t('shared.feedback.errors.trafficUnavailable')}
|
||||
</Typography>
|
||||
</Box>
|
||||
}
|
||||
>
|
||||
|
||||
@@ -70,8 +70,8 @@ export const TestItem = ({
|
||||
})
|
||||
|
||||
const menu = [
|
||||
{ label: 'Edit', handler: onEditTest },
|
||||
{ label: 'Delete', handler: onDelete },
|
||||
{ label: t('shared.actions.edit'), handler: onEditTest },
|
||||
{ label: t('shared.actions.delete'), handler: onDelete },
|
||||
]
|
||||
|
||||
useEffect(() => {
|
||||
@@ -220,7 +220,7 @@ export const TestItem = ({
|
||||
sx={{ minWidth: 120 }}
|
||||
dense
|
||||
>
|
||||
{t(item.label)}
|
||||
{item.label}
|
||||
</MenuItem>
|
||||
))}
|
||||
</Menu>
|
||||
|
||||
@@ -68,8 +68,12 @@ export const TestViewer = forwardRef<TestViewerRef, Props>(
|
||||
formIns.handleSubmit(async (form) => {
|
||||
setLoading(true)
|
||||
try {
|
||||
if (!form.name) throw new Error('`Name` should not be null')
|
||||
if (!form.url) throw new Error('`Url` should not be null')
|
||||
if (!form.name) {
|
||||
throw new Error(t('tests.modals.test.errors.nameRequired'))
|
||||
}
|
||||
if (!form.url) {
|
||||
throw new Error(t('tests.modals.test.errors.urlRequired'))
|
||||
}
|
||||
|
||||
let newList
|
||||
let uid
|
||||
@@ -84,7 +88,7 @@ export const TestViewer = forwardRef<TestViewerRef, Props>(
|
||||
'image/svg+xml',
|
||||
)
|
||||
if (doc.querySelector('parsererror')) {
|
||||
throw new Error('`Icon`svg format error')
|
||||
throw new Error(t('tests.modals.test.errors.invalidSvg'))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,7 +99,9 @@ export const TestViewer = forwardRef<TestViewerRef, Props>(
|
||||
await patchVerge({ test_list: newList })
|
||||
onChange(uid)
|
||||
} else {
|
||||
if (!form.uid) throw new Error('UID not found')
|
||||
if (!form.uid) {
|
||||
throw new Error(t('tests.modals.test.errors.uidMissing'))
|
||||
}
|
||||
uid = form.uid
|
||||
|
||||
await patchTestList(uid, form)
|
||||
@@ -105,7 +111,7 @@ export const TestViewer = forwardRef<TestViewerRef, Props>(
|
||||
setLoading(false)
|
||||
setTimeout(() => formIns.reset(), 500)
|
||||
} catch (err: any) {
|
||||
showNotice.error(err)
|
||||
showNotice.error('tests.modals.test.errors.saveFailed', err)
|
||||
setLoading(false)
|
||||
}
|
||||
}),
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { useLockFn } from 'ahooks'
|
||||
import i18n from 'i18next'
|
||||
import { getVersion } from 'tauri-plugin-mihomo-api'
|
||||
|
||||
import {
|
||||
@@ -47,10 +48,14 @@ const hasClashInfoPayload = (patch: ClashInfoPatch) =>
|
||||
|
||||
const validatePortRange = (port: number) => {
|
||||
if (port < 1000) {
|
||||
throw new Error('The port should not < 1000')
|
||||
throw new Error(
|
||||
i18n.t(($) => $.settings.modals.clashPort.messages.portTooLow),
|
||||
)
|
||||
}
|
||||
if (port > 65535) {
|
||||
throw new Error('The port should not > 65536')
|
||||
throw new Error(
|
||||
i18n.t(($) => $.settings.modals.clashPort.messages.portTooHigh),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"errors": {
|
||||
"load": "فشل الحصول على معلومات الـ IP"
|
||||
"load": "فشل الحصول على معلومات الـ IP",
|
||||
"loadWithDetails": "تعذّر الحصول على معلومات IP: {{message}}",
|
||||
"noServices": "لا توجد خدمات كشف IP متاحة"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "Group",
|
||||
"proxy": "Proxy",
|
||||
"noActiveNode": "No active proxy node"
|
||||
},
|
||||
"status": {
|
||||
"testing": "جارٍ الاختبار",
|
||||
"untested": "لم يُختبر",
|
||||
"error": "خطأ",
|
||||
"timeout": "انتهت المهلة",
|
||||
"latencyHigh": "زمن استجابة مرتفع",
|
||||
"latencyMedium": "زمن استجابة متوسط",
|
||||
"latencyGood": "زمن استجابة جيد",
|
||||
"latencyExcellent": "زمن استجابة ممتاز",
|
||||
"uninitialized": "غير مُهيأ",
|
||||
"noProxyNode": "لا توجد عقدة وكيل"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} Minutes"
|
||||
}
|
||||
},
|
||||
"unknownTime": "وقت غير معروف",
|
||||
"chartStyles": {
|
||||
"smooth": "ناعم",
|
||||
"linear": "خطي"
|
||||
},
|
||||
"diagnostics": "النقاط: {{points}} | مضغوط: {{compressed}} | الإطارات/ث: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "فشلت عملية الخدمة",
|
||||
"stateRefreshFailed": "تعذّر تحديث حالة الخدمة",
|
||||
"restartFailed": "تعذّر إعادة تشغيل النواة",
|
||||
"revalidationFailed": "تعذّر تحديث حالة التشغيل",
|
||||
"sidecarFailed": "تعذّر المتابعة باستخدام Sidecar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "تعذّر إيقاف النواة بأمان، لذا أُلغيت إعادة التشغيل",
|
||||
"quitCoreStopFailed": "تعذّر إيقاف النواة بأمان، لذا أُلغي الخروج"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
|
||||
"onlyYaml": "لا يتم دعم سوى ملفات YAML"
|
||||
"onlyYaml": "لا يتم دعم سوى ملفات YAML",
|
||||
"createFailed": "تعذّر إنشاء الملف الشخصي",
|
||||
"deleteFailed": "تعذّر حذف الملف الشخصي",
|
||||
"enhanceFailed": "تعذّر إعادة تفعيل الملفات الشخصية",
|
||||
"importFailed": "تعذّر استيراد الملف الشخصي",
|
||||
"openFailed": "تعذّر فتح الملف الشخصي",
|
||||
"readFailed": "تعذّر قراءة الملف الشخصي",
|
||||
"reorderFailed": "تعذّر إعادة ترتيب الملفات الشخصية",
|
||||
"switchFailed": "تعذّر تبديل الملف الشخصي",
|
||||
"updateFailed": "تعذّر تحديث الملف الشخصي"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "Import failed, retrying with Clash proxy...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Force refresh completed",
|
||||
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "بيانات الملف الشخصي غير متاحة؛ انقر للتحديث القسري"
|
||||
}
|
||||
},
|
||||
"title": "الملفات الشخصية"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "النوع",
|
||||
"description": "الوصف",
|
||||
"subscriptionUrl": "رابط الاشتراك",
|
||||
"userAgent": "وكيل المستخدم",
|
||||
"httpTimeout": "HTTP Request Timeout",
|
||||
"updateInterval": "فاصل التحديث",
|
||||
"useSystemProxy": "استخدام وكيل النظام",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "قبول الشهادات غير الصالحة (خطر)",
|
||||
"allowAutoUpdate": "Allow Auto Update"
|
||||
},
|
||||
"types": {
|
||||
"remote": "بعيد",
|
||||
"local": "محلي"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "اختر نوع الملف الشخصي",
|
||||
"urlRequired": "أدخل رابط الاشتراك",
|
||||
"uidMissing": "مُعرّف الملف الشخصي مفقود",
|
||||
"saveFailed": "تعذّر حفظ الملف الشخصي"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "Proxy Count",
|
||||
"delayCheckReset": "فحص التأخير لإلغاء الثابت"
|
||||
"delayCheckReset": "فحص التأخير لإلغاء الثابت",
|
||||
"nodeCount": "{{count}} عقدة"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "الموقع",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "رابط فحص التأخير"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "لا توجد مجموعات وكيل متاحة",
|
||||
"noProxies": "لا توجد وكلاء"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Chain Proxy Config",
|
||||
"warning": "Chain proxy will significantly reduce network speed. If you do not have a clear business need, or do not understand this configuration, keep it disabled.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "قناة تيليجرام",
|
||||
"github": "مستودع Github"
|
||||
},
|
||||
"actionsGroupLabel": "روابط الإعدادات",
|
||||
"title": "الإعدادات"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "Port settings saved",
|
||||
"saveFailed": "Failed to save port settings"
|
||||
"saveFailed": "Failed to save port settings",
|
||||
"portTooLow": "يجب ألا يقل المنفذ عن 1000",
|
||||
"portTooHigh": "يجب ألا يزيد المنفذ عن 65535"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "تحديث"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "هذا الإصدار هو تحديث رئيسي ولا يدعم التحديث داخل التطبيق. يرجى إلغاء التثبيت وتنزيل الإصدار الجديد وتثبيته يدويًا"
|
||||
"breakChangeError": "هذا الإصدار هو تحديث رئيسي ولا يدعم التحديث داخل التطبيق. يرجى إلغاء التثبيت وتنزيل الإصدار الجديد وتثبيته يدويًا",
|
||||
"available": "يتوفّر إصدار جديد"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "ملاحظة",
|
||||
"tip": "نصيحة",
|
||||
"important": "مهم",
|
||||
"warning": "تحذير",
|
||||
"caution": "تنبيه"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "يدعم %host و%port و%secret",
|
||||
"placeholderInstruction": "استبدل المضيف والمنفذ والمفتاح بـ %host و%port و%secret"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "معلومات اتصال النواة غير متاحة",
|
||||
"invalidServer": "عنوان خادم النواة \"{{server}}\" غير صالح",
|
||||
"openFailed": "تعذّر فتح واجهة الويب"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "تعذّر تحديث إعدادات النواة",
|
||||
"modeUpdateFailed": "تعذّر تغيير وضع الوكيل",
|
||||
"restartFailed": "تعذّر إعادة تشغيل النواة",
|
||||
"startFailed": "تعذّر تشغيل النواة",
|
||||
"stopFailed": "تعذّر إيقاف النواة"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "تعذّر تثبيت الخدمة",
|
||||
"uninstallFailed": "تعذّر إلغاء تثبيت الخدمة",
|
||||
"reinstallFailed": "تعذّر إعادة تثبيت الخدمة",
|
||||
"repairFailed": "تعذّر إصلاح الخدمة",
|
||||
"sidecarFailed": "تعذّر المتابعة باستخدام Sidecar"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "تم إعادة تشغيل نواة Clash",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "إغلاق الكل",
|
||||
"clear": "مسح",
|
||||
"previous": "Previous",
|
||||
"next": "Next"
|
||||
"next": "Next",
|
||||
"check": "فحص"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "التحديث عند",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "ممكّن",
|
||||
"disabled": "معطّل",
|
||||
"saving": "Saving...",
|
||||
"empty": "فارغ"
|
||||
"empty": "فارغ",
|
||||
"loading": "جارٍ التحميل..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "ميلي ثانية",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "حدث خطأ ما",
|
||||
"label": "خطأ",
|
||||
"unknown": "خطأ غير معروف",
|
||||
"details": "تفاصيل الخطأ",
|
||||
"stack": "تتبّع الخطأ",
|
||||
"componentStack": "تتبّع المكوّن",
|
||||
"trafficUnavailable": "بيانات حركة المرور غير متاحة",
|
||||
"operationFailed": "فشلت العملية",
|
||||
"trafficStats": "Traffic Statistics Error",
|
||||
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "رابط الاختبار"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "أدخل اسمًا",
|
||||
"urlRequired": "أدخل رابط الاختبار",
|
||||
"invalidSvg": "الأيقونة ليست بصيغة SVG صالحة",
|
||||
"uidMissing": "مُعرّف عنصر الاختبار مفقود",
|
||||
"saveFailed": "تعذّر حفظ عنصر الاختبار"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "Unbekannt"
|
||||
},
|
||||
"errors": {
|
||||
"load": "IP-Informationen konnten nicht abgerufen werden"
|
||||
"load": "IP-Informationen konnten nicht abgerufen werden",
|
||||
"loadWithDetails": "IP-Informationen konnten nicht abgerufen werden: {{message}}",
|
||||
"noServices": "Keine IP-Erkennungsdienste verfügbar"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "Proxy-Gruppe",
|
||||
"proxy": "Knoten",
|
||||
"noActiveNode": "Kein aktiver Proxy-Knoten"
|
||||
},
|
||||
"status": {
|
||||
"testing": "Wird getestet",
|
||||
"untested": "Nicht getestet",
|
||||
"error": "Fehler",
|
||||
"timeout": "Zeitüberschreitung",
|
||||
"latencyHigh": "Hohe Latenz",
|
||||
"latencyMedium": "Mittlere Latenz",
|
||||
"latencyGood": "Gute Latenz",
|
||||
"latencyExcellent": "Ausgezeichnete Latenz",
|
||||
"uninitialized": "Nicht initialisiert",
|
||||
"noProxyNode": "Kein Proxy-Knoten"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} Minutes"
|
||||
}
|
||||
},
|
||||
"unknownTime": "Unbekannte Zeit",
|
||||
"chartStyles": {
|
||||
"smooth": "Weich",
|
||||
"linear": "Linear"
|
||||
},
|
||||
"diagnostics": "Punkte: {{points}} | Komprimiert: {{compressed}} | FPS: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "Der Dienstvorgang ist fehlgeschlagen",
|
||||
"stateRefreshFailed": "Dienststatus konnte nicht aktualisiert werden",
|
||||
"restartFailed": "Kern konnte nicht neu gestartet werden",
|
||||
"revalidationFailed": "Laufstatus konnte nicht aktualisiert werden",
|
||||
"sidecarFailed": "Fortsetzung mit Sidecar fehlgeschlagen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "Der Kern konnte nicht sicher gestoppt werden, daher wurde der Neustart abgebrochen",
|
||||
"quitCoreStopFailed": "Der Kern konnte nicht sicher gestoppt werden, daher wurde das Beenden abgebrochen"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
|
||||
"onlyYaml": "Nur YAML-Dateien werden unterstützt"
|
||||
"onlyYaml": "Nur YAML-Dateien werden unterstützt",
|
||||
"createFailed": "Abonnement konnte nicht erstellt werden",
|
||||
"deleteFailed": "Abonnement konnte nicht gelöscht werden",
|
||||
"enhanceFailed": "Abonnements konnten nicht erneut aktiviert werden",
|
||||
"importFailed": "Abonnement konnte nicht importiert werden",
|
||||
"openFailed": "Abonnement konnte nicht geöffnet werden",
|
||||
"readFailed": "Abonnement konnte nicht gelesen werden",
|
||||
"reorderFailed": "Abonnements konnten nicht neu angeordnet werden",
|
||||
"switchFailed": "Abonnement konnte nicht gewechselt werden",
|
||||
"updateFailed": "Abonnement konnte nicht aktualisiert werden"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "Import des Abonnements fehlgeschlagen. Versuche es mit dem Clash-Proxy erneut...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Force refresh completed",
|
||||
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "Abonnementdaten sind nicht verfügbar; zum erzwungenen Aktualisieren klicken"
|
||||
}
|
||||
},
|
||||
"title": "Abonnement"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "Typ",
|
||||
"description": "Beschreibung",
|
||||
"subscriptionUrl": "Abonnement-Link",
|
||||
"userAgent": "User Agent",
|
||||
"httpTimeout": "HTTP Request Timeout",
|
||||
"updateInterval": "Aktualisierungsintervall",
|
||||
"useSystemProxy": "Systemproxy zur Aktualisierung verwenden",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
|
||||
"allowAutoUpdate": "Allow Auto Update"
|
||||
},
|
||||
"types": {
|
||||
"remote": "Remote",
|
||||
"local": "Lokal"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "Abonnementtyp auswählen",
|
||||
"urlRequired": "Abonnement-URL eingeben",
|
||||
"uidMissing": "Die Abonnement-Kennung fehlt",
|
||||
"saveFailed": "Abonnement konnte nicht gespeichert werden"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "Erstellung des Abonnements fehlgeschlagen. Versuche es mit dem Clash-Proxy erneut...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "Anzahl der Knoten",
|
||||
"delayCheckReset": "Latenztest durchführen, um Fixierung aufzuheben"
|
||||
"delayCheckReset": "Latenztest durchführen, um Fixierung aufzuheben",
|
||||
"nodeCount": "{{count}} Knoten"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "Aktueller Knoten",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "Latenztest-URL"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "Keine Proxy-Gruppen verfügbar",
|
||||
"noProxies": "Keine Proxys"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Chain Proxy Config",
|
||||
"warning": "Chain proxy will significantly reduce network speed. If you do not have a clear business need, or do not understand this configuration, keep it disabled.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "Telegram-Kanal",
|
||||
"github": "GitHub-Projektadresse"
|
||||
},
|
||||
"actionsGroupLabel": "Einstellungslinks",
|
||||
"title": "Einstellungen"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "Port settings saved",
|
||||
"saveFailed": "Failed to save port settings"
|
||||
"saveFailed": "Failed to save port settings",
|
||||
"portTooLow": "Der Port muss mindestens 1000 sein",
|
||||
"portTooHigh": "Der Port darf höchstens 65535 sein"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "Aktualisieren"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "Dies ist eine wichtige Aktualisierung. Die In-App-Aktualisierung wird nicht unterstützt. Bitte deinstallieren Sie die Software und laden Sie die neue Version manuell herunter und installieren Sie sie."
|
||||
"breakChangeError": "Dies ist eine wichtige Aktualisierung. Die In-App-Aktualisierung wird nicht unterstützt. Bitte deinstallieren Sie die Software und laden Sie die neue Version manuell herunter und installieren Sie sie.",
|
||||
"available": "Eine neue Version ist verfügbar"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "Hinweis",
|
||||
"tip": "Tipp",
|
||||
"important": "Wichtig",
|
||||
"warning": "Warnung",
|
||||
"caution": "Achtung"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "Unterstützt %host, %port, %secret",
|
||||
"placeholderInstruction": "Verwenden Sie %host, %port, %secret für Host, Port und Zugangsschlüssel"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "Verbindungsinformationen des Kerns sind nicht verfügbar",
|
||||
"invalidServer": "Die Kern-Serveradresse „{{server}}“ ist ungültig",
|
||||
"openFailed": "Web-UI konnte nicht geöffnet werden"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "Kernkonfiguration konnte nicht aktualisiert werden",
|
||||
"modeUpdateFailed": "Proxy-Modus konnte nicht geändert werden",
|
||||
"restartFailed": "Kern konnte nicht neu gestartet werden",
|
||||
"startFailed": "Kern konnte nicht gestartet werden",
|
||||
"stopFailed": "Kern konnte nicht gestoppt werden"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "Dienst konnte nicht installiert werden",
|
||||
"uninstallFailed": "Dienst konnte nicht deinstalliert werden",
|
||||
"reinstallFailed": "Dienst konnte nicht neu installiert werden",
|
||||
"repairFailed": "Dienst konnte nicht repariert werden",
|
||||
"sidecarFailed": "Fortsetzung mit Sidecar fehlgeschlagen"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "Clash-Kern wurde neu gestartet",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "Alle schließen",
|
||||
"clear": "Löschen",
|
||||
"previous": "Previous",
|
||||
"next": "Next"
|
||||
"next": "Next",
|
||||
"check": "Prüfen"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "Aktualisiert am",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "Aktiviert",
|
||||
"disabled": "Deaktiviert",
|
||||
"saving": "Saving...",
|
||||
"empty": "Leer"
|
||||
"empty": "Leer",
|
||||
"loading": "Wird geladen..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "Millisekunden",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "Etwas ist schiefgelaufen",
|
||||
"label": "Fehler",
|
||||
"unknown": "Unbekannter Fehler",
|
||||
"details": "Fehlerdetails",
|
||||
"stack": "Fehler-Stack",
|
||||
"componentStack": "Komponenten-Stack",
|
||||
"trafficUnavailable": "Traffic-Daten nicht verfügbar",
|
||||
"operationFailed": "Der Vorgang ist fehlgeschlagen",
|
||||
"trafficStats": "Traffic Statistics Error",
|
||||
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "Test-URL"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "Namen eingeben",
|
||||
"urlRequired": "Test-URL eingeben",
|
||||
"invalidSvg": "Das Symbol ist kein gültiges SVG",
|
||||
"uidMissing": "Die Kennung des Testelements fehlt",
|
||||
"saveFailed": "Testelement konnte nicht gespeichert werden"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"errors": {
|
||||
"load": "Failed to get IP info"
|
||||
"load": "Failed to get IP info",
|
||||
"loadWithDetails": "Failed to get IP info: {{message}}",
|
||||
"noServices": "No IP detection services are available"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "Group",
|
||||
"proxy": "Proxy",
|
||||
"noActiveNode": "No active proxy node"
|
||||
},
|
||||
"status": {
|
||||
"testing": "Testing",
|
||||
"untested": "Not tested",
|
||||
"error": "Error",
|
||||
"timeout": "Timeout",
|
||||
"latencyHigh": "High latency",
|
||||
"latencyMedium": "Moderate latency",
|
||||
"latencyGood": "Good latency",
|
||||
"latencyExcellent": "Excellent latency",
|
||||
"uninitialized": "Not initialized",
|
||||
"noProxyNode": "No proxy node"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} Minutes"
|
||||
}
|
||||
},
|
||||
"unknownTime": "Unknown time",
|
||||
"chartStyles": {
|
||||
"smooth": "Smooth",
|
||||
"linear": "Linear"
|
||||
},
|
||||
"diagnostics": "Points: {{points}} | Compressed: {{compressed}} | FPS: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "The service operation failed",
|
||||
"stateRefreshFailed": "Failed to refresh the service state",
|
||||
"restartFailed": "Failed to restart the core",
|
||||
"revalidationFailed": "Failed to refresh the running state",
|
||||
"sidecarFailed": "Failed to continue with Sidecar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "The core could not be stopped safely, so the restart was cancelled",
|
||||
"quitCoreStopFailed": "The core could not be stopped safely, so quitting was cancelled"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
|
||||
"onlyYaml": "Only YAML Files Supported"
|
||||
"onlyYaml": "Only YAML Files Supported",
|
||||
"createFailed": "Failed to create profile",
|
||||
"deleteFailed": "Failed to delete profile",
|
||||
"enhanceFailed": "Failed to reactivate profiles",
|
||||
"importFailed": "Failed to import profile",
|
||||
"openFailed": "Failed to open profile",
|
||||
"readFailed": "Failed to read profile",
|
||||
"reorderFailed": "Failed to reorder profiles",
|
||||
"switchFailed": "Failed to switch profile",
|
||||
"updateFailed": "Failed to update profile"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "Import failed, retrying with Clash proxy...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Force refresh completed",
|
||||
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "Profile data is unavailable; click to force a refresh"
|
||||
}
|
||||
},
|
||||
"title": "Profiles"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "Type",
|
||||
"description": "Descriptions",
|
||||
"subscriptionUrl": "Subscription URL",
|
||||
"userAgent": "User Agent",
|
||||
"httpTimeout": "HTTP Request Timeout",
|
||||
"updateInterval": "Update Interval",
|
||||
"useSystemProxy": "Use System Proxy",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
|
||||
"allowAutoUpdate": "Allow Auto Update"
|
||||
},
|
||||
"types": {
|
||||
"remote": "Remote",
|
||||
"local": "Local"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "Select a profile type",
|
||||
"urlRequired": "Enter a subscription URL",
|
||||
"uidMissing": "The profile identifier is missing",
|
||||
"saveFailed": "Failed to save profile"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "Proxy Count",
|
||||
"delayCheckReset": "Delay check to cancel fixed"
|
||||
"delayCheckReset": "Delay check to cancel fixed",
|
||||
"nodeCount": "{{count}} nodes"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "locate",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "Delay check URL"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "No proxy groups are available",
|
||||
"noProxies": "No proxies"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Chain Proxy Config",
|
||||
"warning": "Chain proxy will significantly reduce network speed. If you do not have a clear business need, or do not understand this configuration, keep it disabled.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "Telegram Channel",
|
||||
"github": "Github Repo"
|
||||
},
|
||||
"actionsGroupLabel": "Settings links",
|
||||
"title": "Settings"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "Port settings saved",
|
||||
"saveFailed": "Failed to save port settings"
|
||||
"saveFailed": "Failed to save port settings",
|
||||
"portTooLow": "The port must be 1000 or higher",
|
||||
"portTooHigh": "The port must be 65535 or lower"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "Update"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "This version is a major update and does not support in-app updates. Please uninstall it and manually download and install the new version"
|
||||
"breakChangeError": "This version is a major update and does not support in-app updates. Please uninstall it and manually download and install the new version",
|
||||
"available": "A new version is available"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "Note",
|
||||
"tip": "Tip",
|
||||
"important": "Important",
|
||||
"warning": "Warning",
|
||||
"caution": "Caution"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "Support %host, %port, %secret",
|
||||
"placeholderInstruction": "Replace host, port, secret with %host, %port, %secret"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "Core connection information is unavailable",
|
||||
"invalidServer": "The core server address \"{{server}}\" is invalid",
|
||||
"openFailed": "Failed to open Web UI"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "Failed to update core configuration",
|
||||
"modeUpdateFailed": "Failed to change proxy mode",
|
||||
"restartFailed": "Failed to restart the core",
|
||||
"startFailed": "Failed to start the core",
|
||||
"stopFailed": "Failed to stop the core"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "Failed to install the service",
|
||||
"uninstallFailed": "Failed to uninstall the service",
|
||||
"reinstallFailed": "Failed to reinstall the service",
|
||||
"repairFailed": "Failed to repair the service",
|
||||
"sidecarFailed": "Failed to continue with Sidecar"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "Clash Core Restarted",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "Close All",
|
||||
"clear": "Clear",
|
||||
"previous": "Previous",
|
||||
"next": "Next"
|
||||
"next": "Next",
|
||||
"check": "Check"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "Update At",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"saving": "Saving...",
|
||||
"empty": "Empty"
|
||||
"empty": "Empty",
|
||||
"loading": "Loading..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "ms",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "Something went wrong",
|
||||
"label": "Error",
|
||||
"unknown": "Unknown error",
|
||||
"details": "Error details",
|
||||
"stack": "Error stack",
|
||||
"componentStack": "Component stack",
|
||||
"trafficUnavailable": "Traffic data unavailable",
|
||||
"operationFailed": "The operation failed",
|
||||
"trafficStats": "Traffic Statistics Error",
|
||||
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "Test URL"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "Enter a name",
|
||||
"urlRequired": "Enter a test URL",
|
||||
"invalidSvg": "The icon is not valid SVG",
|
||||
"uidMissing": "The test item identifier is missing",
|
||||
"saveFailed": "Failed to save test item"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "Desconocido"
|
||||
},
|
||||
"errors": {
|
||||
"load": "Error al obtener la información de IP"
|
||||
"load": "Error al obtener la información de IP",
|
||||
"loadWithDetails": "No se pudo obtener la información de IP: {{message}}",
|
||||
"noServices": "No hay servicios de detección de IP disponibles"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "Grupo de proxy",
|
||||
"proxy": "Nodo",
|
||||
"noActiveNode": "No hay nodos de proxy activos"
|
||||
},
|
||||
"status": {
|
||||
"testing": "Probando",
|
||||
"untested": "Sin probar",
|
||||
"error": "Error",
|
||||
"timeout": "Tiempo agotado",
|
||||
"latencyHigh": "Latencia alta",
|
||||
"latencyMedium": "Latencia moderada",
|
||||
"latencyGood": "Latencia buena",
|
||||
"latencyExcellent": "Latencia excelente",
|
||||
"uninitialized": "Sin inicializar",
|
||||
"noProxyNode": "Sin nodo proxy"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} Minutes"
|
||||
}
|
||||
},
|
||||
"unknownTime": "Hora desconocida",
|
||||
"chartStyles": {
|
||||
"smooth": "Suave",
|
||||
"linear": "Lineal"
|
||||
},
|
||||
"diagnostics": "Puntos: {{points}} | Comprimido: {{compressed}} | FPS: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "La operación del servicio falló",
|
||||
"stateRefreshFailed": "No se pudo actualizar el estado del servicio",
|
||||
"restartFailed": "No se pudo reiniciar el núcleo",
|
||||
"revalidationFailed": "No se pudo actualizar el estado de ejecución",
|
||||
"sidecarFailed": "No se pudo continuar con Sidecar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "No se pudo detener el núcleo de forma segura, por lo que se canceló el reinicio",
|
||||
"quitCoreStopFailed": "No se pudo detener el núcleo de forma segura, por lo que se canceló la salida"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
|
||||
"onlyYaml": "Solo se admiten archivos YAML"
|
||||
"onlyYaml": "Solo se admiten archivos YAML",
|
||||
"createFailed": "No se pudo crear la suscripción",
|
||||
"deleteFailed": "No se pudo eliminar la suscripción",
|
||||
"enhanceFailed": "No se pudieron reactivar las suscripciones",
|
||||
"importFailed": "No se pudo importar la suscripción",
|
||||
"openFailed": "No se pudo abrir la suscripción",
|
||||
"readFailed": "No se pudo leer la suscripción",
|
||||
"reorderFailed": "No se pudo reordenar las suscripciones",
|
||||
"switchFailed": "No se pudo cambiar de suscripción",
|
||||
"updateFailed": "No se pudo actualizar la suscripción"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "Error al importar la suscripción. Intentando con el proxy de Clash...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Force refresh completed",
|
||||
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "Los datos de la suscripción no están disponibles; haz clic para forzar una actualización"
|
||||
}
|
||||
},
|
||||
"title": "Suscripciones"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "Tipo",
|
||||
"description": "Descripción",
|
||||
"subscriptionUrl": "Enlace de suscripción",
|
||||
"userAgent": "Agente de usuario",
|
||||
"httpTimeout": "HTTP Request Timeout",
|
||||
"updateInterval": "Intervalo de actualización",
|
||||
"useSystemProxy": "Usar proxy del sistema para actualizar",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
|
||||
"allowAutoUpdate": "Allow Auto Update"
|
||||
},
|
||||
"types": {
|
||||
"remote": "Remoto",
|
||||
"local": "Local"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "Selecciona un tipo de suscripción",
|
||||
"urlRequired": "Introduce una URL de suscripción",
|
||||
"uidMissing": "Falta el identificador de la suscripción",
|
||||
"saveFailed": "No se pudo guardar la suscripción"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "Error al crear la suscripción. Intentando con el proxy de Clash...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "Número de nodos",
|
||||
"delayCheckReset": "Realizar prueba de latencia para cancelar la fijación"
|
||||
"delayCheckReset": "Realizar prueba de latencia para cancelar la fijación",
|
||||
"nodeCount": "{{count}} nodos"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "Nodo actual",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "URL de prueba de latencia"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "No hay grupos de proxy disponibles",
|
||||
"noProxies": "Sin proxies"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Chain Proxy Config",
|
||||
"warning": "Chain proxy will significantly reduce network speed. If you do not have a clear business need, or do not understand this configuration, keep it disabled.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "Canal de Telegram",
|
||||
"github": "Dirección del proyecto en GitHub"
|
||||
},
|
||||
"actionsGroupLabel": "Enlaces de configuración",
|
||||
"title": "Ajustes"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "Port settings saved",
|
||||
"saveFailed": "Failed to save port settings"
|
||||
"saveFailed": "Failed to save port settings",
|
||||
"portTooLow": "El puerto debe ser 1000 o superior",
|
||||
"portTooHigh": "El puerto debe ser 65535 o inferior"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "Actualizar"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "Esta es una actualización importante y no se admite la actualización desde dentro de la aplicación. Desinstale e instale manualmente la nueva versión."
|
||||
"breakChangeError": "Esta es una actualización importante y no se admite la actualización desde dentro de la aplicación. Desinstale e instale manualmente la nueva versión.",
|
||||
"available": "Hay una nueva versión disponible"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "Nota",
|
||||
"tip": "Consejo",
|
||||
"important": "Importante",
|
||||
"warning": "Advertencia",
|
||||
"caution": "Precaución"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "Soporta %host, %port, %secret",
|
||||
"placeholderInstruction": "Utilice %host, %port, %secret para representar el host, el puerto y la clave de acceso."
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "La información de conexión del núcleo no está disponible",
|
||||
"invalidServer": "La dirección del servidor del núcleo «{{server}}» no es válida",
|
||||
"openFailed": "No se pudo abrir la interfaz web"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "No se pudo actualizar la configuración del núcleo",
|
||||
"modeUpdateFailed": "No se pudo cambiar el modo de proxy",
|
||||
"restartFailed": "No se pudo reiniciar el núcleo",
|
||||
"startFailed": "No se pudo iniciar el núcleo",
|
||||
"stopFailed": "No se pudo detener el núcleo"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "No se pudo instalar el servicio",
|
||||
"uninstallFailed": "No se pudo desinstalar el servicio",
|
||||
"reinstallFailed": "No se pudo reinstalar el servicio",
|
||||
"repairFailed": "No se pudo reparar el servicio",
|
||||
"sidecarFailed": "No se pudo continuar con Sidecar"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "Núcleo de Clash reiniciado",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "Cerrar todas",
|
||||
"clear": "Limpiar",
|
||||
"previous": "Previous",
|
||||
"next": "Next"
|
||||
"next": "Next",
|
||||
"check": "Comprobar"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "Actualizado el",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "Habilitado",
|
||||
"disabled": "Deshabilitado",
|
||||
"saving": "Saving...",
|
||||
"empty": "Vacío"
|
||||
"empty": "Vacío",
|
||||
"loading": "Cargando..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "Milisegundos",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "Algo salió mal",
|
||||
"label": "Error",
|
||||
"unknown": "Error desconocido",
|
||||
"details": "Detalles del error",
|
||||
"stack": "Pila de errores",
|
||||
"componentStack": "Pila de componentes",
|
||||
"trafficUnavailable": "Datos de tráfico no disponibles",
|
||||
"operationFailed": "La operación falló",
|
||||
"trafficStats": "Traffic Statistics Error",
|
||||
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "URL de prueba"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "Introduce un nombre",
|
||||
"urlRequired": "Introduce una URL de prueba",
|
||||
"invalidSvg": "El icono no es un SVG válido",
|
||||
"uidMissing": "Falta el identificador del elemento de prueba",
|
||||
"saveFailed": "No se pudo guardar el elemento de prueba"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"errors": {
|
||||
"load": "دریافت اطلاعات IP با خطا مواجه شد"
|
||||
"load": "دریافت اطلاعات IP با خطا مواجه شد",
|
||||
"loadWithDetails": "دریافت اطلاعات IP ناموفق بود: {{message}}",
|
||||
"noServices": "هیچ سرویس تشخیص IP در دسترس نیست"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "Group",
|
||||
"proxy": "Proxy",
|
||||
"noActiveNode": "No active proxy node"
|
||||
},
|
||||
"status": {
|
||||
"testing": "در حال آزمایش",
|
||||
"untested": "آزمایشنشده",
|
||||
"error": "خطا",
|
||||
"timeout": "مهلت تمام شد",
|
||||
"latencyHigh": "تأخیر زیاد",
|
||||
"latencyMedium": "تأخیر متوسط",
|
||||
"latencyGood": "تأخیر خوب",
|
||||
"latencyExcellent": "تأخیر عالی",
|
||||
"uninitialized": "مقداردهی نشده",
|
||||
"noProxyNode": "نود پروکسی وجود ندارد"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} Minutes"
|
||||
}
|
||||
},
|
||||
"unknownTime": "زمان نامشخص",
|
||||
"chartStyles": {
|
||||
"smooth": "نرم",
|
||||
"linear": "خطی"
|
||||
},
|
||||
"diagnostics": "نقاط: {{points}} | فشرده: {{compressed}} | FPS: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "عملیات سرویس ناموفق بود",
|
||||
"stateRefreshFailed": "بهروزرسانی وضعیت سرویس ناموفق بود",
|
||||
"restartFailed": "راهاندازی مجدد هسته ناموفق بود",
|
||||
"revalidationFailed": "بهروزرسانی وضعیت اجرا ناموفق بود",
|
||||
"sidecarFailed": "ادامه با Sidecar ناموفق بود"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "هسته را نمیتوان با ایمنی متوقف کرد، بنابراین راهاندازی مجدد لغو شد",
|
||||
"quitCoreStopFailed": "هسته را نمیتوان با ایمنی متوقف کرد، بنابراین خروج لغو شد"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
|
||||
"onlyYaml": "فقط فایلهای YAML پشتیبانی میشوند"
|
||||
"onlyYaml": "فقط فایلهای YAML پشتیبانی میشوند",
|
||||
"createFailed": "ایجاد پروفایل ناموفق بود",
|
||||
"deleteFailed": "حذف پروفایل ناموفق بود",
|
||||
"enhanceFailed": "فعالسازی مجدد پروفایلها ناموفق بود",
|
||||
"importFailed": "وارد کردن پروفایل ناموفق بود",
|
||||
"openFailed": "باز کردن پروفایل ناموفق بود",
|
||||
"readFailed": "خواندن پروفایل ناموفق بود",
|
||||
"reorderFailed": "تغییر ترتیب پروفایلها ناموفق بود",
|
||||
"switchFailed": "تعویض پروفایل ناموفق بود",
|
||||
"updateFailed": "بهروزرسانی پروفایل ناموفق بود"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "Import failed, retrying with Clash proxy...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Force refresh completed",
|
||||
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "دادههای پروفایل در دسترس نیست؛ برای بهروزرسانی اجباری کلیک کنید"
|
||||
}
|
||||
},
|
||||
"title": "پروفایلها"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "نوع",
|
||||
"description": "توضیحات",
|
||||
"subscriptionUrl": "آدرس اشتراک",
|
||||
"userAgent": "عامل کاربر",
|
||||
"httpTimeout": "HTTP Request Timeout",
|
||||
"updateInterval": "فاصله زمانی بهروزرسانی",
|
||||
"useSystemProxy": "استفاده از پراکسی سیستم",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "پذیرش گواهینامههای نامعتبر (خطرناک)",
|
||||
"allowAutoUpdate": "Allow Auto Update"
|
||||
},
|
||||
"types": {
|
||||
"remote": "از راه دور",
|
||||
"local": "محلی"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "نوع پروفایل را انتخاب کنید",
|
||||
"urlRequired": "نشانی اشتراک را وارد کنید",
|
||||
"uidMissing": "شناسه پروفایل موجود نیست",
|
||||
"saveFailed": "ذخیره پروفایل ناموفق بود"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "Proxy Count",
|
||||
"delayCheckReset": "بررسی تأخیر برای لغو ثابت"
|
||||
"delayCheckReset": "بررسی تأخیر برای لغو ثابت",
|
||||
"nodeCount": "{{count}} نود"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "موقعیت",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "آدرس بررسی تأخیر"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "هیچ گروه پروکسی در دسترس نیست",
|
||||
"noProxies": "پروکسیای وجود ندارد"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Chain Proxy Config",
|
||||
"warning": "Chain proxy will significantly reduce network speed. If you do not have a clear business need, or do not understand this configuration, keep it disabled.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "کانال تلگرام",
|
||||
"github": "مخزن GitHub"
|
||||
},
|
||||
"actionsGroupLabel": "پیوندهای تنظیمات",
|
||||
"title": "تنظیمات"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "Port settings saved",
|
||||
"saveFailed": "Failed to save port settings"
|
||||
"saveFailed": "Failed to save port settings",
|
||||
"portTooLow": "پورت باید ۱۰۰۰ یا بیشتر باشد",
|
||||
"portTooHigh": "پورت باید ۶۵۵۳۵ یا کمتر باشد"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "بهروزرسانی"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "این نسخه یک بهروزرسانی اساسی است و پشتیبانی از بهروزرسانی درون برنامه را پشتیبانی نمیکند. لطفاً پس از حذف، دستی دانلود و نصب کنید."
|
||||
"breakChangeError": "این نسخه یک بهروزرسانی اساسی است و پشتیبانی از بهروزرسانی درون برنامه را پشتیبانی نمیکند. لطفاً پس از حذف، دستی دانلود و نصب کنید.",
|
||||
"available": "نسخه جدیدی در دسترس است"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "یادداشت",
|
||||
"tip": "نکته",
|
||||
"important": "مهم",
|
||||
"warning": "هشدار",
|
||||
"caution": "احتیاط"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "پشتیبانی از %host، %port و %secret",
|
||||
"placeholderInstruction": "جایگزین کردن میزبان، پورت و رمز با %host، %port، %secret"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "اطلاعات اتصال هسته در دسترس نیست",
|
||||
"invalidServer": "نشانی سرور هسته «{{server}}» نامعتبر است",
|
||||
"openFailed": "باز کردن رابط وب ناموفق بود"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "بهروزرسانی پیکربندی هسته ناموفق بود",
|
||||
"modeUpdateFailed": "تغییر حالت پروکسی ناموفق بود",
|
||||
"restartFailed": "راهاندازی مجدد هسته ناموفق بود",
|
||||
"startFailed": "راهاندازی هسته ناموفق بود",
|
||||
"stopFailed": "توقف هسته ناموفق بود"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "نصب سرویس ناموفق بود",
|
||||
"uninstallFailed": "حذف سرویس ناموفق بود",
|
||||
"reinstallFailed": "نصب مجدد سرویس ناموفق بود",
|
||||
"repairFailed": "تعمیر سرویس ناموفق بود",
|
||||
"sidecarFailed": "ادامه با Sidecar ناموفق بود"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "هسته Clash مجدداً راهاندازی شد",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "بستن همه",
|
||||
"clear": "پاک کردن",
|
||||
"previous": "Previous",
|
||||
"next": "Next"
|
||||
"next": "Next",
|
||||
"check": "بررسی"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "بهروزرسانی در",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "توانایی فعال شد",
|
||||
"disabled": "غیرفعال شد",
|
||||
"saving": "Saving...",
|
||||
"empty": "خالی خالی"
|
||||
"empty": "خالی خالی",
|
||||
"loading": "در حال بارگذاری..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "میلیثانیه",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "مشکلی پیش آمد",
|
||||
"label": "خطا",
|
||||
"unknown": "خطای نامشخص",
|
||||
"details": "جزئیات خطا",
|
||||
"stack": "پشته خطا",
|
||||
"componentStack": "پشته مؤلفه",
|
||||
"trafficUnavailable": "دادههای ترافیک در دسترس نیست",
|
||||
"operationFailed": "عملیات ناموفق بود",
|
||||
"trafficStats": "Traffic Statistics Error",
|
||||
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "آدرس آزمون"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "یک نام وارد کنید",
|
||||
"urlRequired": "نشانی آزمایش را وارد کنید",
|
||||
"invalidSvg": "آیکون یک SVG معتبر نیست",
|
||||
"uidMissing": "شناسه مورد آزمایش موجود نیست",
|
||||
"saveFailed": "ذخیره مورد آزمایش ناموفق بود"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"errors": {
|
||||
"load": "Gagal mendapatkan informasi IP"
|
||||
"load": "Gagal mendapatkan informasi IP",
|
||||
"loadWithDetails": "Gagal mendapatkan info IP: {{message}}",
|
||||
"noServices": "Tidak ada layanan deteksi IP yang tersedia"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "Group",
|
||||
"proxy": "Proxy",
|
||||
"noActiveNode": "No active proxy node"
|
||||
},
|
||||
"status": {
|
||||
"testing": "Menguji",
|
||||
"untested": "Belum diuji",
|
||||
"error": "Kesalahan",
|
||||
"timeout": "Waktu habis",
|
||||
"latencyHigh": "Latensi tinggi",
|
||||
"latencyMedium": "Latensi sedang",
|
||||
"latencyGood": "Latensi baik",
|
||||
"latencyExcellent": "Latensi sangat baik",
|
||||
"uninitialized": "Belum diinisialisasi",
|
||||
"noProxyNode": "Tidak ada node proxy"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} Minutes"
|
||||
}
|
||||
},
|
||||
"unknownTime": "Waktu tidak diketahui",
|
||||
"chartStyles": {
|
||||
"smooth": "Halus",
|
||||
"linear": "Linier"
|
||||
},
|
||||
"diagnostics": "Titik: {{points}} | Terkompresi: {{compressed}} | FPS: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "Operasi layanan gagal",
|
||||
"stateRefreshFailed": "Gagal menyegarkan status layanan",
|
||||
"restartFailed": "Gagal memulai ulang core",
|
||||
"revalidationFailed": "Gagal menyegarkan status berjalan",
|
||||
"sidecarFailed": "Gagal melanjutkan dengan Sidecar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "Core tidak dapat dihentikan dengan aman, sehingga mulai ulang dibatalkan",
|
||||
"quitCoreStopFailed": "Core tidak dapat dihentikan dengan aman, sehingga keluar dibatalkan"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
|
||||
"onlyYaml": "Hanya File YAML yang Didukung"
|
||||
"onlyYaml": "Hanya File YAML yang Didukung",
|
||||
"createFailed": "Gagal membuat profil",
|
||||
"deleteFailed": "Gagal menghapus profil",
|
||||
"enhanceFailed": "Gagal mengaktifkan ulang profil",
|
||||
"importFailed": "Gagal mengimpor profil",
|
||||
"openFailed": "Gagal membuka profil",
|
||||
"readFailed": "Gagal membaca profil",
|
||||
"reorderFailed": "Gagal mengurutkan ulang profil",
|
||||
"switchFailed": "Gagal beralih profil",
|
||||
"updateFailed": "Gagal memperbarui profil"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "Import failed, retrying with Clash proxy...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Force refresh completed",
|
||||
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "Data profil tidak tersedia; klik untuk menyegarkan paksa"
|
||||
}
|
||||
},
|
||||
"title": "Profil"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "Jenis",
|
||||
"description": "Deskripsi",
|
||||
"subscriptionUrl": "URL Langganan",
|
||||
"userAgent": "User Agent",
|
||||
"httpTimeout": "HTTP Request Timeout",
|
||||
"updateInterval": "Interval Pembaruan",
|
||||
"useSystemProxy": "Gunakan Proksi Sistem",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "Terima Sertifikat Tidak Valid (Bahaya)",
|
||||
"allowAutoUpdate": "Allow Auto Update"
|
||||
},
|
||||
"types": {
|
||||
"remote": "Jarak jauh",
|
||||
"local": "Lokal"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "Pilih jenis profil",
|
||||
"urlRequired": "Masukkan URL langganan",
|
||||
"uidMissing": "Pengenal profil tidak ada",
|
||||
"saveFailed": "Gagal menyimpan profil"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "Proxy Count",
|
||||
"delayCheckReset": "Periksa keterlambatan untuk membatalkan tetap"
|
||||
"delayCheckReset": "Periksa keterlambatan untuk membatalkan tetap",
|
||||
"nodeCount": "{{count}} node"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "Lokasi",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "URL Periksa Keterlambatan"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "Tidak ada grup proxy yang tersedia",
|
||||
"noProxies": "Tidak ada proxy"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Chain Proxy Config",
|
||||
"warning": "Chain proxy will significantly reduce network speed. If you do not have a clear business need, or do not understand this configuration, keep it disabled.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "Saluran Telegram",
|
||||
"github": "Repositori Github"
|
||||
},
|
||||
"actionsGroupLabel": "Tautan pengaturan",
|
||||
"title": "Pengaturan"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "Port settings saved",
|
||||
"saveFailed": "Failed to save port settings"
|
||||
"saveFailed": "Failed to save port settings",
|
||||
"portTooLow": "Port harus 1000 atau lebih tinggi",
|
||||
"portTooHigh": "Port harus 65535 atau lebih rendah"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "Perbarui"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "Versi ini adalah pembaruan besar dan tidak mendukung pembaruan dalam aplikasi. Harap hapus instalasi dan unduh serta instal versi baru secara manual"
|
||||
"breakChangeError": "Versi ini adalah pembaruan besar dan tidak mendukung pembaruan dalam aplikasi. Harap hapus instalasi dan unduh serta instal versi baru secara manual",
|
||||
"available": "Versi baru tersedia"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "Catatan",
|
||||
"tip": "Tips",
|
||||
"important": "Penting",
|
||||
"warning": "Peringatan",
|
||||
"caution": "Perhatian"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "Dukung %host, %port, %secret",
|
||||
"placeholderInstruction": "Ganti host, port, rahasia dengan %host, %port, %secret"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "Informasi koneksi core tidak tersedia",
|
||||
"invalidServer": "Alamat server core \"{{server}}\" tidak valid",
|
||||
"openFailed": "Gagal membuka Web UI"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "Gagal memperbarui konfigurasi core",
|
||||
"modeUpdateFailed": "Gagal mengubah mode proxy",
|
||||
"restartFailed": "Gagal memulai ulang core",
|
||||
"startFailed": "Gagal memulai core",
|
||||
"stopFailed": "Gagal menghentikan core"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "Gagal memasang layanan",
|
||||
"uninstallFailed": "Gagal mencopot layanan",
|
||||
"reinstallFailed": "Gagal memasang ulang layanan",
|
||||
"repairFailed": "Gagal memperbaiki layanan",
|
||||
"sidecarFailed": "Gagal melanjutkan dengan Sidecar"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "Core Clash Dimulai Ulang",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "Tutup Semua",
|
||||
"clear": "Bersihkan",
|
||||
"previous": "Previous",
|
||||
"next": "Next"
|
||||
"next": "Next",
|
||||
"check": "Periksa"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "Diperbarui Pada",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "Diaktifkan",
|
||||
"disabled": "Dinonaktifkan",
|
||||
"saving": "Saving...",
|
||||
"empty": "Kosong"
|
||||
"empty": "Kosong",
|
||||
"loading": "Memuat..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "milidetik",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "Terjadi kesalahan",
|
||||
"label": "Kesalahan",
|
||||
"unknown": "Kesalahan tidak diketahui",
|
||||
"details": "Detail kesalahan",
|
||||
"stack": "Tumpukan kesalahan",
|
||||
"componentStack": "Tumpukan komponen",
|
||||
"trafficUnavailable": "Data lalu lintas tidak tersedia",
|
||||
"operationFailed": "Operasi gagal",
|
||||
"trafficStats": "Traffic Statistics Error",
|
||||
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "URL Tes"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "Masukkan nama",
|
||||
"urlRequired": "Masukkan URL pengujian",
|
||||
"invalidSvg": "Ikon bukan SVG yang valid",
|
||||
"uidMissing": "Pengenal item pengujian tidak ada",
|
||||
"saveFailed": "Gagal menyimpan item pengujian"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "不明"
|
||||
},
|
||||
"errors": {
|
||||
"load": "IP情報の取得に失敗しました"
|
||||
"load": "IP情報の取得に失敗しました",
|
||||
"loadWithDetails": "IP情報の取得に失敗しました: {{message}}",
|
||||
"noServices": "利用可能なIP検出サービスがありません"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "プロキシグループ",
|
||||
"proxy": "ノード",
|
||||
"noActiveNode": "アクティブなプロキシノードがありません。"
|
||||
},
|
||||
"status": {
|
||||
"testing": "テスト中",
|
||||
"untested": "未テスト",
|
||||
"error": "エラー",
|
||||
"timeout": "タイムアウト",
|
||||
"latencyHigh": "遅延が高い",
|
||||
"latencyMedium": "遅延が中程度",
|
||||
"latencyGood": "遅延が良好",
|
||||
"latencyExcellent": "遅延が非常に良好",
|
||||
"uninitialized": "未初期化",
|
||||
"noProxyNode": "プロキシノードがありません"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} Minutes"
|
||||
}
|
||||
},
|
||||
"unknownTime": "不明な時刻",
|
||||
"chartStyles": {
|
||||
"smooth": "スムーズ",
|
||||
"linear": "リニア"
|
||||
},
|
||||
"diagnostics": "データ点: {{points}} | 圧縮後: {{compressed}} | FPS: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "サービス操作に失敗しました",
|
||||
"stateRefreshFailed": "サービス状態の更新に失敗しました",
|
||||
"restartFailed": "コアの再起動に失敗しました",
|
||||
"revalidationFailed": "実行状態の更新に失敗しました",
|
||||
"sidecarFailed": "Sidecar での続行に失敗しました"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "コアを安全に停止できなかったため、再起動をキャンセルしました",
|
||||
"quitCoreStopFailed": "コアを安全に停止できなかったため、終了をキャンセルしました"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
|
||||
"onlyYaml": "YAMLファイルのみサポートされています。"
|
||||
"onlyYaml": "YAMLファイルのみサポートされています。",
|
||||
"createFailed": "プロファイルの作成に失敗しました",
|
||||
"deleteFailed": "プロファイルの削除に失敗しました",
|
||||
"enhanceFailed": "プロファイルの再適用に失敗しました",
|
||||
"importFailed": "プロファイルのインポートに失敗しました",
|
||||
"openFailed": "プロファイルを開けませんでした",
|
||||
"readFailed": "プロファイルの読み込みに失敗しました",
|
||||
"reorderFailed": "プロファイルの並べ替えに失敗しました",
|
||||
"switchFailed": "プロファイルの切り替えに失敗しました",
|
||||
"updateFailed": "プロファイルの更新に失敗しました"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "インポートに失敗しました。Clashプロキシを使用して再試行します...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Force refresh completed",
|
||||
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "プロファイルデータが利用できません。クリックして強制的に更新します"
|
||||
}
|
||||
},
|
||||
"title": "プロファイル"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "タイプ",
|
||||
"description": "説明",
|
||||
"subscriptionUrl": "サブスクリプションURL",
|
||||
"userAgent": "ユーザーエージェント",
|
||||
"httpTimeout": "HTTP Request Timeout",
|
||||
"updateInterval": "更新間隔",
|
||||
"useSystemProxy": "システムプロキシを使用して更新",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "Allows Invalid Certificates (Danger)",
|
||||
"allowAutoUpdate": "Allow Auto Update"
|
||||
},
|
||||
"types": {
|
||||
"remote": "リモート",
|
||||
"local": "ローカル"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "プロファイルの種類を選択してください",
|
||||
"urlRequired": "サブスクリプションURLを入力してください",
|
||||
"uidMissing": "プロファイル識別子がありません",
|
||||
"saveFailed": "プロファイルの保存に失敗しました"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "プロファイルの作成に失敗しました。Clashプロキシを使用して再試行します...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "ノード数",
|
||||
"delayCheckReset": "遅延テストを実行して固定を解除する"
|
||||
"delayCheckReset": "遅延テストを実行して固定を解除する",
|
||||
"nodeCount": "{{count}} ノード"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "現在のノード",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "遅延テストURL"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "利用可能なプロキシグループがありません",
|
||||
"noProxies": "プロキシがありません"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Chain Proxy Config",
|
||||
"warning": "Chain proxy will significantly reduce network speed. If you do not have a clear business need, or do not understand this configuration, keep it disabled.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "Telegramチャンネル",
|
||||
"github": "GitHubリポジトリ"
|
||||
},
|
||||
"actionsGroupLabel": "設定リンク",
|
||||
"title": "設定"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "Port settings saved",
|
||||
"saveFailed": "Failed to save port settings"
|
||||
"saveFailed": "Failed to save port settings",
|
||||
"portTooLow": "ポート番号は 1000 以上である必要があります",
|
||||
"portTooHigh": "ポート番号は 65535 以下である必要があります"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "更新"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "このバージョンは重大な更新であり、アプリケーション内での更新はサポートされていません。アンインストールしてから手動でダウンロードしてインストールしてください。"
|
||||
"breakChangeError": "このバージョンは重大な更新であり、アプリケーション内での更新はサポートされていません。アンインストールしてから手動でダウンロードしてインストールしてください。",
|
||||
"available": "新しいバージョンが利用可能です"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "メモ",
|
||||
"tip": "ヒント",
|
||||
"important": "重要",
|
||||
"warning": "警告",
|
||||
"caution": "注意"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "%host, %port, %secretをサポートします。",
|
||||
"placeholderInstruction": "%host, %port, %secretを使用してホスト、ポート、アクセスキーを表します。"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "コアの接続情報を取得できません",
|
||||
"invalidServer": "コアサーバーアドレス「{{server}}」が無効です",
|
||||
"openFailed": "Web UI を開けませんでした"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "コア設定の更新に失敗しました",
|
||||
"modeUpdateFailed": "プロキシモードの変更に失敗しました",
|
||||
"restartFailed": "コアの再起動に失敗しました",
|
||||
"startFailed": "コアの起動に失敗しました",
|
||||
"stopFailed": "コアの停止に失敗しました"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "サービスのインストールに失敗しました",
|
||||
"uninstallFailed": "サービスのアンインストールに失敗しました",
|
||||
"reinstallFailed": "サービスの再インストールに失敗しました",
|
||||
"repairFailed": "サービスの修復に失敗しました",
|
||||
"sidecarFailed": "Sidecar での続行に失敗しました"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "Clashコアが再起動されました。",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "すべて閉じる",
|
||||
"clear": "クリア",
|
||||
"previous": "Previous",
|
||||
"next": "Next"
|
||||
"next": "Next",
|
||||
"check": "検査"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "更新日時",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "有効",
|
||||
"disabled": "無効",
|
||||
"saving": "Saving...",
|
||||
"empty": "空っぽ"
|
||||
"empty": "空っぽ",
|
||||
"loading": "読み込み中..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "ミリ秒",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "問題が発生しました",
|
||||
"label": "エラー",
|
||||
"unknown": "不明なエラー",
|
||||
"details": "エラーの詳細",
|
||||
"stack": "エラースタック",
|
||||
"componentStack": "コンポーネントスタック",
|
||||
"trafficUnavailable": "トラフィックデータを利用できません",
|
||||
"operationFailed": "操作に失敗しました",
|
||||
"trafficStats": "Traffic Statistics Error",
|
||||
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "テストURL"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "名前を入力してください",
|
||||
"urlRequired": "テストURLを入力してください",
|
||||
"invalidSvg": "アイコンが有効なSVGではありません",
|
||||
"uidMissing": "テスト項目の識別子がありません",
|
||||
"saveFailed": "テスト項目の保存に失敗しました"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "알 수 없음"
|
||||
},
|
||||
"errors": {
|
||||
"load": "IP 정보를 가져오지 못했습니다"
|
||||
"load": "IP 정보를 가져오지 못했습니다",
|
||||
"loadWithDetails": "IP 정보를 가져오지 못했습니다: {{message}}",
|
||||
"noServices": "사용 가능한 IP 감지 서비스가 없습니다"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "그룹",
|
||||
"proxy": "프록시",
|
||||
"noActiveNode": "활성 프록시 노드 없음"
|
||||
},
|
||||
"status": {
|
||||
"testing": "테스트 중",
|
||||
"untested": "테스트 안 함",
|
||||
"error": "오류",
|
||||
"timeout": "시간 초과",
|
||||
"latencyHigh": "지연 높음",
|
||||
"latencyMedium": "지연 보통",
|
||||
"latencyGood": "지연 양호",
|
||||
"latencyExcellent": "지연 매우 우수",
|
||||
"uninitialized": "초기화되지 않음",
|
||||
"noProxyNode": "프록시 노드 없음"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}}분"
|
||||
}
|
||||
},
|
||||
"unknownTime": "알 수 없는 시간",
|
||||
"chartStyles": {
|
||||
"smooth": "부드럽게",
|
||||
"linear": "선형"
|
||||
},
|
||||
"diagnostics": "데이터 점: {{points}} | 압축됨: {{compressed}} | FPS: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "서비스 작업에 실패했습니다",
|
||||
"stateRefreshFailed": "서비스 상태를 새로 고치지 못했습니다",
|
||||
"restartFailed": "코어를 재시작하지 못했습니다",
|
||||
"revalidationFailed": "실행 상태를 새로 고치지 못했습니다",
|
||||
"sidecarFailed": "Sidecar로 계속하지 못했습니다"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "코어를 안전하게 중지할 수 없어 재시작이 취소되었습니다",
|
||||
"quitCoreStopFailed": "코어를 안전하게 중지할 수 없어 종료가 취소되었습니다"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "잘못된 프로필 URL입니다. http:// 또는 https://로 시작하는 URL을 입력하세요",
|
||||
"onlyYaml": "YAML 파일만 지원됩니다"
|
||||
"onlyYaml": "YAML 파일만 지원됩니다",
|
||||
"createFailed": "프로필을 만들지 못했습니다",
|
||||
"deleteFailed": "프로필을 삭제하지 못했습니다",
|
||||
"enhanceFailed": "프로필을 다시 활성화하지 못했습니다",
|
||||
"importFailed": "프로필을 가져오지 못했습니다",
|
||||
"openFailed": "프로필을 열지 못했습니다",
|
||||
"readFailed": "프로필을 읽지 못했습니다",
|
||||
"reorderFailed": "프로필 순서를 변경하지 못했습니다",
|
||||
"switchFailed": "프로필을 전환하지 못했습니다",
|
||||
"updateFailed": "프로필을 업데이트하지 못했습니다"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "가져오기에 실패했습니다. Clash 프록시로 다시 시도 중...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "강제 새로고침 완료",
|
||||
"emergencyRefreshFailed": "긴급 새로고침 실패: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "프로필 데이터를 사용할 수 없습니다. 클릭하여 강제로 새로 고칩니다"
|
||||
}
|
||||
},
|
||||
"title": "프로필"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "유형",
|
||||
"description": "설명",
|
||||
"subscriptionUrl": "구독 URL",
|
||||
"userAgent": "사용자 에이전트",
|
||||
"httpTimeout": "HTTP 요청 시간 초과",
|
||||
"updateInterval": "업데이트 간격",
|
||||
"useSystemProxy": "시스템 프록시 사용",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "잘못된 인증서 허용(위험)",
|
||||
"allowAutoUpdate": "자동 업데이트 허용"
|
||||
},
|
||||
"types": {
|
||||
"remote": "원격",
|
||||
"local": "로컬"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "프로필 유형을 선택하세요",
|
||||
"urlRequired": "구독 URL을 입력하세요",
|
||||
"uidMissing": "프로필 식별자가 없습니다",
|
||||
"saveFailed": "프로필을 저장하지 못했습니다"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "프로필 생성 실패, Clash 프록시로 다시 시도 중...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "프록시 개수",
|
||||
"delayCheckReset": "고정 취소를 위한 지연 확인"
|
||||
"delayCheckReset": "고정 취소를 위한 지연 확인",
|
||||
"nodeCount": "노드 {{count}}개"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "위치 찾기",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "지연 확인 URL"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "사용 가능한 프록시 그룹이 없습니다",
|
||||
"noProxies": "프록시 없음"
|
||||
},
|
||||
"chain": {
|
||||
"header": "체인 프록시 구성",
|
||||
"warning": "체인 프록시는 네트워크 속도를 크게 저하시킬 수 있습니다. 명확한 업무상 필요가 없거나 이 구성을 이해하지 못한다면 비활성화 상태로 두세요.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "Telegram 채널",
|
||||
"github": "GitHub 저장소"
|
||||
},
|
||||
"actionsGroupLabel": "설정 링크",
|
||||
"title": "설정"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "포트 설정이 저장되었습니다",
|
||||
"saveFailed": "포트 설정 저장에 실패했습니다"
|
||||
"saveFailed": "포트 설정 저장에 실패했습니다",
|
||||
"portTooLow": "포트는 1000 이상이어야 합니다",
|
||||
"portTooHigh": "포트는 65535 이하여야 합니다"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "업데이트"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "이 버전은 메이저 업데이트로 앱 내 업데이트를 지원하지 않습니다. 프로그램을 제거한 뒤 새 버전을 수동으로 설치하세요"
|
||||
"breakChangeError": "이 버전은 메이저 업데이트로 앱 내 업데이트를 지원하지 않습니다. 프로그램을 제거한 뒤 새 버전을 수동으로 설치하세요",
|
||||
"available": "새 버전을 사용할 수 있습니다"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "참고",
|
||||
"tip": "팁",
|
||||
"important": "중요",
|
||||
"warning": "경고",
|
||||
"caution": "주의"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "지원되는 자리표시자: %host, %port, %secret",
|
||||
"placeholderInstruction": "host, port, secret을 %host, %port, %secret로 바꿔 입력하세요"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "코어 연결 정보를 사용할 수 없습니다",
|
||||
"invalidServer": "코어 서버 주소 \"{{server}}\"이(가) 잘못되었습니다",
|
||||
"openFailed": "Web UI를 열지 못했습니다"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "코어 구성을 업데이트하지 못했습니다",
|
||||
"modeUpdateFailed": "프록시 모드를 변경하지 못했습니다",
|
||||
"restartFailed": "코어를 재시작하지 못했습니다",
|
||||
"startFailed": "코어를 시작하지 못했습니다",
|
||||
"stopFailed": "코어를 중지하지 못했습니다"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "서비스를 설치하지 못했습니다",
|
||||
"uninstallFailed": "서비스를 제거하지 못했습니다",
|
||||
"reinstallFailed": "서비스를 다시 설치하지 못했습니다",
|
||||
"repairFailed": "서비스를 복구하지 못했습니다",
|
||||
"sidecarFailed": "Sidecar로 계속하지 못했습니다"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "Clash 코어가 재시작되었습니다",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "모두 닫기",
|
||||
"clear": "지우기",
|
||||
"previous": "Previous",
|
||||
"next": "Next"
|
||||
"next": "Next",
|
||||
"check": "검사"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "업데이트 시간",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "사용",
|
||||
"disabled": "비활성화",
|
||||
"saving": "저장 중...",
|
||||
"empty": "비어있음"
|
||||
"empty": "비어있음",
|
||||
"loading": "로드 중..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "밀리초",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "문제가 발생했습니다",
|
||||
"label": "오류",
|
||||
"unknown": "알 수 없는 오류",
|
||||
"details": "오류 세부 정보",
|
||||
"stack": "오류 스택",
|
||||
"componentStack": "컴포넌트 스택",
|
||||
"trafficUnavailable": "트래픽 데이터를 사용할 수 없습니다",
|
||||
"operationFailed": "작업에 실패했습니다",
|
||||
"trafficStats": "트래픽 통계 오류",
|
||||
"trafficStatsDescription": "트래픽 통계 구성 요소에서 오류가 발생하여 충돌을 방지하기 위해 비활성화되었습니다."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "테스트 URL"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "이름을 입력하세요",
|
||||
"urlRequired": "테스트 URL을 입력하세요",
|
||||
"invalidSvg": "아이콘이 유효한 SVG가 아닙니다",
|
||||
"uidMissing": "테스트 항목 식별자가 없습니다",
|
||||
"saveFailed": "테스트 항목을 저장하지 못했습니다"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "Неизвестно"
|
||||
},
|
||||
"errors": {
|
||||
"load": "Не удалось получить информацию об IP"
|
||||
"load": "Не удалось получить информацию об IP",
|
||||
"loadWithDetails": "Не удалось получить сведения об IP: {{message}}",
|
||||
"noServices": "Нет доступных сервисов определения IP"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "Группа",
|
||||
"proxy": "Прокси",
|
||||
"noActiveNode": "Нет активного прокси"
|
||||
},
|
||||
"status": {
|
||||
"testing": "Проверка",
|
||||
"untested": "Не проверено",
|
||||
"error": "Ошибка",
|
||||
"timeout": "Тайм-аут",
|
||||
"latencyHigh": "Высокая задержка",
|
||||
"latencyMedium": "Средняя задержка",
|
||||
"latencyGood": "Хорошая задержка",
|
||||
"latencyExcellent": "Отличная задержка",
|
||||
"uninitialized": "Не инициализировано",
|
||||
"noProxyNode": "Нет прокси-узла"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} мин"
|
||||
}
|
||||
},
|
||||
"unknownTime": "Неизвестное время",
|
||||
"chartStyles": {
|
||||
"smooth": "Плавный",
|
||||
"linear": "Линейный"
|
||||
},
|
||||
"diagnostics": "Точки: {{points}} | Сжато: {{compressed}} | Кадры/с: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "Не удалось выполнить операцию со службой",
|
||||
"stateRefreshFailed": "Не удалось обновить состояние службы",
|
||||
"restartFailed": "Не удалось перезапустить ядро",
|
||||
"revalidationFailed": "Не удалось обновить состояние выполнения",
|
||||
"sidecarFailed": "Не удалось продолжить в режиме Sidecar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "Не удалось безопасно остановить ядро, поэтому перезапуск отменён",
|
||||
"quitCoreStopFailed": "Не удалось безопасно остановить ядро, поэтому выход отменён"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Недопустимый URL профиля. Укажите адрес, начинающийся с http:// или https://",
|
||||
"onlyYaml": "Поддерживаются только файлы YAML"
|
||||
"onlyYaml": "Поддерживаются только файлы YAML",
|
||||
"createFailed": "Не удалось создать профиль",
|
||||
"deleteFailed": "Не удалось удалить профиль",
|
||||
"enhanceFailed": "Не удалось повторно активировать профили",
|
||||
"importFailed": "Не удалось импортировать профиль",
|
||||
"openFailed": "Не удалось открыть профиль",
|
||||
"readFailed": "Не удалось прочитать профиль",
|
||||
"reorderFailed": "Не удалось изменить порядок профилей",
|
||||
"switchFailed": "Не удалось переключить профиль",
|
||||
"updateFailed": "Не удалось обновить профиль"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "Не удалось импортировать, повторная попытка через Clash proxy...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Принудительное обновление завершено",
|
||||
"emergencyRefreshFailed": "Экстренное обновление не удалось: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "Данные профиля недоступны; нажмите для принудительного обновления"
|
||||
}
|
||||
},
|
||||
"title": "Профили"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "Тип",
|
||||
"description": "Описание",
|
||||
"subscriptionUrl": "URL подписки",
|
||||
"userAgent": "User Agent",
|
||||
"httpTimeout": "Тайм-аут HTTP-запроса",
|
||||
"updateInterval": "Интервал обновления",
|
||||
"useSystemProxy": "Использовать системный прокси для обновления",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "Принимать недействительные сертификаты (ОПАСНО)",
|
||||
"allowAutoUpdate": "Разрешить автообновление"
|
||||
},
|
||||
"types": {
|
||||
"remote": "Удалённый",
|
||||
"local": "Локальный"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "Выберите тип профиля",
|
||||
"urlRequired": "Введите URL подписки",
|
||||
"uidMissing": "Отсутствует идентификатор профиля",
|
||||
"saveFailed": "Не удалось сохранить профиль"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "Не удалось создать профиль, повторная попытка через Clash proxy...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "Количество прокси",
|
||||
"delayCheckReset": "Сброс проверки задержки"
|
||||
"delayCheckReset": "Сброс проверки задержки",
|
||||
"nodeCount": "Узлов: {{count}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "Местоположение",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "URL для проверки задержки"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "Нет доступных групп прокси",
|
||||
"noProxies": "Нет прокси"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Цепочка прокси",
|
||||
"warning": "Цепочка прокси может значительно снизить скорость сети. Если у вас нет явной рабочей необходимости или вы не понимаете эту настройку, оставьте ее отключенной.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "Telegram-канал",
|
||||
"github": "GitHub репозиторий"
|
||||
},
|
||||
"actionsGroupLabel": "Ссылки настроек",
|
||||
"title": "Настройки"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Порт {{port}} уже используется",
|
||||
"saved": "Настройки портов сохранены",
|
||||
"saveFailed": "Не удалось сохранить настройки портов"
|
||||
"saveFailed": "Не удалось сохранить настройки портов",
|
||||
"portTooLow": "Порт должен быть не меньше 1000",
|
||||
"portTooHigh": "Порт должен быть не больше 65535"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "Обновить"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "Это крупное обновление, которое не поддерживает обновление внутри приложения. Пожалуйста, удалите текущую версию и загрузите установочный файл вручную."
|
||||
"breakChangeError": "Это крупное обновление, которое не поддерживает обновление внутри приложения. Пожалуйста, удалите текущую версию и загрузите установочный файл вручную.",
|
||||
"available": "Доступна новая версия"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "Примечание",
|
||||
"tip": "Совет",
|
||||
"important": "Важно",
|
||||
"warning": "Предупреждение",
|
||||
"caution": "Осторожно"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "Поддерживаются %host, %port, %secret",
|
||||
"placeholderInstruction": "Замените хост, порт и секрет на %host, %port, %secret"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "Сведения о подключении к ядру недоступны",
|
||||
"invalidServer": "Адрес сервера ядра «{{server}}» недействителен",
|
||||
"openFailed": "Не удалось открыть веб-интерфейс"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "Не удалось обновить конфигурацию ядра",
|
||||
"modeUpdateFailed": "Не удалось изменить режим прокси",
|
||||
"restartFailed": "Не удалось перезапустить ядро",
|
||||
"startFailed": "Не удалось запустить ядро",
|
||||
"stopFailed": "Не удалось остановить ядро"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "Не удалось установить службу",
|
||||
"uninstallFailed": "Не удалось удалить службу",
|
||||
"reinstallFailed": "Не удалось переустановить службу",
|
||||
"repairFailed": "Не удалось восстановить службу",
|
||||
"sidecarFailed": "Не удалось продолжить в режиме Sidecar"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "Ядро перезапущено",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "Закрыть всё",
|
||||
"clear": "Очистить",
|
||||
"previous": "Назад",
|
||||
"next": "Далее"
|
||||
"next": "Далее",
|
||||
"check": "Проверить"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "Обновлено в",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "Включено",
|
||||
"disabled": "Отключено",
|
||||
"saving": "Сохранение...",
|
||||
"empty": "Пусто"
|
||||
"empty": "Пусто",
|
||||
"loading": "Загрузка..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "миллисекунды",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "Что-то пошло не так",
|
||||
"label": "Ошибка",
|
||||
"unknown": "Неизвестная ошибка",
|
||||
"details": "Сведения об ошибке",
|
||||
"stack": "Стек ошибки",
|
||||
"componentStack": "Стек компонентов",
|
||||
"trafficUnavailable": "Данные трафика недоступны",
|
||||
"operationFailed": "Не удалось выполнить операцию",
|
||||
"trafficStats": "Ошибка статистики трафика",
|
||||
"trafficStatsDescription": "Компонент статистики трафика столкнулся с ошибкой и был отключён во избежание сбоев."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "URL для проверки"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "Введите название",
|
||||
"urlRequired": "Введите URL для теста",
|
||||
"invalidSvg": "Значок не является допустимым SVG",
|
||||
"uidMissing": "Отсутствует идентификатор тестового элемента",
|
||||
"saveFailed": "Не удалось сохранить тестовый элемент"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "Bilinmiyor"
|
||||
},
|
||||
"errors": {
|
||||
"load": "IP bilgisi alınamadı"
|
||||
"load": "IP bilgisi alınamadı",
|
||||
"loadWithDetails": "IP bilgisi alınamadı: {{message}}",
|
||||
"noServices": "Kullanılabilir IP algılama hizmeti yok"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "Grup",
|
||||
"proxy": "Vekil",
|
||||
"noActiveNode": "Aktif vekil düğümü yok"
|
||||
},
|
||||
"status": {
|
||||
"testing": "Test ediliyor",
|
||||
"untested": "Test edilmedi",
|
||||
"error": "Hata",
|
||||
"timeout": "Zaman aşımı",
|
||||
"latencyHigh": "Yüksek gecikme",
|
||||
"latencyMedium": "Orta gecikme",
|
||||
"latencyGood": "İyi gecikme",
|
||||
"latencyExcellent": "Mükemmel gecikme",
|
||||
"uninitialized": "Başlatılmadı",
|
||||
"noProxyNode": "Proxy düğümü yok"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} Minutes"
|
||||
}
|
||||
},
|
||||
"unknownTime": "Bilinmeyen zaman",
|
||||
"chartStyles": {
|
||||
"smooth": "Yumuşak",
|
||||
"linear": "Doğrusal"
|
||||
},
|
||||
"diagnostics": "Nokta: {{points}} | Sıkıştırılmış: {{compressed}} | FPS: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "Hizmet işlemi başarısız oldu",
|
||||
"stateRefreshFailed": "Hizmet durumu yenilenemedi",
|
||||
"restartFailed": "Çekirdek yeniden başlatılamadı",
|
||||
"revalidationFailed": "Çalışma durumu yenilenemedi",
|
||||
"sidecarFailed": "Sidecar ile devam edilemedi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "Çekirdek güvenli biçimde durdurulamadı, bu nedenle yeniden başlatma iptal edildi",
|
||||
"quitCoreStopFailed": "Çekirdek güvenli biçimde durdurulamadı, bu nedenle çıkış iptal edildi"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
|
||||
"onlyYaml": "Yalnızca YAML Dosyaları Desteklenir"
|
||||
"onlyYaml": "Yalnızca YAML Dosyaları Desteklenir",
|
||||
"createFailed": "Profil oluşturulamadı",
|
||||
"deleteFailed": "Profil silinemedi",
|
||||
"enhanceFailed": "Profiller yeniden etkinleştirilemedi",
|
||||
"importFailed": "Profil içe aktarılamadı",
|
||||
"openFailed": "Profil açılamadı",
|
||||
"readFailed": "Profil okunamadı",
|
||||
"reorderFailed": "Profiller yeniden sıralanamadı",
|
||||
"switchFailed": "Profil değiştirilemedi",
|
||||
"updateFailed": "Profil güncellenemedi"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "İçe aktarma başarısız oldu, Clash vekil ile yeniden deneniyor...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Force refresh completed",
|
||||
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "Profil verileri kullanılamıyor; zorla yenilemek için tıklayın"
|
||||
}
|
||||
},
|
||||
"title": "Profiller"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "Tip",
|
||||
"description": "Açıklamalar",
|
||||
"subscriptionUrl": "Abonelik URL'si",
|
||||
"userAgent": "Kullanıcı Aracısı",
|
||||
"httpTimeout": "HTTP Request Timeout",
|
||||
"updateInterval": "Güncelleme Aralığı",
|
||||
"useSystemProxy": "Sistem Vekil'ini Kullan",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "Geçersiz Sertifikalara İzin Ver (Tehlikeli)",
|
||||
"allowAutoUpdate": "Allow Auto Update"
|
||||
},
|
||||
"types": {
|
||||
"remote": "Uzak",
|
||||
"local": "Yerel"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "Bir profil türü seçin",
|
||||
"urlRequired": "Bir abonelik URL’si girin",
|
||||
"uidMissing": "Profil tanımlayıcısı eksik",
|
||||
"saveFailed": "Profil kaydedilemedi"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "Profil oluşturma başarısız oldu, Clash vekil ile yeniden deneniyor...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "Vekil Sayısı",
|
||||
"delayCheckReset": "Sabit iptali için gecikme kontrolü"
|
||||
"delayCheckReset": "Sabit iptali için gecikme kontrolü",
|
||||
"nodeCount": "{{count}} düğüm"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "konum",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "Gecikme kontrol URL'si"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "Kullanılabilir proxy grubu yok",
|
||||
"noProxies": "Proxy yok"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Chain Proxy Config",
|
||||
"warning": "Chain proxy will significantly reduce network speed. If you do not have a clear business need, or do not understand this configuration, keep it disabled.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "Telegram Kanalı",
|
||||
"github": "Github Repo"
|
||||
},
|
||||
"actionsGroupLabel": "Ayar bağlantıları",
|
||||
"title": "Ayarlar"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "Port settings saved",
|
||||
"saveFailed": "Failed to save port settings"
|
||||
"saveFailed": "Failed to save port settings",
|
||||
"portTooLow": "Bağlantı noktası 1000 veya daha yüksek olmalıdır",
|
||||
"portTooHigh": "Bağlantı noktası 65535 veya daha düşük olmalıdır"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "Güncelle"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "Bu sürüm büyük bir güncellemedir ve uygulama içi güncellemeleri desteklemez. Lütfen kaldırın ve yeni sürümü manuel olarak indirip kurun"
|
||||
"breakChangeError": "Bu sürüm büyük bir güncellemedir ve uygulama içi güncellemeleri desteklemez. Lütfen kaldırın ve yeni sürümü manuel olarak indirip kurun",
|
||||
"available": "Yeni bir sürüm mevcut"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "Not",
|
||||
"tip": "İpucu",
|
||||
"important": "Önemli",
|
||||
"warning": "Uyarı",
|
||||
"caution": "Dikkat"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "%host, %port, %secret destekler",
|
||||
"placeholderInstruction": "Ana bilgisayar, port, sırrı %host, %port, %secret ile değiştirin"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "Çekirdek bağlantı bilgisi kullanılamıyor",
|
||||
"invalidServer": "Çekirdek sunucu adresi \"{{server}}\" geçersiz",
|
||||
"openFailed": "Web UI açılamadı"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "Çekirdek yapılandırması güncellenemedi",
|
||||
"modeUpdateFailed": "Proxy modu değiştirilemedi",
|
||||
"restartFailed": "Çekirdek yeniden başlatılamadı",
|
||||
"startFailed": "Çekirdek başlatılamadı",
|
||||
"stopFailed": "Çekirdek durdurulamadı"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "Hizmet kurulamadı",
|
||||
"uninstallFailed": "Hizmet kaldırılamadı",
|
||||
"reinstallFailed": "Hizmet yeniden kurulamadı",
|
||||
"repairFailed": "Hizmet onarılamadı",
|
||||
"sidecarFailed": "Sidecar ile devam edilemedi"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "Clash Çekirdeği Yeniden Başlatıldı",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"closeAll": "Tümünü Kapat",
|
||||
"clear": "Temizle",
|
||||
"previous": "Previous",
|
||||
"next": "Next"
|
||||
"next": "Next",
|
||||
"check": "Denetle"
|
||||
},
|
||||
"labels": {
|
||||
"updateAt": "Güncelleme Zamanı",
|
||||
@@ -44,7 +45,8 @@
|
||||
"enabled": "Etkin",
|
||||
"disabled": "Devre Dışı",
|
||||
"saving": "Saving...",
|
||||
"empty": "Boş"
|
||||
"empty": "Boş",
|
||||
"loading": "Yükleniyor..."
|
||||
},
|
||||
"units": {
|
||||
"milliseconds": "ms",
|
||||
@@ -74,6 +76,14 @@
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"unexpected": "Bir şeyler ters gitti",
|
||||
"label": "Hata",
|
||||
"unknown": "Bilinmeyen hata",
|
||||
"details": "Hata ayrıntıları",
|
||||
"stack": "Hata yığını",
|
||||
"componentStack": "Bileşen yığını",
|
||||
"trafficUnavailable": "Trafik verileri kullanılamıyor",
|
||||
"operationFailed": "İşlem başarısız oldu",
|
||||
"trafficStats": "Traffic Statistics Error",
|
||||
"trafficStatsDescription": "The traffic statistics component encountered an error and has been disabled to prevent crashes."
|
||||
},
|
||||
|
||||
@@ -20,6 +20,13 @@
|
||||
},
|
||||
"fields": {
|
||||
"url": "Test URL'si"
|
||||
},
|
||||
"errors": {
|
||||
"nameRequired": "Bir ad girin",
|
||||
"urlRequired": "Bir test URL’si girin",
|
||||
"invalidSvg": "Simge geçerli bir SVG değil",
|
||||
"uidMissing": "Test öğesi tanımlayıcısı eksik",
|
||||
"saveFailed": "Test öğesi kaydedilemedi"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -82,7 +82,9 @@
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"errors": {
|
||||
"load": "IP мәгълүматын алу мөмкин булмады"
|
||||
"load": "IP мәгълүматын алу мөмкин булмады",
|
||||
"loadWithDetails": "IP мәгълүматын алып булмады: {{message}}",
|
||||
"noServices": "IP ачыклау хезмәтләре юк"
|
||||
}
|
||||
},
|
||||
"currentProxy": {
|
||||
@@ -96,6 +98,18 @@
|
||||
"group": "Group",
|
||||
"proxy": "Proxy",
|
||||
"noActiveNode": "No active proxy node"
|
||||
},
|
||||
"status": {
|
||||
"testing": "Тикшерелә",
|
||||
"untested": "Тикшерелмәгән",
|
||||
"error": "Хата",
|
||||
"timeout": "Вакыт узды",
|
||||
"latencyHigh": "Зур тоткарлык",
|
||||
"latencyMedium": "Урта тоткарлык",
|
||||
"latencyGood": "Яхшы тоткарлык",
|
||||
"latencyExcellent": "Бик яхшы тоткарлык",
|
||||
"uninitialized": "Әзерләнмәгән",
|
||||
"noProxyNode": "Прокси төене юк"
|
||||
}
|
||||
},
|
||||
"tests": {
|
||||
@@ -114,7 +128,13 @@
|
||||
},
|
||||
"patterns": {
|
||||
"minutes": "{{time}} Minutes"
|
||||
}
|
||||
},
|
||||
"unknownTime": "Билгесез вакыт",
|
||||
"chartStyles": {
|
||||
"smooth": "Шома",
|
||||
"linear": "Сызыклы"
|
||||
},
|
||||
"diagnostics": "Нокталар: {{points}} | Кысылган: {{compressed}} | FPS: {{fps}}"
|
||||
},
|
||||
"clashMode": {
|
||||
"errors": {
|
||||
|
||||
@@ -28,7 +28,20 @@
|
||||
"reinstall": "Reinstall service",
|
||||
"repair": "Repair service",
|
||||
"continueSidecar": "Continue with Sidecar",
|
||||
"success": "The Clash Verge service was updated successfully"
|
||||
"success": "The Clash Verge service was updated successfully",
|
||||
"errors": {
|
||||
"actionFailed": "Хезмәт операциясе башкарылмады",
|
||||
"stateRefreshFailed": "Хезмәт халәтен яңартып булмады",
|
||||
"restartFailed": "Ядрону яңадан башлап булмады",
|
||||
"revalidationFailed": "Эшләү халәтен яңартып булмады",
|
||||
"sidecarFailed": "Sidecar белән дәвам итеп булмады"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"restartCoreStopFailed": "Ядрону иминлек белән туктатып булмады, шуңа күрә яңадан башлау кире кагылды",
|
||||
"quitCoreStopFailed": "Ядрону иминлек белән туктатып булмады, шуңа күрә чыгу кире кагылды"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,16 @@
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"invalidUrl": "Invalid profile URL. Please enter a URL starting with http:// or https://",
|
||||
"onlyYaml": "Фәкать YAML-файллар гына хуплана"
|
||||
"onlyYaml": "Фәкать YAML-файллар гына хуплана",
|
||||
"createFailed": "Профиль төзеп булмады",
|
||||
"deleteFailed": "Профильне бетереп булмады",
|
||||
"enhanceFailed": "Профильләрне яңадан эшкә җибәреп булмады",
|
||||
"importFailed": "Профильне кертеп булмады",
|
||||
"openFailed": "Профильне ачып булмады",
|
||||
"readFailed": "Профильне укып булмады",
|
||||
"reorderFailed": "Профильләр тәртибен үзгәртеп булмады",
|
||||
"switchFailed": "Профильне алыштырып булмады",
|
||||
"updateFailed": "Профильне яңартып булмады"
|
||||
},
|
||||
"notifications": {
|
||||
"importRetry": "Import failed, retrying with Clash proxy...",
|
||||
@@ -43,6 +52,9 @@
|
||||
"notices": {
|
||||
"forceRefreshCompleted": "Force refresh completed",
|
||||
"emergencyRefreshFailed": "Emergency refresh failed: {{message}}"
|
||||
},
|
||||
"tooltips": {
|
||||
"forceRefreshStaleData": "Профиль мәгълүматы юк; көчләп яңарту өчен басыгыз"
|
||||
}
|
||||
},
|
||||
"title": "Профильләр"
|
||||
@@ -105,6 +117,7 @@
|
||||
"type": "Төр",
|
||||
"description": "Тасвирламалар",
|
||||
"subscriptionUrl": "Подписка URL-ы",
|
||||
"userAgent": "Кулланучы агенты",
|
||||
"httpTimeout": "HTTP Request Timeout",
|
||||
"updateInterval": "Яңарту интервалы",
|
||||
"useSystemProxy": "Системалы проксины кулланып яңарту",
|
||||
@@ -112,6 +125,16 @@
|
||||
"acceptInvalidCerts": "Дөрес булмаган сертификатларны кабул итү (Куркыныч)",
|
||||
"allowAutoUpdate": "Allow Auto Update"
|
||||
},
|
||||
"types": {
|
||||
"remote": "Ерактагы",
|
||||
"local": "Җирле"
|
||||
},
|
||||
"errors": {
|
||||
"typeRequired": "Профиль төрен сайлагыз",
|
||||
"urlRequired": "Язылу сылтамасын кертегез",
|
||||
"uidMissing": "Профиль билгесе юк",
|
||||
"saveFailed": "Профильне саклап булмады"
|
||||
},
|
||||
"feedback": {
|
||||
"notifications": {
|
||||
"creationRetry": "Profile creation failed, retrying with Clash proxy...",
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
},
|
||||
"labels": {
|
||||
"proxyCount": "Proxy Count",
|
||||
"delayCheckReset": "Беркетелгәнне гамәлдән чыгару өчен задержканы тикшерү"
|
||||
"delayCheckReset": "Беркетелгәнне гамәлдән чыгару өчен задержканы тикшерү",
|
||||
"nodeCount": "{{count}} төен"
|
||||
},
|
||||
"tooltips": {
|
||||
"locate": "Урын",
|
||||
@@ -41,6 +42,10 @@
|
||||
"placeholders": {
|
||||
"delayCheckUrl": "Задержканы тикшерү URL-ы"
|
||||
},
|
||||
"empty": {
|
||||
"noAvailableGroups": "Кулланырлык прокси төркемнәре юк",
|
||||
"noProxies": "Проксилар юк"
|
||||
},
|
||||
"chain": {
|
||||
"header": "Chain Proxy Config",
|
||||
"warning": "Chain proxy will significantly reduce network speed. If you do not have a clear business need, or do not understand this configuration, keep it disabled.",
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
"telegram": "Telegram каналы",
|
||||
"github": "GitHub репозиториясе"
|
||||
},
|
||||
"actionsGroupLabel": "Көйләү сылтамалары",
|
||||
"title": "Көйләүләр"
|
||||
},
|
||||
"sections": {
|
||||
@@ -284,7 +285,9 @@
|
||||
"messages": {
|
||||
"portInUse": "Port {{port}} is already in use",
|
||||
"saved": "Port settings saved",
|
||||
"saveFailed": "Failed to save port settings"
|
||||
"saveFailed": "Failed to save port settings",
|
||||
"portTooLow": "Порт 1000 дән ким булмаска тиеш",
|
||||
"portTooHigh": "Порт 65535 тән артмаска тиеш"
|
||||
}
|
||||
},
|
||||
"clashCore": {
|
||||
@@ -429,7 +432,15 @@
|
||||
"update": "Яңарту"
|
||||
},
|
||||
"messages": {
|
||||
"breakChangeError": "Бу зур яңарту, ул кушымта эчендә яңартылмый. Борып алып ташлап, яңадан урнаштыру сорала."
|
||||
"breakChangeError": "Бу зур яңарту, ул кушымта эчендә яңартылмый. Борып алып ташлап, яңадан урнаштыру сорала.",
|
||||
"available": "Яңа версия бар"
|
||||
},
|
||||
"alerts": {
|
||||
"note": "Искәрмә",
|
||||
"tip": "Киңәш",
|
||||
"important": "Мөһим",
|
||||
"warning": "Кисәтү",
|
||||
"caution": "Игътибар"
|
||||
}
|
||||
},
|
||||
"sysproxy": {
|
||||
@@ -590,6 +601,11 @@
|
||||
"messages": {
|
||||
"supportedPlaceholders": "%host, %port, %secret макросларын хуплау",
|
||||
"placeholderInstruction": "Хост, порт, серсүзне %host, %port, %secret белән алмаштырыгыз"
|
||||
},
|
||||
"errors": {
|
||||
"clashInfoUnavailable": "Ядро тоташу мәгълүматы юк",
|
||||
"invalidServer": "Ядро сервер адресы «{{server}}» дөрес түгел",
|
||||
"openFailed": "Web UI ачып булмады"
|
||||
}
|
||||
},
|
||||
"hotkey": {
|
||||
@@ -617,6 +633,22 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"errors": {
|
||||
"clash": {
|
||||
"configUpdateFailed": "Ядро көйләүләрен яңартып булмады",
|
||||
"modeUpdateFailed": "Прокси режимын үзгәртеп булмады",
|
||||
"restartFailed": "Ядрону яңадан башлап булмады",
|
||||
"startFailed": "Ядрону башлап булмады",
|
||||
"stopFailed": "Ядрону туктатып булмады"
|
||||
},
|
||||
"clashService": {
|
||||
"installFailed": "Хезмәтне урнаштырып булмады",
|
||||
"uninstallFailed": "Хезмәтне бетереп булмады",
|
||||
"reinstallFailed": "Хезмәтне яңадан урнаштырып булмады",
|
||||
"repairFailed": "Хезмәтне төзәтеп булмады",
|
||||
"sidecarFailed": "Sidecar белән дәвам итеп булмады"
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"clash": {
|
||||
"restartSuccess": "Clash ядросы яңадан башланды",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user