mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-31 15:45:23 +00:00
* fix(sso): send the PKCE verifier for GitHub login (#1534) * fix(remote-desktop): clip cursor overflow without disabling zoom (#1535) * test(remote-desktop): preserve sessions beyond one hour (#1536) * fix(hosts): expose controls for overflowing editor tabs (#1537) * fix(hosts): expose controls for overflowing editor tabs * test(hosts): mock resize observation in admin panel tests * fix(status): skip TCP probes while host sessions are active (#1538) * fix(database): batch session activity persistence (#1539) * docs(api): describe cookie and API key authentication (#1540) * fix(snippets): repair missing note column on SQLite upgrades (#1541) * fix(docker): retain stored SSH credential association (#1543) * fix(file-manager): render transfer toasts without plugin hooks (#1546) * feat(hosts): keep compact row actions inline (#1547) * fix(auth): allow retrying unavailable second-factor interfaces (#1549) * fix(auth): reject unresolved legacy identity provisioning (#1550) * fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551) * fix(tmux): pass full session info to the terminal's session picker (#1552) The tmux.sessions service reduced detected sessions to bare names, but the picker reads session.name, so every entry rendered blank and selecting one sent an empty name, which created a new session instead of attaching. * fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553) The column holds the text "true"/"false", and the resolver passed it through as-is. The string "false" is truthy, so the password provider treated every saved host as forced keyboard-interactive and left the password out. Jump hops are built straight from the resolved host, so a password hop whose server doesn't offer keyboard-interactive failed with "All configured authentication methods failed". * fix(database): batch database saves for bulk host writes (#1554) * fix(database): yield to the event loop between database saves Each SQLite save serializes and encrypts the whole database into new buffers, which V8 only releases once the event loop turns. Boot migrations and bulk host import write plugin settings per host and per key in an awaited loop, so hundreds of full copies piled up and the container ran out of memory. * fix(database): save once per bulk host write instead of once per row On SQLite every repository write force-saves the whole database. Boot plugin data migrations, host defaults materialization and the bulk host routes write one row per host per setting, so they serialized and encrypted the full database hundreds of times in a row. DatabaseSaveTrigger.batched wraps a function so force saves made while it runs collapse into a single save when it finishes. Nested scopes fold into the outer one, and work that outlives its scope saves normally. * feat(hosts): add instance-wide predefined tag suggestions (#1548) * feat(hosts): add shared predefined tag suggestions * style(hosts): format tag catalog routes * test(database): advance fake timers past the save yield (#1555) * fix(i18n): complete Simplified Chinese core and plugin translations (#1542) * fix(i18n): complete Chinese onboarding and navigation labels * fix(i18n): translate remaining Chinese core and plugin interfaces * fix(i18n): translate host editor tab overflow controls * fix(i18n): use consistent Chinese fleet terminology * fix(i18n): localize hardcoded controls and plugin views * fix(i18n): translate built-in homepage widget catalog * test(homepage): follow translated timezone placeholder * fix(i18n): translate plugin-provided homepage widgets * fix(i18n): localize feature settings section titles * fix: 2.8 oidc accounts unable to sign in after upgrading (#1381) * fix: plugins losing the saved ssh login when copying a host (#1391) * fix: fleets, proxmox and automations not getting the host sudo password * fix: host imports running a defaults pass and metrics restart per host (#1384) * fix: high cpu from status probes and full database saves on every sample (#1300) * fix: user data export freezing the server (#1393) * fix: op:// secret references rejected as ssh keys on credentials (#1394) * fix: slow file deletes from the trash lookups on every delete (#1390) * fix: add openapi docs and error handling to host tag routes * test: compare download stream buffers directly so it stops timing out * chore: drop em dash from host row comment * chore: update release notes for 2.9.1 * fix: restore space to add host tags and redesign predefined tags editor * fix: host key silently accepted when the host is missing from the database (#1397) * fix: clearer host login failed status label and fix its translations (#1396) * chore: add host key and status label fixes to release notes * fix: sso and ldap provider dialogs overflowing the screen and using mismatched toggles * chore: increment ver * fix(audit): store plugin entries with no acting user as a null user_id (#1556) Plugin audit entries written outside a request used the literal "system" as user_id. That column references users.id, so the insert was refused (Postgres logs it as an FK violation) and the entry was silently dropped. Write null instead and keep "system" / plugin:<id> in username. * chore: add sso/ldap dialog and audit log fixes to release notes * fix: tunnels and host settings missing from shared hosts on desktop * fix: remote desktop logins missing from shared hosts on desktop * fix: simplify host status to online/offline and keep it live without a refresh * chore: sync Crowdin translations for 2.9.1 --------- Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
316 lines
13 KiB
JSON
316 lines
13 KiB
JSON
{
|
|
"nav": {
|
|
"hostMetrics": "호스트 메트릭"
|
|
},
|
|
"hostMetrics": {
|
|
"cpu": "CPU",
|
|
"memory": "메모리",
|
|
"disk": "디스크",
|
|
"network": "네트워크",
|
|
"uptime": "업타임",
|
|
"processes": "프로세스",
|
|
"available": "사용 가능",
|
|
"free": "여유",
|
|
"connecting": "연결 중...",
|
|
"connectionFailed": "서버 연결 실패",
|
|
"naCpus": "N/A CPU",
|
|
"cpuCores_one": "{{count}} 코어",
|
|
"cpuCores_other": "{{count}} 코어",
|
|
"cpuUsage": "CPU 사용률",
|
|
"memoryUsage": "메모리 사용률",
|
|
"diskUsage": "디스크 사용률",
|
|
"selectFilesystem": "파일 시스템을 선택하세요",
|
|
"temperature": "온도",
|
|
"highestTemperature": "최고 온도",
|
|
"primaryTemperatureSensor": "1차 센서",
|
|
"gpu": {
|
|
"title": "GPU",
|
|
"noDevice": "NVIDIA GPU가 감지되지 않았습니다. NVIDIA 드라이버를 설치하세요(드라이버에는 nvidia-smi가 포함되어 있습니다). 그러면 GPU 메트릭을 확인할 수 있습니다.",
|
|
"driver": "드라이버 {{version}}",
|
|
"utilization": "이용",
|
|
"memory": "VRAM",
|
|
"temperature": "임시",
|
|
"power": "힘",
|
|
"fan": "팬",
|
|
"processes": "GPU 프로세스",
|
|
"noProcesses": "GPU를 사용하는 프로세스가 없습니다."
|
|
},
|
|
"failedToFetchHostConfig": "호스트 구성 가져오기 실패",
|
|
"serverOffline": "서버 오프라인",
|
|
"cannotFetchMetrics": "오프라인 서버에서 메트릭 가져오기 불가",
|
|
"totpFailed": "TOTP 인증 실패",
|
|
"noneAuthNotSupported": "호스트 메트릭에서 'none' 인증 유형을 지원하지 않습니다.",
|
|
"noHostSelected": "호스트가 선택되지 않았습니다.",
|
|
"load": "부하",
|
|
"systemInfo": "시스템 정보",
|
|
"hostname": "호스트 이름",
|
|
"operatingSystem": "운영 체제",
|
|
"kernel": "커널",
|
|
"seconds": "초",
|
|
"networkInterfaces": "네트워크 인터페이스",
|
|
"noInterfacesFound": "네트워크 인터페이스를 찾을 수 없습니다.",
|
|
"noProcessesFound": "프로세스를 찾을 수 없습니다.",
|
|
"processesTotal": "전체",
|
|
"processesRunning": "실행 중",
|
|
"loginStats": "SSH 로그인 통계",
|
|
"noRecentLoginData": "최근 로그인 데이터가 없습니다.",
|
|
"ports": {
|
|
"title": "수신 대기 포트",
|
|
"protocol": "프로토콜",
|
|
"port": "포트",
|
|
"address": "주소",
|
|
"process": "프로세스",
|
|
"search": "포트 검색...",
|
|
"allProtocols": "전체",
|
|
"noData": "수신 대기 포트 데이터가 없습니다."
|
|
},
|
|
"firewall": {
|
|
"title": "방화벽",
|
|
"inactive": "비활성",
|
|
"policy": "정책",
|
|
"rules": "규칙",
|
|
"noRules": "이 체인에 규칙이 없습니다.",
|
|
"noData": "방화벽 데이터를 사용할 수 없습니다.",
|
|
"action": "동작",
|
|
"protocol": "프로토콜",
|
|
"port": "포트",
|
|
"source": "소스",
|
|
"anywhere": "모든 곳",
|
|
"chains": "체인"
|
|
},
|
|
"loadAvg": "로드 평균",
|
|
"swap": "스왑",
|
|
"architecture": "아키텍처",
|
|
"refresh": "새로 고침",
|
|
"retry": "재시도",
|
|
"customize": "레이아웃 사용자 정의",
|
|
"reset": "초기화",
|
|
"tabLive": "실시간",
|
|
"editModeInstructions": "카드를 드래그하여 재배열하고, 아래쪽 가장자리를 드래그하여 크기를 조정하며, 너비 버튼을 사용해 카드의 가로 폭을 변경하세요. 아래에서 카드를 추가하거나 제거할 수 있습니다.",
|
|
"managers": {
|
|
"services": "서비스",
|
|
"processInspector": "프로세스 검사기",
|
|
"logViewer": "로그 뷰어",
|
|
"cron": "크론 작업",
|
|
"packages": "패키지",
|
|
"ssl": "SSL 인증서",
|
|
"firewall": "방화벽",
|
|
"users": "사용자 및 권한",
|
|
"healthCheck": "상태 검사",
|
|
"diskBreakdown": "디스크 분석",
|
|
"systemdTimers": "타이머",
|
|
"topMemory": "메모리 사용량 상위",
|
|
"noData": "데이터 없음",
|
|
"sudoHint": "호스트 편집기에서 이 호스트의 sudo 암호를 설정하여 권한이 필요한 작업을 활성화하세요.",
|
|
"filter": "필터...",
|
|
"start": "시작",
|
|
"stop": "중지",
|
|
"restart": "재시작",
|
|
"actionDone": "{{name}} 업데이트됨",
|
|
"actionFailed": "작업 실패",
|
|
"signalSent": "PID {{pid}}에 시그널 전송됨",
|
|
"killHint": "클릭: 종료 (SIGTERM). 마우스 오른쪽 클릭: 강제 종료 (SIGKILL).",
|
|
"working": "작업 중...",
|
|
"update": "업데이트",
|
|
"upgradeAll": "모두 업그레이드",
|
|
"allUpToDate": "모든 항목이 최신 상태입니다",
|
|
"save": "저장",
|
|
"command": "명령",
|
|
"enabled": "활성화됨",
|
|
"cronSaved": "Crontab이 업데이트되었습니다",
|
|
"clients": "클라이언트",
|
|
"dryRun": "테스트 실행",
|
|
"renew": "갱신",
|
|
"noAcmeClient": "이 호스트에 ACME 클라이언트(certbot 또는 acme.sh)가 없습니다.",
|
|
"addInputRule": "INPUT 규칙 추가",
|
|
"firewallWarning": "변경 사항은 저장하기 전까지 런타임에만 적용됩니다. 접근이 차단되지 않도록 주의하세요.",
|
|
"ruleApplied": "규칙이 적용되었습니다",
|
|
"invalidPort": "유효한 포트(1-65535)를 입력하세요",
|
|
"newUsername": "새 사용자 이름",
|
|
"addUser": "추가",
|
|
"deleteUser": "사용자 삭제",
|
|
"noHealthChecks": "아직 상태 점검이 구성되지 않았습니다.",
|
|
"follow": "따라가기",
|
|
"noLogData": "로그 출력이 없습니다.",
|
|
"tree": "트리",
|
|
"enableDisable": "부팅 시 활성화/비활성화",
|
|
"grantSudo": "sudo 권한 부여",
|
|
"revokeSudo": "sudo 권한 회수",
|
|
"sslIssueCert": "인증서 발급",
|
|
"sslExpired": "만료됨",
|
|
"sslInDays": "{{days}}일 후",
|
|
"sslNeedDomain": "최소 하나의 도메인을 입력하세요",
|
|
"sslIssued": "인증서가 발급되었습니다",
|
|
"sslDomainsPlaceholder": "example.com, www.example.com",
|
|
"sslHttpStandalone": "HTTP (독립형)",
|
|
"sslHttpWebroot": "HTTP (웹루트)",
|
|
"sslDns": "DNS",
|
|
"sslDnsProvider": "DNS 공급자 (예: cloudflare)",
|
|
"sslIssueHint": "DNS 공급자 자격 증명이 호스트에 이미 구성되어 있어야 합니다.",
|
|
"sslRevoke": "인증서 폐기",
|
|
"sslRevoked": "인증서가 폐기되었습니다",
|
|
"sslRevokeConfirm": "인증서 \"{{name}}\"을(를) 폐기하고 제거하시겠습니까? 이 작업은 취소할 수 없습니다.",
|
|
"healthRun": "실행",
|
|
"healthName": "이름",
|
|
"healthTarget": "호스트 / 주소",
|
|
"healthAddCheck": "검사 추가",
|
|
"healthSaved": "상태 검사가 저장되었습니다",
|
|
"healthMissingFields": "각 검사에는 이름과 대상이 필요합니다",
|
|
"logFile": "파일",
|
|
"logUnit": "유닛",
|
|
"logCustomPath": "/var/log 아래의 사용자 지정 경로 (선택 사항)",
|
|
"logGrep": "줄 필터...",
|
|
"firewallPersist": "규칙 영구 저장",
|
|
"firewallPersisted": "방화벽 규칙이 영구 저장되었습니다",
|
|
"wireguard": "WireGuard",
|
|
"wgNotInstalled": "이 호스트에 WireGuard가 설치되어 있지 않습니다",
|
|
"wgNoInterfaces": "구성된 WireGuard 인터페이스가 없습니다",
|
|
"wgInterfaceUp": "올리기",
|
|
"wgInterfaceDown": "내리기",
|
|
"wgBringingUp": "{{name}} 올리는 중...",
|
|
"wgBringingDown": "{{name}} 내리는 중...",
|
|
"wgInterfaceUpDone": "{{name}}이(가) 올라왔습니다",
|
|
"wgInterfaceDownDone": "{{name}}이(가) 내려갔습니다",
|
|
"wgListenPort": "포트",
|
|
"wgPublicKey": "공개 키",
|
|
"wgEndpoint": "엔드포인트",
|
|
"wgAllowedIPs": "허용된 IP",
|
|
"wgLastHandshake": "마지막 핸드셰이크",
|
|
"wgHandshakeNever": "없음",
|
|
"wgTransfer": "전송",
|
|
"wgNoPeers": "동료 없음"
|
|
}
|
|
},
|
|
"metricsHistory": {
|
|
"title": "메트릭 기록",
|
|
"historySuffix": "기록",
|
|
"cpuMemoryDisk": "CPU / 메모리 / 디스크",
|
|
"network": "네트워크",
|
|
"download": "RX",
|
|
"upload": "TX",
|
|
"noData": "이 시간 범위에 대한 기록 데이터가 없습니다.",
|
|
"custom": "사용자 지정",
|
|
"to": "~",
|
|
"apply": "적용",
|
|
"viewHistory": "기록 보기"
|
|
},
|
|
"hosts": {
|
|
"tabHostMetrics": "호스트 메트릭",
|
|
"metricsCollectionLabel": "메트릭 수집",
|
|
"enableMetricsLabel": "메트릭 활성화",
|
|
"enableMetricsDesc": "이 호스트에서 CPU, RAM, 디스크 및 기타 메트릭을 수집합니다.",
|
|
"useGlobalMetrics": "전역 간격 사용",
|
|
"useGlobalMetricsDesc": "서버 전체 메트릭 간격으로 재정의합니다.",
|
|
"metricsIntervalS": "메트릭 간격(초)",
|
|
"metricsIntervalDesc2": "메트릭 스냅샷 간격(초)",
|
|
"excludedMountsLabel": "제외된 마운트",
|
|
"monitoredMountsLabel": "사용자 지정 모니터링 경로",
|
|
"monitoredMountsDesc": "/config와 같이 바인드 마운트된 Home Assistant 경로를 포함하여 별도의 마운트로 노출되지 않는 경로를 추가합니다.",
|
|
"monitoredMountPathPlaceholder": "경로(/config, /mnt/data)",
|
|
"monitoredMountLabelPlaceholder": "레이블 (선택 사항)",
|
|
"addMonitoredMount": "경로를 추가합니다",
|
|
"excludedMountsDesc": "이 호스트의 디스크 사용량 및 알림에서 특정 마운트 지점 또는 파일 시스템 유형(예: NFS, CIFS)을 숨깁니다.",
|
|
"excludedMountsPlaceholder": "마운트 경로(/mnt/nas) 또는 파일 시스템 유형(nfs, cifs)",
|
|
"excludedMountsEmpty": "마운트된 항목을 제외하지 않습니다. 감지된 모든 파일 시스템이 표시됩니다.",
|
|
"addExcludedMount": "추가",
|
|
"visibleWidgets": "표시 위젯",
|
|
"widgetsMovedToHostMetrics": "카드는 이제 호스트 메트릭 탭에서 직접 추가, 정렬 및 크기 조정됩니다. 이 호스트의 호스트 메트릭을 열고 사용자 정의를 사용하여 표시할 카드를 선택하세요.",
|
|
"hostNotFound": "호스트를 찾을 수 없습니다",
|
|
"loadingHost": "호스트 로드 중..."
|
|
},
|
|
"onboarding": {
|
|
"feature_metrics": "지표 및 알림",
|
|
"feature_metrics_desc": "CPU, 메모리 및 디스크 사용량을 시간 경과에 따라 추적하고, 문제가 발생하면 알림을 받으세요."
|
|
},
|
|
"admin": {
|
|
"metricsHistoryRetention": "메트릭 이력 보존 기간",
|
|
"metricsHistoryRetentionRange": "1~90일",
|
|
"days": "일"
|
|
},
|
|
"homepage": {
|
|
"noData": "데이터 없음",
|
|
"showCurrentValue": "현재 값 표시",
|
|
"chartMetric": "메트릭",
|
|
"metricRange": "범위",
|
|
"host": "호스트",
|
|
"loading": "로딩 중...",
|
|
"metricCpu": "CPU",
|
|
"metricDisk": "디스크",
|
|
"metricHostname": "호스트명",
|
|
"metricKernel": "커널",
|
|
"metricMemory": "메모리",
|
|
"metricNetwork": "네트워크",
|
|
"metricOs": "OS",
|
|
"metricProcesses": "프로세스",
|
|
"metricProcessesRunning": "실행 중",
|
|
"metricProcessesTotal": "전체",
|
|
"metricUptime": "업타임",
|
|
"metricsNotAvailable": "메트릭을 사용할 수 없습니다",
|
|
"noHostSelected": "선택된 호스트 없음",
|
|
"selectHost": "호스트 선택..."
|
|
},
|
|
"terminalStatus": {
|
|
"unavailable": "실시간 통계를 사용할 수 없습니다."
|
|
},
|
|
"dashboard": {
|
|
"cpu": "CPU",
|
|
"ram": "RAM"
|
|
},
|
|
"dashboardTab": {
|
|
"disk": "디스크"
|
|
},
|
|
"terminal": {
|
|
"connected": "연결됨"
|
|
},
|
|
"permissions": {
|
|
"use": {
|
|
"title": "호스트 메트릭 사용",
|
|
"description": "접속 가능한 호스트에서 호스트 지표를 확인하고 호스트 관리자(서비스, 패키지, 방화벽 등)를 사용하세요."
|
|
}
|
|
},
|
|
"settings": {
|
|
"admin": {
|
|
"metricsInterval": {
|
|
"label": "측정 간격(초)",
|
|
"description": "호스트가 자체 간격을 설정하지 않는 한, 보고 있는 호스트를 샘플링하는 빈도입니다."
|
|
},
|
|
"historyRetentionDays": {
|
|
"label": "기록 보존 기간(일)",
|
|
"description": "기록 차트를 위해 측정값 샘플을 보관하는 기간은 얼마나 되나요?"
|
|
},
|
|
"enabledForNewHosts": {
|
|
"label": "새 호스트에 대한 메트릭 활성화",
|
|
"description": "새 호스트가 메트릭 수집 기능을 켠 상태로 시작하는지 여부."
|
|
}
|
|
},
|
|
"user": {
|
|
"temperatureUnit": {
|
|
"label": "온도 단위",
|
|
"description": "호스트 메트릭스에서 온도가 표시되는 방식입니다.",
|
|
"celsius": "섭씨",
|
|
"fahrenheit": "화씨"
|
|
}
|
|
},
|
|
"host": {
|
|
"metricsEnabled": {
|
|
"label": "측정 지표 수집"
|
|
},
|
|
"metricsInterval": {
|
|
"label": "측정 간격(초)"
|
|
},
|
|
"enabledWidgets": {
|
|
"label": "활성화된 위젯"
|
|
},
|
|
"excludedMounts": {
|
|
"label": "제외된 마운트"
|
|
},
|
|
"monitoredMounts": {
|
|
"label": "모니터링되는 경로"
|
|
}
|
|
}
|
|
},
|
|
"plugin": {
|
|
"name": "Host Metrics"
|
|
}
|
|
}
|