mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 15:15: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>
239 lines
11 KiB
JSON
239 lines
11 KiB
JSON
{
|
|
"nav": {
|
|
"snippets": "스니펫"
|
|
},
|
|
"onboarding": {
|
|
"feature_snippets": "스니펫",
|
|
"feature_snippets_desc": "자주 실행하는 명령어를 저장하고 한 번의 클릭으로 터미널에 전송하세요."
|
|
},
|
|
"permissions": {
|
|
"view": {
|
|
"title": "미리보기",
|
|
"description": "내가 작성한 코드 조각, 메모, 공유한 코드 조각을 확인하세요."
|
|
},
|
|
"create": {
|
|
"title": "코드 조각 만들기",
|
|
"description": "새로운 스니펫, 메모 및 폴더를 만드세요."
|
|
},
|
|
"edit": {
|
|
"title": "코드 조각 편집",
|
|
"description": "기존 코드 조각 및 폴더의 이름을 바꾸거나 변경하세요."
|
|
},
|
|
"delete": {
|
|
"title": "코드 조각을 삭제하세요",
|
|
"description": "스니펫과 폴더를 삭제하세요."
|
|
},
|
|
"share": {
|
|
"title": "짧은 글 공유하기",
|
|
"description": "다른 사용자 또는 역할과 코드 조각 및 폴더를 공유하세요."
|
|
}
|
|
},
|
|
"settings": {
|
|
"foldersCollapsed": {
|
|
"label": "기본적으로 폴더 접기",
|
|
"description": "스니펫 패널을 열 때 각 스니펫 폴더가 접힌 상태로 시작됩니다."
|
|
},
|
|
"showCommands": {
|
|
"label": "명령 표시",
|
|
"description": "각 코드 조각의 명령 첫 번째 줄을 이름 아래에 표시합니다."
|
|
},
|
|
"confirmExecution": {
|
|
"label": "실행하기 전에 확인하세요",
|
|
"description": "터미널에서 명령어를 실행하기 전에 먼저 허락을 구하세요."
|
|
}
|
|
},
|
|
"cancel": "취소",
|
|
"loading": "로딩 중...",
|
|
"searchPlaceholder": "스니펫 검색",
|
|
"newFolder": "새 폴더",
|
|
"newSnippet": "새로운 스니펫",
|
|
"noFolder": "폴더 없음",
|
|
"noSnippetsInFolder": "이 폴더에 스니펫이 없습니다",
|
|
"noTerminalTabsOpen": "터미널 탭이 열려 있지 않습니다.",
|
|
"run": "실행",
|
|
"pasteToTerminal": "터미널에 붙여넣기",
|
|
"copySuccess": "클립보드에 복사됨",
|
|
"importExport": "가져오기 / 내보내기",
|
|
"importFailed": "스니펫 가져오기 실패",
|
|
"nameLabel": "이름",
|
|
"namePlaceholder": "스니펫 이름",
|
|
"descriptionLabel": "설명",
|
|
"descriptionPlaceholder": "선택 사항 설명",
|
|
"folderLabel": "폴더",
|
|
"typeLabel": "유형",
|
|
"typeCommand": "명령",
|
|
"typeNote": "메모",
|
|
"commandLabel": "명령",
|
|
"commandPlaceholder": "실행할 명령어 (예: systemctl status $HOST)",
|
|
"noteLabel": "메모",
|
|
"notePlaceholder": "터미널에 붙여넣을 텍스트",
|
|
"createSnippetTitle": "코드 조각 생성",
|
|
"createSnippetButton": "코드 조각 생성",
|
|
"createSuccess": "코드 조각이 생성되었습니다",
|
|
"createFailed": "스니펫 생성에 실패했습니다",
|
|
"editSnippetTitle": "코드 조각 편집",
|
|
"saveSnippetButton": "코드 조각 저장",
|
|
"updateSuccess": "스니펫이 업데이트되었습니다.",
|
|
"updateFailed": "스니펫 업데이트에 실패했습니다",
|
|
"deleteFailed": "스니펫 삭제에 실패했습니다",
|
|
"createFolderTitle": "폴더 생성",
|
|
"createFolderButton": "폴더 생성",
|
|
"folderCreateSuccess": "폴더가 생성되었습니다",
|
|
"folderCreateFailed": "폴더 생성에 실패했습니다",
|
|
"editFolderTitle": "폴더 편집",
|
|
"saveFolderButton": "폴더 저장",
|
|
"folderEditSuccess": "폴더가 업데이트되었습니다",
|
|
"folderEditFailed": "폴더 업데이트에 실패했습니다",
|
|
"folderNameLabel": "폴더 이름",
|
|
"folderNamePlaceholder": "폴더 이름",
|
|
"folderIconLabel": "아이콘",
|
|
"folderDeleteSuccess": "폴더가 삭제되었습니다",
|
|
"folderDeleteFailed": "폴더 삭제 실패",
|
|
"confirmRunMessage": "\"{{name}}\"을(를) 실행하시겠습니까?",
|
|
"confirmRunButton": "실행",
|
|
"runSuccess": "{{name}}\"을 {{count}} 터미널에서 실행했습니다.",
|
|
"pasteSuccess": "\"{{name}}\"을 {{count}} 터미널에 붙여넣었습니다.",
|
|
"admin": {
|
|
"tabTitle": "스니펫",
|
|
"count": "{{count}}개의 스니펫",
|
|
"add": "스니펫 추가",
|
|
"namePlaceholder": "스니펫 이름",
|
|
"contentPlaceholder": "명령 내용",
|
|
"folderPlaceholder": "폴더 (선택 사항)",
|
|
"empty": "이 사용자는 스니펫이 없습니다",
|
|
"deleteConfirm": "{{username}}님의 스니펫 \"{{name}}\"을 삭제하시겠습니까?",
|
|
"deleted": "스니펫이 삭제되었습니다",
|
|
"deleteFailed": "스니펫 삭제에 실패했습니다",
|
|
"requiredFields": "스니펫 이름과 내용이 필요합니다",
|
|
"saved": "스니펫이 저장되었습니다",
|
|
"saveFailed": "스니펫 저장에 실패했습니다",
|
|
"saving": "저장 중...",
|
|
"save": "저장"
|
|
},
|
|
"backToSnippets": "스니펫으로 돌아가기",
|
|
"settingsTitle": "스니펫 설정",
|
|
"settingsDisplayTitle": "표시하다",
|
|
"settingsBehaviorTitle": "동작",
|
|
"typeCommandHint": "현재 활성화된 터미널에서 실행됩니다.",
|
|
"typeNoteHint": "실행하지 않고 활성화된 터미널에 붙여넣습니다.",
|
|
"variablesHint": "변수: $HOST, $USER, $PORT, $NAME, ${INPUT_1:Label}",
|
|
"doubleClickToRun": "두 번 클릭하여 실행하세요",
|
|
"sharedBadge": "공유됨",
|
|
"copyToClipboard": "클립보드에 복사",
|
|
"copyFailed": "클립보드로 복사하지 못했습니다.",
|
|
"moreOptions": "더 많은 옵션",
|
|
"moreActions": "더 보기",
|
|
"moveToFolder": "폴더로 이동",
|
|
"deleteSnippet": "코드 조각 삭제",
|
|
"deleteSnippetConfirm": "\"{{name}} \" 부분을 삭제하시겠습니까?",
|
|
"deleteSuccess": "스니펫이 삭제되었습니다",
|
|
"delete": "삭제",
|
|
"folderActions": "폴더 작업",
|
|
"addSnippetHere": "여기에 새로운 코드 조각이 있습니다.",
|
|
"deleteFolder": "폴더 삭제",
|
|
"deleteFolderConfirm": "\"{{name}}\" 폴더를 삭제하시겠습니까? 해당 폴더의 조각들이 폴더 밖으로 이동합니다.",
|
|
"createFolderDescription": "관련된 코드 조각들을 함께 그룹화하세요.",
|
|
"editFolderDescription": "이 폴더의 이름, 색상 또는 아이콘을 변경하세요.",
|
|
"folderColorLabel": "색상",
|
|
"loadFailed": "스니펫을 로드하는 데 실패했습니다.",
|
|
"importSkipExisting": "가져오기 (기존 건너뛰기)",
|
|
"importOverwrite": "가져오기(기존 파일 덮어쓰기)",
|
|
"importInvalidFile": "해당 파일은 유효한 스니펫 내보내기 파일이 아닙니다.",
|
|
"importSuccess": "{{imported}}가져오기 완료, {{updated}}업데이트 완료, {{skipped}} 건너뛰기 완료",
|
|
"exportSnippets": "내보내기 스니펫",
|
|
"exportSuccess": "내보낸 코드 조각",
|
|
"exportFailed": "스니펫 내보내기 실패",
|
|
"expandAll": "모든 폴더 펼치기",
|
|
"collapseAll": "모든 폴더 접기",
|
|
"docsLink": "문서",
|
|
"clearSearch": "검색 결과 지우기",
|
|
"noSearchResults": "검색 결과와 일치하는 스니펫이 없습니다.",
|
|
"emptyTitle": "아직 설정된 스니펫이 없습니다",
|
|
"emptyDescription": "자주 사용하는 명령어를 저장해 두었다가 터미널에서 한 번의 클릭으로 실행하세요.",
|
|
"shareSnippet": "스니펫 공유",
|
|
"shareFolder": "공유 폴더",
|
|
"shareExpiry": "만료",
|
|
"shareExpiryOptions": {
|
|
"h0": "없음",
|
|
"h1": "1시간 안에",
|
|
"h24": "하루 만에",
|
|
"h168": "7일 안에",
|
|
"h720": "30일 안에"
|
|
},
|
|
"shareButton": "공유",
|
|
"shareSuccess": "{{count}}와 공유됨",
|
|
"shareFailed": "공유에 실패했습니다",
|
|
"shareLoadFailed": "공유 세부 정보를 불러오는 데 실패했습니다.",
|
|
"currentAccess": "현재 접근 권한",
|
|
"notSharedYet": "아직 아무에게도 공유하지 않았습니다.",
|
|
"revokeAccess": "취소",
|
|
"revokeSuccess": "접근 권한이 취소되었습니다",
|
|
"revokeFailed": "접근 권한 취소 실패",
|
|
"close": "닫기",
|
|
"targetHostsLabel": "대상 호스트",
|
|
"targetHostsHint": "터미널 창을 열지 않고 이 명령을 직접 실행할 호스트를 선택하세요. 활성 터미널에서 실행하려면 비워 두세요.",
|
|
"clearTargetHosts": "비우기",
|
|
"noHostsAvailable": "사용 가능한 호스트가 없습니다.",
|
|
"searchHosts": "호스트 검색",
|
|
"runOnTargets": "대상 호스트에서 실행",
|
|
"executionResultTitle": "\"{{name}} \"에 대한 결과",
|
|
"executionResultDescription": "각 대상 호스트의 출력입니다.",
|
|
"executionSuccess": "성공",
|
|
"executionFailed": "실패",
|
|
"directRunSuccess": "\"{{name}}\"을(를) {{count}}개 호스트에서 실행했습니다",
|
|
"directRunPartialFail": "\"{{name}}\"가 일부 호스트에서 실패했습니다.",
|
|
"reorderFailed": "스니펫 순서 변경에 실패했습니다.",
|
|
"dropToRemoveFromFolder": "폴더 밖으로 이동하려면 여기에 드롭하세요.",
|
|
"shareSnippetTitle": "\"{{name}} \" 공유",
|
|
"shareFolderTitle": "공유 폴더 \"{{name}}\"",
|
|
"shareWith": "공유 대상",
|
|
"usersTab": "사용자",
|
|
"rolesTab": "역할",
|
|
"shareSearchPlaceholder": "사용자 또는 역할 검색",
|
|
"shareNoMatches": "일치하는 항목이 없습니다",
|
|
"shareWithCount": "{{count}}와 공유하세요",
|
|
"shareFolderHint": "이 폴더에 있는 모든 코드 조각을 공유합니다. 나중에 추가된 코드 조각은 자동으로 공유되지 않습니다.",
|
|
"shareFolderSummary": "이 폴더에 공유된 {{count}} 코드 조각",
|
|
"grantedBy": "공유자",
|
|
"expired": "만료됨",
|
|
"variablesDialogTitle": "\"{{name}} \" 실행",
|
|
"variablesDialogDescription": "이 코드 조각을 실행하기 전에 필요한 값을 입력하세요.",
|
|
"variablesPreviewLabel": "미리보기",
|
|
"variablesConfirmButton": "실행",
|
|
"keybindings": {
|
|
"runSnippet": "기존 코드 조각을 실행하세요",
|
|
"snippetLabel": "단편",
|
|
"selectSnippet": "코드 조각을 선택하세요",
|
|
"snippetMissing": "스니펫을 찾을 수 없습니다.",
|
|
"snippetRequired": "코드 조각을 선택하세요"
|
|
},
|
|
"paletteHintRun": "현재 활성화된 터미널 탭에서 실행하세요",
|
|
"host": {
|
|
"startupTitle": "시작 스니펫",
|
|
"quickActionsTitle": "빠른 작업",
|
|
"quickActionsDescription": "빠른 작업은 한 번의 클릭으로 명령을 실행할 수 있도록 호스트 메트릭 도구 모음에 버튼으로 표시됩니다.",
|
|
"noQuickActions": "아직 빠른 작업이 없습니다.",
|
|
"buttonLabel": "버튼 레이블",
|
|
"selectSnippet": "스니펫 선택...",
|
|
"addQuickAction": "작업 추가",
|
|
"tabTitle": "스니펫",
|
|
"startupDescription": "이 호스트에 연결될 때마다 터미널에서 실행됩니다. $HOST 와 같은 변수가 채워지고, 입력을 요청하는 부분은 건너뜁니다.",
|
|
"none": "전체 해제",
|
|
"removeQuickAction": "빠른 실행 제거"
|
|
},
|
|
"quickActions": {
|
|
"running": "{{name}} 실행 중...",
|
|
"succeeded": "{{name}}이(가) 성공적으로 완료되었습니다.",
|
|
"failed": "{{name}} 실패",
|
|
"error": "{{name}} 실행에 실패했습니다."
|
|
},
|
|
"paletteHintPaste": "활성화된 터미널 탭에 붙여넣으세요",
|
|
"targetTerminals": "달리기",
|
|
"targetTerminalsHint": "선택 사항이며, 그렇지 않으면 활성 탭이 표시됩니다.",
|
|
"selectAll": "모두",
|
|
"selectNone": "전체 해제",
|
|
"plugin": {
|
|
"name": "Snippets"
|
|
}
|
|
}
|