mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 23:25:24 +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>
226 lines
9.8 KiB
JSON
226 lines
9.8 KiB
JSON
{
|
|
"permissions": {
|
|
"view": {
|
|
"title": "자동화 보기",
|
|
"description": "자동화 기능과 그 이력을 확인하세요."
|
|
},
|
|
"create": {
|
|
"title": "자동화를 생성하세요",
|
|
"description": "새로운 자동화를 추가하세요."
|
|
},
|
|
"edit": {
|
|
"title": "자동화 편집",
|
|
"description": "기존 자동화 설정을 변경하세요."
|
|
},
|
|
"delete": {
|
|
"title": "자동화 삭제",
|
|
"description": "자동화 기능을 제거하세요."
|
|
},
|
|
"run": {
|
|
"title": "자동화 실행",
|
|
"description": "자동화 기능을 수동으로 실행합니다."
|
|
}
|
|
},
|
|
"newUi": {
|
|
"sidebar": {
|
|
"automations": {
|
|
"title": "자동화",
|
|
"tabAutomations": "자동화",
|
|
"tabRuns": "실행",
|
|
"tabChannels": "채널",
|
|
"createAutomation": "새로운 자동화",
|
|
"backToAutomations": "자동화 목록으로 돌아가기",
|
|
"createTitle": "새로운 자동화",
|
|
"editTitle": "편집 자동화",
|
|
"empty": "아직 자동화가 설정되어 있지 않습니다. 지표, 일정 또는 이벤트에 반응하는 자동화를 생성하세요.",
|
|
"emptyRuns": "아직 실행된 적이 없습니다.",
|
|
"channelsHint": "알림에 채널이 설정됩니다.",
|
|
"noChannelsHint": "알림은 항상 받은 편지함으로 전송됩니다. 알림 설정에서 채널을 추가하면 다른 곳으로도 알림을 보낼 수 있습니다.",
|
|
"nameLabel": "이름",
|
|
"namePlaceholder": "예: /data 디렉토리가 가득 차면 정리합니다.",
|
|
"nameRequired": "이름은 필수입니다",
|
|
"descriptionLabel": "설명",
|
|
"descriptionPlaceholder": "선택 사항 설명",
|
|
"enabledLabel": "사용",
|
|
"concurrencyLabel": "이미 실행 중인 경우",
|
|
"concurrencyHint": "마지막 실행이 완료되기 전에 이 문제가 다시 발생할 경우 어떻게 해야 할까요?",
|
|
"concurrency": {
|
|
"skip": "새로운 실행을 건너뛰세요",
|
|
"queue": "기다렸다가 실행하세요",
|
|
"allow": "두 가지를 동시에 실행하세요"
|
|
},
|
|
"save": "저장",
|
|
"created": "자동화 생성됨",
|
|
"updated": "자동화 저장됨",
|
|
"deleted": "자동화 삭제됨",
|
|
"deleteConfirm": "이 자동화를 삭제하시겠습니까? 실행 기록도 함께 삭제됩니다.",
|
|
"runNow": "지금 실행하세요",
|
|
"testRun": "테스트 실행",
|
|
"testRunHint": "모든 단계를 실행하지만 Termix 외부의 어떤 것도 건드리지 않습니다.",
|
|
"runStarted": "실행 시작됨",
|
|
"runFinished": "실행 완료: {{status}}",
|
|
"trigger": "트리거",
|
|
"steps": "단계",
|
|
"addStep": "단계 추가",
|
|
"removeStep": "제거 단계",
|
|
"moveUp": "위로 이동",
|
|
"moveDown": "아래로 이동",
|
|
"noSteps": "아직 단계가 없습니다. 어떤 일이 일어나야 하는지 설명하는 단계를 추가하세요.",
|
|
"webhookTokenTitle": "웹훅 URL",
|
|
"webhookTokenDescription": "이 내용은 한 번만 표시됩니다. 지금 저장하세요. 나중에 다시 불러올 수 없습니다.",
|
|
"copy": "복사",
|
|
"copied": "복사됨",
|
|
"viewJson": "JSON",
|
|
"viewBuilder": "건축업자",
|
|
"viewGraph": "그래프",
|
|
"lastRun": "마지막 실행",
|
|
"never": "없음",
|
|
"duration": "{{seconds}}s",
|
|
"stepOutput": "출력",
|
|
"stepError": "오류",
|
|
"dryRunBadge": "테스트 실행",
|
|
"hostSelector": {
|
|
"trigger": "트리거링 호스트",
|
|
"host": "특정 호스트",
|
|
"fleet": "함대",
|
|
"all": "모든 호스트"
|
|
},
|
|
"triggerKinds": {
|
|
"metric_threshold": "측정 임계값",
|
|
"host_status": "호스트가 올라가거나 내려갑니다.",
|
|
"health_check": "건강 검진 변경 사항",
|
|
"schedule": "정해진 일정에 따라",
|
|
"docker_event": "컨테이너 이벤트",
|
|
"internal_event": "터믹스 이벤트",
|
|
"webhook": "수신 웹훅"
|
|
},
|
|
"stepTypes": {
|
|
"notify": "알림을 보내세요",
|
|
"http": "URL을 호출합니다",
|
|
"run_snippet": "코드 조각을 실행하세요",
|
|
"run_command": "명령어를 실행하세요",
|
|
"docker": "컨테이너를 제어하세요",
|
|
"tunnel": "터널을 제어하세요",
|
|
"wol": "호스트를 깨우세요",
|
|
"wait": "기다리다",
|
|
"set_var": "변수를 설정하세요",
|
|
"if": "만약 / 그렇지 않다면",
|
|
"run_automation": "다른 자동화를 실행합니다",
|
|
"stop": "스톱"
|
|
},
|
|
"statuses": {
|
|
"running": "실행 중",
|
|
"success": "성공",
|
|
"failed": "실패",
|
|
"timeout": "시간 초과됨",
|
|
"skipped": "건너뛰었습니다",
|
|
"cancelled": "취소"
|
|
},
|
|
"fields": {
|
|
"host": "호스트",
|
|
"metric": "메트릭",
|
|
"mount": "마운트 포인트",
|
|
"operator": "~이다",
|
|
"value": "값",
|
|
"forSeconds": "(초) 동안 지속됨",
|
|
"cooldown": "쿨다운 (분)",
|
|
"cron": "크론 발현",
|
|
"intervalSeconds": "매 (초)",
|
|
"timezone": "시간대",
|
|
"timezoneServer": "서버 시간",
|
|
"timezoneHint": "크론 시간은 이 영역에서 읽습니다. 간격 스케줄에는 적용되지 않습니다.",
|
|
"container": "컨테이너",
|
|
"command": "명령",
|
|
"url": "URL",
|
|
"method": "방법",
|
|
"body": "몸",
|
|
"channels": "또한 다음에도 보내주세요",
|
|
"title": "제목",
|
|
"message": "메시지",
|
|
"snippet": "단편",
|
|
"seconds": "초",
|
|
"conditionLeftPlaceholder": "확인할 값",
|
|
"conditionRightPlaceholder": "~와 비교하세요",
|
|
"variableName": "변수 이름",
|
|
"variableValue": "값",
|
|
"elevated": "sudo를 사용하여 실행하세요",
|
|
"onError": "이것이 실패하면",
|
|
"allowPrivateNetwork": "로컬 네트워크 주소를 허용합니다",
|
|
"allowPrivateNetworkHint": "LAN에서 자체 호스팅 서비스를 운영하는 데 필요합니다. 내부 주소로의 요청을 방지하기 위해 기본적으로 비활성화되어 있습니다."
|
|
},
|
|
"onError": {
|
|
"stop": "달리기를 멈춰라",
|
|
"continue": "계속하세요"
|
|
},
|
|
"needsPlugin": "{{plugin}}가 필요합니다",
|
|
"needsPluginHint": "이 자동화 작업은 필요한 기능이 다시 사용 가능해질 때까지 건너뛰어집니다.",
|
|
"offBadge": "꺼짐",
|
|
"docsLink": "문서 보기",
|
|
"ago": {
|
|
"seconds": "{{count}}초 전",
|
|
"minutes": "{{count}}분 전",
|
|
"hours": "{{count}}시간 전",
|
|
"days": "{{count}}일 전"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"nav": {
|
|
"automations": "자동화"
|
|
},
|
|
"onboarding": {
|
|
"feature_automations": "자동화",
|
|
"feature_automations_desc": "어떤 상황이 발생하면 자동으로 단계를 실행하고 알림을 받으세요."
|
|
},
|
|
"maintenance": {
|
|
"title": "유지 관리",
|
|
"description": "작업이 진행되는 동안 호스트 상태, 상태 모니터링, 메트릭 모니터링, 컨테이너 모니터링 및 터널 연결 해제 자동화가 일시 중지됩니다. 모니터링, 수동 실행 및 예약된 자동화는 계속 실행됩니다.",
|
|
"denied": "유지보수 화면을 볼 권한이 없습니다.",
|
|
"sharedReadOnly": "이 호스트는 귀하와 공유되었습니다. 유지 관리 변경은 호스트 소유자만 할 수 있습니다.",
|
|
"failed": "유지보수 업데이트를 할 수 없습니다.",
|
|
"active": "유지보수 중",
|
|
"estimated": "예상 완료일",
|
|
"noAutoEnd": "견적은 유지보수를 종료하는 것이 아닙니다. 작업이 완료되면 명시적으로 유지보수를 종료하십시오.",
|
|
"endConfirm": "이 호스트에 대한 유지 관리를 종료하고 이벤트 기반 자동화를 다시 시작하시겠습니까?",
|
|
"confirmEnd": "종료 확인",
|
|
"cancel": "취소",
|
|
"end": "유지보수 종료",
|
|
"action": "작업",
|
|
"startNow": "지금 시작하세요",
|
|
"schedule": "나중에 일정 잡기",
|
|
"reason": "이유",
|
|
"startUtc": "첫 시작 (UTC)",
|
|
"repeat": "반복하다",
|
|
"once": "한 번",
|
|
"weekly": "주간",
|
|
"monthly": "월간 간행물",
|
|
"utcHelp": "일정은 연중 UTC를 기준으로 합니다. 월별 일정은 선택한 날짜가 없는 달은 건너뜁니다. 계획된 기간은 겹칠 수 없으며, 연장된 유지 보수 작업은 이후 기간에도 계속됩니다.",
|
|
"duration": "예상 소요 시간(분)",
|
|
"grace": "유예 기간(분)",
|
|
"notify": "예상 시간 및 유예 기간이 지난 후에도 오프라인 상태인 경우 한 번만 알림을 보내주세요.",
|
|
"addSchedule": "일정을 추가하세요",
|
|
"schedules": "일정",
|
|
"noSchedules": "정기 유지보수 일정이 없습니다.",
|
|
"completed": "이미 시작했습니다",
|
|
"minutes_one": "{{count}} 분",
|
|
"minutes_other": "{{count}} 분",
|
|
"remove": "일정을 삭제합니다",
|
|
"loadFailed": "점검 상태를 새로 고칠 수 없습니다. 점검 상태가 로드될 때까지 변경 사항이 적용되지 않습니다.",
|
|
"loading": "유지보수 상태 로딩 중…"
|
|
},
|
|
"ui": {
|
|
"sidebar": {
|
|
"automations": {
|
|
"options": {
|
|
"connect": "connect",
|
|
"disconnect": "disconnect",
|
|
"offline": "offline",
|
|
"online": "online",
|
|
"failing": "failing",
|
|
"recovered": "recovered"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|