Files
hermes-web/packages/client/src/i18n/locales/ko.ts
T
toor 1e9ea89d86
Build / build (push) Canceled after 0s
NPM Lockfile Check / npm ci --ignore-scripts (push) Canceled after 0s
Playwright / e2e (push) Canceled after 0s
chore: bootstrap hermes-ui skeleton from 0.6.29 snapshot
Import the client, server, skills, tests, and build scripts as the starting
point for the rebuild, then trim the surfaces this project does not ship:
Electron desktop packaging, the marketing website, and the ESP32 firmware
tree. CI keeps the web build, e2e, lockfile, release, and Docker workflows.

Rename the package and CLI entry points to hermes-ui, drop the prepare hook so
npm ci no longer triggers a build, and drop the removed tsconfig and nodemon
references. Rewrite AGENTS.md, ARCHITECTURE.md, DEVELOPMENT.md, and the READMEs
so the documented package map and hard rules match this repository.

reference_code/ is ignored: it is a read-only snapshot, not an input to the build.
2026-10-16 10:34:35 +08:00

2090 lines
99 KiB
TypeScript

export default {
// 로그인
login: {
title: 'Hermes Studio',
description: '계속하려면 사용자 이름과 비밀번호를 입력하세요.',
placeholder: '액세스 토큰',
submit: '로그인',
tokenRequired: '액세스 토큰을 입력해 주세요',
invalidToken: '유효하지 않은 토큰입니다',
connectionFailed: '서버에 연결할 수 없습니다',
passwordLogin: '비밀번호',
tokenLogin: '토큰',
usernamePlaceholder: '사용자 이름',
passwordPlaceholder: '비밀번호',
defaultCredentialsHint: '기본 로그인 이름: admin, 기본 비밀번호: 123456',
credentialsRequired: '사용자 이름과 비밀번호를 입력해 주세요',
invalidCredentials: '사용자 이름 또는 비밀번호가 올바르지 않습니다',
tooManyAttempts: '로그인 시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요',
lockResetHint: '본인 서버라면 다음 명령으로 로그인 잠금을 해제할 수 있습니다:',
defaultLoginResetHint: '기본 admin 비밀번호를 재설정하려면 다음을 실행하세요:',
desktopLockResetHint: 'Too many failed login attempts. Open the system tray menu and choose Reset Login to reset the password.',
sessionExpired: '로그인이 만료되었습니다. 다시 로그인해 주세요.',
accessDenied: '이 리소스에 접근할 권한이 없습니다.',
passwordMismatch: '비밀번호가 일치하지 않습니다',
passwordTooShort: '비밀번호는 6자 이상이어야 합니다',
setupSuccess: '비밀번호 로그인이 설정되었습니다',
passwordChanged: '비밀번호가 변경되었습니다',
passwordRemoved: '비밀번호 로그인이 제거되었습니다',
setupPassword: '비밀번호 로그인 설정',
changePassword: '비밀번호 변경',
changeUsername: '사용자 이름 변경',
removePasswordLogin: '제거',
username: '사용자 이름',
currentPassword: '현재 비밀번호',
newPassword: '새 비밀번호',
confirmPassword: '비밀번호 확인',
newUsername: '새 사용자 이름',
usernameChanged: '사용자 이름이 변경되었습니다',
usernameTooShort: '사용자 이름은 2자 이상이어야 합니다',
setupDescription: '로그인에 사용할 사용자 이름과 비밀번호를 관리합니다.',
removeConfirm: '사용자 계정에는 비밀번호 로그인이 필요합니다.',
passwordLoginNotConfigured: '비밀번호 로그인 미설정',
passwordLoginConfigured: '현재 계정: {username}',
defaultCredentialTitle: '기본 계정과 비밀번호를 변경하세요',
defaultCredentialMessage: '현재 로그인 계정이 아직 기본 사용자 이름 또는 기본 비밀번호를 사용하고 있습니다. 무단 접근을 방지하려면 현재 계정에서 사용자 이름과 비밀번호를 가능한 한 빨리 변경하세요.',
defaultCredentialAction: '변경하기',
defaultCredentialLater: '나중에 알림',
},
users: {
title: '계정 관리',
description: '사용자를 만들고 역할을 할당하며 일반 관리자가 접근할 수 있는 프로필을 제어합니다.',
create: '사용자 만들기',
edit: '사용자 편집',
username: '사용자 이름',
role: '역할',
statusLabel: '상태',
profiles: '접근 가능한 프로필',
profilesPlaceholder: '접근 가능한 프로필 선택',
allProfiles: '모든 프로필',
noProfiles: '할당된 프로필 없음',
lastLogin: '마지막 로그인',
newPasswordOptional: '새 비밀번호 (비워두면 유지)',
loadFailed: '사용자 목록을 불러오지 못했습니다',
deleteConfirm: '이 사용자를 삭제하시겠습니까?',
enable: '활성화',
disable: '비활성화',
roles: {
superAdmin: '슈퍼 관리자',
admin: '관리자',
},
status: {
active: '활성',
disabled: '비활성',
},
},
// 공통
common: {
loading: '로딩 중...',
cancel: '취소',
retry: '재시도',
reset: '초기화',
delete: '삭제',
edit: '편집',
save: '저장',
saved: '저장됨',
update: '업데이트',
create: '생성',
saveFailed: '저장 실패',
deleteFailed: '삭제 실패',
ok: '확인',
copied: '복사됨',
copy: '복사',
noData: '데이터 없음',
fetch: '가져오기',
add: '추가',
enable: '활성화',
disable: '비활성화',
configured: '구성됨',
notConfigured: '미구성',
confirm: '확인',
expand: '펼치기',
collapse: '접기',
stop: '중지',
start: '시작',
expired: '만료됨',
},
// 사이드바
// MCP 관리
mcp: {
title: 'MCP 서버',
loadFailed: 'MCP 서버를 불러오지 못했습니다',
reloadAll: '모두 다시 로드',
refresh: '새로고침',
total: '합계',
connected: '연결됨',
disconnected: '연결 끊김',
tools: '도구',
tool: '도구',
searchPlaceholder: '서버 검색...',
addServer: '+ 서버 추가',
zeroTools: '0개 도구',
loading: '로딩...',
empty: 'MCP 서버가 설정되지 않았습니다',
reloaded: '{server} 다시 로드됨',
reloadedAll: '모든 MCP 서버가 다시 로드되었습니다',
reloadFailed: '다시 로드 실패',
serverAdded: '서버 "{name}" 추가됨',
addFailed: '서버 추가 실패',
serverUpdated: '서버 "{name}" 업데이트됨',
updateFailed: '서버 업데이트 실패',
saveFailed: '저장 실패',
serverRemoved: '"{name}" 제거됨',
enabled: "{name} 활성화됨",
disabled: "{name} 비활성화됨",
connectedStatus: '연결됨',
disconnectedStatus: '연결 끊김',
disabledStatus: '비활성화됨',
toolList: '도구 목록',
count: ' ',
more: '개 더보기',
removeFailed: '서버 제거 실패',
testOk: '테스트 성공 — {count}개 도구 사용 가능',
testEmpty: '테스트에서 도구가 반환되지 않았습니다',
testFailed: '테스트 실패',
edit: '편집',
test: '테스트',
reload: '다시 로드',
remove: '제거',
confirmRemove: '서버 "{name}"을(를) 제거하시겠습니까?',
cancel: '취소',
add: '추가',
save: '저장',
addTitle: 'MCP 서버 추가',
editTitle: 'MCP 서버 편집',
invalidJson: 'JSON 형식 오류',
invalidYaml: 'YAML 형식이 올바르지 않습니다',
invalidConfig: '올바르지 않은 설정',
invalidServerConfig: '서버 설정이 올바르지 않습니다',
missingCommandOrUrl: 'command 또는 url이 필요합니다',
manageTools: '도구 관리',
toolsVisibilityTitle: '도구 가시성 관리',
fetchTools: '도구 목록 가져오기',
fetchToolsFailed: '도구 목록을 가져오지 못했습니다',
toolsMode: '모드:',
toolsModeAll: '전체',
toolsModeInclude: '포함',
toolsModeExclude: '제외',
toolsListHeader: '도구 이름',
toolsEmpty: '도구가 없습니다. 먼저 도구 목록을 가져오세요',
toolsSummaryAll: '총 {count}개 도구, 모두 활성화',
toolsSummaryInclude: '총 {total}개 도구, {count}개 선택됨',
toolsSummaryExclude: '총 {total}개 도구, {count}개 제외됨',
toolsVisibilitySaved: '도구 가시성이 저장되었습니다',
toolsSelectAll: '모두 선택',
toolsClearSelection: '선택 지우기',
toolsExcludeAll: '모두 제외',
toolsClearExcluded: '제외 항목 지우기',
},
sidebar: {
chat: '채팅',
backToChat: '뒤로',
search: '검색',
apiRelay: 'API 릴레이',
history: '기록',
jobs: '예약 작업',
models: '모델',
profiles: '프로필',
plugins: '플러그인',
mcp: 'MCP',
petdex: 'Pets',
skills: '스킬',
memory: '메모리',
logs: '로그',
usage: '사용량',
performance: '성능 모니터링',
journey: '학습 경로',
skillsUsage: '스킬 사용량',
channels: '채널',
terminal: '터미널',
singleChat: '채팅',
globalAgent: 'Global Agent',
files: '파일',
devices: '기기',
groupChat: '그룹 채팅',
groupConversation: '대화',
groupConversationShort: '대화',
groupAgent: '에이전트',
groupAgentShort: '에전',
groupSystem: '시스템',
groupSystemShort: '시스템',
groupMonitoring: '모니터링',
groupMonitoringShort: '모니터',
settings: '설정',
connected: '연결됨',
disconnected: '연결 끊김',
updateTip: '터미널에서 "hermes-web-ui update"를 실행하여 업데이트하세요',
updateVersion: 'v{version}(으)로 업그레이드',
reloadClientVersion: 'v{version}(으)로 새로고침',
updating: '업데이트 중...',
updateSuccess: '업데이트가 완료되었습니다. 잠시 후 페이지를 새로고침하세요. 오랫동안 시작되지 않으면 수동으로 시작하세요.',
updateFailed: '업데이트 실패',
logout: '로그아웃',
nodeVersionWarning: 'Node.js v{version}이 감지되었습니다. 버전 23 이상으로 업그레이드하세요.',
changelog: '변경 이력',
noChangelog: '변경 이력이 없습니다',
versionManagement: '버전 관리',
updateAvailableLabel: '(새 버전 있음)',
dockerUpdateTitle: 'Docker 업데이트',
dockerUpdateGuide: 'Docker 환경에서 실행 중입니다. 최신 이미지를 가져와 컨테이너를 다시 생성하세요:',
dockerUpdateNote: '데이터는 유지되며 컨테이너 재생성 후에도 손실되지 않습니다.',
kanban: '칸반',
workflow: '워크플로',
groupTools: '도구',
groupToolsShort: "도구",
codingAgents: "코딩 에이전트",
versionPreview: "버전 미리보기",
groupPlatform: '플랫폼',
gateways: '게이트웨이',
expand: '메뉴 펼치기',
collapse: '메뉴 접기',
},
runtimeVersions: {
title: '버전 관리',
runtimeTitle: 'Hermes Runtime',
webUiTitle: 'Web UI',
platform: '플랫폼',
currentWebUi: '현재 Web UI',
activeVersion: '활성 버전',
active: '활성',
installed: '설치됨',
download: '다운로드',
downloadGithub: 'GitHub 다운로드',
downloadCf: 'Cloudflare 다운로드',
github: 'GitHub',
cf: 'Cloudflare',
useVersion: '다음 시작 시 사용',
deleteVersion: '삭제',
deleteRuntimeConfirm: 'Hermes Runtime {version}을 삭제할까요?',
deleteWebUiConfirm: 'Web UI {version}을 삭제할까요?',
deleteRuntimeSuccess: 'Runtime이 삭제되었습니다',
deleteWebUiSuccess: 'Web UI가 삭제되었습니다',
refresh: '새로고침',
noVersions: '사용 가능한 버전이 없습니다',
remoteLoadFailed: '원격 버전을 불러오지 못했습니다',
downloadTasks: '다운로드 작업',
downloadStarted: '다운로드를 시작했습니다',
activateSuccess: '버전 선택이 저장되었습니다. Hermes Studio를 다시 시작하면 적용됩니다.',
jobStatus: {
queued: '대기 중',
running: '실행 중',
completed: '완료',
failed: '실패',
},
jobStageStatus: {
queued: '대기 중',
resolve: '확인 중',
download: '다운로드 중',
verify: '검증 중',
extract: '압축 해제 중',
install: '설치 중',
completed: '완료',
failed: '실패',
},
jobStage: {
queued: '대기 중',
download: '다운로드 중',
resolveRuntime: 'Runtime 패키지 확인 중',
verifyRuntime: 'Runtime 압축 파일 검증 중',
extractRuntime: 'Runtime 압축 파일 해제 중',
installRuntime: 'Runtime 설치 중',
resolveWebUi: 'Web UI 패키지 확인 중',
verifyWebUi: 'Web UI 압축 파일 검증 중',
extractWebUi: 'Web UI 압축 파일 해제 중',
installWebUi: 'Web UI 설치 중',
completed: '완료',
failed: '실패',
},
},
mcuDevices: {
title: 'Little Box',
subtitle: 'View device link status',
name: 'Name',
nameOptional: 'Name is optional',
deviceCode: 'Device code',
deviceCodePlaceholder: 'Enter device code',
deviceCodeRequired: 'Enter device code',
channel: 'Channel',
official: 'Official',
unofficial: 'Unofficial',
createdAt: 'Added at',
lanStatus: 'LAN',
remoteStatus: '원격',
connected: '연결됨',
disconnected: '연결 안 됨',
remoteConnect: '원격 연결',
remoteConnected: '원격 연결됨',
remoteConnectFailed: '원격 연결 실패',
remoteDisconnect: '연결 해제',
remoteDisconnected: '원격 연결 해제됨',
remoteDisconnectFailed: '원격 연결 해제 실패',
actions: 'Actions',
add: 'Add',
addTitle: 'Add MCU device',
added: 'MCU device added',
addFailed: 'Failed to add MCU device',
purchase: 'Buy',
edit: 'Edit',
editNameTitle: 'Edit name',
nameUpdated: 'Name updated',
nameUpdateFailed: 'Failed to update name',
delete: 'Delete',
deleteTitle: 'Delete MCU device',
deleteConfirm: 'Delete "{name}"?',
deleted: 'MCU device deleted',
deleteFailed: 'Failed to delete MCU device',
loadFailed: 'Failed to load MCU devices',
close: 'Close',
},
devices: {
title: '기기',
count: '기기 {count}개',
lastScanned: '마지막 스캔: {time}',
refresh: '새로고침',
empty: '기기를 찾을 수 없습니다',
computer: '컴퓨터',
endpointLabel: '엔드포인트',
statusLabel: '상태',
online: '온라인',
offline: '오프라인',
address: '주소',
os: 'OS',
agentVersion: 'Agent',
webUiVersion: 'Web UI',
responseMs: '지연 시간',
lastSeen: '마지막 발견',
open: '열기',
never: '없음',
unknown: '알 수 없음',
loadFailed: '기기를 불러오지 못했습니다',
scanFailed: '기기 스캔에 실패했습니다',
updateFailed: '기기를 업데이트하지 못했습니다',
duplicateRequest: '대기 중인 페어링 요청이 이미 있습니다',
manualPairing: 'Pair by URL',
copyPairingLink: 'Copy pairing link',
manualUrlPlaceholder: 'https://device.example.com',
manualUrlRequired: 'Enter a device URL',
manualRequestSent: 'Pairing request sent',
manualRequestFailed: 'Failed to request remote pairing',
pairingLinkCopied: 'Pairing link copied',
pairingLinkCopyFailed: 'Failed to copy pairing link',
pairingCodeTitle: 'Enter pairing code',
pairingCodePlaceholder: 'Pairing code',
pairingCodeRequired: 'Enter the pairing code',
submitPairingRequest: 'Submit request',
processed: '처리됨',
unprocessed: '미처리',
deleteHistory: '기록 삭제',
deleteHistoryConfirm: '이 요청 기록을 삭제하고 이 기기의 연결 권한을 취소할까요?',
requests: '요청 목록',
requestsWithCount: '요청 목록 ({count})',
noRequests: '요청 없음',
requestPairing: '페어링 요청',
paired: '페어링됨',
approve: '승인',
reject: '거절',
block: '차단',
unblock: '차단 해제',
inboundStatus: {
none: '요청 허용',
pending: '대기 중',
approved: '승인됨',
rejected: '거절됨',
blocked: '차단됨',
},
outboundStatus: {
none: '미페어링',
pending: '요청됨',
approved: '페어링됨',
rejected: '거절됨',
blocked: '차단됨',
},
endpoint: {
web: 'Web',
desktop: '데스크톱',
custom: '사용자 지정',
},
},
performance: {
title: '성능 모니터링',
subtitle: '시스템 리소스, Bridge Broker, Workers, 활성 세션 확인',
refresh: '새로고침',
autoRefreshOn: '자동 새로고침',
autoRefreshOff: '수동 새로고침',
loadFailed: '성능 데이터를 불러오지 못했습니다',
systemCpu: '시스템 CPU',
systemMemory: '시스템 메모리',
activeSessions: '활성 세션',
runningSessions: '실행 중 {count}',
workers: 'Workers',
totalWorkerMemory: 'Worker 총 메모리',
processes: '프로세스',
uptime: '실행 시간',
running: '실행 중',
stopped: '중지됨',
workerMemory: 'Worker 메모리',
lastUpdated: '업데이트 시간',
profile: 'Profile',
memory: '메모리',
sessions: '세션',
runningActiveSessions: '실행 중 / 활성',
lastUsed: '마지막 사용',
status: '상태',
noWorkers: 'Worker 없음',
sessionsByProfile: 'Profile별 세션',
noActiveSessions: '활성 세션 없음',
},
journey: {
title: '학습 경로',
play: '학습 경로 재생',
pause: '학습 경로 일시정지',
refresh: '새로고침',
loadFailed: '학습 경로를 불러오지 못했습니다',
nodes: '노드',
edges: '연결',
skills: '스킬',
memories: '메모리',
clusters: '클러스터',
profile: '프로필',
source: '소스',
learnedSkills: '학습된 스킬',
memorySkillEdges: '메모리 링크',
allKinds: '모든 종류',
allCategories: '모든 카테고리',
searchPlaceholder: '노드 검색',
noClusters: '클러스터 없음',
noNodes: '학습 경로 노드 없음',
noCategory: '미분류',
category: '카테고리',
useCount: '사용 횟수',
createdBy: '생성자',
timestamp: '시간',
pinned: '고정됨',
},
// 서랍
drawer: {
terminal: '터미널',
files: '작업 공간',
},
// 채팅
chat: {
contextRemaining: '남음',
contextClickToEdit: '클릭하여 컨텍스트 길이 편집',
contextEditTitle: '컨텍스트 길이 편집',
contextEditDesc: '현재 모델의 컨텍스트 길이 제한 설정 (토큰 수)',
contextEditPlaceholder: '컨텍스트 길이 입력',
contextEditHint: '일반적인 값: 256k (Hermes 기본값), 128k (GPT-4), 32k (GPT-3.5)',
contextEditSave: '저장',
contextEditCancel: '취소',
contextEditInvalid: '유효한 컨텍스트 길이를 입력하세요',
contextEditSuccess: '컨텍스트 길이가 업데이트되었습니다',
contextEditFailed: '업데이트 실패',
emptyState: 'Hermes Agent와 대화를 시작하세요',
emptyStateAgent: '{agent}와 대화를 시작하세요',
viewOlderInHistory: '이전 메시지는 기록에서 보기',
scrollToBottom: '맨 아래로 이동',
outlineTitle: '대화 개요',
outlineEmpty: '대화 내용이 없습니다',
outlineUserQuestion: '사용자 질문',
inputPlaceholder: '메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)',
inputHeightResizeHint: '드래그해서 채팅 입력창 높이를 바꾸고, 더블클릭하면 자동 높이로 돌아갑니다.',
slashCommandArgs: {
message: '<메시지>',
title: '<제목>',
text: '<텍스트>',
},
slashCommands: {
usage: '현재 세션 사용량 계산',
status: '세션 상태와 대기열 표시',
abort: '활성 Bridge 실행 중지',
queue: '활성 실행 뒤에 메시지 대기열 추가',
learn: '설명한 소스에서 재사용 가능한 스킬 학습',
plan: 'Markdown 구현 계획 작성',
goal: 'Set a standing goal that continues across turns',
goalStatus: 'Show the active goal status',
goalPause: 'Pause the active goal loop',
goalResume: 'Resume the paused goal loop',
goalDone: 'Complete and clear the active goal',
goalClear: 'Clear the active goal',
subgoal: 'Add a criterion to the active goal',
clear: '현재 표시 내용 지우기',
clearHistory: '이 세션의 저장된 메시지 기록 삭제',
title: '이 세션 이름 변경',
compress: '유휴 상태에서 컨텍스트 압축 실행',
steer: '활성 Bridge 실행에 지시 텍스트 보내기',
destroy: '이 세션의 Bridge Agent 해제',
reloadMcp: 'MCP 서버 다시 로드',
reloadSkills: '스킬 명령 다시 로드',
},
attachFiles: '파일 첨부',
reasoningEffort: {
tooltip: '추론 노력',
defaultLabel: '기본값',
options: {
default: '기본값 (config.yaml)',
none: '없음',
minimal: '최소',
low: '낮음',
medium: '중간',
high: '높음',
xhigh: '매우 높음',
},
},
showToolCalls: '도구 호출 표시',
hideToolCalls: '도구 호출 숨기기',
messageQueue: '메시지 대기열',
removeQueuedMessage: '대기열 메시지 제거',
stop: '중지',
send: '전송',
contextUsed: '사용된 컨텍스트:',
sessions: '세션',
webUiSessions: '세션',
allProfiles: '모든 프로필',
profileMissingModelsTip: '이 세션의 프로필 "{profile}"에는 사용 가능한 공급자 또는 모델이 없습니다',
sessionScopeHint: '채팅에는 Web UI/API Server 세션만 표시됩니다. CLI, Telegram, Discord, Cron 등 채널 세션은 기록에서 읽기 전용으로 볼 수 있습니다.',
openHistory: '기록 열기',
hermesHistory: 'Hermes 기록',
historyScopeHint: '현재 profile의 Hermes 기록 세션을 소스별로 읽기 전용으로 봅니다.',
noSessions: '세션 없음',
newChat: '새 채팅',
agent: 'Agent',
approvalKicker: '터미널 권한',
approvalTitle: '실행 전에 명령 확인',
approvalAgree: '동의',
approvalAllowOnce: '한 번만 허용',
approvalAllowSession: '이 세션에서 허용',
approvalAlways: '항상 허용',
approvalDeny: '거부',
clarifyKicker: '에이전트 확인 필요',
clarifyTitle: '에이전트가 질문이 있습니다',
clarifyPlaceholder: '답변 입력...',
clarifySubmit: '답장',
clarifyDismiss: '무시',
deleteSession: '이 세션을 삭제하시겠습니까?',
toggleBatchMode: '일괄 선택',
selectAll: '모두 선택',
confirmBatchDelete: '선택한 {count}개의 세션을 삭제하시겠습니까?',
batchDeleteSuccess: '{count}개의 세션을 삭제했습니다',
batchDeletePartial: '{failed}개의 세션 삭제 실패',
batchDeleteFailed: '일괄 삭제 실패',
importToWebUi: 'Web UI로 가져오기',
importSessionSuccess: '세션을 Web UI로 가져왔습니다',
importSessionAlreadyExists: '세션이 이미 Web UI에 있습니다',
importSessionFailed: '세션 가져오기 실패',
sessionDeleted: '세션이 삭제되었습니다',
rename: '이름 변경',
archiveSession: '보관',
unarchiveSession: '보관 해제',
pin: '고정',
unpin: '고정 해제',
pinned: '고정됨',
chatMode: '채팅',
liveMode: '라이브',
liveSessions: '라이브 세션',
recentBadge: '최근',
linkedSessions: '{count}개 연결됨',
noVisibleMessages: '사람이 볼 수 있는 메시지가 없습니다.',
monitorRoleUser: '사용자',
monitorRoleAssistant: '어시스턴트',
copySessionLink: '세션 링크 복사',
openSessionInNewTab: '새 탭에서 열기',
sessionLinkCopied: 'Session link copied',
copySessionId: '세션 ID 복사',
export: '내보내기',
editConfig: '구성 편집',
exportFull: '전체 내보내기 (JSON)',
exportCompressed: '압축 내보내기 (TXT)',
exportCompressing: '컨텍스트 압축 중, 잠시 기다려주세요...',
exportSuccess: '세션을 내보냈습니다',
exportFailed: '내보내기 실패',
renamed: '이름이 변경되었습니다',
renameFailed: '이름 변경 실패',
sessionArchived: '세션을 보관했습니다',
archiveSessionFailed: '세션 보관 실패',
sessionUnarchived: '세션 보관을 해제했습니다',
unarchiveSessionFailed: '세션 보관 해제 실패',
renameSession: '세션 이름 변경',
sessionNotFound: '세션을 찾을 수 없습니다',
enterNewTitle: '새 제목을 입력하세요',
other: '기타',
runFailed: '실행 실패',
error: '오류',
tool: '도구',
arguments: '인수',
result: '결과',
workspaceChanges: '작업공간 변경',
changedFiles: '{files}개 파일 변경됨',
diffUnavailable: 'diff를 표시할 수 없습니다',
binaryFileDiffUnavailable: '바이너리 파일 diff를 표시할 수 없습니다',
truncated: '... (잘림)',
unchangedLines: '변경 없음 {count}줄',
executionDuration: '실행 시간', thinkingLabel: '사고 과정',
thinkingInProgress: '사고 중',
thinkingShow: '사고 과정 펼치기',
thinkingHide: '사고 과정 접기',
thinkingDuration: '관측 {duration}',
thinkingChars: '{count}자',
copyBubble: '메시지 복사',
copiedBubble: '복사됨',
copyFailed: '복사 실패',
playSpeech: '음성 재생',
pauseSpeech: '일시정지',
resumeSpeech: '재개',
stopSpeech: '중지',
speechNotSupported: '이 브라우저는 음성 재생을 지원하지 않습니다',
searchEnterHint: 'Enter로 열기 · Esc로 닫기',
searchHint: 'Cmd/Ctrl+K',
searchScope: '검색 범위: Web UI 로컬 세션 DB만 포함하며 읽기 전용 Hermes 기록 세션은 포함하지 않습니다.',
searchFailed: '세션 검색 실패',
searchNoSnippet: '표시할 요약이 없습니다',
searchNoResults: '일치하는 세션이 없습니다',
searchRecent: '최근 세션',
searchEmpty: '최근 세션',
searchPlaceholder: '세션 검색...',
searchSubtitle: '제목 또는 메시지 내용으로 검색',
searchTitle: '세션 검색',
stopGateway: 'Gateway 중지',
start: '시작',
workspaceSetFailed: 'Workspace 설정 실패',
workspaceSet: 'Workspace가 설정되었습니다',
workspacePlaceholder: '프로젝트 경로 입력, 예: /home/user/project',
folderPickerEmpty: '(비어 있음)',
folderPickerNoFolders: 'Workspace 폴더가 없습니다',
folderPickerSelected: '선택됨:',
workspaceDefault: '기본',
workspaceDefaultTooltip: '이 작업 공간은 기본값으로 설정되어 새 채팅에 자동 입력됩니다',
workspacePin: '기본 작업 공간으로 설정',
workspaceUnpin: '기본 작업 공간 해제',
workspaceRecent: '최근 사용',
defaultWorkspace: '기본 작업 공간',
more: '더보기',
workspace: '작업 공간',
setWorkspaceTitle: '세션 Workspace 설정',
setWorkspace: 'Workspace 설정',
modelSetFailed: '모델 설정 실패',
modelSet: '모델이 설정되었습니다',
setModelTitle: '세션 모델 설정',
setModel: '모델 설정',
newCliChat: '새 CLI',
cliEmptyState: 'CLI 채팅 시작',
autoPlaySpeech: '음성 자동 재생',
voiceInput: {
startCapture: '음성 입력 시작',
stopCaptureAndInsert: '음성 입력을 중지하고 입력창에 삽입',
cancelCapture: '음성 입력 취소',
statusLabel: '상태: {status}',
transcriptLabel: '전사: {text}',
errorLabel: '오류: {error}',
recentEvents: '최근 이벤트',
status: {
idle: '대기',
capturing: '듣는 중',
transcribing: '전사 중',
sending: '입력창에 삽입 중',
error: '오류',
},
browserSpeechUnsupported: '이 브라우저는 내장 음성 인식을 지원하지 않습니다.',
browserSpeechFailed: '브라우저 음성 인식에 실패했습니다.',
browserSpeechFailedWithReason: '브라우저 음성 인식에 실패했습니다: {error}.',
microphoneUnsupported: '이 브라우저는 마이크 녹음을 지원하지 않습니다.',
microphoneRecordingFailed: '마이크 녹음에 실패했습니다.',
},
},
// 예약 작업
jobs: {
title: '예약 작업',
createJob: '작업 생성',
editJob: '작업 편집',
noJobs: '예약된 작업이 없습니다. 새로 만들어 시작하세요.',
sortBy: '정렬',
sortByName: '이름순',
sortByTime: '날짜순',
sortByNameHint: '이름으로 정렬',
sortByTimeHint: '날짜로 정렬',
sortAsc: '오름차순',
sortDesc: '내림차순',
name: '이름',
namePlaceholder: '작업 이름',
schedule: '스케줄 (Cron 표현식)',
schedulePlaceholder: '예: 0 9 * * *',
quickPresets: '빠른 프리셋',
selectPreset: '프리셋 선택...',
presetEveryMinute: '매 분',
presetEvery5Min: '매 5분',
presetEveryHour: '매 시간',
presetEveryDay: '매일 00:00',
presetEveryDay9: '매일 09:00',
presetEveryMonday: '매주 월요일 09:00',
presetEveryMonth: '매월 1일 09:00',
prompt: '프롬프트',
promptPlaceholder: '실행할 프롬프트',
skills: '스킬',
skillsPlaceholder: '스킬 선택...',
provider: 'Provider',
model: 'Model',
defaultProvider: 'Default provider',
defaultModel: 'Default model',
deliverTarget: '전송 대상',
origin: '출처',
local: '로컬',
repeatCount: '반복 횟수 (선택)',
modelPlaceholder: '기본 모델',
repeatPlaceholder: '비워두면 무한 반복',
jobCreated: '작업이 생성되었습니다',
jobUpdated: '작업이 업데이트되었습니다',
nameRequired: '이름을 입력해 주세요',
scheduleRequired: '스케줄을 입력해 주세요',
loadFailed: '작업을 불러오지 못했습니다',
jobPaused: '작업이 일시 정지되었습니다',
jobResumed: '작업이 재개되었습니다',
jobTriggered: '작업이 실행되었습니다',
modelUpdated: '모델이 업데이트되었습니다',
jobDeleted: '작업이 삭제되었습니다',
status: {
running: '실행 중',
paused: '일시 정지',
disabled: '비활성화',
scheduled: '예약됨',
},
info: {
model: '모델',
provider: 'Provider',
schedule: '일정',
lastRun: '마지막 실행',
nextRun: '다음 실행',
deliver: '전송',
repeat: '반복',
},
action: {
pause: '일시 정지',
pauseJob: '작업 일시 정지',
resume: '재개',
resumeJob: '작업 재개',
runNow: '즉시 실행',
triggerImmediately: '즉시 실행',
},
runHistory: {
title: '실행 기록',
runs: '회 실행',
noRuns: '실행 기록이 없습니다.',
},
},
// 스킬
skills: {
title: '스킬',
targetFilter: '런타임',
targets: {
hermes: 'Hermes',
claude: 'Claude',
codex: 'Codex',
},
searchPlaceholder: '스킬 검색...',
noMatch: '검색과 일치하는 스킬이 없습니다',
noSkills: '스킬을 찾을 수 없습니다',
backTo: '돌아가기',
attachedFiles: '첨부 파일',
loadFailed: '스킬을 불러오지 못했습니다',
fileLoadFailed: '파일을 불러오지 못했습니다',
modified: '사용자 수정됨',
archived: '보관됨',
pinned: '고정됨',
pin: '스킬 고정',
unpin: '고정 해제',
pinFailed: '고정 상태 변경 실패',
edit: '편집',
saving: '저장 중...',
editorLabel: '스킬 편집기',
saveSuccess: '스킬 저장됨',
saveFailed: '스킬 저장 실패',
toggleFailed: '스킬 상태를 전환하지 못했습니다',
source: {
builtin: '내장',
hub: 'Hub',
local: '로컬',
external: '외부',
},
delete: '삭제',
deleteConfirm: '스킬 "{name}"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
deleteSuccess: '스킬이 삭제되었습니다',
deleteFailed: '삭제 실패',
import: '가져오기',
importTitle: '스킬 가져오기',
importModeZip: 'Zip',
importModeFolder: '폴더',
importHintZip: 'SKILL.md를 포함한 디렉터리의 .zip 파일 업로드',
importHintFolder: '로컬 스킬 폴더 선택 (SKILL.md 필요)',
importTargetCategory: '대상 카테고리 (선택)',
importTargetCategoryPlaceholder: '비워두면 misc에 배치',
importSelectFile: '.zip 파일 선택',
importSelectFolder: '폴더 선택',
importInvalidFile: '.zip 파일만 지원됩니다',
importFileCount: '개 파일',
importNoSelection: '먼저 파일 또는 폴더를 선택하세요',
importSuccess: '스킬이 가져와졌습니다',
importFailed: '가져오기 실패',
path: {
local: '로컬',
external: '외부',
},
externalDirs: {
manage: '외부 디렉터리',
title: '외부 디렉터리 관리',
hint: 'config.skills.external_dirs 를 관리합니다. ~ 과 $VAR 지원. 존재하지 않는 경로는 흐리게 표시됩니다.',
add: '외부 디렉터리 추가',
placeholder: '/path/to/skills 또는 ~/my-skills',
empty: '외부 디렉터리가 없습니다',
missing: '경로를 찾을 수 없음',
notDir: '디렉터리가 아님',
saveSuccess: '외부 디렉터리 저장됨',
saveFailed: '저장 실패',
loadFailed: '외부 디렉터리 로드 실패',
removeRow: '제거',
},
pathCopied: '경로 복사됨',
pathCopyFailed: '경로 복사 실패',
reloadHint: '활성 세션에서는 /reload-skills 실행. 새 세션은 자동 로드됩니다.',
writeApprovalButton: '대기 {count}',
writeApprovalTitle: '쓰기 승인 대기',
writeApprovalDescription: 'Hermes Agent가 보류한 메모리와 스킬 쓰기를 승인하거나 거부합니다.',
writeApprovalRefresh: '새로고침',
writeApprovalEmpty: '승인 대기 중인 쓰기가 없습니다.',
writeApprovalUnsupported: '이 Hermes Agent 버전은 쓰기 승인을 지원하지 않습니다. 이 기능을 사용하려면 Hermes Agent를 업그레이드하세요.',
writeApprovalMemory: '메모리',
writeApprovalSkills: '스킬',
writeApprovalViewDiff: '검토',
writeApprovalHideDiff: '숨기기',
writeApprovalNoDiff: '표시할 차이가 없습니다.',
writeApprovalLoadFailed: '승인 대기 쓰기를 불러오지 못했습니다',
writeApprovalDiffFailed: '쓰기 세부 정보를 불러오지 못했습니다',
writeApprovalActionFailed: '승인 대기 쓰기를 처리하지 못했습니다',
writeApprovalApproved: '쓰기가 승인되었습니다',
writeApprovalRejected: '쓰기가 거부되었습니다',
writeApprovalApprove: '승인',
writeApprovalReject: '거부',
writeApprovalPendingMemoryWrite: '승인 대기 메모리 쓰기',
writeApprovalCurrentFile: '현재 {file}',
writeApprovalProposedFile: '제안된 {file}',
writeApprovalDiffSection: '차이',
writeApprovalPatchOldStringMissing: '패치 old_string을 현재 {file}에서 찾지 못해 승인해도 파일은 변경되지 않습니다.',
writeApprovalRequestedOldString: '요청된 old_string',
writeApprovalCurrentReadFailed: '현재 {file}을 UTF-8 텍스트로 읽을 수 없습니다.',
writeApprovalDeleteSkill: '이 승인은 스킬 {skill}을 삭제합니다.',
writeApprovalRemoveFile: '이 승인은 스킬 {skill}에서 {file}을 제거합니다.',
},
// 플러그인
plugins: {
title: '플러그인',
refresh: '새로고침',
notice: '탐색 가능한 Hermes 플러그인 manifest 인벤토리입니다. 탐색 메타데이터는 플러그인 코드를 로드하지 않고 읽습니다. standalone 사용자 플러그인은 여기에서 활성화하거나 비활성화할 수 있으며, 변경 사항은 새 Hermes 세션에서 적용됩니다.',
loadFailed: '플러그인을 불러오지 못했습니다',
updateFailed: '플러그인을 업데이트하지 못했습니다',
enableSuccess: '{name} 활성화됨',
disableSuccess: '{name} 비활성화됨',
commandCopied: '명령을 복사했습니다',
searchPlaceholder: 'key, 이름, 설명, 경로 검색...',
source: '소스',
kind: '종류',
statusTitle: '상태',
configStatus: 'config: {status}',
notAvailable: 'n/a',
copyCommand: '명령 복사',
managedElsewhere: '다른 곳에서 관리됨',
noMatch: '현재 필터와 일치하는 플러그인이 없습니다',
enabled: '활성화됨',
disabled: '비활성화됨',
summary: {
total: '전체',
active: '활성 / 자동',
inactive: '비활성',
disabled: '비활성화됨',
providerManaged: 'Provider 관리',
},
status: {
enabled: '활성화됨',
'auto-active': '자동 활성',
inactive: '비활성',
disabled: '비활성화됨',
'provider-managed': 'Provider 관리',
},
statusLabel: {
enabled: '설정으로 활성화됨',
'auto-active': '자동 활성',
inactive: '비활성',
disabled: '비활성화됨',
'provider-managed': 'Provider 관리',
},
configStatuses: {
enabled: '활성화됨',
disabled: '비활성화됨',
'not-enabled': '활성화되지 않음',
auto: '자동',
'provider-managed': 'Provider 관리',
},
table: {
plugin: '플러그인',
status: '상태',
source: '소스',
kind: '종류',
capabilities: '기능',
path: '경로 / entrypoint',
manage: '관리',
},
capabilities: {
tools: '{count} tools',
hooks: '{count} hooks',
env: '{count} env',
},
metadata: {
agentRoot: '에이전트 루트',
python: 'Python',
scanCwd: 'cwd 스캔',
projectPlugins: '프로젝트 플러그인',
},
},
// 메모리
petdex: {
title: 'Petdex Pets',
subtitle: 'Browse the public petdex catalog used by Hermes desktop pets.',
refresh: 'Refresh',
adopt: 'Adopt',
active: 'Active',
adopted: 'Adopted {name}',
adoptFailed: 'Failed to adopt pet',
loadFailed: 'Failed to load petdex catalog',
searchPlaceholder: 'Search by name, slug, author, or kind',
kindFilter: 'Kind',
spritesheet: 'Spritesheet',
submittedBy: 'By {name}',
empty: 'No pets match the current filters.',
showMore: 'Show {count} more',
summary: {
total: 'Catalog total',
visible: 'Matching',
kinds: 'Kinds',
generatedAt: 'Generated at',
},
},
memory: {
title: '메모리',
refresh: '새로고침',
loadFailed: '메모리를 불러오지 못했습니다',
myNotes: '내 메모',
noNotes: '메모가 없습니다.',
notesPlaceholder: '메모를 작성하세요...',
userProfile: '사용자 프로필',
noProfile: '프로필이 없습니다.',
profilePlaceholder: '프로필을 작성하세요...',
soul: '소울',
noSoul: '소울 설정이 없습니다.',
soulPlaceholder: '소울 설정을 작성하세요...',
},
// 모델
models: {
title: '모델',
addProvider: 'Provider 추가',
refreshModelCache: '모델 캐시 새로고침',
refreshModelCacheLoading: '모델 캐시를 새로고침하는 중...',
refreshModelCacheSuccess: '모델 캐시를 새로고침했습니다',
refreshModelCacheFailed: '모델 캐시 새로고침 실패',
providerType: 'Provider 유형',
preset: '프리셋',
custom: '사용자 지정',
selectProvider: 'Provider 선택',
chooseProvider: 'Provider를 선택하세요...',
name: '이름',
autoGeneratedName: 'Base URL에서 자동 생성',
baseUrl: 'Base URL',
region: '지역',
regionIntl: '국제판',
regionCn: '중국 본토',
baseUrlPlaceholder: '예: https://api.example.com/v1',
apiKey: 'API Key',
apiKeyPlaceholder: 'sk-...',
defaultModel: '기본 모델',
selectOrInput: '모델 선택 또는 직접 입력...',
selectModel: '모델 선택...',
providerAdded: 'Provider가 추가되었습니다',
providerDeleted: 'Provider가 삭제되었습니다',
providerCredentialsCleared: 'Provider 자격 증명이 삭제되었습니다',
clearProviderCredentials: '자격 증명 삭제',
clearCredentialsConfirm: '"{name}"의 저장된 자격 증명을 삭제하시겠습니까? 이 기본 제공 Provider는 목록에 남으며, 자격 증명을 다시 설정하면 사용할 수 있습니다.',
disableProvider: 'Provider 비활성화',
disableProviderConfirm: '기본 제공 Provider "{name}"을(를) 비활성화하시겠습니까? 이 Provider는 기본 제공 항목으로 남으며 나중에 다시 활성화할 수 있습니다.',
providerDisabled: 'Provider가 비활성화되었습니다',
defaultProviderUpdated: '기본 Provider가 업데이트되었습니다',
defaultProviderUpdateFailed: '기본 Provider 업데이트에 실패했습니다',
defaultModelUpdated: '기본 모델이 업데이트되었습니다',
defaultModelUpdateFailed: '기본 모델 업데이트에 실패했습니다',
deleteProvider: 'Provider 삭제',
deleteConfirm: '"{name}"을(를) 삭제하시겠습니까?',
codexLoginTitle: 'OpenAI Codex 로그인',
codexWaiting: '인증 페이지에서 아래 코드를 입력하여 로그인하세요:',
codexCopyCode: '코드가 복사되었습니다',
codexOpenLink: '인증 페이지 열기',
codexApproved: '로그인 성공',
codexExpired: '인증이 만료되었습니다. 다시 시도해주세요.',
nousLoginTitle: 'Nous Portal 로그인',
nousWaiting: '인증 페이지에서 이 코드를 입력하세요:',
nousCopyCode: '코드 복사됨',
nousOpenLink: '인증 페이지 열기',
nousApproved: '로그인 성공',
nousDenied: '인증이 거부되었습니다',
nousExpired: '인증이 만료되었습니다',
copilotLoginTitle: 'GitHub Copilot 로그인',
copilotWaiting: 'GitHub을 열고 아래의 디바이스 코드를 입력하여 인증하세요. 승인 후 창이 자동으로 닫힙니다.',
copilotCopyCode: '코드가 복사되었습니다',
copilotOpenLink: 'GitHub 인증 페이지 열기',
copilotApproved: '로그인 성공!',
copilotDenied: '인증이 거부되었습니다.',
copilotExpired: '인증 링크가 만료되었습니다. 다시 시도하세요.',
copilotAddDetectedTitle: 'GitHub Copilot 감지됨',
copilotAddDetected: '이 컴퓨터에서 GitHub Copilot OAuth 토큰이 감지되었습니다. 추가를 클릭하여 Hermes에서 Copilot을 활성화하세요.',
copilotAddSourceEnv: '출처: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)',
copilotAddSourceGhCli: '출처: gh CLI (gh auth token)',
copilotAddSourceAppsJson: '출처: VS Code Copilot 확장 (apps.json)',
copilotDeleteHintEnv: '이 작업은 ~/.hermes/.env의 COPILOT_GITHUB_TOKEN을 지웁니다. 다른 도구에는 영향이 없습니다.',
copilotDeleteHintGhCli: 'Copilot이 Hermes에서 숨겨집니다. gh CLI 로그인에는 영향이 없으며 `gh auth status`는 여전히 로그인 상태를 표시합니다.',
copilotDeleteHintAppsJson: 'Copilot이 Hermes에서 숨겨집니다. VS Code Copilot 확장 로그인에는 영향이 없습니다.',
customBadge: '커스텀',
previewBadge: '프리뷰',
disabledBadge: '사용 불가',
disabledTooltip: "이 모델은 현재 계정에서 사용할 수 없습니다.",
customModelPlaceholder: '목록에 없는 모델 ID',
customModelHint: '제공자는 지원하지만 API가 반환하지 않는 모델용입니다. 표시 이름 변경이 아닙니다. Enter로 불러옵니다.',
noProviders: 'Provider가 없습니다. 사용자 지정 Provider를 추가하여 시작하세요.',
clearVisibleModels: '선택 지우기',
generalTitle: '일반 모델',
combinationTitle: '모델 앙상블',
combinationSubtitle: 'MoA 프리셋을 설정합니다. 참조 모델이 먼저 관점을 제공하고, 이후 하나의 집계 모델이 최종 응답과 도구 호출을 처리합니다.',
combinationPreset: '프리셋',
combinationName: '이름',
combinationAddModel: '모델 앙상블 추가',
combinationEditModel: '모델 앙상블 편집',
combinationNewPreset: '새 프리셋',
combinationPresetPlaceholder: '예: review',
combinationAddPreset: '프리셋 추가',
combinationSetDefault: '기본값으로 설정',
combinationEnabled: '참조 모델 활성화',
combinationReferenceModels: '참조 모델',
combinationReferenceModel: '참조 모델',
combinationAddReference: '참조 모델 추가',
combinationAggregator: '집계 모델',
combinationReferenceTemperature: '참조 온도',
combinationAggregatorTemperature: '집계 온도',
combinationMaxTokens: '최대 토큰',
combinationNotSet: '설정 안 됨',
combinationSaved: '모델 앙상블 저장됨',
combinationLoadFailed: '모델 앙상블을 불러오지 못했습니다',
combinationSaveFailed: '모델 앙상블을 저장하지 못했습니다',
combinationPresetExists: '프리셋이 이미 존재합니다',
combinationNameRequired: '모델 앙상블 이름을 입력하세요',
combinationNameInvalid: '이름에는 문자, 숫자, 밑줄, 하이픈, 점만 사용할 수 있습니다',
combinationReferenceRequired: '참조 모델을 하나 이상 추가하세요',
combinationAggregatorRequired: '집계 모델을 선택하세요',
auxiliaryTitle: '보조 모델',
auxiliarySubtitle: '압축, 비전, 승인, MCP, 백그라운드 유지 관리 같은 보조 작업별 모델 재정의입니다.',
auxiliaryRefresh: '새로고침',
auxiliaryTask: '작업',
auxiliaryTimeout: '시간 제한',
auxiliaryDownloadTimeout: '다운로드 시간 제한',
auxiliaryActions: '작업',
auxiliaryDefault: '기본값',
auxiliaryCustomEndpoint: '사용자 지정 엔드포인트',
auxiliaryProviderAuto: '자동',
auxiliaryProviderMain: '메인 모델',
auxiliaryProviderPlaceholder: 'auto, main 또는 provider key',
auxiliaryDownloadShort: '다운로드',
auxiliaryExtraBody: 'Extra body JSON',
auxiliaryClear: '초기화',
auxiliarySaved: '보조 모델을 저장했습니다',
auxiliaryLoadFailed: '보조 모델을 불러오지 못했습니다',
auxiliarySaveFailed: '보조 모델을 저장하지 못했습니다',
auxiliaryInvalidExtraBody: 'Extra body는 JSON 객체여야 합니다',
auxiliaryTaskCompression: '압축',
auxiliaryTaskVision: '비전',
auxiliaryTaskWebExtract: '웹 추출',
auxiliaryTaskSkillsHub: '스킬 허브',
auxiliaryTaskApproval: '승인',
auxiliaryTaskMcp: 'MCP',
auxiliaryTaskTitleGeneration: '제목 생성',
auxiliaryTaskTriageSpecifier: '트리아지 지정',
auxiliaryTaskKanbanDecomposer: 'Kanban 분해',
auxiliaryTaskProfileDescriber: '프로필 설명',
auxiliaryTaskCurator: '큐레이터',
auxiliaryTaskSessionSearch: '세션 검색',
auxiliaryTaskFlushMemories: '메모리 쓰기',
currentDefault: '현재 기본값',
defaultShort: '기본값',
setDefaultProvider: '기본 Provider로 설정',
setDefault: '기본값으로 설정',
builtIn: '내장',
customType: '사용자 지정',
provider: '공급자',
contextLength: '컨텍스트 길이',
contextLengthPlaceholder: '예: 256000 (선택사항)',
apiMode: 'API 모드',
local: '로컬 ({host})',
selectProviderRequired: 'Provider를 선택해 주세요',
baseUrlRequired: 'Base URL을 입력해 주세요',
apiKeyRequired: 'API Key를 입력해 주세요',
modelRequired: '기본 모델을 선택해 주세요',
enterBaseUrl: '먼저 Base URL을 입력해 주세요',
unexpectedFormat: '예상치 못한 응답 형식입니다',
foundModels: '{count}개의 모델을 찾았습니다',
fetchFailed: '모델을 가져오지 못했습니다',
xaiWaiting: '열린 xAI 페이지에서 인증을 완료하세요. 승인되면 창이 자동으로 닫힙니다.',
xaiOpenLink: 'xAI 인증 페이지 열기',
xaiLoginTitle: 'xAI Grok OAuth 로그인',
xaiExpired: '인증 링크가 만료되었습니다. 다시 시도하세요.',
xaiCopyLink: '인증 링크 복사',
xaiApproved: '로그인 성공!',
anthropicLoginTitle: 'Claude OAuth 로그인',
anthropicWaiting: 'Claude 인증 페이지에서 인증을 완료한 뒤 반환된 코드를 여기에 붙여넣으세요.',
anthropicOpenLink: 'Claude 인증 페이지 열기',
anthropicCopyLink: '인증 링크 복사',
anthropicCodePlaceholder: '인증 코드 붙여넣기...',
anthropicSubmitCode: '코드 제출',
anthropicApproved: '로그인 성공!',
anthropicExpired: '인증이 만료되었습니다. 다시 시도하세요.',
geminiLoginTitle: 'Google Gemini OAuth 로그인',
geminiWaiting: '열린 Google 페이지에서 인증을 완료하세요. 승인되면 창이 자동으로 닫힙니다.',
geminiOpenLink: 'Google 인증 페이지 열기',
geminiCopyLink: '인증 링크 복사',
geminiApproved: '로그인 성공!',
geminiExpired: '인증 링크가 만료되었습니다. 다시 시도하세요.',
visibilitySelectOne: '최소 하나의 표시 모델을 유지하세요',
visibilitySaved: '표시 모델이 저장되었습니다',
visibilitySaveFailed: '표시 모델 저장 실패',
visibilityHint: 'Web UI의 모델 선택기와 모델 페이지 표시에만 영향을 줍니다. Hermes CLI의 provider/model 설정은 변경되지 않으며 실제 호출은 원본 모델 ID를 사용합니다.',
showAllModels: '모든 모델 표시',
searchPlaceholder: '모델 검색...',
noResults: '결과 없음',
noModels: '모델 없음',
removeCustomModel: '목록에 없는 이 모델 제거',
refresh: '모델 목록 새로고침 (config.yaml 다시 불러오기)',
more: '개 더',
models: '모델 목록',
manageVisibleModelsFor: '{name} 표시 모델 관리',
manageVisibleModels: '표시 모델 관리',
getApiKey: 'API Key 가져오기',
count: '개 모델',
aliasUseOriginal: '원본 ID로 복원',
aliasTitleFor: '{model}의 표시 이름',
aliasTitle: '모델 표시 이름',
aliasSaveFailed: '표시 이름 저장 실패',
aliasPlaceholder: '비워두면 원본 모델 ID 사용',
aliasManageFor: '{provider}의 표시 이름',
aliasManage: '표시 이름',
aliasHint: 'Web UI 표시 이름만 변경합니다. Hermes에는 여전히 원본 모델 ID가 전달됩니다.',
aliasEdit: '이름 변경',
aliasCanonical: '원본 ID: {model}',
},
// 프로필
profiles: {
title: '프로필',
create: '프로필 생성',
import: '가져오기',
export: '내보내기',
rename: '이름 변경',
delete: '삭제',
switchTo: 'Hermes Profile 전환',
switchConfirm: '`hermes profile use {name}`를 실행하고 Hermes CLI active profile을 변경합니다. 계속하시겠습니까?',
switchSuccess: 'Hermes active profile이 "{name}"(으)로 전환되었습니다',
switchFailed: 'Hermes Profile 전환 실패. 게이트웨이를 수동으로 재시작해야 할 수 있습니다.',
createSuccess: '프로필 "{name}"이(가) 생성되었습니다',
createFailed: '프로필 생성 실패',
renameSuccess: '프로필 이름이 변경되었습니다',
renameFailed: '프로필 이름 변경 실패',
deleteConfirm: '프로필 "{name}"을(를) 삭제하시겠습니까?',
deleteSuccess: '프로필이 삭제되었습니다',
deleteFailed: '프로필 삭제 실패',
exportSuccess: '프로필이 내보내기되었습니다',
exportFailed: '프로필 내보내기 실패',
importSuccess: '프로필이 가져오기되었습니다',
importFailed: '프로필 가져오기 실패',
importSelectFile: '아카이브 파일 선택',
importInvalidFile: '유효한 아카이브 파일을 선택해 주세요 (.tar.gz, .tgz, .gz, .zip)',
name: '프로필 이름',
namePlaceholder: '영문, 숫자, 하이픈만 사용 가능',
nameValidation: '프로필 이름에는 소문자, 숫자, 밑줄, 하이픈만 사용할 수 있습니다',
newName: '새 이름',
newNamePlaceholder: '새 이름을 입력하세요',
cloneFromCurrent: '현재 프로필에서 복제',
cloneCleanupNotice: '복제 시 독점형 플랫폼 자격 증명(Weixin / Telegram / Slack 등)은 자동으로 건너뛰어 원본 프로필과의 충돌을 방지합니다',
cloneStrippedCredentials: '독점 자격 증명 {count}개 제거됨: {list}',
cloneDisabledPlatforms: '플랫폼 {count}개 비활성화됨: {list}',
cloneStrippedConfigCredentials: 'config.yaml에서 임베디드 자격 증명 {count}개 제거됨: {list}',
archivePath: '아카이브 경로',
archivePathPlaceholder: '아카이브 파일의 서버 경로',
importName: '프로필 이름 (선택)',
importNamePlaceholder: '비워두면 아카이브 이름을 사용합니다',
active: '활성',
model: '모델',
gateway: '게이트웨이',
alias: '별칭',
provider: '공급자',
path: '경로',
skills: '스킬',
hasEnv: '.env 있음',
hasSoulMd: 'soul.md 있음',
noProfiles: '프로필이 없습니다. 새로 만들어 시작하세요.',
avatar: {
title: '사용자 지정 아바타',
customize: '아바타',
upload: '이미지 업로드',
random: '무작위 생성',
reset: '기본값 복원',
hint: 'PNG, JPEG, WebP 지원, 최대 1MB',
invalidType: 'PNG, JPEG 또는 WebP 이미지를 선택하세요',
tooLarge: '아바타 이미지는 1MB를 초과할 수 없습니다',
saveSuccess: '아바타가 저장되었습니다',
saveFailed: '아바타 저장 실패',
resetSuccess: '기본 아바타로 복원되었습니다',
resetFailed: '기본 아바타 복원 실패',
},
runtime: {
activeProfile: '현재: {name}',
bridgeWorker: 'Bridge 상태',
gateway: '게이트웨이',
active: '활성',
activeTag: '현재',
idle: '대기 중',
checking: '확인 중',
running: '실행 중',
stopped: '중지됨',
restartGateway: 'Gateway 재시작',
restartProfile: '프로필 재시작',
switchProfile: '프론트엔드 프로필 전환',
gatewayRestarted: 'Gateway가 재시작되었습니다: {name}',
gatewayRestartFailed: 'Gateway 재시작 실패',
profileRestarted: '프로필이 재시작되었습니다: {name}',
profileRestartFailed: '프로필 재시작 실패',
},
},
// 로그
logs: {
title: '로그',
all: '전체',
searchPlaceholder: '검색...',
refresh: '새로고침',
noEntries: '로그 항목 없음',
},
// 설정
settings: {
title: '설정',
saved: '저장됨',
saveFailed: '저장 실패',
tabs: {
display: '표시',
account: '현재 계정',
users: '계정 관리',
agent: '에이전트',
proxy: '프록시',
memory: '메모리',
compression: '압축',
session: '세션',
privacy: '개인정보',
apiServer: 'API 서버',
models: '모델',
voice: '음성',
},
display: {
streaming: '스트리밍 응답',
streamingHint: 'AI 응답을 실시간으로 표시',
compact: '컴팩트 모드',
compactHint: '메시지 간격 줄이기',
showReasoning: '추론 과정 표시',
showReasoningHint: '모델의 생각 과정 표시',
showCost: '비용 표시',
showCostHint: '응답에 토큰 사용량 표시',
inlineDiffs: '인라인 변경사항',
inlineDiffsHint: '코드 변경사항을 인라인으로 표시',
bellOnComplete: '완료 알림음',
bellOnCompleteHint: 'AI 응답 완료 시 알림음 재생',
notifyOnComplete: '완료 알림',
notifyOnCompleteHint: 'AI 응답 완료 시 시스템 알림 표시',
notifyOnCompleteMacHint: 'macOS 에서는 시스템 설정에서 브라우저 알림을 허용해야 합니다.',
notifyOnCompleteDenied: '알림 권한이 거부되었습니다',
notifyOnCompleteInsecure: '브라우저 알림은 HTTPS 또는 localhost 가 필요합니다',
notifyOnCompleteUnsupported: '이 브라우저는 알림을 지원하지 않습니다',
notifyOnCompleteTest: '알림이 활성화되었습니다.',
notifyOnCompleteTestButton: '테스트',
notifyOnCompleteTesting: '테스트 알림을 보내는 중...',
notifyOnCompleteTestSent: '테스트 알림을 보냈습니다',
notifyOnCompleteTestFailed: '테스트 알림 전송 실패',
busyInputMode: '바쁨 입력 모드',
busyInputModeHint: 'AI 처리 중에도 입력 허용',
theme: '테마',
themeHint: '라이트, 다크 또는 시스템 설정 따르기',
themeLight: '라이트',
themeDark: '다크',
themeSystem: '시스템',
chatInputHeight: '채팅 입력 높이',
chatInputHeightHint: '데스크톱 채팅 입력창 기본 높이(px). 모바일은 자동 높이를 유지합니다.'
},
agent: {
maxTurns: '최대 턴 수',
maxTurnsHint: '대화당 최대 상호작용 라운드 수',
gatewayTimeout: '게이트웨이 시간초과',
gatewayTimeoutHint: '요청 시간초과 (초)',
restartDrainTimeout: '재시작 드레인 시간초과',
restartDrainTimeoutHint: '재시작 전 드레인 시간초과 (초)',
toolEnforcement: '도구 실행 정책',
toolEnforcementHint: '도구 호출 실행 모드 제어',
auto: '자동',
always: '항상',
never: '사용 안 함',
},
gatewayAutoStart: {
title: 'Gateway 자동 시작',
description: 'Web UI 시작 시 자동으로 실행할 로컬 Hermes profile gateway를 제어합니다. 이 값은 profile config.yaml이 아니라 Web UI 설정에 저장됩니다.',
enabled: 'Gateway 자동 시작',
enabledHint: '끄면 시작 시 어떤 profile gateway도 자동으로 실행하지 않습니다.',
management: '통합 gateway',
managementHint: 'Hermes Agent 0.17.0 이상이 필요합니다. 켜면 Web UI가 multiplex_profiles를 기록해 default gateway가 모든 profiles를 처리합니다. 다른 profile은 Feishu, Weixin, QQBot 같은 메시징 진입점을 별도로 설정할 수 없습니다. 끄면 해당 설정을 제거합니다.',
managementAuto: '자동',
managementPerProfile: 'Profile별 gateway 하나',
managementUnified: '통합 default gateway',
mode: 'Profile 정책',
modeHint: '발견된 모든 profiles를 시작하거나 명시적으로 포함한 목록만 시작합니다.',
modeAll: '발견된 모든 profiles',
modeInclude: '포함된 profiles만',
include: '포함할 profiles',
includeHint: '쉼표로 구분한 profile 이름입니다. 포함 모드에서 빈 목록은 아무것도 시작하지 않습니다.',
exclude: '제외할 profiles',
excludeHint: 'include/all 정책 적용 후 건너뛸 profile 이름을 쉼표로 구분해 입력합니다.',
profileListPlaceholder: 'default, reviewer',
},
proxy: {
title: 'Gateway 프록시',
description: '선택한 profile gateway의 프록시 환경 변수를 설정합니다. 변경 사항을 저장하면 gateway가 재시작되어 메시징 플랫폼이 새 네트워크 설정을 사용합니다.',
httpsProxy: 'HTTPS_PROXY',
httpsProxyHint: 'HTTPS 요청용 프록시입니다. 보통 가장 먼저 설정하는 값입니다.',
httpProxy: 'HTTP_PROXY',
httpProxyHint: '일반 HTTP 요청용 프록시입니다.',
allProxy: 'ALL_PROXY',
allProxyHint: '프로토콜별 프록시가 없을 때 사용하는 대체 프록시입니다.',
noProxy: 'NO_PROXY',
noProxyHint: '프록시를 우회할 호스트 또는 도메인을 쉼표로 구분합니다.',
save: '프록시 설정 저장',
},
memory: {
enabled: '메모리 활성화',
enabledHint: 'AI가 대화 컨텍스트를 기억하도록 허용',
userProfile: '사용자 프로필',
userProfileHint: 'AI가 사용자 선호를 기억하도록 허용',
charLimit: '메모리 문자 제한',
charLimitHint: 'MEMORY.md 최대 문자 수',
userCharLimit: '사용자 프로필 문자 제한',
userCharLimitHint: 'USER.md 최대 문자 수',
},
compression: {
enabled: '압축 활성화',
enabledHint: '긴 채팅 기록이 모델 컨텍스트를 넘기 전에 자동 압축',
threshold: '압축 임계값',
thresholdHint: '추정 토큰이 이 컨텍스트 비율을 넘으면 압축 시작',
targetRatio: '목표 비율',
targetRatioHint: '압축 후 기록 크기를 컨텍스트 비율로 지정',
protectLastN: '최근 메시지 보호',
protectLastNHint: '이 수만큼 최신 메시지는 압축하지 않음',
protectFirstN: '처음 메시지 보호',
protectFirstNHint: '이 수만큼 처음 메시지는 압축하지 않음',
},
session: {
mode: '초기화 모드',
modeHint: '세션 초기화 트리거 조건',
modeBoth: '유휴 + 예약',
modeIdle: '유휴만',
modeDaily: '예약만',
modeNone: '안함 (수동만)',
idleMinutes: '유휴 시간초과',
idleMinutesHint: '자동 초기화 대기 시간 (분)',
atHour: '예약 초기화 시간',
humanOnly: '사람 세션만 표시',
humanOnlyHint: '하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다',
liveMonitorHumanOnly: '라이브 모니터: 사람 세션만 표시',
liveMonitorHumanOnlyHint: '라이브 모니터에서 하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다',
atHourHint: '매일 지정한 시간에 세션 초기화',
requireAuth: '세션 승인',
requireAuthHint: '세션 작업에 승인을 요구합니다',
memoryWriteApproval: '메모리 쓰기 검토',
memoryWriteApprovalHint: 'Hermes Agent의 메모리 쓰기를 저장하기 전에 승인 대기 상태로 둡니다.',
skillsWriteApproval: '스킬 쓰기 검토',
skillsWriteApprovalHint: 'Hermes Agent의 스킬 변경을 저장하기 전에 승인 대기 상태로 둡니다.',
writeApprovalTitle: '쓰기 승인 대기',
writeApprovalDescription: 'Hermes Agent가 보류한 메모리와 스킬 쓰기를 승인하거나 거부합니다.',
writeApprovalRefresh: '새로고침',
writeApprovalEmpty: '승인 대기 중인 쓰기가 없습니다.',
writeApprovalMemory: '메모리',
writeApprovalSkills: '스킬',
writeApprovalViewDiff: '검토',
writeApprovalHideDiff: '숨기기',
writeApprovalNoDiff: '표시할 차이가 없습니다.',
writeApprovalLoadFailed: '승인 대기 쓰기를 불러오지 못했습니다',
writeApprovalDiffFailed: '쓰기 세부 정보를 불러오지 못했습니다',
writeApprovalActionFailed: '승인 대기 쓰기를 처리하지 못했습니다',
writeApprovalApproved: '쓰기가 승인되었습니다',
writeApprovalRejected: '쓰기가 거부되었습니다',
writeApprovalApprove: '승인',
writeApprovalReject: '거부',
writeApprovalPendingMemoryWrite: '승인 대기 메모리 쓰기',
writeApprovalCurrentFile: '현재 {file}',
writeApprovalProposedFile: '제안된 {file}',
writeApprovalDiffSection: '차이',
writeApprovalPatchOldStringMissing: '패치 old_string을 현재 {file}에서 찾지 못해 승인해도 파일은 변경되지 않습니다.',
writeApprovalRequestedOldString: '요청된 old_string',
writeApprovalCurrentReadFailed: '현재 {file}을 UTF-8 텍스트로 읽을 수 없습니다.',
writeApprovalDeleteSkill: '이 승인은 스킬 {skill}을 삭제합니다.',
writeApprovalRemoveFile: '이 승인은 스킬 {skill}에서 {file}을 제거합니다.',
},
privacy: {
redactPii: '개인정보 마스킹',
redactPiiHint: '민감 정보 자동 감지 및 숨김 (비밀번호, 키 등)',
},
apiServer: {
enable: '활성화',
enableHint: 'API 서버 활성화',
host: '호스트',
hostHint: '수신 주소',
port: '포트',
portHint: '수신 포트',
key: '키',
keyHint: 'API 접근 키',
cors: 'CORS 출처',
corsHint: '허용된 교차 출처',
},
voice: {
activeTtsApi: '활성 TTS API',
activeSttApi: '활성 STT API',
ttsProvidersTitle: 'TTS 제공자',
ttsProvidersDescription: '어시스턴트 응답 재생과 음성 미리듣기에 사용하는 텍스트 음성 변환 연동을 관리합니다.',
sttProvidersTitle: 'STT 제공자',
sttProvidersDescription: '마이크와 음성 입력 흐름에서 사용하는 음성 텍스트 변환 연동을 관리합니다.',
noneSelected: '선택 없음',
keyStored: '저장됨',
keyMissing: '없음',
customApi: 'API',
localBuiltin: '로컬 내장',
ttsCardHint: '음성 합성 제공자',
sttCardHint: '음성 전사 제공자',
setActive: '활성화',
testAction: '테스트',
connect: '연결',
presetEdgeTtsLabel: 'Edge TTS',
presetEdgeTtsDescription: 'Microsoft Edge의 무료 고품질 클라우드 음성입니다.',
presetOpenaiTtsLabel: 'OpenAI TTS',
presetMimoTtsLabel: 'MiMo TTS',
presetDoubaoTtsLabel: 'Volcengine Doubao TTS',
presetCustomTtsLabel: '사용자 지정 TTS',
presetBrowserSttLabel: '브라우저 STT',
presetBrowserSttDescription: '브라우저 기본 음성 인식 API입니다.',
presetOpenaiWhisperLabel: 'OpenAI Whisper',
presetGroqSttLabel: 'Groq STT',
presetDoubaoSttLabel: 'Volcengine Doubao STT',
presetCustomSttLabel: '사용자 지정 STT',
apiCompatibility: 'API 호환성',
openaiCompatible: 'OpenAI 호환',
manualCustomEndpoint: '수동 사용자 지정 엔드포인트',
connectionStep: '연결',
discoveryManualHint: '수동 사용자 지정 엔드포인트가 선택되었습니다. 모델 검색을 사용할 수 없으므로 모델 이름을 직접 입력하세요.',
discoveryCredentialHint: 'Base URL과 API key를 입력한 뒤 연결하여 사용 가능한 모델을 가져오세요.',
discoveryNoAutoProbeHint: '입력 중에는 요청을 보내지 않습니다. 자격 증명이 준비되면 Connect를 사용하세요.',
apiKeyConnectPlaceholder: '연결할 API key를 붙여넣으세요. 저장된 key는 표시되지 않습니다',
connectFetchModels: '연결 및 모델 가져오기',
modelRecommendedSuffix: '추천',
modelConnectManualHint: '연결하여 자동 입력하거나 직접 입력하세요.',
modelRequiredConnectManual: '모델은 필수입니다. 연결하여 자동 입력하거나 직접 입력하세요.',
apiKeyRequired: 'API key는 필수입니다.',
apiKeyRequiredForDiscovery: '모델을 가져오려면 API key가 필요합니다.',
baseUrlRequired: 'Base URL은 필수입니다.',
baseUrlHttpsRequired: 'http:// 또는 https:// 프로토콜을 사용하세요.',
baseUrlInvalid: 'https://를 포함한 올바른 Base URL을 입력하세요.',
discoveryFailedManualFallback: '모델을 가져올 수 없습니다. 모델 이름은 직접 입력할 수 있습니다.',
completeRequiredProviderFields: '저장하기 전에 필수 provider 필드를 완료하세요.',
fetchingModels: '모델 가져오는 중...',
recommendedModel: '추천: {model}.',
useRecommendedModel: '이 모델 사용',
modelsDiscovered: '{count}개 모델을 발견했습니다. 필드가 비어 있으면 추천 모델이 선택됩니다.',
remove: '제거',
testSuccess: '테스트 완료',
testTextRequired: '테스트하기 전에 텍스트를 입력하세요.',
keyMissingForTest: '이 제공자를 테스트하기 전에 API 키를 추가하세요.',
testing: '테스트 중...',
transcribing: '전사 중...',
browserSttTestHint: '브라우저 STT는 채팅 마이크에서 테스트합니다.',
sttEmptyAudio: '녹음된 오디오가 없습니다. 다시 시도하세요.',
sttTestSuccess: '전사가 완료되었습니다',
sttRecordingHint: '녹음 중... 전사하려면 중지를 클릭하세요.',
keepStoredKeyPlaceholder: '저장된 키를 유지하려면 비워 두세요',
apiKeyPlaceholder: 'API 키 입력',
lastTest: '마지막 테스트',
notTested: '—',
recording: '녹음 중',
testFailedShort: '실패',
testFailedSummary: '테스트에 실패했습니다. 제공자 설정을 확인하고 다시 시도하세요.',
showDetails: '세부 정보 표시',
hideDetails: '세부 정보 숨기기',
moreActions: '더보기',
moreActionsFor: '{provider} 추가 작업',
addTtsApi: 'TTS API 추가',
addSttApi: 'STT API 추가',
active: '활성',
builtin: '내장',
connected: '연결됨',
disconnected: '연결 끊김',
source: '소스',
model: '모델',
voice: '음성',
doubaoVoiceHint: 'Seed TTS 2.0 음색을 선택하면 리소스 필드가 자동으로 업데이트됩니다.',
apiKey: 'API 키',
confirmDeleteSecret: '이 음성 API의 저장된 API 키를 삭제할까요?',
ttsTitle: '텍스트 음성 변환',
ttsSaved: 'TTS 설정이 서버에 저장되었습니다',
ttsSaveFailed: 'TTS 설정 저장에 실패했습니다',
ttsTestSaved: '미리듣기에 성공했습니다. TTS 설정이 서버에 저장되었습니다',
ttsTestSaving: '미리듣기 전에 TTS 설정을 저장하는 중...',
ttsMissingBaseUrl: '테스트 전에 Base URL이 필요합니다. 제공자 엔드포인트를 입력한 뒤 다시 테스트하세요.',
ttsMissingApiKey: '테스트 전에 API 키가 필요합니다. 키를 붙여넣거나 먼저 서버 저장 키를 저장하세요.',
ttsCleared: '저장된 TTS 키를 삭제했습니다',
ttsClearFailed: '저장된 TTS 키 삭제에 실패했습니다',
storedBaseUrlsTitle: '저장된 Base URLs',
storedBaseUrlsHint: '저장된 음성 provider endpoint를 여기서 관리합니다. 위 입력란은 현재 값만 지우고, 저장된 URL 삭제는 여기서 합니다.',
storedBaseUrlsEmpty: '서버에 저장된 사용자 지정 음성 Base URL이 없습니다.',
storedBaseUrlDelete: 'URL 삭제',
storedApiKeysTitle: '저장된 API keys',
storedApiKeysHint: '서버에 저장된 음성 API key 목록입니다. 용도와 출처만 표시하고 전체 key는 표시하지 않습니다.',
storedApiKeysEmpty: '서버에 저장된 음성 API key가 없습니다.',
storedKeyKindTts: 'TTS',
storedKeyKindStt: 'STT',
storedApiKeyMasked: '[stored]',
storedApiKeyDelete: 'key 삭제',
baseUrlPresetClear: 'URL 지우기',
baseUrlPresetCleared: '현재 Base URL을 지웠습니다.',
baseUrlPresetDelete: 'URL 삭제',
baseUrlPresetDeleted: '저장 목록에서 Base URL을 제거했습니다.',
baseUrlPresetDeleteFailed: '저장된 Base URL 제거에 실패했습니다.',
ttsPendingSecret: '새 키가 저장됩니다',
ttsStoredSecret: '서버에 저장된 키가 있습니다: {value}',
ttsClearKey: '저장된 키 삭제',
sttTitle: '음성 텍스트 변환',
sttProvider: 'STT 제공자',
sttProviderHint: '음성 입력을 전사하는 방식을 선택하세요',
sttProviderBrowser: '브라우저',
sttProviderOpenai: 'OpenAI 호환',
sttProviderCustom: '사용자 지정',
sttBrowserHint: '사용 가능한 경우 브라우저 내장 음성 인식을 사용합니다.',
sttApiKey: 'API 키',
sttApiKeyHint: '인증이 필요한 STT 제공자를 위해 서버 측에 저장됩니다.',
sttStoredSecret: '저장된 서버 키: {value}',
sttPendingSecret: '저장된 서버 키: 저장 시 업데이트됩니다',
sttClearKey: '저장된 키 삭제',
sttModel: '모델',
sttModelHint: '사용할 음성 텍스트 변환 모델입니다.',
sttLanguage: '언어',
sttLanguageHint: 'en 또는 zh 같은 선택적 언어 힌트입니다.',
sttPrompt: '프롬프트',
sttPromptHint: '선택적 전사 프롬프트입니다.',
sttAudioTranscode: '오디오 트랜스코딩',
sttAudioTranscodeNone: '원본 오디오 전송',
sttAudioTranscodeFfmpeg: 'ffmpeg로 WAV 변환',
sttBaseUrl: 'Base URL',
sttBaseUrlHint: 'OpenAI 호환 사용자 지정 음성 텍스트 변환 엔드포인트입니다.',
sttSave: 'STT 설정 저장',
sttSaved: 'STT 설정이 서버에 저장되었습니다.',
sttSaveFailed: 'STT 설정 저장에 실패했습니다.',
sttCleared: '저장된 STT 비밀 값이 서버에서 삭제되었습니다.',
sttClearFailed: '저장된 STT 비밀 값 삭제에 실패했습니다.',
sttActiveSaved: '활성 STT 제공자가 서버에 저장되었습니다.',
sttSaveActive: '활성 STT 제공자 저장',
sttEndpointHint: '최종 전사 엔드포인트: {endpoint}',
sttTestTitle: '음성 텍스트 변환 테스트',
sttTestButton: 'STT API 테스트',
sttTestStopButton: '중지하고 전사',
sttTestBackendOnly: 'STT API 테스트는 OpenAI 호환 및 사용자 지정 제공자에서 사용할 수 있습니다.',
sttTestRecording: '테스트 샘플 녹음 중... 완료되면 중지하고 전사를 클릭하세요.',
sttTestTranscribing: '테스트 샘플 전사 중...',
sttTestEmpty: 'STT 테스트용 오디오가 녹음되지 않았습니다.',
sttTestSucceeded: 'STT 테스트가 성공했습니다.',
sttTestFailed: 'STT 테스트 실패: {error} — {hint}',
sttFailureHintMissingConfig: '테스트 전에 제공자가 Base URL/모델 및 API 키와 함께 저장되었는지 확인하세요.',
sttFailureHintAuth: 'API 키를 확인하세요. 키가 이미 저장되어 있었다면 현재 키를 다시 붙여넣고 저장한 뒤 테스트하세요.',
sttFailureHintForbidden: '키가 제공자에 도달했지만 이 STT 모델 또는 계정에 대한 권한이 없습니다. 제공자 접근 권한/결제를 확인하세요.',
sttFailureHintEndpointModel: 'Base URL과 모델을 확인하세요. Groq의 경우 {endpoint}에 whisper-large-v3-turbo 또는 다른 Groq STT 모델을 사용하세요.',
sttFailureHintModel: '선택한 STT 모델이 존재하며 이 계정에서 활성화되어 있는지 확인하세요.',
sttFailureHintQuota: '제공자가 할당량, 결제 또는 속도 제한 문제를 보고했습니다. 계정 할당량/결제를 확인하거나 나중에 다시 시도하세요.',
sttFailureHintNetworkCustom: '서버가 사용자 지정 STT 엔드포인트에 연결할 수 없습니다. {endpoint}가 Web UI 서버에서 접근 가능하고 OpenAI 호환인지 확인하세요.',
sttFailureHintNetwork: 'Web UI 서버가 STT 제공자에 연결할 수 없습니다. 네트워크/프록시/방화벽을 확인하고 다시 시도하세요.',
sttFailureHintAudio: '녹음된 오디오가 비어 있거나 거부되었습니다. 짧고 명확한 샘플을 시도하고, 마이크 접근을 허용하거나 Chrome에서 다시 시도하세요.',
sttFailureHintGenericCustom: 'API 키, Base URL, 모델, 최종 엔드포인트 {endpoint}를 확인하세요.',
sttFailureHintGeneric: 'API 키, 모델, 제공자 계정 접근 권한을 확인한 뒤 다시 시도하세요.',
sttTestRecordFailed: '마이크 녹음을 시작할 수 없습니다: {error}',
sttTestTranscript: '전사 결과: {text}',
ttsProvider: 'TTS 제공자',
ttsProviderHint: '메시지 재생에 사용할 텍스트 음성 변환 엔진 선택',
providerWebSpeech: 'WebSpeech API (브라우저)',
providerOpenai: 'OpenAI TTS',
providerCustom: '사용자 정의 엔드포인트 (OpenAI 호환)',
providerEdge: 'Edge TTS (무료, API Key 불필요)',
// WebSpeech
webspeechVoice: '음성',
webspeechVoiceHint: '브라우저 또는 OS에서 음성 선택',
webspeechVoicePlaceholder: '자동 (기본 음성)',
// OpenAI
openaiKey: 'API 키',
openaiKeyHint: 'TTS 접근 권한이 있는 OpenAI API 키',
openaiUrl: 'API 기본 URL',
openaiUrlHint: '예: https://api.openai.com/v1/audio/speech',
openaiModel: '모델',
openaiModelHint: 'tts-1 (빠름) / tts-1-hd (고음질)',
openaiVoice: '음색',
openaiVoiceHint: '합성에 사용할 음색',
// Custom endpoint
customHint: '모든 OpenAI 호환 TTS API 사용 가능 — GPT-SoVITS, CosyVoice 등 지원',
customUrl: 'API URL',
customUrlHint: 'TTS 서비스의 기본 URL',
customUrlPlaceholder: '로컬 어댑터에 설정된 주소 (예: http://127.0.0.1:9880)',
customApiKey: 'API 키 (선택사항)',
customApiKeyHint: '일부 사용자 정의 엔드포인트는 인증 필요',
customApiKeyPlaceholder: '필요하지 않으면 비워둠',
// Edge TTS
edgeHint: 'Microsoft Edge TTS 기반 (node-edge-tts).',
edgeUrl: '어댑터 URL',
edgeUrlHint: 'Edge TTS 어댑터 주소 (예: http://127.0.0.1:9882)',
edgeUrlPlaceholder: 'http://127.0.0.1:9882',
edgeVoice: '음색',
edgeVoiceHint: '음성 합성에 사용할 음색 선택',
edgeRate: '속도',
edgeRateHint: '음성 속도 조절 (0.5~2.0배)',
edgePitch: '음높이',
edgePitchHint: '음성 음높이 조절 (-20~+20 Hz)',
// Test
testTitle: '음성 테스트',
testText: '테스트 텍스트',
testTextPlaceholder: '테스트할 텍스트 입력...',
testTextDefault: '안녕하세요, 음성 테스트입니다.',
testButton: '테스트',
testButtonPlaying: '재생 중...',
testFailed: '테스트 실패: {error}',
// MiMo TTS
providerMimo: 'MiMo TTS',
mimoHint: '샤오미 MiMo TTS — 프리셋 음성, 음성 디자인, 음성 클론 세 가지 모드 지원',
mimoApiKey: 'API Key',
mimoApiKeyHint: 'platform.xiaomimimo.com에서 발급',
mimoApiKeyPlaceholder: 'MiMo API Key',
mimoAuthMode: '인증 모드',
mimoAuthModeHint: '선택한 MiMo 엔드포인트가 요구하는 헤더 형식',
mimoAuthModeBearer: 'Bearer 토큰 (Authorization)',
mimoAuthModeApiKey: 'API key 헤더 (api-key)',
mimoAuthModeBoth: '두 헤더 모두',
mimoBaseUrl: 'Base URL',
mimoBaseUrlHint: 'MiMo API 엔드포인트 URL',
mimoModel: '모델',
mimoModelHint: '음성 합성 모델 선택',
mimoModelPreset: '프리셋 음성',
mimoModelVoiceDesign: '음성 디자인',
mimoModelVoiceClone: '음성 클론',
mimoVoice: '음성',
mimoVoiceHint: '프리셋 음성 선택',
mimoVoiceDesignPrompt: '음성 설명',
mimoVoiceDesignPromptHint: '원하는 음성 특징을 설명하세요',
mimoVoiceDesignPromptPlaceholder: '예: 따뜻한 젊은 여성 목소리, 약간 느린 속도, 마그네틱한 톤',
mimoCloneAudio: '오디오 업로드',
mimoCloneAudioHint: '음성 클론용 오디오 샘플 업로드 (mp3/wav, 최대 10MB)',
mimoCloneAudioUpload: '파일 선택',
mimoCloneAudioClear: '지우기',
mimoStylePrompt: '스타일 프롬프트',
mimoStylePromptHint: '선택사항 — 자연어로 말하기 스타일 설명',
mimoStylePromptPlaceholder: '예: 밝고 경쾌한 톤, 빠른 속도',
},
lockedIps: {
title: '잠긴 IP 관리',
count: '{count}개 잠김',
empty: '잠긴 IP 없음',
unlock: '잠금 해제',
unlockAll: '전체 해제',
unlockAllConfirm: '모든 잠긴 IP를 해제하시겠습니까?',
unlocked: 'IP 잠금 해제됨',
allUnlocked: '{count}개 IP 잠금 해제됨',
type: {
password: 'Password',
token: 'API token',
pairing: 'Device pairing',
},
},
userAvatar: {
title: '사용자 아바타',
upload: '이미지 업로드',
random: '무작위 생성',
reset: '기본값으로 재설정',
hint: 'PNG, JPEG, WebP를 최대 1MB까지 지원하며 500KB 미만으로 자동 압축됩니다.',
invalidType: 'PNG, JPEG 또는 WebP 이미지를 선택하세요',
tooLarge: '아바타 이미지는 1MB 이하여야 합니다',
saveSuccess: '아바타 저장됨',
saveFailed: '아바타 저장 실패',
resetSuccess: '아바타 재설정됨',
resetFailed: '아바타 재설정 실패',
},
models: {
apiKey: 'API Key',
apiKeyPlaceholder: 'API Key 입력',
noProviders: '구성된 공급자가 없습니다',
save: '저장',
saveFailed: '저장 실패',
saved: '저장됨',
},
},
githubPreview: {
title: "버전 미리보기",
description: "선택한 GitHub tag 를 Web UI 미리보기 작업 디렉터리에 클론하고, 의존성을 설치한 뒤 개발 포트로 실행합니다.",
refresh: "새로고침",
selectTag: "tag 선택",
prepare: "코드 준비",
install: "의존성 설치",
start: "미리보기 시작",
stop: "중지",
note: "미리보기 코드는 Web UI 데이터 홈 아래에 저장됩니다. 프로덕션은 8648을 유지하고, 미리보기 개발 환경은 프론트엔드 8651, 백엔드 8650에서 실행됩니다.",
path: "미리보기 경로",
webuiHome: "미리보기 데이터 홈",
currentTag: "현재 Tag",
repoReady: "저장소 준비됨",
dependencies: "의존성 설치됨",
running: "실행 상태",
notRunning: "실행 중 아님",
open: "미리보기 열기",
log: "작업 로그 경로",
logOutput: "로그 출력",
actionLog: "작업 로그",
devLog: "개발 서버 로그",
yes: "예",
no: "아니요",
actionFailed: "작업 실패",
nodeEnvironmentMissing: "Node/npm 환경을 찾을 수 없습니다. Node.js를 설치한 뒤 다시 시도하세요.",
prepareSuccess: "미리보기 코드가 준비되었습니다",
installSuccess: "의존성이 설치되었습니다",
startSuccess: "미리보기가 완료되었습니다",
stopSuccess: "미리보기가 중지되었습니다",
},
codingAgents: {
title: "코딩 에이전트",
notice: "모든 제공업체와 모델이 호환되는 것은 아닙니다.",
claudeDescription: "print mode 단발 작업과 대화형 코딩 세션을 위한 Anthropic CLI입니다.",
codexDescription: "저장소 작업을 위한 OpenAI CLI 및 Hermes openai-codex 제공업체 흐름입니다.",
copyCommand: "복사",
commandCopied: "명령이 복사되었습니다",
commandCopyFailed: "복사 실패",
refresh: "새로고침",
checking: "확인 중",
installStatus: "설치 상태",
installed: "설치됨",
notInstalled: "설치되지 않음",
installRequired: "{agent}이(가) 설치되어 있지 않습니다. 세션을 만들기 전에 설치하세요.",
installNow: "설치",
installing: "설치 중",
installSuccess: "설치됨",
installFailed: "설치 실패",
installFailedHermesHint: "설치에 실패했습니다. Hermes에게 설치를 요청하세요.",
installFailureReason: "오류 원인",
nodeEnvironmentMissing: "Node/npm 환경을 찾을 수 없습니다. Node.js를 설치한 뒤 다시 시도하세요.",
deleteNow: "삭제",
deleting: "삭제 중",
deleteSuccess: "삭제됨",
deleteFailed: "삭제 실패",
configFiles: "설정 파일",
profileScope: "프로필",
providerScope: "제공업체",
providerPlaceholder: "예: custom:glm",
modelScope: "모델",
modelPlaceholder: "모델 선택",
launchModeScope: "시작 모드",
launchModeGlobal: "전역 설정",
launchModeScoped: "제공업체와 모델",
protocolScope: "프로토콜",
protocolOpenAiChat: "OpenAI Chat Completions (/v1/chat/completions)",
protocolOpenAiResponses: "OpenAI Responses (/v1/responses)",
protocolAnthropicMessages: "Anthropic Messages (/v1/messages)",
reloadConfig: "설정 다시 읽기",
configFileNotCreated: "생성되지 않음",
configLoadFailed: "설정 파일을 읽지 못했습니다",
loadFailed: "코딩 에이전트를 확인하지 못했습니다",
launch: "시작",
launchTitle: "코딩 에이전트 시작",
nativeTerminal: "네이티브 터미널",
builtInTerminal: "내장 터미널",
launchPrepared: "시작 설정이 준비되었습니다",
launchPrepareFailed: "시작 설정 준비 실패",
nativeLaunchStarted: "네이티브 터미널을 열었습니다",
nativeLaunchFailed: "네이티브 터미널을 열지 못했습니다",
terminalTitle: "코딩 에이전트 터미널",
loadProvidersFailed: "현재 프로필의 제공업체를 불러오지 못했습니다",
selectProviderModel: "제공업체와 모델을 선택하세요",
launchConfigDir: "시작 설정 디렉터리",
launchCommand: "시작 명령",
table: {
tool: "도구",
kind: "단계",
command: "명령",
note: "설명",
action: "작업",
},
kinds: {
install: "설치",
auth: "인증",
health: "상태",
run: "실행",
},
notes: {
claudeInstall: "Claude Code CLI를 전역으로 설치합니다.",
codexInstall: "Codex CLI를 전역으로 설치합니다.",
claudeAuth: "Claude Code 로그인 상태를 확인합니다. 로그인이 없으면 claude를 한 번 실행하세요.",
codexAuth: "Hermes가 관리하는 OpenAI Codex OAuth 자격 증명을 추가합니다.",
claudeHealth: "업데이터와 로컬 CLI 상태를 확인합니다.",
codexHealth: "Codex CLI가 PATH에서 사용 가능한지 확인합니다.",
claudeRun: "API 기반 단발 작업에는 print mode가 가장 깔끔한 경로입니다.",
codexRun: "Codex 단발 작업은 git 저장소 안에서 실행해야 합니다.",
},
},
platform: {
requireMention: "{'@'}멘션 필요",
requireMentionGroup: "그룹에서 {'@'}멘션 시에만 응답",
requireMentionChannel: "채널에서 {'@'}멘션 시에만 응답",
requireMentionRoom: "방에서 {'@'}멘션 시에만 응답",
reactions: '반응',
reactionsHint: '메시지에 이모지 반응',
freeResponseChats: '자유 응답 채팅',
freeResponseChatsHint: "{'@'}멘션 없이 응답할 채팅 ID (쉼표로 구분)",
freeResponseChannels: '자유 응답 채널',
freeResponseChannelsHint: "{'@'}멘션 없이 응답할 채널 ID (쉼표로 구분)",
freeResponseRooms: '자유 응답 방',
freeResponseRoomsHint: "{'@'}멘션 없이 응답할 방 ID (쉼표로 구분)",
mentionPatterns: '사용자 지정 멘션 패턴',
mentionPatternsHint: '추가 트리거 패턴',
autoThread: '자동 스레드',
autoThreadHint: "{'@'}멘션 후 자동으로 스레드 생성",
autoThreadHintRoom: '방에서 자동으로 스레드 생성',
dmMentionThreads: 'DM 멘션 스레드',
dmMentionThreadsHint: 'DM에서 멘션 시 스레드로 응답',
allowBots: '봇 메시지 허용',
allowBotsHint: '다른 봇의 메시지에 응답',
allowedChannels: '허용된 채널',
allowedChannelsHint: '채널 ID 허용 목록 (쉼표로 구분)',
ignoredChannels: '무시할 채널',
ignoredChannelsHint: '봇이 응답하지 않는 채널 ID (쉼표로 구분)',
noThreadChannels: '스레드 없는 채널',
noThreadChannelsHint: '스레드 없이 응답할 채널 ID (쉼표로 구분)',
exclusiveTokenWarning: '이 플랫폼은 독점 토큰 잠금을 사용합니다. 각 프로필은 다른 프로필과 충돌하지 않도록 서로 다른 ID 토큰을 사용해야 합니다.',
botToken: '봇 토큰',
botTokenHint: '개발자 포털에서 발급받은 봇 토큰',
proxyUrl: '프록시 URL',
proxyUrlHint: '선택 사항인 플랫폼 전용 프록시입니다. http://, https://, socks5:// 지원',
accessToken: '액세스 토큰',
accessTokenHint: 'Matrix 액세스 토큰',
homeserver: '홈서버 URL',
homeserverHint: 'Matrix 홈서버 URL',
matrixUserId: 'Matrix 사용자 ID',
matrixUserIdHint: '비밀번호 로그인에는 필수, 액세스 토큰에는 선택 사항',
matrixPassword: 'Matrix 비밀번호',
matrixPasswordHint: '액세스 토큰 대신 사용할 로그인 비밀번호',
appId: 'App ID',
appIdHint: 'Feishu의 App ID',
appSecret: 'App Secret',
appSecretHint: 'Feishu의 App Secret',
encryptKey: '암호화 키',
encryptKeyHint: 'Feishu 암호화 키',
verificationToken: '검증 토큰',
verificationTokenHint: 'Feishu 검증 토큰',
clientId: 'Client ID',
clientIdHint: 'DingTalk의 Client ID',
clientSecret: 'Client Secret',
clientSecretHint: 'DingTalk의 Client Secret',
cardTemplateId: 'AI 카드 템플릿 ID',
cardTemplateIdHint: 'DingTalk AI 카드 템플릿 ID; 비워 두면 AI 카드를 사용하지 않음',
botId: 'Bot ID',
botIdHint: 'WeCom 봇 ID',
wecomSecretHint: 'WeCom 봇 Secret',
waEnabled: 'WhatsApp 활성화',
waEnabledHint: 'QR 코드 페어링으로 WhatsApp 활성화',
weixinToken: 'Weixin 토큰',
weixinTokenHint: 'weixin CLI QR 로그인에서 가져오기 (hermes weixin)',
accountId: '계정 ID',
accountIdHint: 'Weixin 계정 ID',
qrLogin: 'QR 로그인',
qrRelogin: '다시 로그인',
qrFetching: 'QR 코드를 가져오는 중...',
qrScanHint: 'WeChat으로 QR 코드를 스캔하여 로그인',
qrScanedHint: '스캔됨, 휴대폰에서 확인해 주세요...',
qqSandboxHint: '샌드박스 환경 활성화(테스트용)',
qqSandbox: '샌드박스 모드',
qqQrScanHint: 'QQ로 위 QR 코드를 스캔하거나 휴대폰에서 링크를 열어 바인딩을 완료하세요',
qqMarkdownHint: 'Markdown 형식 메시지 활성화(일부 클라이언트는 지원하지 않을 수 있음)',
qqMarkdown: 'Markdown 지원',
qqAppSecretHint: 'QQ Open Platform Bot의 App Secret',
qqAppSecret: 'App Secret',
qqAppIdHint: 'QQ Open Platform Bot의 App ID',
qqAppId: 'App ID',
allowedUsersHint: '사용자 ID 또는 OpenID 허용 목록, 쉼표로 구분',
allowedUsers: '허용 사용자',
allowAllUsersHint: '모든 사용자의 메시지를 허용합니다. 끄면 허용 목록을 사용합니다',
allowAllUsers: '모든 사용자 허용',
},
// 언어
language: {
label: '언어',
zh: '中文',
en: 'English',
ko: '한국어',
},
// 터미널
terminal: {
sessions: '세션',
newTab: '새 터미널',
closeSession: '이 세션을 닫으시겠습니까?',
sessionExited: '종료됨',
processExited: '프로세스가 종료되었습니다 (코드 {code})',
noSessions: '터미널 세션이 없습니다',
connectionFailed: '터미널에 연결하지 못했습니다',
connectionError: '연결 오류',
connectionClosed: '연결이 닫혔습니다',
},
// 사용량
usage: {
title: '사용량 통계',
refresh: '새로고침',
totalTokens: '총 토큰 수',
inputTokens: '입력',
outputTokens: '출력',
totalSessions: '총 세션 수',
avgPerDay: '일평균 ~{n}',
estimatedCost: '예상 비용',
cacheHitRate: '캐시 적중률',
modelBreakdown: '모델별 분포',
agentBreakdown: 'Agent별 분포',
agents: { hermes: 'Hermes Agent', claudeCode: 'Claude Code', codex: 'Codex', ekkoAgent: 'Ekko Agent', unknown: '알 수 없음' },
dailyTrend: '일별 사용량',
date: '날짜',
tokens: '토큰',
cache: '캐시',
cacheRead: '캐시 읽기',
cacheWrite: '캐시 쓰기',
sessions: '세션',
cost: '비용',
noData: '사용량 데이터 없음',
},
skillsUsage: {
title: '스킬 사용량',
subtitle: 'Hermes 세션의 스킬 로드와 편집을 추적합니다',
refresh: '새로고침',
periodSelector: '스킬 사용량 기간',
periodLabel: '{days}일',
summary: '요약',
totalActions: '작업 수',
loads: '로드',
edits: '편집',
distinctSkills: '스킬 수',
topSkills: '상위',
dailyTrend: '일별',
periodSummary: '최근 {days}일',
skill: '스킬',
share: '비중',
lastUsed: '마지막',
noData: '스킬 사용량 데이터가 없습니다',
loadFailed: '스킬 사용량을 불러오지 못했습니다',
otherSkills: '기타',
},
workflow: {
node: {
approvalRequired: '완료 후 승인',
},
status: {
pending_approval: '승인 대기',
approval_rejected: '승인 거부',
},
},
// 변경 이력
changelog: {
new_0_6_29_1: '이번 릴리스는 0.6.28 이후 병합된 14개 PR을 모두 포함하며 UI 일관성, MCU 오디오와 v2 하드웨어, workspace diff, 사용량 분석, Docker 업데이트, MiMo 음성 복제를 다룹니다',
new_0_6_29_2: '페이지 헤더, 다크 표면, 모서리 반경을 하나의 시각 시스템으로 통일하고 버전 미리보기는 유효한 태그를 시맨틱 버전순으로 정렬합니다 (#2014, #2015)',
new_0_6_29_3: 'ESP32 제품 페이지를 반응형으로 개편하고 웹사이트 버전 선택기에 Hermes Agent 0.18.2를 추가했습니다 (#2020, #2042)',
new_0_6_29_4: 'ESP32-C3 v1 업링크 오디오에 IMA-ADPCM을 적용해 대역폭을 약 4분의 1로 줄이고 녹음 한도를 2분으로 늘렸으며, OLED는 임시 상태 후 LAN IP로 돌아갑니다 (#2024, #2025)',
new_0_6_29_5: 'Workspace diff를 기본 접힘 상태로 표시하고 0줄 변경을 제거했으며 표준 다크 채팅 입력 배경을 복원했습니다 (#2032)',
new_0_6_29_6: '세션 내보내기는 잘못된 퍼센트 기호가 있는 파일명을 처리하고, Docker 업데이트는 컨테이너 내부 npm 대신 이미지 pull/recreate 안내를 표시합니다 (#2026, #2033)',
new_0_6_29_7: 'Bridge 도구 결과는 전체 저장하되 모델 컨텍스트에서는 앞뒤를 사용한 5,500자 요약으로 제한해 반복적인 컨텍스트 증가를 막습니다 (#2036)',
new_0_6_29_8: 'Hermes Agent, Claude Code, Codex, Ekko Agent의 모델 호출을 통합 기록하고 Agent 분포 보기를 추가했습니다 (#2039)',
new_0_6_29_9: '독립된 ESP32-C3 v2 펌웨어에 새 핀 맵을 추가해 v1과 분리했으며, v2는 기본 80% 볼륨과 1.5배 PCM 게인 및 소프트 리미팅을 사용합니다 (#2044, #2045)',
new_0_6_29_10: 'MiMo 음성 복제에 WAV/MP3 참조 오디오 업로드를 복원하고 현재 API 요구사항에 따라 audio.voice로 전송합니다 (#2046)',
new_0_6_28_1: '이번 릴리스는 0.6.27 이후 병합된 PR을 반영하며 MCU 관리, 그룹 채팅 workspace diff, Coding Agent 수정, Workflow 승인, workspace diff 필터링, scheduled job 모델 선택, desktop 새 버전 표시를 포함합니다',
new_0_6_28_2: 'MCU는 device management를 추가하고 global-agent event에 API token 인증을 요구하며 ESP32-C3 firmware를 갱신하고 remote relay login을 안정화했습니다',
new_0_6_28_3: '그룹 채팅 workspace 변경은 workspace diff run으로 저장되어 세션 완료 후에도 room-level agent activity를 확인할 수 있습니다',
new_0_6_28_4: 'Coding Agent는 scoped external MCP server를 상속하고 workflow agent abort를 올바르게 라우팅하며 완료된 Codex 및 Claude Code native session을 best-effort로 export합니다',
new_0_6_28_5: 'Workspace file drawer를 수정하고 깨진 starred-history embed를 제거했으며 bridge session의 ended_at 및 end_reason metadata를 기록합니다',
new_0_6_28_6: 'Workflow node는 완료 후 approval gate를 지원하고 반복 실행 시 rerun approval state도 수정했습니다',
new_0_6_28_7: 'Workspace diff는 SQLite WAL/SHM sidecar를 필터링하고 변경 없는 파일을 지나 계속 scan해 새로 만든 일반 파일이 보이도록 합니다',
new_0_6_28_8: 'Scheduled job은 provider/model을 선택해 저장할 수 있으며 현재 Hermes cron CLI가 지원하지 않는 model flag는 전달하지 않습니다',
new_0_6_28_9: 'Desktop 버전 관리 버튼은 업데이트가 있을 때 지역화된 새 버전 표시를 보여주며 public version manifest에 0.6.28을 추가했습니다',
new_0_6_27_1: '이번 릴리스는 0.6.26 이후 병합된 모든 PR을 반영하며 데스크톱 시작 fallback, Windows runtime 수정, remote MCU relay, 그룹 채팅 workspace, 기본 workspace 개선, 빈 diff 필터링을 포함합니다',
new_0_6_27_2: '데스크톱 시작은 active Web UI 디렉터리가 없거나 불완전할 때 bundled Web UI로 fallback하며 pinned runtime은 유지합니다',
new_0_6_27_3: 'Windows 데스크톱 runtime은 Web UI server 호출에서 취약한 .exe trampoline 대신 이동 가능한 hermes.cmd wrapper를 사용합니다',
new_0_6_27_4: 'Remote MCU traffic은 Socket.IO /global-agent relay를 사용하며 ESP32-C3 로그인, 검색, 음성 재생 큐, Wi-Fi 자격 증명 저장, 업데이트된 firmware가 더 안정적으로 동작합니다',
new_0_6_27_5: '그룹 채팅 room은 검증된 workspace를 보유하고 group-agent run에 전달할 수 있으며, 읽기 전용 멤버에게는 workspace, invite code, 관리 컨트롤이 숨겨집니다',
new_0_6_27_6: '기본 workspace 즐겨찾기는 folder picker의 선택된 path 행 안으로 이동했으며 workspace picker label의 locale coverage도 완료했습니다',
new_0_6_27_7: 'Workspace diff 카드는 patch나 줄 변화가 없는 0 byte change를 건너뛰어 의미 없는 +0/-0 changed-file 카드를 피합니다',
new_0_6_26_1: '이번 릴리스는 0.6.25 이후 병합된 PR을 반영하며 Ekko Agent, Coding Agent context 표시, Journey, 그룹 채팅 baseline, 데스크톱 수정, MCP payload size에 중점을 둡니다',
new_0_6_26_2: 'Ekko Agent는 이제 채팅에서 사용할 수 있으며 runtime context 처리, browser tools, 더 안정적인 tool event, context usage 계산을 위한 tool-result history 복원을 지원합니다',
new_0_6_26_3: 'Coding Agent session은 reasoning과 context 설정을 더 명확히 보여 주고 API mode를 유지하며 Codex app-server mode 오용을 피하고 follow-up turn 뒤 context usage가 튀는 문제를 줄입니다',
new_0_6_26_4: 'Journey에는 learning graph view와 다듬어진 graph interaction이 추가되었고, 그룹 채팅에는 새 기능 라인의 baseline coverage가 추가되었습니다',
new_0_6_26_5: '데스크톱 안정성이 개선되어 login persistence와 reset flow, Windows worker dynamic port fallback, stdout/stderr EPIPE handling, 분리된 ESP32-C3 v1 firmware packaging을 보강했습니다',
new_0_6_26_6: 'Hermes Studio MCP는 이제 available-models를 기본적으로 compact summary로 반환하며 filter와 명시적인 full-detail option으로 agent context에 많은 모델 데이터가 들어가는 일을 피합니다',
new_0_6_25_1: 'Hermes Agent 0.18.0에서 Agent Bridge 승인 메모리 wrapper가 새 has_host_access 매개변수를 전달하지 않아 execute_code가 실패하던 문제를 수정했습니다',
new_0_6_24_1: '이번 릴리스는 0.6.23 이후 병합된 PR을 반영하며 채팅 입력, workspace 표시, 플러그인 관리, 기본 모델, workspace diff 확인을 개선합니다',
new_0_6_24_2: '단일 채팅과 그룹 채팅 입력 영역은 통합 툴바, 간결한 모델 컨트롤, 모아진 입력 설정, 더 명확한 context 사용량, 모바일 chrome, 단일 채팅 수동 높이 조절 복구를 포함합니다',
new_0_6_24_3: 'Workspace run 변경 사항은 지속되는 chat diff 카드로 표시되며 오른쪽 drawer에서 diff 보기와 파일 편집을 지원하고 session resume 후에도 복원되며 모바일 보기도 조정되었습니다',
new_0_6_24_4: 'Workspace folder picker는 Windows drive와 junction workflow를 더 안정적으로 탐색하고 .hermes, .config, .codex 같은 dot-prefixed folder를 WORKSPACE_BASE 안전 경계 안에서 표시합니다',
new_0_6_24_5: 'Plugins 페이지에서 관리 가능한 user plugin을 enable / disable할 수 있으며 Hermes base config와 현재 profile config의 plugin state를 더 정확히 표시합니다',
new_0_6_24_6: 'Models 페이지에 default provider와 default model 작업을 추가했고 bridge terminal error 오탐을 줄였으며 Hermes Agent runtime packaging을 0.18.0으로 올리고 website version manifest도 갱신했습니다',
},
}