From f1df98e406208afa957da516b9919743530e0fb6 Mon Sep 17 00:00:00 2001 From: moduvoice Date: Wed, 8 Jul 2026 19:22:48 +0700 Subject: [PATCH] feat(i18n): add Korean (ko) translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add src/i18n/ko.json with a full Korean translation of every key in en.json (710 leaf keys), mirroring the existing en/zh structure and preserving all {{placeholder}} interpolations and plural key pairs. - Register the ko bundle in src/i18n/index.ts alongside en and zh. - Add Korean (한국어) to the UI Language picker in interface-section.tsx. --- .../settings/sections/interface-section.tsx | 1 + src/i18n/index.ts | 2 + src/i18n/ko.json | 814 ++++++++++++++++++ 3 files changed, 817 insertions(+) create mode 100644 src/i18n/ko.json diff --git a/src/components/settings/sections/interface-section.tsx b/src/components/settings/sections/interface-section.tsx index 3ea185515..170502d5b 100644 --- a/src/components/settings/sections/interface-section.tsx +++ b/src/components/settings/sections/interface-section.tsx @@ -15,6 +15,7 @@ interface Props { const UI_LANGUAGES = [ { value: "en", label: "English" }, { value: "zh", label: "中文" }, + { value: "ko", label: "한국어" }, ] const THEMES = [ diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 4ed0c995e..647047dcc 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -2,11 +2,13 @@ import i18n from "i18next" import { initReactI18next } from "react-i18next" import en from "./en.json" import zh from "./zh.json" +import ko from "./ko.json" i18n.use(initReactI18next).init({ resources: { en: { translation: en }, zh: { translation: zh }, + ko: { translation: ko }, }, lng: "en", fallbackLng: "en", diff --git a/src/i18n/ko.json b/src/i18n/ko.json new file mode 100644 index 000000000..dc8bd0259 --- /dev/null +++ b/src/i18n/ko.json @@ -0,0 +1,814 @@ +{ + "app": { + "title": "LLM Wiki", + "subtitle": "LLM로 나만의 지식 베이스를 구축하고 관리하세요" + }, + "nav": { + "chat": "채팅", + "wiki": "위키", + "sources": "소스", + "search": "검색", + "graph": "그래프", + "lint": "린트", + "review": "리뷰", + "skills": "스킬", + "settings": "설정", + "switchProject": "프로젝트 전환", + "updateAvailable": "업데이트 가능", + "updateAvailableSuffix": " · 업데이트" + }, + "updateBanner": { + "message": "{{version}} 버전을 사용할 수 있습니다", + "openDownload": "다운로드 페이지 열기", + "dismiss": "닫기" + }, + "welcome": { + "newProject": "새 프로젝트", + "openProject": "프로젝트 열기", + "recentProjects": "최근 프로젝트" + }, + "sidebar": { + "knowledge": "지식", + "files": "파일" + }, + "research": { + "title": "심층 리서치", + "notConfigured": "심층 리서치 소스가 설정되어 있지 않습니다. 설정 → 외부 정보 소스에서 웹 검색 또는 AnyTXT를 설정하세요.", + "activeBadge": "{{running}}개 실행 중{{queued, plural, =0 {} other {, {{queued}}개 대기 중}}}", + "inputPlaceholder": "리서치 주제를 입력하세요...", + "emptyTitle": "아직 리서치 작업이 없습니다", + "emptyHint": "위에 주제를 입력하거나 리뷰에서 심층 리서치를 클릭하세요", + "sourcesCount": "소스 ({{count}})", + "anyTxtSource": "AnyTXT 소스", + "webSource": "웹 소스", + "open": "열기", + "remove": "제거", + "status": { + "queued": "대기 중", + "searching": "소스 검색 중...", + "synthesizing": "종합 중...", + "saving": "위키에 저장 중...", + "saved": "저장됨", + "done": "완료", + "failed": "실패" + } + }, + "project": { + "createTitle": "새 위키 프로젝트 만들기", + "name": "프로젝트 이름", + "namePlaceholder": "my-research-wiki", + "parentDir": "상위 디렉터리", + "parentDirPlaceholder": "/Users/you/projects", + "template": "템플릿", + "cancel": "취소", + "create": "생성", + "creating": "생성 중...", + "errorNameRequired": "이름과 경로를 입력해야 합니다", + "errorLanguageRequired": "AI 출력 언어를 선택하세요", + "requiredHint": "이름을 입력하고 언어를 선택한 뒤 상위 디렉터리를 지정하면 프로젝트를 만들 수 있습니다.", + "requiredMarker": "*", + "browse": "상위 디렉터리 선택", + "aiOutputLanguage": "AI 출력 언어", + "aiOutputLanguageHint": "AI가 생성하는 모든 콘텐츠(위키 페이지, 채팅 답변, 리서치 결과)에 이 언어가 사용됩니다. 나중에 설정 → 출력에서 변경할 수 있습니다.", + "pickLanguage": "언어를 선택하세요…" + }, + "templates": { + "research": { + "name": "리서치", + "description": "가설 추적과 방법론 기록이 포함된 심층 리서치" + }, + "reading": { + "name": "독서", + "description": "책의 등장인물, 주제, 줄거리, 챕터별 메모를 추적합니다" + }, + "personal": { + "name": "자기계발", + "description": "목표, 습관, 성찰, 일기를 기록해 자기계발을 추적합니다" + }, + "business": { + "name": "비즈니스", + "description": "팀의 회의, 의사결정, 프로젝트, 이해관계자 맥락을 관리합니다" + }, + "general": { + "name": "일반", + "description": "최소한의 설정 — 어떤 용도로든 사용할 수 있는 빈 템플릿" + } + }, + "sources": { + "title": "원본 소스", + "import": "가져오기", + "importing": "가져오는 중...", + "noSources": "아직 소스가 없습니다", + "importHint": "문서를 가져와 위키 구축을 시작하세요", + "importFiles": "파일 가져오기", + "importFolder": "폴더", + "importSourceFiles": "소스 파일 가져오기", + "importSourceFolder": "소스 폴더 가져오기", + "refresh": "새로고침", + "refreshFolder": "폴더 새로고침", + "refreshingFolder": "새로고침 중...", + "refreshFolderHint": "소스 폴더를 다시 스캔하고 새로 추가되거나 변경, 삭제된 파일을 처리합니다.", + "refreshFolderTooltip": "자동 모니터링과 동일한 규칙으로 프로젝트 소스 폴더를 다시 스캔합니다. 새로 추가되거나 수정된 허용 파일은 가져오기 대기열에 추가되고, 삭제된 소스는 일반적인 위키·인덱스 정리 절차를 거치며, 이후 파일 트리가 다시 빌드됩니다.", + "refreshFailed": "소스 새로고침 실패: {{error}}", + "ingest": "위키 반영", + "delete": "소스 및 관련 위키 페이지 삭제", + "deleteConfirm": "\"{{name}}\"와 관련 위키 페이지를 삭제할까요?\n\n다음 작업이 수행됩니다:\n- 소스 파일 삭제\n- 이 소스로 생성된 위키 페이지 삭제\n- index.md 업데이트", + "deleteFolder": "폴더 {{name}} 삭제(하위 항목 포함)", + "deleteFolderConfirm": "다시 클릭하면 폴더 {{name}}과 그 안의 모든 내용이 삭제됩니다", + "deleteFile": "{{name}} 삭제", + "deleteFileConfirm": "다시 클릭하면 {{name}}이 삭제됩니다", + "confirm": "확인", + "loadingMore": "소스를 더 불러오는 중...", + "sourceCount": "소스 {{count}}개", + "sourceCount_plural": "소스 {{count}}개" + }, + "chat": { + "placeholder": "위키에 대해 질문하세요...", + "ingestPlaceholder": "소스에 대해 이야기하거나 후속 질문을 해보세요...", + "saveToWiki": "위키에 저장", + "saving": "저장 중...", + "saved": "저장되었습니다!", + "writeToWiki": "위키에 작성", + "emptyHint": "질문을 하거나 가져오기를 시작해보세요.", + "sources": "소스", + "newChat": "새 채팅", + "newConversation": "새 대화", + "noConversationsYet": "아직 대화가 없습니다", + "msgCount": "개 메시지", + "startNewConversation": "새 대화 시작", + "clickNewChatToBegin": "\"새 채팅\"을 클릭해 시작하세요", + "typeAMessage": "메시지를 입력하세요...", + "useWebSearch": "웹 검색", + "useAnyTxtSearch": "AnyTXT 검색", + "skills": "스킬", + "enabledSkills": "활성화된 스킬", + "skillsAutoMode": "자동", + "slashSkillHint": "스킬 선택", + "removeSkill": "{{name}} 제거", + "noSkillsAvailable": "스킬을 찾을 수 없습니다. .llm-wiki/skills 또는 사용자 스킬 폴더에 SKILL.md 파일을 추가하세요.", + "approveCommand": "명령 승인", + "skillSources": { + "project": "프로젝트", + "claude": "Claude", + "codex": "Codex", + "agents": "에이전트" + }, + "agentMode": "에이전트 모드", + "agentModes": { + "fast": "빠름", + "standard": "표준", + "deep": "심층", + "localFirst": "로컬 우선" + }, + "enableAnyTxtInSettings": "설정 → 외부 정보 소스에서 AnyTXT를 활성화하세요", + "sendMessage": "메시지 보내기", + "stopGeneration": "생성 중지", + "attachImage": "이미지 첨부", + "removeImage": "이미지 제거", + "imageMessage": "이미지", + "imageVisionHint": "이미지는 현재 LLM으로 전송됩니다. 이미지 관련 질문에는 비전 기능을 지원하는 모델을 사용하세요.", + "imageInputUnavailable": "현재 공급자는 이미지 입력을 지원하지 않습니다. 설정에서 비전 기능을 지원하는 공급자로 전환하세요.", + "imageTooLarge": "이미지가 너무 큽니다(최대 {{max}}MB): {{name}}", + "tooManyImages": "이미지가 너무 많습니다(최대 {{max}}개)", + "unsupportedImageType": "지원하지 않는 이미지 형식: {{type}}", + "referencePreview": "참조 미리보기", + "references": "참조", + "generatedOutputs": "생성된 결과물", + "generatedOutput": "결과물", + "generatedOutputCount": "파일 {{count}}개", + "generatedOutputCount_plural": "파일 {{count}}개", + "closeGeneratedOutputs": "생성된 결과물 닫기", + "closeGeneratedOutputPreview": "생성된 결과물 미리보기 닫기", + "closeReferencePreview": "참조 미리보기 닫기", + "resizeReferencePreview": "참조 미리보기 크기 조절", + "noReferencePreviewFragment": "미리 볼 수 있는 조각이 반환되지 않았습니다.", + "userInputRequiredDescription": "계속하려면 요청된 정보를 입력해주세요.", + "userInputSubmit": "제출하고 계속", + "userInputSubmitted": "제출됨", + "userInputRecommended": "권장", + "userInputEnabled": "사용함", + "agent": { + "understanding": "요청 파악 중", + "routing": "다음 단계 계획 중", + "tool_call": "도구 호출 중", + "tool_result": "도구 결과", + "searching_wiki": "위키 검색 중", + "searching_graph": "지식 그래프 탐색 중", + "searching_web": "웹 검색 중", + "searching_anytxt": "AnyTXT 검색 중", + "reading_context": "컨텍스트 읽는 중", + "writing": "답변 작성 중", + "resultCount": "결과: {{count}}건" + } + }, + "search": { + "title": "검색", + "placeholder": "위키 페이지 검색...", + "noResults": "결과가 없습니다", + "startSearching": "위키 페이지를 검색하려면 입력하세요" + }, + "lint": { + "title": "위키 린트", + "semantic": "시맨틱 검사 (LLM)", + "running": "실행 중...", + "runLint": "린트 실행", + "runLintHint": "린트를 실행해 위키 상태를 점검하세요", + "runLintDescription": "고립된 페이지, 깨진 링크 등을 검사합니다", + "allClear": "이상 없음!", + "noIssues": "발견된 문제가 없습니다.", + "warnings": "경고", + "info": "정보", + "sectionCount": "{{label}} ({{count}})", + "open": "열기", + "fixing": "수정 중...", + "fix": "수정", + "fixFailed": "수정 실패: {{error}}", + "delete": "삭제", + "selectAll": "전체 선택", + "selectItem": "{{page}} 선택", + "selectedCount": "{{count}}개 선택됨", + "fixSelected": "선택 항목 수정", + "sendSelectedToReview": "선택 항목을 리뷰로 보내기", + "ignoreSelected": "선택 항목 무시", + "openEdit": "열어서 편집", + "skip": "건너뛰기", + "deletePage": "페이지 삭제", + "fixBrokenLink": "{{page}}의 깨진 링크 수정", + "addCrossRefs": "{{page}}에 상호 참조 추가", + "addCrossRefsDescription": "이 페이지에는 나가는 [[위키링크]]가 없습니다. 관련 엔티티나 개념으로의 상호 참조를 추가하는 것이 좋습니다.", + "suggestedTarget": "제안된 대상: {{page}}", + "suggestedSource": "제안된 소스: {{page}}", + "deleteOrphanConfirm": "고립된 페이지 \"{{page}}\"를 삭제할까요?", + "typeLabels": { + "orphan": "고립된 페이지", + "broken-link": "깨진 링크", + "no-outlinks": "나가는 링크 없음", + "semantic": "시맨틱 문제" + }, + "issues": "문제 {{count}}건", + "issues_plural": "문제 {{count}}건" + }, + "review": { + "title": "리뷰", + "clearResolved": "해결됨 지우기", + "refresh": "새로고침", + "refreshHint": "디스크에서 리뷰 항목을 다시 불러옵니다", + "selectPending": "대기 중 항목 선택", + "selectItem": "{{title}} 선택", + "selectedCount": "{{count}}개 선택됨", + "markSelectedResolved": "선택 항목을 해결됨으로 표시", + "dismissSelected": "선택 항목 무시", + "allClear": "이상 없음 — 리뷰할 항목이 없습니다", + "resolvedDivider": "— 해결됨 —" + }, + "settings": { + "title": "설정", + "llmProvider": "LLM 공급자", + "provider": "공급자", + "apiKey": "API 키", + "apiKeyPlaceholder": "{{provider}} API 키를 입력하세요", + "model": "모델", + "customModel": "또는 모델 이름을 직접 입력", + "ollamaUrl": "Ollama 주소", + "customEndpoint": "API 엔드포인트 (OpenAI 호환)", + "customEndpointHint": "OpenAI 호환 API 엔드포인트라면 무엇이든 가능합니다(예: LiteLLM, vLLM, LocalAI, Azure OpenAI)", + "customApiKey": "필요한 경우 API 키를 입력하세요", + "modelPlaceholder": "모델 이름을 입력하세요", + "save": "저장", + "saved": "저장됨", + "savedTick": "저장됨 ✓", + "changeHint": "변경 사항은 저장 후 적용됩니다.", + "saveFailed": "저장에 실패했습니다. 일부 설정이 저장되지 않았을 수 있습니다. 자세한 내용은 콘솔을 확인하세요.", + "language": "언어", + "languageHint": "인터페이스 언어입니다(위키 콘텐츠는 원본 자료의 언어를 따릅니다)", + "categories": { + "general": "일반", + "llm": "LLM 모델", + "embedding": "임베딩", + "multimodal": "이미지 캡션", + "webSearch": "외부 정보 소스", + "network": "네트워크", + "sourceWatch": "소스 폴더 감시", + "scheduledImport": "예약 가져오기", + "mineru": "MinerU PDF", + "apiServer": "API + MCP", + "output": "출력", + "interface": "인터페이스", + "maintenance": "유지 관리", + "changelog": "변경 이력", + "about": "정보" + }, + "sections": { + "general": { + "title": "일반", + "description": "데스크톱 앱의 시작 및 창 동작 설정입니다.", + "autostart": "시스템 시작 시 자동 실행", + "autostartHint": "이 컴퓨터에 로그인하면 LLM Wiki가 자동으로 실행됩니다.", + "closeBehavior": "창을 닫을 때", + "closeBehaviorHint": "제목 표시줄의 닫기 버튼을 클릭했을 때 적용되는 설정입니다. 트레이 메뉴에서는 여전히 앱을 바로 종료할 수 있습니다.", + "closeAsk": "매번 확인", + "closeAskHint": "확인 창을 표시합니다. 취소하면 창은 숨겨지고 백그라운드 기능은 계속 실행됩니다.", + "closeMinimize": "창 숨기기", + "closeMinimizeHint": "창을 닫아도 LLM Wiki는 백그라운드에서 계속 실행됩니다. macOS에서는 빨간 닫기 버튼의 일반적인 동작과 동일합니다. Linux에서 트레이를 사용할 수 없으면 숨기는 대신 창을 최소화합니다.", + "closeExit": "앱 종료", + "closeExitHint": "창을 닫으면 즉시 LLM Wiki를 종료합니다." + }, + "skills": { + "title": "스킬", + "description": "프로젝트 및 사용자 스킬 폴더를 스캔하고, 채팅에서 사용할 스킬을 선택합니다.", + "paths": "스캔 폴더: .llm-wiki/skills, ~/.claude/skills, ~/.codex/skills, ~/.agents/skills.", + "summary": "{{enabled}}개 활성화 / 총 {{total}}개 발견", + "enableAll": "모두 활성화", + "disableAll": "모두 비활성화", + "refresh": "다시 스캔", + "searchPlaceholder": "이름, ID, 설명 또는 출처로 스킬 검색...", + "scanDone": "{{count}}개의 스킬을 찾았습니다.", + "empty": "스킬을 찾을 수 없습니다. 스캔 폴더에 SKILL.md 파일을 추가한 뒤 다시 스캔하세요.", + "noSearchResults": "이 검색과 일치하는 스킬이 없습니다.", + "enabled": "활성화됨", + "disabled": "비활성화됨" + }, + "llm": { + "title": "LLM 모델", + "description": "공급자마다 한 줄씩 표시됩니다. 하나를 켜면 다른 공급자는 자동으로 꺼집니다. 변경 사항은 즉시 저장되며, 각 공급자의 API 키는 독립적으로 저장되므로 전환해도 데이터가 사라지지 않습니다.", + "expand": "설정 펼치기", + "collapse": "접기", + "toggleOff": "클릭하여 비활성화", + "toggleOn": "클릭하여 활성화(다른 공급자는 꺼집니다)", + "deactivate": "비활성화", + "activate": "활성화", + "apiMode": "API 모드", + "endpoint": "엔드포인트", + "contextWindow": "컨텍스트 윈도우", + "wireOpenAi": "OpenAI 호환", + "wireAnthropic": "Anthropic 호환", + "apiKeyPlaceholderCustom": "키가 없으면 비워두세요(로컬 모델)", + "apiKeyPlaceholder": "API 키를 입력하세요", + "savedBadge": "저장됨", + "configuredBadge": "설정됨", + "activeBadge": "● 활성", + "useModel": "{{model}} 사용", + "typeCustomModel": "커스텀 모델 ID 입력", + "customModel": "커스텀…", + "customModelBadge": "커스텀: {{model}}", + "endpointPreviewWillUse": "다음으로 확인됨", + "endpointPreviewAutoApply": "(입력란에서 포커스를 벗어나면 자동 적용)", + "providerTests": "공급자 테스트", + "providerTestsHint": "연결 테스트는 엔드포인트가 응답하는지 확인합니다. 기능 테스트는 모델에게 간단한 지시를 따르도록 요청합니다.", + "localCliIsolation": "로컬 CLI 설정 격리", + "localCliIsolationHint": "Claude Code와 Codex CLI에만 해당하는 선택 항목입니다. 활성화하면 LLM Wiki는 지원되는 범위에서 CLI가 사용자 수준 규칙/설정/MCP/도구를 무시하도록 요청합니다. 이는 설정 격리이지 프로세스 샌드박스가 아닙니다. CLI는 여전히 로컬 로그인 자격 증명과 네트워크 접근을 사용합니다. 로컬 CLI 설정을 의도적으로 사용하고 있다면 꺼두세요.", + "localCliIsolationOn": "격리 켜짐: CLI가 지원하는 범위 내에서 사용자 CLI 규칙, MCP/도구, 저장된 세션이 비활성화됩니다. 로컬 자격 증명과 네트워크 접근은 여전히 CLI 자체가 제어합니다.", + "localCliIsolationOff": "격리 꺼짐: 이 공급자는 평소 사용하는 로컬 CLI 설정을 그대로 사용할 수 있습니다.", + "codexCliTimeout": "Codex CLI 타임아웃", + "codexCliTimeoutUnit": "분", + "codexCliTimeoutHint": "Codex CLI 요청 한 건에 대한 전체 타임아웃입니다. 긴 PDF 가져오기나 느린 로컬/네트워크 세션에서는 값을 늘리세요.", + "testConnection": "연결 테스트", + "testFunction": "기능 테스트", + "testingConnection": "연결 테스트 중…", + "testingFunction": "기능 테스트 중…", + "deploymentName": "배포 이름", + "azureApiVersion": "Azure API 버전", + "azureApiVersionHint": "Azure OpenAI의 api-version 쿼리 매개변수로 전송됩니다.", + "azureModelFamily": "Azure 모델 계열", + "azureModelFamilyAuto": "배포 이름에서 자동 감지", + "azureModelFamilyGpt5": "GPT-5 / o-시리즈 엄격 매개변수", + "azureModelFamilyHint": "Azure 배포 이름은 임의로 지정할 수 있습니다. 이 배포가 max_tokens나 기본값이 아닌 temperature를 거부한다면 GPT-5 / o-시리즈를 선택하세요.", + "reasoning": { + "title": "추론 / 사고 과정", + "auto": "자동", + "off": "끄기", + "low": "낮음", + "medium": "중간", + "high": "높음", + "max": "최대", + "custom": "커스텀", + "budgetTokens": "사고 과정 토큰 예산", + "hint": "가져오기 같은 정형화된 작업에서는 추론만 있고 본문이 없는 응답을 피하기 위해 이 설정을 자동으로 끄기로 전환할 수 있습니다." + } + }, + "embedding": { + "title": "벡터 임베딩", + "description": "위키에 대한 시맨틱 검색을 활성화합니다. OpenAI 호환 /v1/embeddings 엔드포인트, Google Gemini 네이티브 embedContent 엔드포인트, Volcengine/Doubao 임베딩 엔드포인트와 함께 사용할 수 있습니다. 로컬 모델(LM Studio, Ollama 임베딩)은 API 키가 필요하지 않습니다.", + "enableLabel": "벡터 검색 활성화", + "enableHint": "꺼져 있으면 검색은 토큰 매칭만 사용합니다.", + "endpoint": "엔드포인트", + "endpointHint": "OpenAI 호환 예시: http://127.0.0.1:1234/v1/embeddings. Gemini 예시: https://generativelanguage.googleapis.com/v1beta, 모델은 gemini-embedding-001. Volcengine 예시: https://ark.cn-beijing.volces.com/api/v3, 모델은 doubao-embedding-vision.", + "apiKey": "API 키(선택 사항)", + "apiKeyPlaceholder": "로컬 모델이면 비워두세요", + "model": "모델", + "modelHint": "일반적인 예시가 제안되지만, 커스텀 OpenAI 호환 모델 ID도 사용할 수 있습니다.", + "outputDimensionality": "출력 차원(Gemini 전용)", + "outputDimensionalityHint": "선택 사항입니다. Gemini 네이티브 embedContent 엔드포인트에만 `output_dimensionality`로 전송됩니다. OpenAI 호환 엔드포인트는 이 필드를 무시합니다. 비워두면 모델 기본값을 사용합니다. 모델이나 차원을 변경한 후에는 임베딩을 다시 빌드해야 합니다.", + "extraHeaders": "커스텀 요청 헤더", + "extraHeadersHint": "선택 사항입니다. 한 줄에 하나씩 `Header-Name: value` 형식으로 입력하세요. 요청 헤더로 라우팅하는 게이트웨이에 사용됩니다(예: mify는 `X-Model-Provider-Id: siliconflow`가 필요). Authorization, Content-Type, Host, Content-Length, x-goog-api-key는 클라이언트가 관리하며 무시됩니다.", + "chunking": "청크 분할", + "maxChunkChars": "최대 청크 크기(문자 수)", + "maxChunkCharsHint": "각 청크의 목표 크기입니다. 엔드포인트의 컨텍스트가 작다면(llama.cpp n_ctx=512, mxbai-embed-large 등) 이 값을 낮추세요(예: 500).", + "overlapChunkChars": "겹침(문자 수)", + "overlapChunkCharsHint": "인접한 청크 사이의 겹치는 문자 수로, 경계에서 내용이 잘리지 않도록 합니다.", + "providerTests": "공급자 테스트", + "providerTestsHint": "연결 테스트는 짧은 임베딩 요청 하나를 보냅니다. 기능 테스트는 안정적이고 유한한 벡터인지 확인하고 반환된 차원을 표시합니다.", + "testConnection": "연결 테스트", + "testFunction": "기능 테스트", + "testingConnection": "임베딩 연결 테스트 중…", + "testingFunction": "임베딩 기능 테스트 중…", + "statsHeading": "인덱스 상태", + "chunkCount": "{{count}}개 청크 색인됨", + "lastErrorHeading": "마지막 임베딩 오류", + "reindexAll": "모든 페이지 다시 색인", + "reindexing": "색인 중 {{done}}/{{total}}…", + "reindexDone": "{{count}}개 페이지를 색인했습니다.", + "reindexError": "다시 색인 실패: {{message}}", + "legacyPromptTitle": "이전 방식(페이지 단위) 인덱스가 감지됨", + "legacyPromptBody": "이 프로젝트의 이전 페이지 단위 벡터 저장소에 {{count}}개의 항목이 있습니다. 새로운 청크 단위 인덱스는 검색 품질이 더 좋지만 한 번의 재임베딩이 필요합니다. \"모든 페이지 다시 색인\"을 실행해 업그레이드하세요.", + "dropLegacy": "이전 인덱스 삭제", + "dropLegacyDone": "이전 인덱스가 삭제되었습니다." + }, + "multimodal": { + "title": "이미지 캡션", + "description": "가져오기 중 PDF/DOCX/PPTX에서 추출된 이미지에 대한 사실 기반 캡션을 생성합니다. 캡션은 소스 마크다운 안에 alt 텍스트로 삽입되며, 이미지 콘텐츠를 검색할 때 시맨틱 검색이 매칭하는 대상이 됩니다. 이미지 해시 기준으로 캐시되므로 중복된 로고나 차트는 LLM을 한 번만 호출합니다.", + "enableLabel": "가져오기 시 캡션 생성 활성화", + "enableHint": "꺼짐: 가져온 콘텐츠에서 이미지 참조가 제거됩니다 — 위키 페이지에 이미지가 표시되지 않고 검색 결과에도 나오지 않습니다.(원본 파일은 원본 소스 미리보기를 위해 wiki/media/에 그대로 추출됩니다.) 켜짐: 새 이미지마다 비전 LLM이 사실 기반 캡션을 생성하며(해시로 캐시됨), 위키 페이지의 alt 텍스트에 반영됩니다.", + "stateOn": "켜짐", + "stateOff": "꺼짐", + "useMainLabel": "캡션 생성에 메인 LLM 사용", + "useMainHint": "설정 → LLM 공급자에서 선택한 모델을 재사용합니다. 해당 모델이 이미지 입력을 지원하는 경우에만 활성화하세요 — 텍스트 전용 모델은 400 오류를 반환합니다.", + "dedicatedHeading": "전용 비전 엔드포인트", + "provider": "공급자", + "ollamaUrl": "Ollama 주소", + "customEndpoint": "엔드포인트 URL", + "customEndpointHint": "OpenAI 호환 /v1 기본 주소입니다. LM Studio, llama.cpp server, vLLM, LocalAI 모두 사용할 수 있습니다.", + "azureEndpoint": "Azure 엔드포인트", + "azureEndpointHint": "Azure OpenAI 리소스 엔드포인트를 사용하세요. 모델 필드에는 배포 이름을 입력합니다.", + "azureApiVersion": "Azure API 버전", + "azureApiVersionHint": "Azure OpenAI의 api-version 쿼리 매개변수로 전송됩니다.", + "azureModelFamily": "Azure 모델 계열", + "azureModelFamilyAuto": "배포 이름에서 자동 감지", + "azureModelFamilyGpt5": "GPT-5 / o-시리즈 엄격 매개변수", + "azureModelFamilyHint": "이 배포가 max_tokens나 기본값이 아닌 temperature를 거부한다면 GPT-5 / o-시리즈를 선택하세요.", + "azureDeployment": "배포 이름", + "apiKey": "API 키", + "apiKeyPlaceholder": "로컬 / 인증이 필요 없는 엔드포인트는 비워두세요", + "model": "모델", + "modelHint": "비전 기능을 지원하는 모델이어야 합니다. 텍스트 전용 모델은 첫 가져오기 시 400 / image-not-supported 오류로 실패합니다.", + "concurrency": "동시 캡션 요청 수", + "concurrencyHint": "캡션 요청을 몇 개까지 병렬로 실행할지 설정합니다. 1 = 완전히 순차 처리. 대부분의 환경에서는 4가 적당하며, 고성능 GPU나 호스팅 엔드포인트에서만 8 이상으로 올리세요.", + "costHeading": "비용 가드레일", + "costPoint1": "새 이미지마다 비전 LLM 호출이 한 번 발생합니다(모델과 사고 모드에 따라 약 500~2000 토큰).", + "costPoint2": "캡션은 이미지 바이트의 SHA-256으로 캐시됩니다. 문서 전반에서 중복되는 로고나 공용 차트 템플릿은 단 한 번만 호출됩니다.", + "costPoint3": "Rust 쪽 필터가 100×100px보다 작은 이미지를 제외하고 소스당 최대 500장으로 제한하므로, 비정상적인 PDF가 비용을 폭증시킬 수 없습니다.", + "costPoint4": "대량 가져오기에는 로컬 비전 모델(LM Studio/Ollama의 Qwen2.5-VL)을 권장하며, 호스팅 비전 API는 중요도가 높은 개별 문서에만 사용하세요." + }, + "webSearch": { + "title": "외부 정보 소스", + "description": "LLM Wiki가 사용할 수 있는 외부 정보 소스를 설정합니다.", + "deepResearchSources": "심층 리서치 소스 모드", + "deepResearchSourcesHint": "웹 검색은 선택한 온라인 공급자를 사용합니다. AnyTXT는 이 기기의 ATGUI.exe를 통해 로컬 색인 파일을 검색합니다.", + "sourceWeb": "웹 검색", + "sourceAnyTxt": "AnyTXT", + "sourceBoth": "둘 다", + "webProviders": "웹 검색 공급자", + "anyTxtTitle": "AnyTXT 로컬 파일 검색", + "anyTxtDescription": "AnyTXT의 로컬 JSON-RPC API를 심층 리서치 소스로 사용합니다. 리서치를 시작하기 전에 ATGUI.exe를 실행해두세요.", + "anyTxtEndpoint": "AnyTXT 엔드포인트", + "anyTxtFilterDir": "검색 폴더", + "anyTxtFilterDirPlaceholder": "비워두면 AnyTXT의 기본 범위를 사용합니다. Windows에서는 필요하면 드라이브나 폴더를 지정하세요", + "anyTxtFilterExt": "확장자 필터", + "anyTxtLimit": "최대 로컬 결과 수", + "anyTxtHint": "AnyTXT 패턴 텍스트는 AnyTXT에 그대로 전달되므로 AnyTXT의 고유 검색 문법이 적용됩니다. AnyTXT API는 로컬 베타 소프트웨어이므로 AnyTXT의 이용 약관을 준수하세요.", + "anyTxtBroadDirWarning": "이 폴더 범위가 매우 넓습니다. 심층 리서치가 민감한 내용을 포함한 로컬 파일 조각을 선택한 LLM으로 전송할 수 있습니다.", + "expand": "펼치기", + "collapse": "접기", + "activate": "활성화", + "deactivate": "비활성화", + "configuredBadge": "설정됨", + "activeBadge": "활성", + "savedBadge": "저장됨", + "instanceUrl": "인스턴스 URL", + "ollamaHint": "공식 Ollama Web Search API(`https://ollama.com/api/web_search`)를 사용합니다. Ollama API 키가 필요합니다.", + "firecrawlHint": "Firecrawl의 익명 검색 API(`https://api.firecrawl.dev/v2/search`)를 사용합니다. 여기서는 API 키가 필요 없지만, Firecrawl이 의심스러운 IP를 차단할 수 있습니다.", + "searxngJsonHint": "인스턴스가 JSON 검색 응답(`format=json`)을 허용해야 합니다.", + "searchCategories": "검색 카테고리", + "searxngCategoriesHint": "카테고리는 SearXNG의 `categories` 매개변수로 전송됩니다.", + "searchEngine": "검색 엔진 / 카테고리", + "customSerpApiPlaceholder": "커스텀 SerpApi 엔진, 예: google_finance", + "customSerpApiHint": "커스텀 엔진은 SerpApi의 `engine` 매개변수로 전송됩니다.", + "testProvider": "검색 테스트", + "testRunning": "테스트 중...", + "testSuccess": "검색 테스트 성공({{count}}건의 결과).", + "testSuccess_plural": "검색 테스트 성공({{count}}건의 결과).", + "testNoResults": "연결은 정상이지만, 이 테스트 쿼리에서는 결과가 없었습니다.", + "testFailed": "검색 테스트 실패: {{message}}", + "firecrawlIpBlocked": "이 IP에서는 Firecrawl 익명 검색이 차단되었습니다. 다른 웹 검색 공급자를 선택하거나 다른 네트워크를 시도하세요.", + "firecrawlNetworkError": "Firecrawl 검색에 연결할 수 없습니다. 네트워크를 확인하거나 다른 웹 검색 공급자를 선택하세요.", + "firecrawlInvalidJson": "Firecrawl이 잘못된 응답을 반환했습니다. 잠시 후 다시 시도하거나 다른 웹 검색 공급자를 선택하세요.", + "configureBeforeTesting": "먼저 설정하세요" + }, + "network": { + "title": "네트워크", + "description": "모든 아웃바운드 HTTP 요청(LLM, 임베딩, 검색, 업데이트 확인)을 프록시를 통해 라우팅합니다. 변경 사항은 저장 시 바로 적용되며 재시작이 필요 없습니다.", + "enable": "프록시 활성화", + "url": "프록시 URL", + "urlHelp": "스킴을 포함한 전체 URL입니다. 지원: http://, https:// (이 버전에서는 SOCKS5를 지원하지 않습니다.)", + "bypassLocal": "로컬 주소는 프록시를 우회(권장)", + "bypassLocalHelp": "localhost, 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, *.local로의 요청은 프록시를 거치지 않습니다. Ollama/LM Studio 등 로컬 또는 LAN에 배포된 LLM을 사용한다면 이 옵션을 켜두세요." + }, + "sourceWatch": { + "title": "소스 폴더 자동 감시", + "description": "raw/sources의 외부 변경 사항을 모니터링하고, 어떤 파일을 자동 가져오기에 허용할지 선택합니다.", + "enable": "프로젝트 소스 폴더 모니터링", + "enableDescription": "raw/sources 아래에서 허용된 새 파일이나 수정된 파일에 대해 소스 뷰를 새로고침하고 색인합니다.", + "autoIngest": "허용된 소스 파일 자동 가져오기", + "autoIngestDescription": "비활성화하면 외부 변경 사항으로 파일 트리는 새로고침되지만 가져오기 작업은 생성되지 않습니다.", + "noProject": "이 프로젝트 수준 설정을 변경하려면 프로젝트를 열어야 합니다.", + "fileTypes": "허용된 파일 형식", + "fileTypesDescription": "문서 형식은 기본적으로 활성화되어 있습니다. 미디어, 바이너리, 소스 코드, 설정류 형식은 선택하기 전까지 꺼져 있습니다.", + "exclusions": "제외 항목 및 제한", + "maxSize": "자동 가져오기 최대 파일 크기(MB)", + "excludeDirs": "제외할 폴더", + "excludeDirsPlaceholder": ".git, node_modules, drafts, subdir/drafts", + "excludeDirsHint": "폴더 이름은 경로의 어떤 세그먼트와도 일치합니다. subdir/drafts 같은 경로는 해당 중첩 폴더와 일치합니다.", + "excludeExtensions": "제외할 파일 확장자", + "excludeExtensionsPlaceholder": "tmp, bak, exe, dll, iso, dmg", + "excludeExtensionsHint": "점 없이 확장자만 입력하세요. 이 항목은 허용된 파일 형식 체크박스보다 우선합니다.", + "excludeGlobs": "제외할 파일명 패턴", + "excludeGlobsHint": "쉼표로 구분된 패턴을 사용하세요. 예: *.draft.*, ~$*, .~lock.*#.", + "groups": { + "documents": "문서", + "presentations": "프레젠테이션", + "spreadsheets": "스프레드시트", + "web": "웹 문서", + "data": "데이터 / 설정", + "images": "이미지", + "media": "오디오 / 비디오", + "code": "소스 코드" + } + }, + "scheduledImport": { + "title": "예약 가져오기", + "description": "지정한 디렉터리를 자동으로 모니터링하며 일정 간격으로 새 파일이나 수정된 파일을 가져옵니다.", + "enable": "예약 가져오기 활성화", + "directory": "모니터링 디렉터리", + "directoryHelp": "현재 LLM Wiki 프로젝트 외부의 폴더를 선택하세요. raw, raw/sources, wiki, .llm-wiki 같은 프로젝트 내부 폴더는 소스 폴더 모니터링에서 이미 처리하므로 건너뜁니다.", + "managedPathWarning": "이 경로는 현재 LLM Wiki 프로젝트 내부에 있으며 이미 소스 폴더 모니터링이 관리하고 있습니다. 중복 스캔을 피하려면 외부 폴더를 선택하세요.", + "privacyNotice": "선택한 디렉터리의 파일은 이 프로젝트로 복사되어 가져오기 중 설정된 LLM으로 전송될 수 있습니다. 원본에서 파일을 삭제해도 프로젝트에서 자동으로 삭제되지는 않습니다.", + "browse": "찾아보기", + "selectDirectory": "모니터링할 디렉터리 선택", + "interval": "스캔 간격(분)", + "intervalHelp": "변경 사항을 확인하는 주기입니다. 최소값: 1분.", + "scanNow": "지금 스캔", + "scanning": "스캔 중...", + "lastScan": "마지막 스캔: {{time}}", + "never": "없음" + }, + "apiServer": { + "title": "API + MCP", + "description": "로컬 HTTP API를 통해 LLM Wiki를 자신의 도구에 노출하고, 필요하면 번들로 제공되는 MCP 서버를 통해 에이전트 클라이언트에도 노출할 수 있습니다.", + "enable": "로컬 HTTP API 활성화", + "enableHint": "비활성화하면 토큰이 설정되어 있어도 /health를 제외한 모든 엔드포인트가 503을 반환합니다. 토큰을 지우지 않고도 사용할 수 있는 킬 스위치로 유용합니다.", + "status": "상태", + "statusRunning": "실행 중", + "statusOpen": "실행 중, 인증 없음", + "statusNoToken": "실행 중, 토큰 없음", + "statusDisabled": "비활성화됨", + "statusStarting": "시작 중…", + "statusPortConflict": "포트 19828 사용 중", + "statusError": "오류", + "statusUnknown": "알 수 없음", + "baseUrl": "기본 URL", + "openHealth": "/health 열기", + "openHealthHint": "시스템 브라우저에서 열립니다. /health는 인증이 필요 없는 유일한 엔드포인트입니다.", + "allowUnauthenticated": "토큰 없이 접근 허용", + "allowUnauthenticatedHint": "신뢰할 수 있는 로컬 에이전트에만 사용하세요. 활성화하면 이 기기의 어떤 프로세스나 브라우저 페이지도 API를 호출할 수 있습니다.", + "allowLanAccess": "API 및 Clip 서버의 로컬 네트워크 접근 허용", + "allowLanAccessHint": "앱을 재시작하면 API와 Clip 서버가 127.0.0.1 대신 0.0.0.0에서 수신 대기합니다. 신뢰할 수 있는 네트워크에서만 사용하고, LAN을 완전히 신뢰하지 않는다면 토큰 인증을 유지하세요.", + "mcpEnable": "MCP 접근 활성화", + "mcpEnableHint": "MCP는 로컬 API와 동일한 토큰 규칙을 사용합니다. HTTP API를 활성화한 상태에서 MCP 클라이언트를 번들된 Node 서버에 연결하세요.", + "mcpUsage": "MCP 사용법", + "mcpUsageHint": "`npm run mcp:build`로 한 번 빌드한 뒤, MCP 클라이언트가 아래 서버를 실행하도록 설정하세요. 인증 없는 접근을 활성화하지 않았다면 LLM_WIKI_API_TOKEN을 사용하세요.", + "mcpPathUnavailable": "MCP 서버 엔트리를 찾을 수 없습니다. LLM Wiki 저장소에서 `npm run mcp:build`를 실행한 뒤 설정을 다시 여세요.", + "token": "접근 토큰", + "tokenHint": "인증 없는 접근을 활성화하지 않았다면 필수입니다. `Authorization: Bearer ` 또는 `X-LLM-Wiki-Token: `으로 전송하세요. 환경 변수 LLM_WIKI_API_TOKEN이 설정되어 있으면 이 필드보다 우선합니다.", + "tokenPlaceholder": "기존 토큰을 붙여넣거나 생성을 클릭하세요", + "generate": "새 토큰 생성", + "show": "표시", + "hide": "숨기기", + "copy": "복사", + "copied": "복사됨", + "tokenMissing": "토큰 없음 — 모든 엔드포인트가 401을 반환합니다", + "tokenUnused": "인증 없는 접근이 활성화된 동안에는 토큰이 사용되지 않습니다", + "envTokenActive": "LLM_WIKI_API_TOKEN이 활성화되어 있으며 이 필드보다 우선합니다", + "tokenWeak": "토큰이 짧습니다 — 256비트 엔트로피를 위해 생성을 사용하는 것을 고려하세요", + "saveFirst": "API/MCP 변경 사항을 적용하려면 설정을 저장하세요", + "saveFirstExample": "먼저 설정을 저장한 뒤 예제 요청을 복사하세요.", + "tokenWarning": "이 토큰을 안전하게 보관하세요. 이 기기에서 토큰을 가진 사람은 누구나 localhost를 통해 프로젝트 파일을 읽을 수 있습니다.", + "tokenQueryWarning": "Authorization 헤더 사용을 권장합니다 — ?token=… 형태로 URL에 전달하면 셸 기록, 로그, Referer 헤더에 값이 노출됩니다.", + "sample": "예제 요청", + "endpoints": "엔드포인트", + "endpointsHint": "{id}는 프로젝트 UUID, 프로젝트 파일 시스템 경로, 또는 문자 그대로 'current'로 대체하세요.", + "endpointHealthNote": "생존 확인용입니다. 인증이 필요 없습니다.", + "endpointProjectsNote": "알려진 프로젝트와 그 ID, 경로를 나열합니다.", + "endpointFilesNote": "?root=wiki|sources|all; ?recursive=false; ?maxFiles=N (≤10000).", + "endpointContentNote": "?path=wiki/index.md — 텍스트 파일만 가능, 최대 2MB.", + "endpointReviewsNote": "?status=unresolved|resolved|all; ?type=missing-page; ?limit=N. 기본값은 미해결 리뷰 항목입니다.", + "endpointPatchReviewNote": "리뷰 항목 하나를 업데이트합니다. JSON 본문: { resolved?, action? } (resolved 기본값은 true이며, false를 전달하면 다시 엽니다). 다시 읽으려면 리뷰 탭의 새로고침 버튼을 사용하세요.", + "endpointBulkResolveNote": "리뷰 항목을 일괄 해결합니다. JSON 본문: { ids, action? }. { resolved, notFound, count }를 반환합니다.", + "endpointSearchNote": "JSON 본문: { query, topK?, includeContent?, queryEmbedding? }. 임베딩이 설정되어 있으면 공유 키워드 + 벡터 검색을 사용합니다.", + "endpointGraphNote": "?q=…&nodeType=…&limit=N — wiki/*.md에서 도출된 위키링크 그래프입니다.", + "endpointRescanNote": "소스 감시 설정을 사용해 백엔드 재스캔을 실행합니다.", + "endpointChatNote": "아직 구현되지 않았습니다(501 반환)." + }, + "output": { + "title": "출력 환경설정", + "description": "생성되는 콘텐츠의 언어, 대화 기록 길이 등을 제어합니다.", + "aiLanguage": "AI 출력 언어", + "aiLanguageHint": "AI가 생성하는 콘텐츠(채팅 답변, 위키 페이지, 리서치 결과, 린트 보고서)에 선택한 언어를 강제 적용합니다. AI가 사용자 입력이나 소스 문서의 언어를 따르게 하려면 \"자동\"을 선택하세요.", + "historyLength": "대화 기록 길이", + "historyHint": "매 요청마다 AI에게 전달되는 이전 메시지 수입니다. 많을수록 맥락은 풍부해지지만 토큰을 더 소모합니다.", + "historyCurrent": "현재 {{count}}개 메시지(약 {{turns}}턴)" + }, + "interface": { + "title": "인터페이스", + "description": "UI 언어와 화면 모양입니다. 변경 사항은 즉시 적용되고 저장됩니다.", + "uiLanguage": "UI 언어", + "uiLanguageHint": "레이블, 버튼 등 UI 문자열에만 영향을 줍니다. AI 출력 언어는 출력 환경설정에서 별도로 설정합니다.", + "theme": "테마", + "themeHint": "미리보기는 즉시 적용됩니다. 선택한 테마를 유지하려면 설정을 저장하세요. 시스템은 운영체제의 화면 설정을 따릅니다.", + "themeLight": "라이트", + "themeDark": "다크", + "themeSystem": "시스템", + "zoom": "인터페이스 확대/축소", + "zoomHint": "앱 전체의 텍스트와 rem 기반 여백 크기를 조절합니다. 일부 고정 픽셀 패널은 실제 크기 제한을 유지합니다.", + "zoomIn": "확대", + "zoomOut": "축소" + }, + "maintenance": { + "title": "유지 관리", + "description": "위키를 정리하는 도구입니다 — 재가져오기 과정에서 LLM이 서로 다른 이름으로 만든 중복 엔티티/개념을 찾아 병합합니다.", + "noProject": "먼저 프로젝트를 여세요.", + "noLlm": "먼저 LLM 공급자를 설정하세요.", + "dedup": { + "title": "중복 엔티티 / 개념 감지", + "description": "LLM에게 모든 엔티티/개념 페이지를 스캔하여 이름은 다르지만 같은 주제를 가리킬 가능성이 있는 항목(영어 대 중국어, 복수형 대 단수형, 약어 대 전체 표기 등)을 그룹화하도록 요청합니다. 병합 전에 각 그룹을 직접 확인합니다. 병합은 대기열에 들어가 한 번에 하나씩 실행되어 상호 참조가 일관되게 유지됩니다.", + "scanButton": "중복 항목 스캔", + "scanning": "스캔 중…", + "noneFound": "중복 그룹이 발견되지 않았습니다. 위키가 깨끗합니다.", + "candidates": "후보 {{n}}개", + "canonicalLabel": "다음 슬러그를 대표로 유지:", + "mergeButton": "{{slug}}(으)로 병합", + "merging": "병합 중…", + "queued": "대기 중", + "queuedAhead": "대기 중({{n}}개 앞에 있음)", + "failed": "실패({{retries}}/3)", + "cancel": "취소", + "retry": "재시도", + "delete": "삭제", + "queueTitle": "진행 중인 병합", + "queueDescription": "지난 스캔 이후 대기열에 들어갔지만 아직 끝나지 않은 작업입니다. 병합은 한 번에 하나씩 실행됩니다.", + "notDuplicates": "중복 아님", + "merged": "병합됨", + "skipped": "중복 아님으로 표시됨" + } + }, + "changelog": { + "title": "변경 이력", + "description": "각 릴리스에서 사용자에게 보이는 주요 변경 사항을 최신순으로 정리합니다." + }, + "about": { + "title": "정보", + "description": "빌드 정보와 런타임 상태입니다.", + "version": "버전", + "clipServer": "Clip 서버", + "apiServer": "API 서버", + "apiDisabled": "비활성화됨", + "apiOpen": "실행 중(인증 없음)", + "apiNoToken": "실행 중(토큰 없음)", + "updateCheck": "업데이트 확인", + "lastChecked": "마지막 확인", + "lastCheckedNever": "없음", + "unreachable": "GitHub에 연결할 수 없음", + "checkNow": "지금 확인", + "checking": "확인 중…", + "upToDate": "최신 버전입니다(v{{version}}).", + "updateAvailable": "업데이트 가능: v{{version}}", + "openDownload": "다운로드 페이지 열기", + "later": "나중에", + "autoCheck": "시작 시 자동으로 업데이트 확인(최소 6시간 간격)", + "appDescription": "LLM 기반 개인 지식 베이스입니다. 소스:" + }, + "mineru": { + "title": "MinerU PDF 파서", + "description": "표, 수식, 복잡한 레이아웃을 더 높은 품질로 파싱하려면 MinerU 클라우드 API를 사용하세요. 기본값은 내장된 pdfium 추출을 사용합니다.", + "privacyNotice": "활성화하면 PDF 내용이 파싱을 위해 MinerU 클라우드로 업로드됩니다. 이를 받아들일 수 없다면 민감한 문서에는 사용하지 마세요.", + "enabled": "MinerU 활성화", + "token": "API 토큰", + "tokenHint": "mineru.net에서 토큰을 발급받으세요", + "model": "모델 버전", + "modelVlm": "VLM(권장, 복잡한 레이아웃에 적합)", + "modelPipeline": "Pipeline(더 빠름)", + "modelHint": "PDF 파싱은 pipeline과 vlm만 지원합니다. MinerU-HTML은 HTML 파일용이며 여기서는 사용되지 않습니다.", + "test": "연결 테스트", + "testQuotaNotice": "연결 테스트는 작은 데모 파일을 MinerU에 제출하며 약간의 할당량을 소모할 수 있습니다.", + "testing": "테스트 중...", + "testSuccess": "연결 성공", + "testFailed": "테스트 실패" + } + } + }, + "preview": { + "selectFile": "미리 볼 파일을 선택하세요", + "notAvailable": "이 파일 형식은 미리보기를 지원하지 않습니다" + }, + "activity": { + "processing": "처리 중: {{title}}", + "done": "완료: {{title}}", + "clearCompleted": "완료 항목 지우기", + "ingestQueue": "가져오기 대기열", + "ingestQueuePaused": "가져오기 대기열(일시 중지됨)", + "pauseQueue": "일시 중지", + "resumeQueue": "재개", + "pauseQueueTitle": "현재 작업이 끝나면 일시 중지합니다. 새 가져오기 작업은 시작되지 않습니다.", + "resumeQueueTitle": "대기 중인 가져오기 작업 처리를 재개합니다", + "queueCompleteCount": "{{done}}/{{total}} 완료", + "failedCount": "{{count}}개 실패", + "cancelAll": "모두 취소", + "cancelAllTitle": "대기 중이거나 처리 중인 모든 작업을 취소합니다", + "cancelAllConfirm": "대기/처리 중인 가져오기 작업 {{count}}개를 모두 취소할까요? 진행 중이던 작업의 일부 파일은 제거됩니다. 실패한 작업은 나중에 재시도할 수 있도록 남겨둡니다.", + "retryFailed": "실패 항목 재시도", + "retryFailedTitle": "실패한 모든 가져오기 작업을 재시도합니다" + }, + "fileTree": { + "noProject": "열려 있는 프로젝트가 없습니다" + }, + "graph": { + "openProject": "그래프를 보려면 프로젝트를 여세요", + "buildingGraph": "그래프를 빌드하는 중...", + "retry": "재시도", + "noPages": "아직 페이지가 없습니다", + "importSourcesHint": "소스를 가져와 지식 그래프 구축을 시작하세요", + "knowledgeGraph": "지식 그래프", + "hidden": "숨김", + "pages": "페이지", + "links": "링크", + "searchLabel": "그래프 검색", + "searchPlaceholder": "노드 검색...", + "clearSearch": "그래프 검색 지우기", + "closeSearch": "그래프 검색 닫기", + "noSearchResults": "일치하는 노드가 없습니다", + "noVisibleNodes": "표시할 노드가 없습니다", + "filter": "필터", + "reset": "초기화", + "type": "유형", + "community": "커뮤니티", + "insights": "인사이트", + "resizing": "크기 조절 중...", + "graphFilters": "그래프 필터", + "quickFilters": "빠른 필터", + "hideIndexOverview": "인덱스/개요/로그 숨기기", + "hideIsolated": "고립된 노드 숨기기", + "minLinks": "최소 링크 수", + "minLinksHint": "이 값보다 링크 수가 적은 노드를 숨깁니다", + "maxLinks": "최대 링크 수", + "maxLinksHint": "이 값보다 링크 수가 많은 노드를 숨깁니다", + "displayTuning": "표시 조정", + "nodeSize": "노드 크기", + "spacing": "간격", + "displayTuningHint": "이 컨트롤을 사용해 작은 화면에서도 밀집된 그래프를 읽기 쉽게 유지하세요.", + "nodeTypes": "노드 유형", + "hiddenNodes": "숨겨진 노드", + "show": "표시", + "showingStats": "전체 {{total}}개 페이지 중 {{pages}}개, 전체 {{totalLinks}}개 링크 중 {{links}}개를 표시 중입니다.", + "hideThisNode": "이 노드 숨기기", + "nodeTypesLabel": "노드 유형", + "communitiesLabel": "커뮤니티", + "showAll": "전체 표시", + "cluster": "클러스터 {{id}}", + "surprisingConnections": "의외의 연결", + "knowledgeGaps": "지식 공백", + "deepResearch": "심층 리서치", + "generatingTopic": "리서치 주제 생성 중...", + "researchTopic": "리서치 주제", + "searchQueries": "검색 쿼리", + "cancel": "취소", + "startResearch": "리서치 시작", + "nodeTypeLabels": { + "entity": "엔티티", + "concept": "개념", + "source": "소스", + "query": "쿼리", + "synthesis": "종합", + "overview": "개요", + "comparison": "비교", + "finding": "발견", + "thesis": "논지", + "methodology": "방법론", + "other": "기타" + } + }, + "time": { + "justNow": "방금 전", + "minutesAgo": "{{count}}분 전", + "hoursAgo": "{{count}}시간 전", + "daysAgo": "{{count}}일 전" + } +}