diff --git a/core/http/react-ui/public/locales/ko/admin.json b/core/http/react-ui/public/locales/ko/admin.json new file mode 100644 index 000000000..726eaed65 --- /dev/null +++ b/core/http/react-ui/public/locales/ko/admin.json @@ -0,0 +1,85 @@ +{ + "manage": { + "title": "시스템", + "subtitle": "설치된 모델과 백엔드를 관리합니다" + }, + "settings": { + "title": "설정", + "subtitle": "LocalAI 런타임 설정을 구성합니다", + "saved": "설정이 저장되었습니다", + "saveFailed": "저장 실패: {{message}}", + "loadFailed": "설정을 불러오지 못했습니다: {{message}}", + "sections": { + "branding": "브랜딩", + "watchdog": "워치독", + "memory": "메모리", + "backends": "백엔드", + "performance": "성능", + "tracing": "트레이싱", + "api": "API 및 CORS", + "p2p": "P2P", + "galleries": "갤러리", + "apikeys": "API 키", + "agents": "에이전트 작업", + "agentpool": "에이전트 풀", + "assistant": "LocalAI 어시스턴트", + "responses": "응답" + } + }, + "backends": { + "title": "백엔드 관리", + "subtitle": "모델을 구동할 AI 백엔드를 탐색하고 설치합니다" + }, + "backendLogs": { + "title": "백엔드 로그", + "subtitle": "실행 중인 백엔드의 로그를 확인합니다", + "empty": "사용 가능한 로그가 없습니다" + }, + "traces": { + "title": "트레이스", + "subtitle": "기록된 API 요청, 응답, 백엔드 작업을 확인합니다" + }, + "nodes": { + "title": "분산 노드", + "subtitle": "백엔드 및 에이전트 워커 노드를 관리합니다" + }, + "p2p": { + "title": "분산 AI 컴퓨팅", + "subtitle": "피어 투 피어 분산으로 여러 기기에 걸쳐 AI 워크로드를 확장합니다" + }, + "users": { + "title": "사용자", + "subtitle": "등록된 사용자, 역할, 초대를 관리합니다" + }, + "usage": { + "title": "사용량", + "subtitle": "API 토큰 사용량 통계", + "sources": { + "tab": "출처", + "mixTitle": "출처 구성", + "ribbonAria": "API 키 {{apikey}}%, 웹 UI {{web}}%, 레거시 {{legacy}}%", + "topSources": "기간별 상위 출처", + "searchPlaceholder": "이름 또는 접두사로 검색", + "sortBy": "정렬", + "sortTokens": "토큰", + "sortRequests": "요청", + "sortLastUsed": "마지막 사용", + "sortName": "이름", + "sortUser": "사용자", + "webUI": "웹 UI", + "legacy": "레거시", + "revoked": "해지됨", + "filteredTo": "필터: {{name}}", + "clearFilter": "필터 지우기", + "other": "기타 ({{count}})", + "noTrafficShort": "이 기간에는 요청이 없습니다.", + "noKeysYet": "요청이 들어오면 여기에 항목별로 표시됩니다.", + "createKey": "첫 API 키 만들기", + "truncatedWarning": "상위 200개 키를 표시합니다. 필터를 적용해 범위를 좁혀 보세요." + } + }, + "explorer": { + "title": "탐색기", + "subtitle": "파일과 구성을 둘러봅니다" + } +} diff --git a/core/http/react-ui/public/locales/ko/agents.json b/core/http/react-ui/public/locales/ko/agents.json new file mode 100644 index 000000000..3fc42358e --- /dev/null +++ b/core/http/react-ui/public/locales/ko/agents.json @@ -0,0 +1,55 @@ +{ + "title": "에이전트", + "subtitle": "자율 AI 에이전트를 관리합니다", + "actions": { + "agentHub": "에이전트 허브", + "import": "가져오기", + "createAgent": "에이전트 만들기", + "edit": "편집", + "chat": "채팅", + "export": "내보내기", + "delete": "삭제", + "pause": "일시중지", + "resume": "재개" + }, + "table": { + "name": "이름", + "status": "상태", + "events": "이벤트", + "actions": "작업", + "eventsTooltip": "이벤트 {{count}}개 - 클릭하여 보기" + }, + "search": { + "placeholder": "에이전트 검색...", + "summary_one": "에이전트 {{total}}개 중 {{shown}}개", + "summary_other": "에이전트 {{total}}개 중 {{shown}}개" + }, + "empty": { + "noConfigured": "구성된 에이전트가 없습니다", + "noConfiguredText": "에이전트를 만들어 자율 AI 워크플로를 시작하세요.", + "browseHub": "어디서 시작할지 모르겠나요? <1>에이전트 허브를 둘러보고 바로 가져올 수 있는 에이전트 구성을 찾아보세요.", + "noMatching": "일치하는 에이전트가 없습니다", + "noMatchingText": "\"{{query}}\"와 일치하는 에이전트가 없습니다" + }, + "sections": { + "yourAgents": "내 에이전트", + "otherUsersAgents": "다른 사용자의 에이전트" + }, + "deleteDialog": { + "title": "에이전트 삭제", + "message": "에이전트 \"{{name}}\"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "confirm": "삭제" + }, + "toasts": { + "loadFailed": "에이전트를 불러오지 못했습니다: {{message}}", + "deleted": "에이전트 \"{{name}}\"이(가) 삭제되었습니다", + "deleteFailed": "에이전트 삭제 실패: {{message}}", + "paused": "에이전트 \"{{name}}\"이(가) 일시중지되었습니다", + "resumed": "에이전트 \"{{name}}\"이(가) 재개되었습니다", + "pauseFailed": "에이전트 일시중지 실패: {{message}}", + "resumeFailed": "에이전트 재개 실패: {{message}}", + "exported": "에이전트 \"{{name}}\"이(가) 내보내졌습니다", + "exportFailed": "에이전트 내보내기 실패: {{message}}", + "parseFailed": "에이전트 파일을 분석하지 못했습니다: {{message}}" + } +} diff --git a/core/http/react-ui/public/locales/ko/auth.json b/core/http/react-ui/public/locales/ko/auth.json new file mode 100644 index 000000000..0bc40391b --- /dev/null +++ b/core/http/react-ui/public/locales/ko/auth.json @@ -0,0 +1,112 @@ +{ + "login": { + "subtitle": "계속하려면 로그인하세요", + "registerSubtitle": "계정을 만듭니다", + "createAdminSubtitle": "관리자 계정을 만듭니다", + "tokenSubtitle": "계속하려면 API 키를 입력하세요", + "email": "이메일", + "emailPlaceholder": "you@example.com", + "name": "이름", + "namePlaceholder": "이름 (선택 사항)", + "password": "비밀번호", + "passwordPlaceholder": "비밀번호 입력...", + "newPasswordPlaceholder": "최소 12자 이상", + "confirmPassword": "비밀번호 확인", + "confirmPasswordPlaceholder": "비밀번호 재입력", + "inviteCodeLabel": "초대 코드", + "inviteCodeOptional": " (선택 사항 — 승인 대기를 건너뜁니다)", + "inviteCodePlaceholder": "초대 코드를 붙여넣으세요...", + "tokenPlaceholder": "API 키 입력...", + "tokenAltPlaceholder": "API 토큰 입력...", + "signIn": "로그인", + "signingIn": "로그인 중...", + "register": "회원가입", + "creatingAccount": "계정 생성 중...", + "createAdminAccount": "관리자 계정 만들기", + "signInWithGitHub": "GitHub로 로그인", + "signInWithSSO": "SSO로 로그인", + "loginWithToken": "토큰으로 로그인", + "showTokenLogin": "API 토큰으로 로그인", + "hideTokenLogin": "토큰 로그인 숨기기", + "noAccount": "계정이 없으신가요?", + "hasAccount": "이미 계정이 있으신가요?", + "or": "또는", + "errors": { + "loginFailed": "로그인 실패", + "registrationFailed": "회원가입 실패", + "invalidToken": "유효하지 않은 토큰", + "passwordsDoNotMatch": "비밀번호가 일치하지 않습니다", + "enterToken": "토큰을 입력해 주세요", + "networkError": "네트워크 오류", + "inviteRequired": "회원가입하려면 유효한 초대 코드가 필요합니다" + }, + "messages": { + "registrationPending": "회원가입이 완료되었습니다. 승인을 기다리고 있습니다." + } + }, + "account": { + "title": "계정", + "subtitle": "프로필, 자격 증명, API 키", + "unavailable": "계정을 사용할 수 없습니다", + "unavailableText": "계정을 관리하려면 인증이 활성화되어 있어야 합니다.", + "tabs": { + "profile": "프로필", + "security": "보안", + "apiKeys": "API 키" + }, + "profile": { + "displayName": "표시 이름", + "displayNameDescription": "공개적으로 표시되는 이름", + "avatarUrl": "아바타 URL", + "avatarUrlDescription": "프로필 사진 URL", + "avatarUrlPlaceholder": "https://example.com/avatar.png", + "save": "저장", + "saving": "저장 중...", + "updated": "프로필이 업데이트되었습니다", + "updateFailed": "프로필 업데이트 실패: {{message}}" + }, + "security": { + "currentPassword": "현재 비밀번호", + "currentPasswordDescription": "본인 확인을 위해 기존 비밀번호를 입력하세요", + "currentPasswordPlaceholder": "현재 비밀번호", + "newPassword": "새 비밀번호", + "newPasswordDescription": "최소 12자 이상이어야 합니다", + "newPasswordPlaceholder": "새 비밀번호", + "confirmPassword": "비밀번호 확인", + "confirmPasswordDescription": "새 비밀번호를 다시 입력하세요", + "confirmPasswordPlaceholder": "새 비밀번호 확인", + "changePassword": "비밀번호 변경", + "changing": "변경 중...", + "changed": "비밀번호가 변경되었습니다", + "passwordsDoNotMatch": "비밀번호가 일치하지 않습니다", + "tooShort": "새 비밀번호는 최소 12자 이상이어야 합니다", + "oauthOnly": "{{provider}} 계정은 비밀번호 관리를 사용할 수 없습니다." + }, + "apiKeys": { + "create": "API 키 만들기", + "createDescription": "프로그래밍 방식 접근을 위한 키를 생성합니다", + "namePlaceholder": "키 이름 (예: my-app)", + "createButton": "만들기", + "creating": "생성 중...", + "createdToast": "API 키가 생성되었습니다", + "createFailed": "API 키 생성 실패: {{message}}", + "loadFailed": "API 키를 불러오지 못했습니다: {{message}}", + "revoke": "해지", + "revokeKey": "키 해지", + "revokeTitle": "API 키 해지", + "revokeMessage": "API 키 \"{{name}}\"을(를) 해지하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "revoked": "API 키가 해지되었습니다", + "revokeFailed": "API 키 해지 실패: {{message}}", + "copyNow": "지금 복사하세요 — 이 키는 다시 표시되지 않습니다", + "copiedToast": "클립보드에 복사되었습니다", + "copyFailed": "복사하지 못했습니다", + "empty": "아직 API 키가 없습니다. 위에서 하나를 만들어 프로그래밍 방식 접근을 시작하세요.", + "lastUsed": "마지막 사용 {{date}}" + } + }, + "notFound": { + "title": "페이지를 찾을 수 없습니다", + "text": "이 페이지가 사라진 것 같습니다. 다시 돌아가도록 도와드리겠습니다.", + "goHome": "홈으로 이동" + } +} diff --git a/core/http/react-ui/public/locales/ko/chat.json b/core/http/react-ui/public/locales/ko/chat.json new file mode 100644 index 000000000..86fcef3c5 --- /dev/null +++ b/core/http/react-ui/public/locales/ko/chat.json @@ -0,0 +1,117 @@ +{ + "activity": { + "thought": "생각", + "tool": "도구", + "result": "결과", + "toolResult": "{{name}} 결과", + "thinking": "생각 중..." + }, + "header": { + "manageModeTooltip": "이 채팅은 LocalAI와 대화하여 모델을 설치하고, 구성을 편집하고, 백엔드를 관리할 수 있습니다.", + "modelInfo": "모델 정보", + "chatSettings": "채팅 설정", + "modelInfoTitle": "모델 정보: {{model}}", + "editConfig": "구성 편집", + "close": "닫기" + }, + "modelInfo": { + "backend": "백엔드", + "modelFile": "모델 파일", + "contextSize": "컨텍스트 크기", + "threads": "스레드", + "mcp": "MCP", + "configured": "구성됨", + "chatTemplate": "채팅 템플릿", + "yes": "예", + "gpuLayers": "GPU 레이어" + }, + "context": { + "label": "컨텍스트: {{percent}}%", + "labelWithTokens": "컨텍스트: {{percent}}% ({{tokens}} 토큰)" + }, + "settings": { + "title": "채팅 설정", + "manageMode": "관리 모드", + "manageModeDesc": "이 채팅이 LocalAI와 대화하여 모델을 설치하고, 백엔드를 전환하고, 구성을 편집할 수 있게 합니다.", + "systemPrompt": "시스템 프롬프트", + "systemPromptPlaceholder": "당신은 도움이 되는 어시스턴트입니다...", + "temperature": "Temperature", + "topP": "Top P", + "topK": "Top K", + "contextSize": "컨텍스트 크기", + "contextSizePlaceholder": "2048", + "clearHistory": "채팅 기록 지우기" + }, + "empty": { + "manageTitle": "채팅으로 LocalAI 관리", + "manageText": "모델 설치, 백엔드 전환, 구성 편집 또는 상태 확인을 요청하세요. 어시스턴트가 작업을 요약하고 변경하기 전에 확인을 기다립니다.", + "startTitle": "대화 시작", + "readyText": "{{model}}와(과) 채팅할 준비가 되었습니다", + "selectModelText": "시작하려면 위에서 모델을 선택하세요", + "suggestionsManage": [ + "무엇이 설치되어 있나요?", + "채팅 모델 설치하기", + "시스템 상태 보기", + "백엔드 업데이트하기" + ], + "suggestionsChat": [ + "이게 어떻게 작동하는지 설명해 줘", + "코드 작성을 도와줘", + "문서를 요약해 줘", + "아이디어를 브레인스토밍해 줘" + ], + "recent": "최근", + "noMessages": "아직 메시지가 없습니다", + "hintEnter": "Enter로 전송", + "hintShiftEnter": "Shift+Enter로 줄바꿈", + "hintAttach": "파일 첨부" + }, + "errors": { + "viewTraces": "자세한 내용은 트레이스를 확인하세요" + }, + "actions": { + "copy": "복사", + "regenerate": "다시 생성" + }, + "streaming": { + "transferring": "모델 전송 중...", + "transferringTo": "{{node}}(으)로 모델 전송 중..." + }, + "tokens": { + "perSec": "{{count}} tok/s", + "peak": "최고: {{count}} tok/s", + "usage": "{{prompt}}p + {{completion}}c = {{total}}" + }, + "input": { + "placeholder": "메시지...", + "attachFile": "파일 첨부", + "stopGenerating": "생성 중지", + "canvasTitle": "캔버스 — 코드 블록과 미디어를 사이드 패널로 추출해 미리보기, 복사, 다운로드할 수 있습니다", + "canvasLabel": "캔버스", + "openCanvas": "캔버스 패널 열기" + }, + "deleteAllDialog": { + "title": "모든 채팅 삭제", + "message": "모든 채팅을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "confirm": "모두 삭제" + }, + "toasts": { + "selectModel": "모델을 선택해 주세요", + "copied": "클립보드에 복사되었습니다", + "copyFailed": "클립보드에 복사할 수 없습니다" + }, + "menu": { + "trigger": "채팅", + "triggerTitle": "대화 (Ctrl/Cmd+K)", + "search": "대화 검색...", + "clearSearch": "검색 지우기", + "noMatch": "검색과 일치하는 대화가 없습니다", + "noConversations": "아직 대화가 없습니다", + "rename": "이름 변경", + "exportMarkdown": "Markdown으로 내보내기", + "deleteChat": "채팅 삭제", + "newChat": "새 채팅", + "clearAll": "모두 지우기", + "deleteAllTitle": "모든 대화 삭제" + } +} diff --git a/core/http/react-ui/public/locales/ko/collections.json b/core/http/react-ui/public/locales/ko/collections.json new file mode 100644 index 000000000..dfebd8263 --- /dev/null +++ b/core/http/react-ui/public/locales/ko/collections.json @@ -0,0 +1,43 @@ +{ + "title": "지식 베이스", + "subtitle": "에이전트 RAG를 위한 문서 컬렉션을 관리합니다", + "newPlaceholder": "새 컬렉션 이름...", + "actions": { + "create": "만들기", + "creating": "생성 중...", + "details": "세부 정보", + "reset": "초기화", + "delete": "삭제", + "viewDetails": "세부 정보 보기", + "resetCollection": "컬렉션 초기화", + "deleteCollection": "컬렉션 삭제" + }, + "sections": { + "yourCollections": "내 컬렉션", + "otherUsersCollections": "다른 사용자의 컬렉션" + }, + "empty": { + "title": "아직 컬렉션이 없습니다", + "text": "컬렉션을 사용하면 문서를 지식 베이스로 정리하여 에이전트가 RAG(검색 증강 생성)로 검색할 수 있습니다. 위에서 컬렉션을 만들어 시작하세요.", + "noPersonal": "아직 컬렉션이 없습니다." + }, + "deleteDialog": { + "title": "컬렉션 삭제", + "message": "컬렉션 \"{{name}}\"을(를) 삭제하시겠습니까? 모든 항목이 제거되며 되돌릴 수 없습니다.", + "confirm": "삭제" + }, + "resetDialog": { + "title": "컬렉션 초기화", + "message": "컬렉션 \"{{name}}\"을(를) 초기화하시겠습니까? 모든 항목은 제거되지만 컬렉션은 유지됩니다.", + "confirm": "초기화" + }, + "toasts": { + "loadFailed": "컬렉션을 불러오지 못했습니다: {{message}}", + "created": "컬렉션 \"{{name}}\"이(가) 생성되었습니다", + "createFailed": "컬렉션 생성 실패: {{message}}", + "deleted": "컬렉션 \"{{name}}\"이(가) 삭제되었습니다", + "deleteFailed": "컬렉션 삭제 실패: {{message}}", + "reset": "컬렉션 \"{{name}}\"이(가) 초기화되었습니다", + "resetFailed": "컬렉션 초기화 실패: {{message}}" + } +} diff --git a/core/http/react-ui/public/locales/ko/common.json b/core/http/react-ui/public/locales/ko/common.json new file mode 100644 index 000000000..e781c986a --- /dev/null +++ b/core/http/react-ui/public/locales/ko/common.json @@ -0,0 +1,109 @@ +{ + "actions": { + "save": "저장", + "saving": "저장 중...", + "cancel": "취소", + "close": "닫기", + "confirm": "확인", + "delete": "삭제", + "edit": "편집", + "add": "추가", + "remove": "제거", + "create": "만들기", + "update": "업데이트", + "refresh": "새로고침", + "reload": "다시 불러오기", + "retry": "다시 시도", + "search": "검색", + "filter": "필터", + "clear": "지우기", + "reset": "초기화", + "apply": "적용", + "back": "뒤로", + "next": "다음", + "previous": "이전", + "open": "열기", + "submit": "제출", + "select": "선택", + "selectAll": "모두 선택", + "copy": "복사", + "copied": "복사됨", + "download": "다운로드", + "upload": "업로드", + "import": "가져오기", + "export": "내보내기", + "view": "보기", + "details": "세부 정보", + "settings": "설정", + "help": "도움말", + "yes": "예", + "no": "아니요", + "loading": "불러오는 중..." + }, + "status": { + "loading": "불러오는 중...", + "saving": "저장 중...", + "saved": "저장됨", + "ready": "준비됨", + "running": "실행 중", + "stopped": "중지됨", + "starting": "시작 중...", + "stopping": "중지 중...", + "pending": "대기 중", + "active": "활성", + "inactive": "비활성", + "enabled": "사용", + "disabled": "사용 안 함", + "online": "온라인", + "offline": "오프라인", + "error": "오류", + "success": "성공", + "warning": "경고", + "info": "정보", + "empty": "항목 없음", + "none": "없음", + "unknown": "알 수 없음" + }, + "dialogs": { + "confirmDelete": { + "title": "삭제 확인", + "message": "정말로 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "confirm": "삭제", + "cancel": "취소" + }, + "unsavedChanges": { + "title": "저장되지 않은 변경 사항", + "message": "저장되지 않은 변경 사항이 있습니다. 폐기하시겠습니까?", + "discard": "폐기", + "keepEditing": "계속 편집" + } + }, + "forms": { + "required": "필수", + "optional": "선택", + "name": "이름", + "description": "설명", + "type": "유형", + "value": "값", + "search": "검색...", + "selectPlaceholder": "옵션을 선택하세요..." + }, + "time": { + "now": "방금", + "secondsAgo_one": "{{count}}초 전", + "secondsAgo_other": "{{count}}초 전", + "minutesAgo_one": "{{count}}분 전", + "minutesAgo_other": "{{count}}분 전", + "hoursAgo_one": "{{count}}시간 전", + "hoursAgo_other": "{{count}}시간 전", + "daysAgo_one": "{{count}}일 전", + "daysAgo_other": "{{count}}일 전" + }, + "units": { + "bytes": "B", + "kilobytes": "KB", + "megabytes": "MB", + "gigabytes": "GB", + "terabytes": "TB" + } +} diff --git a/core/http/react-ui/public/locales/ko/errors.json b/core/http/react-ui/public/locales/ko/errors.json new file mode 100644 index 000000000..9e352dbbe --- /dev/null +++ b/core/http/react-ui/public/locales/ko/errors.json @@ -0,0 +1,17 @@ +{ + "generic": "문제가 발생했습니다", + "network": "네트워크 오류입니다. 연결을 확인하고 다시 시도하세요.", + "unauthorized": "이 작업을 수행할 권한이 없습니다.", + "forbidden": "접근이 거부되었습니다.", + "notFound": "요청한 리소스를 찾을 수 없습니다.", + "serverError": "서버 오류입니다. 잠시 후 다시 시도하세요.", + "loadFailed": "불러오기 실패: {{message}}", + "saveFailed": "저장 실패: {{message}}", + "deleteFailed": "삭제 실패: {{message}}", + "updateFailed": "업데이트 실패: {{message}}", + "createFailed": "생성 실패: {{message}}", + "operationFailed": "작업 실패: {{message}}", + "invalidInput": "잘못된 입력입니다. 양식을 확인하고 다시 시도하세요.", + "tryAgain": "다시 시도해 주세요.", + "contactAdmin": "문제가 계속되면 관리자에게 문의하세요." +} diff --git a/core/http/react-ui/public/locales/ko/home.json b/core/http/react-ui/public/locales/ko/home.json new file mode 100644 index 000000000..007885b2f --- /dev/null +++ b/core/http/react-ui/public/locales/ko/home.json @@ -0,0 +1,66 @@ +{ + "cluster": { + "vram": "클러스터 VRAM", + "ram": "클러스터 RAM", + "nodesOnline": "노드 {{total}}개 중 {{healthy}}개 온라인" + }, + "resourceGpu": "GPU", + "resourceRam": "RAM", + "assistant": { + "title": "채팅으로 LocalAI 관리", + "description": "LocalAI와 대화하여 모델을 설치하고, 백엔드를 전환하고, 구성을 편집하고, 상태를 확인하세요.", + "open": "어시스턴트 열기", + "tooltip": "채팅으로 LocalAI 관리" + }, + "input": { + "placeholder": "메시지...", + "attachImage": "이미지 첨부", + "attachAudio": "오디오 첨부", + "attachFile": "파일 첨부", + "enterToSend": "Enter로 전송", + "selectModelFirst": "먼저 모델을 선택하세요", + "sendMessage": "메시지 보내기", + "selectModelToast": "먼저 모델을 선택해 주세요" + }, + "quickLinks": { + "manageByChat": "채팅으로 관리", + "installedModels": "설치된 모델", + "browseGallery": "갤러리 둘러보기", + "importModel": "모델 가져오기", + "documentation": "문서" + }, + "loadedModels": { + "count_one": "모델 {{count}}개 로드됨", + "count_other": "모델 {{count}}개 로드됨", + "stop": "모델 중지", + "stopAll": "모두 중지" + }, + "stopDialog": { + "title": "모델 중지", + "message": "모델 {{model}}을(를) 중지하시겠습니까?", + "confirm": "{{model}} 중지", + "stopAllTitle": "모든 모델 중지", + "stopAllMessage": "로드된 모델 {{count}}개를 모두 중지하시겠습니까?", + "stopAllConfirm": "모두 중지", + "stoppedToast": "{{model}} 중지됨", + "allStoppedToast": "모든 모델이 중지되었습니다", + "stopFailed": "중지 실패: {{message}}" + }, + "wizard": { + "getStarted": "{{name}} 시작하기", + "intro": "첫 모델을 설치하여 시작하세요. 갤러리를 둘러보거나 직접 가져올 수 있습니다.", + "steps": { + "step1Title": "모델 갤러리 둘러보기", + "step1Body": "엄선된 컬렉션에서 필요에 맞는 모델을 찾으세요.", + "step2Title": "모델 설치", + "step2Body": "설치를 클릭하면 자동으로 다운로드되고 구성됩니다.", + "step3Title": "채팅 시작", + "step3Body": "브라우저에서 바로 모델과 채팅하거나 API를 사용하세요." + }, + "browseGallery": "모델 갤러리 둘러보기", + "importModel": "모델 가져오기", + "docs": "문서", + "noModelsTitle": "사용 가능한 모델 없음", + "noModelsBody": "아직 설치된 모델이 없습니다. 채팅을 시작할 수 있도록 관리자에게 모델 설정을 요청하세요." + } +} diff --git a/core/http/react-ui/public/locales/ko/importModel.json b/core/http/react-ui/public/locales/ko/importModel.json new file mode 100644 index 000000000..5be2624e4 --- /dev/null +++ b/core/http/react-ui/public/locales/ko/importModel.json @@ -0,0 +1,142 @@ +{ + "title": "새 모델 가져오기", + "subtitle": { + "simple": "URI에서 모델을 가져옵니다 — 자동 감지가 백엔드를 선택합니다.", + "powerYaml": "전체 모델 YAML 구성을 작성합니다.", + "powerPrefs": "세밀한 가져오기 환경설정." + }, + "actions": { + "import": "모델 가져오기", + "importing": "가져오는 중...", + "create": "만들기", + "saving": "저장 중...", + "browseHF": "HF에서 모델 둘러보기", + "addCustom": "사용자 지정 추가", + "copy": "복사" + }, + "form": { + "modelUri": "모델 URI", + "uriPlaceholder": "huggingface://TheBloke/Llama-2-7B-Chat-GGUF 또는 https://example.com/model.gguf", + "uriHint": "가져올 모델 파일의 URI 또는 경로를 입력하세요", + "supportedFormats": "지원되는 URI 형식", + "options": "옵션", + "preferences": "환경설정 (선택 사항)", + "commonPreferences": "공통 환경설정", + "customPreferences": "사용자 지정 환경설정", + "customKeyValueHint": "고급 구성을 위한 사용자 지정 키-값 쌍을 추가합니다.", + "preferenceKey": "{{index}}행의 환경설정 키", + "preferenceValue": "{{index}}행의 환경설정 값", + "removePref": "이 환경설정 제거", + "key": "키", + "value": "값", + "backend": "백엔드", + "backendAuto": "자동 감지 (URI 기반)", + "backendLoading": "백엔드 불러오는 중…", + "backendSearch": "백엔드 검색...", + "backendHint": "특정 백엔드를 강제로 지정합니다. 비워 두면 URI에서 자동 감지합니다. \"수동 선택\"으로 표시된 항목은 자동 감지되지 않으므로 모델에 필요한 것을 알고 있다면 직접 선택하세요.", + "backendErrorHint": "백엔드 목록을 불러오지 못했습니다 — 자동 감지만 사용합니다.", + "backendNotInstalled": "이 백엔드는 아직 설치되지 않았습니다. 가져오기를 제출하면 먼저 다운로드됩니다.", + "modelName": "모델 이름", + "modelNamePlaceholder": "비워 두면 파일 이름을 사용합니다", + "modelNameHint": "모델의 사용자 지정 이름입니다. 비워 두면 파일 이름이 사용됩니다.", + "description": "설명", + "descriptionPlaceholder": "비워 두면 기본 설명을 사용합니다", + "descriptionHint": "모델의 사용자 지정 설명입니다.", + "quantizations": "양자화", + "quantizationsPlaceholder": "q4_k_m,q4_k_s,q3_k_m (쉼표로 구분)", + "quantizationsHint": "선호하는 양자화 (쉼표로 구분). 비워 두면 기본값(q4_k_m)을 사용합니다.", + "mmprojQuantizations": "MMProj 양자화", + "mmprojQuantizationsPlaceholder": "fp16,fp32 (쉼표로 구분)", + "mmprojQuantizationsHint": "선호하는 MMProj 양자화입니다. 비워 두면 기본값(fp16)을 사용합니다.", + "embeddings": "임베딩", + "embeddingsHint": "이 모델에 대한 임베딩 지원을 활성화합니다.", + "modelType": "모델 유형", + "modelTypePlaceholder": "AutoModelForCausalLM (transformers 백엔드용)", + "modelTypeHint": "transformers 백엔드의 모델 유형입니다. 예: AutoModelForCausalLM, SentenceTransformer, Mamba.", + "pipelineType": "파이프라인 유형", + "pipelineTypeHint": "diffusers 백엔드의 파이프라인 유형입니다.", + "schedulerType": "스케줄러 유형", + "schedulerTypePlaceholder": "k_dpmpp_2m (선택 사항)", + "schedulerTypeHint": "diffusers 백엔드의 스케줄러 유형입니다. 예: k_dpmpp_2m, euler_a, ddim.", + "enableParameters": "활성화 매개변수", + "enableParametersPlaceholder": "negative_prompt,num_inference_steps (쉼표로 구분)", + "enableParametersHint": "diffusers 백엔드에 대해 활성화된 매개변수 (쉼표로 구분).", + "cuda": "CUDA", + "cudaHint": "GPU 가속을 위한 CUDA 지원을 활성화합니다.", + "yamlEditor": "YAML 구성 편집기", + "manualPick": "수동 선택", + "manualPickTooltip": "자동 감지는 이 백엔드로 라우팅하지 않습니다. 원하는 것이 무엇인지 안다면 여기서 직접 선택하세요." + }, + "modality": { + "text": "텍스트 LLM", + "asr": "음성 인식", + "tts": "텍스트 음성 변환", + "image": "이미지 / 비디오", + "embeddings": "임베딩", + "reranker": "리랭커", + "detection": "객체 감지", + "vad": "음성 활동 감지", + "other": "기타" + }, + "powerTabs": { + "ariaLabel": "고급 모드 탭", + "preferences": "환경설정", + "yaml": "YAML" + }, + "switchDialog": { + "title": "사용자 지정 환경설정을 유지할까요?", + "body": "간단 모드로 전환하면 백엔드, 이름, 설명을 제외한 환경설정이 숨겨집니다. 가져오기 시 여전히 전송됩니다.", + "cancel": "취소", + "discard": "폐기하고 전환", + "keep": "유지하고 전환" + }, + "estimate": { + "title": "예상 요구 사항", + "download": "다운로드: {{size}}", + "vram": "VRAM: {{vram}}" + }, + "toasts": { + "noUri": "모델 URI를 입력해 주세요", + "noYaml": "YAML 구성을 입력해 주세요", + "started": "가져오기를 시작했습니다! 진행 상황을 추적하는 중...", + "startedWithMeta": "가져오기를 시작했습니다! 진행 상황을 추적하는 중... ({{meta}})", + "imported": "모델을 성공적으로 가져왔습니다!", + "importedYaml": "모델 구성을 성공적으로 가져왔습니다!", + "importFailed": "가져오기 실패: {{message}}", + "startImportFailed": "가져오기를 시작하지 못했습니다: {{message}}", + "backendsLoadFailed": "백엔드 목록을 불러오지 못했습니다 — 자동 감지만 사용합니다", + "modalityClearedBackend": "백엔드 선택을 해제했습니다 — {{label}} 그룹에 없었습니다.", + "copied": "클립보드에 복사되었습니다" + }, + "uriFormats": { + "huggingface": { + "title": "HuggingFace", + "standard": "표준 HuggingFace 형식", + "short": "짧은 HuggingFace 형식", + "fullUrl": "전체 HuggingFace URL" + }, + "http": { + "title": "HTTP/HTTPS URL", + "direct": "모든 HTTPS URL에서 직접 다운로드" + }, + "local": { + "title": "로컬 파일", + "filePath": "로컬 파일 경로 (절대 경로)", + "directYaml": "직접 로컬 YAML 구성 파일" + }, + "oci": { + "title": "OCI 레지스트리", + "registry": "OCI 컨테이너 레지스트리", + "tarball": "로컬 OCI tarball 파일" + }, + "ollama": { + "title": "Ollama", + "model": "Ollama 모델 형식" + }, + "yaml": { + "title": "YAML 구성 파일", + "remote": "원격 YAML 구성 파일", + "local": "로컬 YAML 구성 파일" + } + } +} diff --git a/core/http/react-ui/public/locales/ko/media.json b/core/http/react-ui/public/locales/ko/media.json new file mode 100644 index 000000000..b52bdc6d1 --- /dev/null +++ b/core/http/react-ui/public/locales/ko/media.json @@ -0,0 +1,154 @@ +{ + "studio": { + "tabs": { + "images": "이미지", + "video": "비디오", + "tts": "TTS", + "sound": "사운드" + } + }, + "image": { + "title": "이미지 생성", + "labels": { + "model": "모델", + "prompt": "프롬프트", + "promptPlaceholder": "생성할 이미지를 설명하세요...", + "negativePrompt": "네거티브 프롬프트", + "negativePromptPlaceholder": "피할 요소...", + "size": "크기", + "count": "개수 (1-4)", + "advanced": "고급 설정", + "imageInputs": "이미지 입력", + "steps": "스텝", + "stepsPlaceholder": "20", + "seed": "시드", + "seedPlaceholder": "랜덤", + "sourceImage": "원본 이미지 (img2img)", + "refImages": "참조 이미지", + "refImagesAdded_one": "이미지 {{count}}개 추가됨", + "refImagesAdded_other": "이미지 {{count}}개 추가됨" + }, + "actions": { + "generate": "생성", + "generating": "생성 중..." + }, + "empty": "생성된 이미지가 여기에 표시됩니다", + "toasts": { + "noPrompt": "프롬프트를 입력해 주세요", + "noModel": "모델을 선택해 주세요", + "noResults": "생성된 이미지가 없습니다" + } + }, + "video": { + "title": "비디오 생성", + "labels": { + "model": "모델", + "prompt": "프롬프트", + "promptPlaceholder": "생성할 비디오를 설명하세요...", + "duration": "길이 (초)", + "fps": "FPS", + "size": "크기", + "advanced": "고급 설정", + "seed": "시드", + "seedPlaceholder": "랜덤" + }, + "actions": { + "generate": "생성", + "generating": "생성 중..." + }, + "empty": "생성된 비디오가 여기에 표시됩니다", + "toasts": { + "noPrompt": "프롬프트를 입력해 주세요", + "noModel": "모델을 선택해 주세요", + "noResults": "생성된 비디오가 없습니다" + } + }, + "tts": { + "title": "텍스트 음성 변환", + "labels": { + "model": "모델", + "voice": "음성", + "voicePlaceholder": "음성 ID (선택 사항)", + "input": "텍스트", + "inputPlaceholder": "합성할 텍스트를 입력하세요..." + }, + "actions": { + "generate": "생성", + "generating": "생성 중..." + }, + "empty": "생성된 오디오가 여기에 표시됩니다", + "toasts": { + "noText": "텍스트를 입력해 주세요", + "noModel": "모델을 선택해 주세요", + "generateFailed": "생성에 실패했습니다" + } + }, + "sound": { + "title": "사운드 생성", + "labels": { + "model": "모델", + "prompt": "프롬프트", + "promptPlaceholder": "생성할 사운드를 설명하세요...", + "duration": "길이 (초)", + "language": "언어", + "vocalLanguage": "보컬 언어", + "lyrics": "가사 (선택 사항)", + "lyricsPlaceholder": "보컬 생성을 위한 가사", + "advanced": "고급 설정", + "seed": "시드", + "seedPlaceholder": "랜덤" + }, + "actions": { + "generate": "생성", + "generating": "생성 중..." + }, + "empty": "생성된 오디오가 여기에 표시됩니다", + "toasts": { + "noPrompt": "프롬프트를 입력해 주세요", + "noModel": "모델을 선택해 주세요", + "generateFailed": "생성에 실패했습니다" + } + }, + "talk": { + "title": "대화", + "subtitle": "실시간 음성 대화", + "actions": { + "start": "세션 시작", + "stop": "세션 종료", + "connecting": "연결 중...", + "muted": "음소거됨", + "mute": "음소거", + "unmute": "음소거 해제" + }, + "labels": { + "model": "모델", + "voice": "음성", + "voicePlaceholder": "alloy", + "language": "언어", + "languagePlaceholder": "en", + "instructions": "지침", + "instructionsPlaceholder": "어시스턴트의 페르소나를 설정하세요..." + }, + "status": { + "idle": "대기 중", + "connecting": "연결 중...", + "listening": "듣는 중...", + "speaking": "말하는 중...", + "ended": "세션이 종료되었습니다" + }, + "toasts": { + "noModel": "먼저 모델을 선택하세요", + "connectFailed": "연결에 실패했습니다: {{message}}" + } + }, + "history": { + "title": "기록", + "empty": "아직 기록이 없습니다", + "deleteEntry": "항목 삭제", + "clear": "기록 지우기", + "clearTitle": "모든 기록 지우기", + "clearMessage": "모든 기록 항목을 제거하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "clearConfirm": "지우기", + "cleared": "기록이 지워졌습니다" + } +} diff --git a/core/http/react-ui/public/locales/ko/models.json b/core/http/react-ui/public/locales/ko/models.json new file mode 100644 index 000000000..2ca05d4a7 --- /dev/null +++ b/core/http/react-ui/public/locales/ko/models.json @@ -0,0 +1,93 @@ +{ + "title": "모델 설치", + "subtitle": "갤러리에서 AI 모델을 둘러보고 설치합니다", + "stats": { + "available": "사용 가능", + "installed": "설치됨" + }, + "actions": { + "addModel": "모델 추가", + "importModel": "모델 가져오기", + "install": "설치", + "reinstall": "재설치", + "delete": "삭제" + }, + "filters": { + "all": "전체", + "llm": "채팅", + "image": "이미지", + "video": "비디오", + "multimodal": "멀티모달", + "vision": "비전", + "tts": "TTS", + "stt": "STT", + "diarization": "화자 분리", + "soundGen": "사운드", + "audioTransform": "오디오 FX", + "realtimeAudio": "실시간 오디오", + "embedding": "임베딩", + "rerank": "리랭크", + "detection": "감지", + "vad": "VAD", + "fitsGpu": "GPU에 적합", + "allBackends": "모든 백엔드", + "searchBackends": "백엔드 검색..." + }, + "search": { + "placeholder": "모델 검색...", + "clearFilters": "필터 지우기" + }, + "table": { + "modelName": "모델 이름", + "description": "설명", + "backend": "백엔드", + "sizeVram": "크기 / VRAM", + "status": "상태", + "actions": "작업", + "size": "크기: {{size}}", + "vram": "VRAM: {{vram}}", + "fits": "적합", + "mayNotFit": "맞지 않을 수 있음", + "trustRemoteCode": "원격 코드 신뢰", + "installing": "설치 중", + "installingPct": "설치 중 · {{percent}}%", + "installed": "설치됨", + "notInstalled": "설치되지 않음" + }, + "detail": { + "description": "설명", + "gallery": "갤러리", + "backend": "백엔드", + "size": "크기", + "vram": "VRAM", + "license": "라이선스", + "tags": "태그", + "links": "링크", + "warning": "경고", + "files": "파일", + "fitsGpu": "GPU에 적합", + "mayNotFitGpu": "GPU에 맞지 않을 수 있음", + "requiresTrustRemoteCode": "원격 코드 신뢰 필요", + "fileCount_one": "파일 {{count}}개", + "fileCount_other": "파일 {{count}}개", + "filename": "파일 이름", + "uri": "URI", + "sha256": "SHA256" + }, + "empty": { + "title": "모델을 찾을 수 없습니다", + "withFilters": "현재 검색 또는 필터와 일치하는 모델이 없습니다.", + "noFilters": "모델 갤러리가 비어 있습니다." + }, + "deleteDialog": { + "title": "모델 삭제", + "message": "모델 {{model}}을(를) 삭제하시겠습니까?", + "confirm": "{{model}} 삭제", + "deletingToast": "{{model}} 삭제 중..." + }, + "errors": { + "loadFailed": "모델을 불러오지 못했습니다: {{message}}", + "installFailed": "설치 실패: {{message}}", + "deleteFailed": "삭제 실패: {{message}}" + } +} diff --git a/core/http/react-ui/public/locales/ko/nav.json b/core/http/react-ui/public/locales/ko/nav.json new file mode 100644 index 000000000..4c152ca86 --- /dev/null +++ b/core/http/react-ui/public/locales/ko/nav.json @@ -0,0 +1,54 @@ +{ + "appName": "LocalAI", + "openMenu": "메뉴 열기", + "closeMenu": "메뉴 닫기", + "primaryNavigation": "기본 탐색", + "switchToLightMode": "라이트 모드로 전환", + "switchToDarkMode": "다크 모드로 전환", + "expandSidebar": "사이드바 펼치기", + "collapseSidebar": "사이드바 접기", + "changeLanguage": "언어 변경", + "logout": "로그아웃", + "accountSettings": "계정 설정", + "account": "계정", + "accountFor": "계정: {{name}}", + "sections": { + "tools": "도구", + "enhance": "향상", + "biometrics": "생체 인식", + "agents": "에이전트", + "system": "시스템" + }, + "items": { + "home": "홈", + "installModels": "모델 설치", + "chat": "채팅", + "studio": "스튜디오", + "talk": "대화", + "fineTune": "파인튜닝 (실험적)", + "quantize": "양자화 (실험적)", + "audioTransform": "오디오 변환", + "faceRecognition": "얼굴 인식", + "voiceRecognition": "음성 인식", + "agents": "에이전트", + "skills": "스킬", + "memory": "메모리", + "mcpJobs": "MCP CI 작업", + "usage": "사용량", + "users": "사용자", + "middleware": "미들웨어", + "backends": "백엔드", + "traces": "트레이스", + "nodes": "노드", + "swarm": "Swarm", + "system": "시스템", + "settings": "설정", + "api": "API" + }, + "footer": { + "github": "GitHub", + "documentation": "문서", + "author": "작성자", + "copyright": "© 2023-{{year}} {{author}}" + } +} diff --git a/core/http/react-ui/public/locales/ko/skills.json b/core/http/react-ui/public/locales/ko/skills.json new file mode 100644 index 000000000..adbcab96b --- /dev/null +++ b/core/http/react-ui/public/locales/ko/skills.json @@ -0,0 +1,79 @@ +{ + "title": "스킬", + "subtitle": "에이전트 스킬(재사용 가능한 지침 및 리소스)을 관리합니다", + "unavailable": { + "subtitle": "스킬 서비스를 사용할 수 없거나 인덱스를 다시 빌드하는 중입니다. 잠시 후 다시 시도하세요.", + "retry": "다시 시도" + }, + "actions": { + "newSkill": "새 스킬", + "createSkill": "스킬 만들기", + "import": "가져오기", + "importing": "가져오는 중...", + "gitRepos": "Git 저장소", + "edit": "편집", + "delete": "삭제", + "export": "내보내기", + "sync": "동기화", + "addRepo": "저장소 추가", + "adding": "추가 중...", + "remove": "제거", + "enable": "사용", + "disable": "사용 안 함" + }, + "search": { + "placeholder": "스킬 검색..." + }, + "git": { + "title": "Git 저장소", + "description": "스킬을 가져올 Git 저장소를 추가합니다. 동기화 후 스킬이 목록에 표시됩니다.", + "urlPlaceholder": "https://github.com/user/repo 또는 git@github.com:user/repo.git", + "noRepos": "구성된 Git 저장소가 없습니다. 위에서 추가하세요.", + "disabled": "사용 안 함", + "removeRepo": "저장소 제거" + }, + "card": { + "noDescription": "설명 없음", + "readOnly": "읽기 전용", + "editTitle": "스킬 편집", + "deleteTitle": "스킬 삭제", + "exportTitle": ".tar.gz로 내보내기" + }, + "empty": { + "title": "스킬을 찾을 수 없습니다", + "text": "스킬을 만들거나 가져와서 시작하세요.", + "noPersonal": "아직 스킬이 없습니다." + }, + "sections": { + "yourSkills": "내 스킬", + "otherUsersSkills": "다른 사용자의 스킬" + }, + "deleteDialog": { + "title": "스킬 삭제", + "message": "스킬 \"{{name}}\"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "confirm": "삭제" + }, + "removeRepoDialog": { + "title": "Git 저장소 제거", + "message": "이 Git 저장소를 제거하시겠습니까? 해당 저장소의 스킬을 더 이상 사용할 수 없게 됩니다.", + "confirm": "제거" + }, + "toasts": { + "loadFailed": "스킬을 불러오지 못했습니다", + "deleted": "스킬 \"{{name}}\"이(가) 삭제되었습니다", + "deleteFailed": "스킬 삭제 실패", + "exported": "스킬 \"{{name}}\"이(가) 내보내졌습니다", + "exportFailed": "내보내기 실패", + "imported": "\"{{file}}\"에서 스킬을 가져왔습니다", + "importFailed": "가져오기 실패", + "loadReposFailed": "Git 저장소를 불러오지 못했습니다", + "repoAdded": "Git 저장소가 추가되고 동기화 중입니다", + "addRepoFailed": "저장소 추가 실패", + "synced": "저장소가 동기화되었습니다", + "syncFailed": "동기화 실패", + "toggled": "저장소가 전환되었습니다", + "toggleFailed": "전환 실패", + "removed": "저장소가 제거되었습니다", + "removeFailed": "제거 실패" + } +} diff --git a/core/http/react-ui/src/i18n/index.js b/core/http/react-ui/src/i18n/index.js index b6432be27..4a08ed939 100644 --- a/core/http/react-ui/src/i18n/index.js +++ b/core/http/react-ui/src/i18n/index.js @@ -11,6 +11,7 @@ export const SUPPORTED_LANGUAGES = [ { code: 'de', name: 'Deutsch', flag: 'DE' }, { code: 'zh-CN', name: '简体中文', flag: 'ZH' }, { code: 'id', name: 'Bahasa Indonesia', flag: 'ID' }, + { code: 'ko', name: '한국어', flag: 'KO' }, ] export const NAMESPACES = [