chore: update i18n

This commit is contained in:
wonfen
2026-07-24 11:53:50 +08:00
parent 82c486923b
commit bce83d5c6f
123 changed files with 2178 additions and 277 deletions
+21 -8
View File
@@ -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();
}
+29
View File
@@ -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"
);
}
}
+52 -29
View File
@@ -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)
}
+9 -12
View File
@@ -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")
}
+1 -4
View File
@@ -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;
}
+1 -4
View File
@@ -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;
}
+5 -3
View File
@@ -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>
+51 -12
View File
@@ -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)
}
+3 -1
View File
@@ -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>
</>
)
+1 -1
View File
@@ -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>
)
+27 -9
View File
@@ -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')}
/>
)}
/>
+12 -19
View File
@@ -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' }}>
+7 -2
View File
@@ -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}
/>
+1 -1
View File
@@ -183,7 +183,7 @@ export const ProxyItemMini = (props: Props) => {
':hover': { bgcolor: alpha(palette.primary.main, 0.15) },
})}
>
Check
{t('shared.actions.check')}
</Widget>
)}
+3 -1
View File
@@ -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>
)}
+3 -1
View File
@@ -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>
)
}
+1 -1
View File
@@ -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)
}
})
+40 -10
View File
@@ -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
+11 -3
View File
@@ -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>
}
>
+3 -3
View File
@@ -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>
+11 -5
View File
@@ -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)
}
}),
+7 -2
View File
@@ -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),
)
}
}
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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": "تعذّر إيقاف النواة بأمان، لذا أُلغي الخروج"
}
}
}
+24 -1
View File
@@ -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...",
+6 -1
View File
@@ -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.",
+34 -2
View File
@@ -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",
+12 -2
View File
@@ -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."
},
+7
View File
@@ -20,6 +20,13 @@
},
"fields": {
"url": "رابط الاختبار"
},
"errors": {
"nameRequired": "أدخل اسمًا",
"urlRequired": "أدخل رابط الاختبار",
"invalidSvg": "الأيقونة ليست بصيغة SVG صالحة",
"uidMissing": "مُعرّف عنصر الاختبار مفقود",
"saveFailed": "تعذّر حفظ عنصر الاختبار"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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"
}
}
}
+24 -1
View File
@@ -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...",
+6 -1
View File
@@ -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.",
+34 -2
View File
@@ -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",
+12 -2
View File
@@ -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."
},
+7
View File
@@ -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"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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"
}
}
}
+24 -1
View File
@@ -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...",
+6 -1
View File
@@ -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.",
+34 -2
View File
@@ -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",
+12 -2
View File
@@ -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."
},
+7
View File
@@ -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"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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"
}
}
}
+24 -1
View File
@@ -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...",
+6 -1
View File
@@ -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.",
+34 -2
View File
@@ -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",
+12 -2
View File
@@ -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."
},
+7
View File
@@ -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"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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": "هسته را نمی‌توان با ایمنی متوقف کرد، بنابراین خروج لغو شد"
}
}
}
+24 -1
View File
@@ -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...",
+6 -1
View File
@@ -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.",
+34 -2
View File
@@ -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 مجدداً راه‌اندازی شد",
+12 -2
View File
@@ -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."
},
+7
View File
@@ -20,6 +20,13 @@
},
"fields": {
"url": "آدرس آزمون"
},
"errors": {
"nameRequired": "یک نام وارد کنید",
"urlRequired": "نشانی آزمایش را وارد کنید",
"invalidSvg": "آیکون یک SVG معتبر نیست",
"uidMissing": "شناسه مورد آزمایش موجود نیست",
"saveFailed": "ذخیره مورد آزمایش ناموفق بود"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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"
}
}
}
+24 -1
View File
@@ -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...",
+6 -1
View File
@@ -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.",
+34 -2
View File
@@ -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",
+12 -2
View File
@@ -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."
},
+7
View File
@@ -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"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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": "コアを安全に停止できなかったため、終了をキャンセルしました"
}
}
}
+24 -1
View File
@@ -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プロキシを使用して再試行します...",
+6 -1
View File
@@ -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.",
+34 -2
View File
@@ -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コアが再起動されました。",
+12 -2
View File
@@ -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."
},
+7
View File
@@ -20,6 +20,13 @@
},
"fields": {
"url": "テストURL"
},
"errors": {
"nameRequired": "名前を入力してください",
"urlRequired": "テストURLを入力してください",
"invalidSvg": "アイコンが有効なSVGではありません",
"uidMissing": "テスト項目の識別子がありません",
"saveFailed": "テスト項目の保存に失敗しました"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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": "코어를 안전하게 중지할 수 없어 종료가 취소되었습니다"
}
}
}
+24 -1
View File
@@ -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 프록시로 다시 시도 중...",
+6 -1
View File
@@ -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": "체인 프록시는 네트워크 속도를 크게 저하시킬 수 있습니다. 명확한 업무상 필요가 없거나 이 구성을 이해하지 못한다면 비활성화 상태로 두세요.",
+34 -2
View File
@@ -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 코어가 재시작되었습니다",
+12 -2
View File
@@ -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": "트래픽 통계 구성 요소에서 오류가 발생하여 충돌을 방지하기 위해 비활성화되었습니다."
},
+7
View File
@@ -20,6 +20,13 @@
},
"fields": {
"url": "테스트 URL"
},
"errors": {
"nameRequired": "이름을 입력하세요",
"urlRequired": "테스트 URL을 입력하세요",
"invalidSvg": "아이콘이 유효한 SVG가 아닙니다",
"uidMissing": "테스트 항목 식별자가 없습니다",
"saveFailed": "테스트 항목을 저장하지 못했습니다"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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": "Не удалось безопасно остановить ядро, поэтому выход отменён"
}
}
}
+24 -1
View File
@@ -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...",
+6 -1
View File
@@ -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": "Цепочка прокси может значительно снизить скорость сети. Если у вас нет явной рабочей необходимости или вы не понимаете эту настройку, оставьте ее отключенной.",
+34 -2
View File
@@ -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": "Ядро перезапущено",
+12 -2
View File
@@ -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": "Компонент статистики трафика столкнулся с ошибкой и был отключён во избежание сбоев."
},
+7
View File
@@ -20,6 +20,13 @@
},
"fields": {
"url": "URL для проверки"
},
"errors": {
"nameRequired": "Введите название",
"urlRequired": "Введите URL для теста",
"invalidSvg": "Значок не является допустимым SVG",
"uidMissing": "Отсутствует идентификатор тестового элемента",
"saveFailed": "Не удалось сохранить тестовый элемент"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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"
}
}
}
+24 -1
View File
@@ -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...",
+6 -1
View File
@@ -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.",
+34 -2
View File
@@ -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ı",
+12 -2
View File
@@ -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."
},
+7
View File
@@ -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"
}
}
},
+22 -2
View File
@@ -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": {
+14 -1
View File
@@ -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": "Ядрону иминлек белән туктатып булмады, шуңа күрә чыгу кире кагылды"
}
}
}
+24 -1
View File
@@ -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...",
+6 -1
View File
@@ -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.",
+34 -2
View File
@@ -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