From 51f1b13f3f87d383bd7ce6b9cd1b6d75e92136d2 Mon Sep 17 00:00:00 2001 From: moduvoice Date: Wed, 8 Jul 2026 21:27:57 +0700 Subject: [PATCH 1/2] feat(i18n): add Korean (ko) translation Adds a complete Korean translation (929/929 keys, matching en.json's structure) and registers ko in the language switcher. Co-Authored-By: Claude Sonnet 5 --- client-next/messages/ko.json | 1085 +++++++++++++++++ .../src/components/language-switcher.tsx | 3 +- 2 files changed, 1087 insertions(+), 1 deletion(-) create mode 100644 client-next/messages/ko.json diff --git a/client-next/messages/ko.json b/client-next/messages/ko.json new file mode 100644 index 0000000..00e3f22 --- /dev/null +++ b/client-next/messages/ko.json @@ -0,0 +1,1085 @@ +{ + "common": { + "save": "저장", + "cancel": "취소", + "delete": "삭제", + "edit": "편집", + "close": "닫기", + "add": "추가", + "search": "검색", + "loading": "불러오는 중...", + "saving": "저장 중...", + "error": "오류", + "success": "성공", + "confirm": "확인", + "back": "뒤로", + "next": "다음", + "done": "완료", + "reset": "초기화", + "refresh": "새로고침", + "copy": "복사", + "copied": "복사됨!", + "enabled": "활성화됨", + "disabled": "비활성화됨", + "active": "활성", + "inactive": "비활성", + "connected": "연결됨", + "disconnected": "연결 끊김", + "recommended": "권장", + "required": "필수", + "optional": "선택", + "name": "이름", + "description": "설명", + "status": "상태", + "actions": "작업", + "noResults": "결과가 없습니다", + "unknownError": "알 수 없는 오류", + "skipToContent": "본문으로 건너뛰기", + "pageHelp": { + "openDocumentation": "문서 열기" + }, + "permissions": { + "searchTools": "도구 검색...", + "enabledOnly": "활성화된 항목만", + "toolsFound": "{count}개 도구 찾음", + "simple": "단순", + "patternMap": "패턴 맵", + "allowDenyList": "허용/거부 목록", + "allow": "허용", + "ask": "확인", + "deny": "거부", + "addPatternPlaceholder": "글롭 패턴 (예: src/**)", + "add": "추가", + "allowPatterns": "허용 패턴", + "allowPlaceholder": "쉼표로 구분된 패턴", + "denyPatterns": "거부 패턴", + "denyPlaceholder": "쉼표로 구분된 패턴" + }, + "debug": { + "title": "디버그 메뉴", + "systemInformation": "시스템 정보", + "fetchingData": "최신 데이터를 가져오는 중...", + "failedToFetch": "백엔드에서 디버그 정보를 가져오지 못했습니다", + "refreshData": "데이터 새로고침", + "copyJson": "JSON 복사", + "hardReload": "페이지 강력 새로고침", + "pressF2ToClose": "이 메뉴를 닫으려면 F2를 다시 누르세요." + }, + "presets": { + "failedToLoad": "프리셋을 불러오지 못했습니다", + "nameRequired": "이름은 필수입니다", + "presetCreated": "프리셋이 생성되었습니다", + "failedToCreate": "프리셋 생성 실패: {msg}", + "presetApplied": "프리셋이 적용되었습니다 ({mode})", + "failedToApply": "프리셋 적용 실패", + "deleteTitle": "프리셋을 삭제할까요?", + "deleteConfirm": "이 프리셋을 삭제하시겠습니까?", + "presetDeleted": "프리셋이 삭제되었습니다", + "failedToDelete": "프리셋 삭제 실패", + "presetsBtn": "프리셋", + "managerTitle": "프리셋 관리자", + "managerDescription": "현재 구성을 프리셋으로 저장하거나 기존 프리셋을 적용하세요.", + "noPresetsYet": "아직 프리셋이 없습니다", + "noPresetsHint": "환경을 구성한 다음(스킬, 플러그인 등 활성화) 아래의 \"새 프리셋\"을 클릭하세요.", + "delete": "삭제", + "skillsCount": "• 스킬 {count}개", + "pluginsCount": "• 플러그인 {count}개", + "mcpsCount": "• MCP {count}개", + "exclusiveTitle": "이 항목들을 활성화하고 다른 모든 항목은 비활성화합니다", + "exclusive": "전용", + "additiveTitle": "이 항목들을 활성화합니다(다른 항목은 유지)", + "additive": "추가", + "newPreset": "새 프리셋", + "createPreset": "프리셋 생성", + "name": "이름", + "namePlaceholder": "예: Coding Mode", + "description": "설명", + "descPlaceholder": "코딩 스킬을 활성화합니다...", + "skills": "스킬", + "none": "없음", + "all": "전체", + "noSkillsFound": "스킬을 찾을 수 없습니다", + "plugins": "플러그인", + "noPluginsFound": "플러그인을 찾을 수 없습니다", + "mcps": "MCP", + "noMcpServersFound": "MCP 서버를 찾을 수 없습니다", + "savePreset": "프리셋 저장" + }, + "quota": { + "dailyQuota": "일일 할당량", + "resetsIn": "{time} 후 초기화", + "resetting": "초기화 중...", + "used": "{count} 사용됨", + "remaining": "{count} 남음" + }, + "sync": { + "title": "Sincronizado", + "description": "원격 AI 실행과 결합된 하이퍼로컬 개발 스택", + "body": "Sincronizado는 로컬 편집과 VPS의 원격 AI 실행을 연결합니다. OpenCode 또는 Claude Code를 사용하는 개발 워크플로에 적합합니다.", + "viewRepository": "저장소 보기", + "documentation": "문서" + }, + "accountPool": { + "ready": "준비됨", + "noAccounts": "풀에 계정이 없습니다", + "addAccountsHint": "다중 계정 순환을 사용하려면 {providerName} 계정을 추가하세요", + "connecting": "연결 중...", + "addAccount": "{providerName} 계정 추가", + "poolTitle": "{providerName} 풀", + "availableCount": "{available} / {total}개 사용 가능", + "clearAll": "모두 지우기", + "addBtn": "추가", + "nextBtn": "다음", + "active": "활성", + "cooldown": "쿨다운", + "reqs": "요청", + "timeLeft": "{time} 남음", + "switchBtn": "전환", + "setActive": "활성으로 설정", + "clearCooldown": "쿨다운 해제", + "markCooldown": "쿨다운으로 표시", + "removeAccount": "계정 제거", + "rename": "이름 변경", + "editMetadata": "메타데이터 편집", + "renameProfile": "프로필 이름 변경", + "newName": "새 이름", + "cancel": "취소", + "save": "저장", + "projectId": "프로젝트 ID", + "projectIdPlaceholder": "예: my-project-123", + "tier": "티어", + "tierPlaceholder": "예: free, paid", + "default": "기본값", + "addPreset": "프리셋 추가", + "ruleNamePlaceholder": "이름 (예: Rate Limit)", + "durationPlaceholder": "기간", + "min": "분", + "hour": "시간", + "day": "일", + "clearAllTitle": "모든 계정을 삭제할까요?", + "clearAllDescription": "풀에서 모든 {providerName} 계정을 제거합니다. 이 작업은 되돌릴 수 없습니다." + } + }, + "sidebar": { + "nav": { + "mcpServers": "MCP 서버", + "profiles": "프로필", + "skills": "스킬", + "plugins": "플러그인", + "commands": "명령어", + "agents": "에이전트", + "logs": "로그", + "rules": "규칙", + "codeSettings": "코드 설정", + "usage": "사용량", + "auth": "인증", + "settings": "설정", + "rawConfig": "원본 설정", + "quickstart": "빠른 시작" + }, + "status": { + "connected": "연결됨", + "disconnected": "연결 끊김" + }, + "tooltips": { + "launchBackend": "백엔드 실행", + "disconnectBackend": "백엔드 연결 해제", + "github": "GitHub" + }, + "disconnectDialog": { + "title": "백엔드 연결을 해제할까요?", + "description": "백엔드 서버가 종료됩니다. OpenCode 구성을 변경하려면 다시 실행해야 합니다.", + "cancel": "취소", + "disconnect": "연결 해제" + } + }, + "settings": { + "pageTitle": "설정", + "pageDocTitle": "설정", + "loading": "불러오는 중...", + "unknownError": "알 수 없는 오류", + "toast": { + "systemPromptUpdated": "시스템 프롬프트가 업데이트되었습니다", + "failedToSavePrompt": "시스템 프롬프트 저장 실패", + "settingsSaved": "설정이 저장되었습니다", + "failedToSaveSettings": "설정 저장 실패: {msg}", + "configPathUpdated": "설정 경로가 업데이트되었습니다", + "resetToAutoDetect": "자동 감지로 재설정", + "failedToSetConfigPath": "설정 경로 지정 실패: {msg}", + "failedToResetPath": "경로 재설정 실패: {msg}", + "backupDownloaded": "백업이 다운로드되었습니다", + "failedToCreateBackup": "백업 생성 실패: {msg}", + "invalidBackupFormat": "잘못된 백업 파일 형식입니다(버전 1이어야 함)", + "backupRestored": "백업이 복원되었습니다", + "failedToRestoreBackup": "백업 복원 실패: {msg}", + "ownerAndRepoRequired": "소유자와 저장소가 필요합니다", + "backupComplete": "백업 완료: {url}", + "backupFailed": "백업 실패", + "restoreFailed": "복원 실패", + "autoSyncEnabled": "자동 동기화가 활성화되었습니다", + "autoSyncDisabled": "자동 동기화가 비활성화되었습니다" + }, + "general": { + "title": "일반 설정", + "description": "핵심 OpenCode 동작을 구성합니다", + "theme": "테마", + "shareMode": "공유 모드", + "defaultAgent": "기본 에이전트", + "defaultAgentPlaceholder": "예: build", + "username": "사용자 이름", + "usernamePlaceholder": "이름을 입력하세요", + "smallModel": "소형 모델", + "smallModelPlaceholder": "예: gpt-4o-mini", + "autoUpdate": "자동 업데이트", + "autoUpdateDescription": "OpenCode를 자동으로 업데이트합니다", + "snapshot": "스냅샷", + "snapshotDescription": "대화 스냅샷을 활성화합니다" + }, + "customProviders": { + "title": "사용자 정의 공급자 및 모델", + "description": "OpenCode 공급자 및 모델 설정을 편집합니다", + "defaultModel": "기본 모델", + "smallModel": "소형 모델", + "providerCount": "공급자 {count}개 구성됨", + "addProvider": "공급자 추가", + "empty": "구성된 사용자 정의 공급자가 없습니다", + "unnamedProvider": "이름 없는 공급자", + "providerId": "공급자 ID", + "displayName": "표시 이름", + "api": "API", + "baseUrl": "기본 URL", + "apiKey": "API 키", + "npm": "NPM 패키지", + "env": "환경 변수", + "timeout": "제한 시간", + "headerTimeout": "헤더 제한 시간", + "chunkTimeout": "청크 제한 시간", + "disableTimeout": "제한 시간 비활성화", + "disableHeaderTimeout": "헤더 제한 시간 비활성화", + "setCacheKey": "캐시 키 설정", + "models": "모델", + "addModel": "모델 추가", + "unnamedModel": "이름 없는 모델", + "modelKey": "모델 키", + "modelId": "모델 ID", + "modelName": "모델 이름", + "contextLimit": "컨텍스트 한도", + "inputLimit": "입력 한도", + "outputLimit": "출력 한도", + "inputCost": "입력 비용", + "outputCost": "출력 비용", + "cacheReadCost": "캐시 읽기 비용", + "cacheWriteCost": "캐시 쓰기 비용", + "attachment": "첨부 파일", + "reasoning": "추론", + "temperature": "온도(Temperature)", + "toolCall": "도구 호출", + "experimental": "실험적 기능", + "validationError": "공급자 ID와 모델 키는 고유하고 비어 있지 않아야 합니다", + "ready": "저장 준비 완료", + "reset": "초기화", + "save": "공급자 저장", + "saving": "저장 중" + }, + "permissions": { + "title": "권한", + "description": "도구 권한 및 패턴을 관리합니다" + }, + "systemPrompt": { + "title": "시스템 프롬프트", + "description": "전역 OPENCODE.md 지침을 편집합니다", + "saveChanges": "변경 사항 저장" + }, + "backup": { + "title": "백업 및 복원", + "description": "전체 OpenCode 구성을 내보내거나 가져옵니다", + "exportTitle": "백업 내보내기", + "exportDescription": "모든 설정, MCP 구성, 스킬, 플러그인을 다운로드합니다", + "downloadBackup": "백업 다운로드", + "restoreTitle": "백업 복원", + "restoreDescription": "이전에 내보낸 백업 파일을 가져옵니다", + "selectBackupFile": "백업 파일 선택", + "restoreWarning": "경고: 현재 구성을 덮어씁니다", + "githubSync": "GitHub 동기화", + "githubSyncDescription": "비공개 GitHub 저장소에 구성을 백업 및 복원합니다", + "connectedAs": "{user}(으)로 연결됨", + "lastSync": "마지막 동기화: {date}", + "owner": "소유자", + "repository": "저장소", + "branch": "브랜치", + "autoSync": "자동 동기화", + "autoSyncDescription": "구성 변경 사항을 GitHub에 자동으로 푸시합니다", + "pushing": "푸시 중...", + "pushToGithub": "GitHub에 푸시", + "pulling": "가져오는 중...", + "pullFromGithub": "GitHub에서 가져오기", + "ghCliNotAuth": "GitHub CLI가 인증되지 않았습니다. 다음 명령을 실행하세요:", + "ghCliCommand": "gh auth login", + "ghCliNotAuthAfter": "명령으로 인증하세요." + }, + "code": { + "pageTitle": "코드 설정", + "pageDocTitle": "LSP 및 포매터 관리자", + "toast": { + "failedToLoadMetadata": "코드 설정 메타데이터를 불러오지 못했습니다" + }, + "resolutionContext": { + "title": "해석 컨텍스트", + "description": "실시간 백엔드 URL, 활성 OpenCode 설정 경로, 백엔드가 해석한 규칙 파일을 보여줍니다.", + "backendUrl": "백엔드 URL", + "activeConfig": "활성 설정", + "detectedConfig": "감지된 설정", + "projectRules": "프로젝트 규칙", + "rulesSource": "규칙 소스", + "pathStrategy": "PATH 전략", + "pathStrategyDescription": "백엔드 셸 조회 방식(WSL/Linux는 `which`, Windows는 `where`)", + "unknown": "알 수 없음", + "none": "없음" + }, + "lsp": { + "title": "LSP 서버", + "description": "감지는 백엔드 셸 PATH를 사용합니다. 바이너리가 `~/.nvm`, `~/.local/bin`, `~/.cargo/bin` 등에 있다면, 해당 PATH를 내보내는 셸에서 OpenCode Studio를 시작하세요.", + "checking": "확인 중", + "detectedInPath": "PATH에서 감지됨", + "notFoundInPath": "PATH에서 찾을 수 없음", + "lookingUpViaBackend": "백엔드 `which`로 조회 중", + "searchedViaBackend": "백엔드 `which {tool}`로 검색됨", + "enabled": "활성화됨", + "commandOverride": "명령어 재정의" + }, + "formatters": { + "title": "포매터" + } + } + }, + "quickstart": { + "copiedToClipboard": "클립보드에 복사되었습니다", + "stepMarkedIncomplete": "단계가 미완료로 표시되었습니다", + "stepCompleted": "단계가 완료되었습니다!", + "progressReset": "진행 상황이 초기화되었습니다", + "loading": "불러오는 중...", + "pageTitle": "빠른 시작", + "reset": "초기화", + "description": "향상된 에이전트와 스킬로 OpenCode를 설정하세요.", + "markIncompleteTitle": "미완료로 표시", + "markCompleteTitle": "완료로 표시", + "markIncomplete": "미완료로 표시", + "markComplete": "완료로 표시", + "github": "GitHub", + "recommended": "권장", + "critical": "중요", + "ohmyopencodeTitle": "Oh My OpenCode", + "ohmyopencodeDescription": "페르소나가 있는 향상된 에이전트 프레임워크", + "ohmyopencodeInstruction": "새 OpenCode 세션에 아래 내용을 붙여넣으세요:", + "ohmyopencodeWarningBefore": "다음 파일을 직접 수정하지 마세요:", + "ohmyopencodeWarningAfter": "대신 3단계의 설정을 사용하세요.", + "superpowersTitle": "Superpowers", + "superpowersDescription": "고급 스킬 및 워크플로", + "superpowersInstruction": "OpenCode 내부에서 실행하세요:", + "superpowersWarningBefore": "다음과 같은 오류가 보이면:", + "superpowersWarningAfter": ", 3단계의 시작 설정으로 해결할 수 있습니다.", + "starterkitTitle": "MoonStarter 설정 적용", + "starterkitDescription": "안전한 사전 구성 파일 복사", + "starterkitStep1": "1. 설정 폴더 찾기:", + "windows": "Windows", + "macLinux": "Mac/Linux", + "starterkitStep2": "2. 기존 파일 백업", + "starterkitStep3": "3. 다음 파일 생성:", + "chooseProvider": "모델 계열별 공급자 선택:", + "claudeLabel": "Claude (Anthropic)", + "gptLabel": "GPT (OpenAI)", + "geminiLabel": "Gemini (Google)", + "grokLabel": "Grok (xAI)", + "githubCopilot": "GitHub Copilot", + "opencodeFree": "OpenCode (무료)", + "directProviderWarningBefore": "직접 연결하는 공급자는 인증이 필요합니다. 다음을 실행하세요:", + "directProviderWarningAfter": "그런 다음 공급자를 선택하세요.", + "starterkitStep4": "4. OpenCode 재시작", + "whatYouGet": "제공되는 기능", + "stabilityFixes": "안정성 수정", + "stabilityFixesDesc": "Windows 충돌 및 모듈 오류 해결", + "mcpTools": "MCP 도구", + "mcpToolsDesc": "Shadcn, Supabase, 웹 검색", + "specializedAgents": "전문 에이전트", + "specializedAgentsDesc": "Oracle, Sisyphus, Librarian 등", + "superpowersSkills": "Superpowers 스킬", + "superpowersSkillsDesc": "TDD, 디버깅, 계획 워크플로" + }, + "auth": { + "failedToLoad": "인증 정보를 불러오지 못했습니다", + "loginTerminalOpened": "로그인 터미널이 열렸습니다", + "loginFailed": "로그인 실패", + "failedToStartLogin": "로그인 프로세스를 시작하지 못했습니다", + "logoutTitle": "로그아웃할까요?", + "logoutConfirm": "{provider}에서 로그아웃하시겠습니까?", + "loggedOut": "{provider}에서 로그아웃되었습니다", + "failedToLogout": "로그아웃 실패", + "savedProfile": "저장된 프로필: {name}", + "failedToSaveProfile": "프로필 저장 실패", + "activatedProfile": "활성화된 프로필: {name}", + "failedToActivateProfile": "프로필 활성화 실패", + "deleteProfileConfirm": "프로필 \"{name}\"을(를) 삭제하시겠습니까?", + "deletedProfile": "삭제된 프로필: {name}", + "failedToDeleteProfile": "프로필 삭제 실패", + "pageTitle": "인증", + "pageDocTitle": "인증 문서", + "pageDescription": "API 자격 증명을 관리하고 계정 간 전환을 수행하세요.", + "refresh": "새로고침", + "oauthLogin": "OAuth 로그인", + "apiKey": "API 키", + "loggedIn": "로그인됨", + "notLoggedIn": "로그인되지 않음", + "saveProfile": "프로필 저장", + "logout": "로그아웃", + "login": "로그인", + "loading": "불러오는 중...", + "savedProfiles": "저장된 프로필 ({count})", + "active": "활성", + "switchToProfile": "이 프로필로 전환", + "deleteProfileTitle": "프로필 삭제", + "noSavedProfiles": "저장된 프로필이 없습니다. 로그인하여 자격 증명을 저장하면 쉽게 전환할 수 있습니다." + }, + "mcp": { + "configMustBeObject": "설정은 JSON 객체여야 합니다", + "invalidJson": "잘못된 JSON입니다", + "failedToSave": "저장 실패", + "editTitle": "{name} 편집", + "configJson": "설정 (JSON)", + "cancel": "취소", + "saving": "저장 중...", + "save": "저장", + "loadFailed": "MCP 서버를 불러오지 못했습니다", + "toggleEnabled": "{name}이(가) 활성화되었습니다", + "toggleDisabled": "{name}이(가) 비활성화되었습니다", + "toggleFailed": "전환 실패: {error}", + "deleted": "{name}이(가) 삭제되었습니다", + "deleteFailed": "삭제 실패: {error}", + "added": "{name}이(가) 추가되었습니다", + "addFailed": "추가 실패: {error}", + "updated": "{name}이(가) 업데이트되었습니다", + "updateFailed": "업데이트 실패: {error}", + "title": "MCP 서버", + "docTitle": "MCP 서버", + "searchPlaceholder": "서버 검색...", + "noMatch": "\"{search}\"와(과) 일치하는 서버가 없습니다", + "deleteConfirmTitle": "{name}을(를) 삭제할까요?", + "deleteConfirmDescription": "MCP 서버 설정을 제거합니다.", + "delete": "삭제", + "unknownError": "알 수 없는 오류" + }, + "skills": { + "toggleEnabled": "{name}이(가) 활성화되었습니다", + "toggleDisabled": "{name}이(가) 비활성화되었습니다", + "toggleFailed": "스킬 전환 실패: {error}", + "deleteTitle": "스킬을 삭제할까요?", + "deleteConfirm": "{name}을(를) 삭제하시겠습니까?", + "title": "스킬", + "docTitleFull": "스킬 문서", + "docTitle": "스킬", + "searchPlaceholder": "스킬 검색...", + "noSkills": "스킬을 찾을 수 없습니다.", + "noMatch": "\"{search}\"와(과) 일치하는 스킬이 없습니다", + "unknownError": "알 수 없는 오류", + "delete": "삭제", + "cancel": "취소" + }, + "plugins": { + "incompatibleWarning": "Antigravity와 호환되지 않습니다. 대신 openskills를 사용하세요.", + "toggleEnabled": "{name}이(가) 활성화되었습니다", + "toggleDisabled": "{name}이(가) 비활성화되었습니다", + "toggleFailed": "플러그인 전환 실패: {error}", + "deleteTitle": "플러그인을 삭제할까요?", + "deleteConfirm": "{name}을(를) 삭제하시겠습니까?", + "title": "플러그인", + "docTitleFull": "플러그인 문서", + "docTitle": "플러그인", + "searchPlaceholder": "플러그인 검색...", + "noPlugins": "플러그인을 찾을 수 없습니다.", + "noMatch": "\"{search}\"와(과) 일치하는 플러그인이 없습니다", + "unknownError": "알 수 없는 오류", + "delete": "삭제", + "cancel": "취소" + }, + "commands": { + "loadFailed": "명령어를 불러오지 못했습니다", + "nameRequired": "명령어 이름은 필수입니다", + "templateRequired": "템플릿은 필수입니다", + "alreadyExists": "이미 존재하는 명령어입니다", + "createSuccess": "명령어 \"{name}\"이(가) 생성되었습니다", + "createFailed": "명령어 생성 실패", + "updateSuccess": "명령어 \"{name}\"이(가) 업데이트되었습니다", + "updateFailed": "명령어 업데이트 실패", + "deleteTitle": "명령어를 삭제할까요?", + "deleteConfirm": "명령어 \"{name}\"을(를) 삭제하시겠습니까?", + "deleteSuccess": "명령어 \"{name}\"이(가) 삭제되었습니다", + "deleteFailed": "명령어 삭제 실패", + "title": "명령어", + "docTitleFull": "명령어 문서", + "docTitle": "명령어", + "newCommand": "새 명령어", + "createTitle": "새 명령어 생성", + "commandName": "명령어 이름", + "commandNamePlaceholder": "my-command", + "commandNameHint": "opencode에서 /{name}으로 사용하세요", + "template": "템플릿", + "templatePlaceholder": "여기에 프롬프트 템플릿을 입력하세요. 사용자 입력에는 $ARGUMENTS를 사용하세요.", + "templateHint": "사용자가 입력한 인수를 포함하려면 $ARGUMENTS를 사용하세요", + "cancel": "취소", + "create": "생성", + "editTitle": "명령어 편집", + "editNameHint": "opencode에서 /{name}으로 사용하세요", + "saveChanges": "변경 사항 저장", + "noCommands": "구성된 명령어가 없습니다.", + "delete": "삭제" + }, + "agents": { + "sourceJson": "JSON", + "sourceMarkdown": "Markdown", + "sourceBuiltin": "내장", + "defaultMode": "subagent", + "disabled": "비활성화됨", + "noDescription": "설명 없음", + "enable": "활성화", + "disable": "비활성화", + "edit": "편집", + "delete": "삭제", + "loadFailed": "에이전트를 불러오지 못했습니다", + "nameRequired": "이름은 필수입니다", + "updated": "에이전트가 업데이트되었습니다", + "created": "에이전트가 생성되었습니다", + "saveFailed": "에이전트 저장 실패", + "deleteTitle": "에이전트를 삭제할까요?", + "deleteConfirm": "에이전트 \"{name}\"을(를) 삭제하시겠습니까?", + "deleted": "에이전트가 삭제되었습니다", + "deleteFailed": "에이전트 삭제 실패", + "toggleFailed": "에이전트 전환 실패", + "title": "에이전트", + "docTitle": "에이전트 문서", + "newAgent": "새 에이전트", + "loading": "에이전트를 불러오는 중...", + "editAgent": "에이전트 편집", + "dialogDescription": "에이전트의 정체성, 프롬프트, 도구, 권한을 관리합니다.", + "nameLabel": "이름", + "namePlaceholder": "agent-name", + "descriptionLabel": "설명", + "descriptionPlaceholder": "이 에이전트는 무엇을 하나요?", + "modeLabel": "모드", + "modelLabel": "모델 재정의", + "temperatureLabel": "온도(Temperature)", + "maxStepsLabel": "최대 단계", + "sourceLabel": "소스", + "scopeLabel": "범위", + "global": "전역", + "project": "프로젝트", + "toolsLabel": "도구", + "all": "전체", + "none": "없음", + "hidden": "숨김", + "systemPrompt": "시스템 프롬프트", + "toolPermissions": "도구 권한", + "toolPermissionsDescription": "이 에이전트가 어떤 도구를 어디서 사용할 수 있는지 세밀하게 제어합니다.", + "configure": "구성", + "cancel": "취소", + "saveAgent": "에이전트 저장", + "configurePermissions": "권한 구성", + "permissionsDescription": "각 도구에 대한 허용/거부 패턴과 접근 수준을 정의합니다.", + "done": "완료" + }, + "profiles": { + "loadFailed": "프로필을 불러오지 못했습니다", + "loadFailedWithError": "프로필을 불러오지 못했습니다: {error}", + "createSuccess": "프로필 {name}이(가) 생성되었습니다", + "createFailed": "프로필 생성 실패", + "createFailedWithError": "프로필 생성 실패: {error}", + "deleted": "프로필이 삭제되었습니다", + "deleteFailed": "프로필 삭제 실패", + "deleteFailedWithError": "프로필 삭제 실패: {error}", + "switchSuccess": "{name}(으)로 전환되었습니다", + "switchFailed": "프로필 전환 실패", + "switchFailedWithError": "프로필 전환 실패: {error}", + "loading": "불러오는 중...", + "title": "프로필", + "docTitle": "프로필 문서", + "activeProfile": "활성: {name}", + "noActiveProfile": "활성 프로필 없음", + "description": "격리된 OpenCode 환경(설정, 기록, 세션)을 관리합니다.", + "newProfile": "새 프로필", + "createTitle": "프로필 생성", + "createDescription": "새로운 격리된 설정 환경을 생성합니다.", + "namePlaceholder": "프로필 이름 (예: work)", + "cancel": "취소", + "create": "생성", + "active": "활성", + "current": "현재", + "switch": "전환", + "deleteTitle": "프로필을 삭제할까요?", + "deleteDescription": "프로필 \"{name}\"과(와) 관련된 모든 설정 및 기록이 영구적으로 삭제됩니다.", + "cancelBtn": "취소", + "deleteBtn": "삭제" + }, + "logs": { + "disconnected": "로그 스트림 연결이 끊겼습니다", + "connectFailed": "로그에 연결하지 못했습니다", + "title": "로그", + "docTitle": "실시간 로그 뷰어 및 디버거", + "filterAll": "전체", + "filterMcp": "MCP", + "filterAgent": "에이전트", + "filterError": "오류", + "resume": "재개", + "pause": "일시정지", + "auto": "자동", + "manual": "수동", + "clear": "지우기", + "noEntries": "아직 로그 항목이 없습니다." + }, + "rules": { + "loadFailed": "규칙을 불러오지 못했습니다", + "saved": "규칙이 저장되었습니다", + "saveFailed": "규칙 저장 실패", + "title": "프로젝트 규칙", + "docTitle": "프로젝트 규칙 (AGENTS.md) 편집기", + "notFound": "찾을 수 없음", + "save": "저장", + "templates": "템플릿", + "insert": "삽입", + "cancel": "취소", + "delete": "삭제", + "templateNextjsName": "Next.js 프로젝트", + "templateNextjsDesc": "Next.js App Router 프로젝트를 위한 규칙", + "templatePythonName": "Python 스크립트", + "templatePythonDesc": "Python 프로젝트를 위한 규칙" + }, + "usage": { + "range24h": "지난 24시간", + "range7d": "지난 7일", + "range30d": "지난 30일", + "range3m": "지난 3개월", + "range6m": "지난 6개월", + "range1y": "지난 1년", + "rangeCustom": "사용자 지정", + "selectBothDates": "시작일과 종료일을 모두 선택하세요.", + "startDateBefore": "시작일은 종료일보다 이전이어야 합니다.", + "fetchFailed": "사용량 통계를 가져오지 못했습니다: {error}", + "csvModel": "모델", + "csvInputTokens": "입력 토큰", + "csvOutputTokens": "출력 토큰", + "csvTotalTokens": "총 토큰", + "csvEstCost": "예상 비용", + "title": "토큰 사용량", + "docTitle": "사용량 문서", + "description": "프로젝트 전반의 지출 및 토큰 소비 분석입니다.", + "customDateRange": "사용자 지정 날짜 범위", + "selectDateRange": "시작일과 종료일을 선택하세요.", + "startDate": "시작일", + "endDate": "종료일", + "cancel": "취소", + "apply": "적용", + "allProjects": "모든 프로젝트", + "exportCsv": "CSV 내보내기", + "saveScreenshot": "스크린샷 저장", + "totalCost": "총 비용", + "estimatedTotalSpend": "예상 총 지출", + "inputVolume": "입력량", + "contextAndPrompts": "컨텍스트 및 프롬프트", + "outputVolume": "출력량", + "aiResponses": "AI 응답", + "usageTimeline": "사용량 타임라인", + "inputCost": "입력 비용", + "outputCost": "출력 비용", + "totalCostLabel": "총 비용", + "costBreakdown": "비용 분석", + "showLess": "간략히 보기", + "viewAll": "전체 보기", + "topProjects": "상위 프로젝트", + "project": "프로젝트", + "estimatedCost": "예상 비용", + "modelAnalysis": "모델 성능 분석", + "modelInterface": "모델 인터페이스", + "input": "입력", + "output": "출력", + "cost": "비용" + }, + "config": { + "invalidJson": "잘못된 JSON: {error}", + "saved": "설정이 저장되었습니다", + "saveFailed": "설정 저장 실패", + "cannotFormat": "형식을 지정할 수 없습니다: {error}", + "title": "원본 설정", + "docTitle": "설정", + "format": "형식 지정", + "reset": "초기화", + "saving": "저장 중...", + "save": "저장", + "fileName": "opencode.json", + "unsavedChanges": "(저장되지 않은 변경 사항)", + "description": "OpenCode 설정을 직접 편집합니다. JSON 구문에 유의하세요." + }, + "editor": { + "loadFailed": "파일을 불러오지 못했습니다", + "descriptionRequired": "스킬에는 설명이 필요합니다", + "saved": "{name} 저장됨", + "saveFailed": "파일 저장 실패", + "editSkill": "스킬 편집", + "editCommand": "명령어 편집", + "skillDoc": "스킬 문서", + "commandDoc": "명령어 문서", + "pluginDoc": "플러그인 문서", + "saving": "저장 중...", + "save": "저장", + "descriptionLabel": "설명", + "descriptionPlaceholder": "이 스킬이 하는 일에 대한 간단한 설명", + "descriptionHint": "필수입니다. 에이전트가 이 스킬을 언제 사용할지 결정하는 데 도움이 됩니다." + }, + "errors": { + "title": "문제가 발생했습니다", + "description": "예기치 않은 오류가 발생했습니다. 페이지를 새로고침하거나 홈으로 돌아가세요.", + "errorId": "오류 ID:", + "tryAgain": "다시 시도", + "goHome": "홈으로 이동", + "notFound": { + "title": "페이지를 찾을 수 없음", + "description": "찾으시는 페이지가 존재하지 않거나 이동되었습니다.", + "goBack": "뒤로 가기", + "goHome": "홈으로 이동" + }, + "codes": { + "CONFIG_NOT_FOUND": "설정을 찾을 수 없습니다", + "INVALID_PERMISSION": "잘못된 권한 값입니다", + "MISSING_AGENT_NAME": "에이전트 이름이 필요합니다", + "INVALID_AGENT_NAME": "잘못된 에이전트 이름 형식입니다", + "NO_CONFIG_PATH": "설정 경로를 찾을 수 없습니다", + "INVALID_NAME_OR_DURATION": "잘못된 이름 또는 기간입니다", + "INVALID_STATE": "잘못된 상태입니다", + "NO_CLOUD_PROVIDER": "연결된 클라우드 공급자가 없습니다", + "NO_SYNC_FILE": "동기화 파일을 찾을 수 없습니다", + "MISSING_AGENTS_PREFS": "에이전트 기본 설정이 없습니다", + "GH_NOT_LOGGED_IN": "GitHub CLI에 로그인되어 있지 않습니다", + "GH_USER_FAILED": "GitHub 사용자 정보를 가져오지 못했습니다", + "NO_REPO_CONFIGURED": "구성된 저장소가 없습니다", + "NO_BACKUP_IN_REPO": "저장소에서 백업을 찾을 수 없습니다", + "INVALID_SKILL_NAME": "잘못된 스킬 이름입니다", + "NOT_FOUND": "리소스를 찾을 수 없습니다", + "NO_CONFIG_FOR_SKILL": "스킬에 사용할 수 있는 설정이 없습니다", + "SKILL_NOT_FOUND": "스킬을 찾을 수 없습니다", + "PLUGIN_NOT_FOUND": "플러그인을 찾을 수 없습니다", + "NO_CONFIG_FOR_PLUGIN": "플러그인에 사용할 수 있는 설정이 없습니다", + "NO_AUTH_FOR_PROVIDER": "공급자에 대한 인증 정보를 찾을 수 없습니다", + "PROFILE_NOT_FOUND": "프로필을 찾을 수 없습니다", + "FAILED_OPEN_TERMINAL": "터미널을 열지 못했습니다", + "NO_TERMINAL": "터미널 에뮬레이터를 찾을 수 없습니다", + "NO_ACCOUNTS_IN_POOL": "풀에 계정이 없습니다", + "NO_AVAILABLE_ACCOUNTS": "사용 가능한 계정이 없습니다", + "PROFILE_FILE_NOT_FOUND": "프로필 파일을 찾을 수 없습니다", + "INVALID_PROVIDER_OR_LIMIT": "잘못된 공급자 또는 한도입니다", + "OAUTH_IN_PROGRESS": "OAuth 인증이 이미 진행 중입니다", + "OAUTH_TIMEOUT": "OAuth 인증 시간이 초과되었습니다", + "PRESET_NOT_FOUND": "프리셋을 찾을 수 없습니다", + "CLIENT_OUTDATED": "클라이언트 버전이 오래되었습니다", + "PROFILE_EXISTS": "이미 존재하는 프로필입니다", + "CANNOT_DELETE_ACTIVE": "활성 프로필은 삭제할 수 없습니다", + "CANNOT_DELETE_DEFAULT": "기본 프로필은 삭제할 수 없습니다", + "NO_OPENCODE_CONFIG_PATH": "OpenCode 설정 경로를 찾을 수 없습니다", + "FAILED_FETCH_USAGE": "사용량 통계를 가져오지 못했습니다", + "MISSING_GEMINI_OAUTH_CLIENT": "Gemini OAuth 설정이 없습니다" + } + }, + "help": { + "sectionLabels": { + "whatIsThis": "이것은 무엇인가요?", + "howToUse": "사용 방법", + "tips": "팁", + "viewDocs": "GitHub에서 문서 보기 →" + }, + "noContent": "표시할 도움말 내용이 없습니다.", + "agents": { + "title": "에이전트", + "description": "특정 도구와 권한이 정의된, 특정 작업을 수행할 수 있는 사용자 정의 AI 에이전트를 생성하고 관리합니다.", + "usage": "에이전트 빌더를 사용해 정체성, 동작, 기능을 구성하세요. 필요에 따라 에이전트를 켜고 끄세요.", + "tip0": "에이전트는 서브에이전트 또는 기본 모드로 실행됩니다", + "tip1": "보안을 위해 도구 권한을 정의하세요", + "tip2": "재사용을 위해 마크다운 기반 에이전트를 작성하세요" + }, + "mcp": { + "title": "MCP 서버", + "description": "Model Context Protocol(MCP) 서버는 외부 도구와 데이터 소스로 AI 기능을 확장합니다.", + "usage": "서버를 켜고 끄거나, npx 명령을 붙여넣어 새 서버를 추가하고, 사용하지 않는 설정을 삭제하세요.", + "tip0": "MCP 서버는 파일 시스템 접근, 웹 브라우징 등을 제공합니다", + "tip1": "활성화된 서버만 AI 세션에서 작동합니다" + }, + "skills": { + "title": "스킬", + "description": "특정 작업이나 도메인에 대한 AI 동작을 안내하는 재사용 가능한 프롬프트 템플릿입니다.", + "usage": "기존 스킬을 탐색하거나, 템플릿에서 새 스킬을 만들거나, GitHub URL에서 일괄 가져오세요.", + "tip0": "스킬은 ~/.config/opencode/skill/에 마크다운 파일로 저장됩니다", + "tip1": "더 나은 에이전트 선택을 위해 설명이 풍부한 제목을 사용하세요" + }, + "plugins": { + "title": "플러그인", + "description": "OpenCode에 사용자 정의 도구, 감시자, 라이프사이클 훅을 추가하는 JavaScript/TypeScript 확장 기능입니다.", + "usage": "템플릿에서 플러그인을 만들거나 기존 플러그인을 가져오세요. 플러그인은 파일을 수정하고, 명령을 실행하고, 변경 사항을 모니터링할 수 있습니다.", + "tip0": "플러그인은 전체 파일 시스템 접근 권한을 가진 Node.js에서 실행됩니다", + "tip1": "이벤트에 반응하려면 라이프사이클 훅을 사용하세요" + }, + "commands": { + "title": "명령어", + "description": "인수 플레이스홀더가 있는 재사용 가능한 프롬프트 템플릿을 만드는 사용자 정의 슬래시 명령어입니다.", + "usage": "$ARGUMENTS 플레이스홀더로 명령어를 만드세요. OpenCode CLI에서 /your-command를 사용하세요.", + "tip0": "명령어는 반복적인 작업에 적합합니다", + "tip1": "명확하고 간결한 프롬프트 템플릿을 사용하세요" + }, + "auth": { + "title": "인증", + "description": "Anthropic, OpenAI, Google, GitHub 등 클라우드 공급자의 API 자격 증명을 관리합니다.", + "usage": "OAuth 또는 API 키로 공급자에 로그인하세요. 프로필을 저장하면 계정 간 전환이 쉬워집니다.", + "tip0": "프로필은 계정별로 자격 증명을 격리합니다", + "tip1": "지원되는 공급자의 OAuth 토큰은 자동으로 갱신됩니다" + }, + "settings": { + "title": "설정", + "description": "전역 OpenCode 동작, 모델 별칭, 권한, 시스템 프롬프트를 구성합니다.", + "usage": "섹션을 펼쳐서 설정을 수정하세요. 변경 사항은 AI 세션에 즉시 적용됩니다.", + "tip0": "시스템 프롬프트는 모든 에이전트 대화에 영향을 줍니다", + "tip1": "권한 패턴은 도구 접근을 제어합니다" + }, + "profiles": { + "title": "프로필", + "description": "설정, 기록, 세션 메모리가 분리된 독립적인 OpenCode 환경입니다.", + "usage": "다른 프로젝트나 상황을 위한 새 프로필을 만드세요. 즉시 전환하여 전체 설정을 변경하세요.", + "tip0": "각 프로필은 자체 opencode.json을 가집니다", + "tip1": "업무/개인 프로젝트를 분리하는 데 유용합니다" + }, + "quickstart": { + "title": "빠른 시작", + "description": "처음 사용하는 사용자를 위해 OpenCode를 구성하는 대화형 설정 마법사입니다.", + "usage": "단계별 설정을 따라 인증, MCP, 스킬, 필수 설정을 구성하세요.", + "tip0": "새로운 OpenCode 설치에 권장됩니다", + "tip1": "기본 설정을 자동으로 생성합니다" + }, + "usage": { + "title": "토큰 사용량", + "description": "AI 세션 전반의 토큰 소비, 비용, 모델별 분석을 보여주는 대시보드입니다.", + "usage": "차트와 표를 통해 지출을 추적하세요. 날짜 범위, 프로젝트, 모델별로 필터링하세요.", + "tip0": "비용은 모델 요금을 기준으로 추정됩니다", + "tip1": "상세 분석을 위해 로그를 내보내세요" + }, + "logs": { + "title": "실시간 로그", + "description": "필터링 기능이 있는 OpenCode 디버그 로그용 실시간 뷰어입니다.", + "usage": "로그를 실시간으로 스트리밍하고, 일시정지/재개하고, 유형별로(MCP, 에이전트, 오류) 필터링하세요. 디버깅에 유용합니다.", + "tip0": "오류는 빨간색으로 강조 표시됩니다", + "tip1": "필터를 사용해 특정 이벤트에 집중하세요" + }, + "rules": { + "title": "프로젝트 규칙", + "description": "AGENTS.md 또는 CLAUDE.md에 저장된 프로젝트별 지침으로 AI 동작을 구성합니다.", + "usage": "규칙 파일을 직접 편집하거나 템플릿을 사용하세요. 규칙은 프로젝트의 모든 AI 에이전트에 적용됩니다.", + "tip0": "AGENTS.md는 프로젝트 문서화에 권장됩니다", + "tip1": "규칙은 기본 에이전트 동작을 재정의합니다" + }, + "config": { + "title": "원본 설정", + "description": "핵심 OpenCode 설정 파일인 opencode.json을 위한 직접 편집기입니다.", + "usage": "JSON을 직접 편집하세요. 저장 전에 검증됩니다. UI에서 제공하지 않는 고급 설정에 사용하세요.", + "tip0": "JSON 구문 오류가 있으면 저장할 수 없습니다", + "tip1": "형식 지정 버튼을 사용해 JSON을 보기 좋게 정리하세요" + }, + "editor": { + "title": "편집기", + "description": "스킬, 플러그인, 명령어를 생성하고 수정하기 위한 공용 편집기입니다.", + "usage": "구문 강조가 있는 Monaco 편집기를 사용하세요. 저장하면 파일이 생성되거나 업데이트됩니다.", + "tip0": "스킬에는 설명이 필요합니다", + "tip1": "플러그인은 훅과 감시자를 사용할 수 있습니다", + "tip2": "명령어는 $ARGUMENTS 플레이스홀더를 사용합니다" + } + }, + "dialogs": { + "cancel": "취소", + "fetch": "가져오기", + "importLabel": "URL에서 가져오기", + "fetchedToast": "URL에서 콘텐츠를 가져왔습니다", + "fetchFailed": "URL을 가져오지 못했습니다", + "addMcp": { + "trigger": "MCP 서버 추가", + "title": "MCP 서버 추가", + "quickAddLabel": "빠른 추가 - 명령 또는 JSON 붙여넣기", + "quickAddPlaceholder": "npx -y @modelcontextprotocol/server-memory\n\n또는 전체 JSON 설정 붙여넣기", + "quickAddHint": "npx 명령 또는 JSON을 붙여넣으세요 (mcpServers 래퍼 형식 지원)", + "serverNameLabel": "서버 이름", + "serverNamePlaceholder": "예: memory-server", + "configLabel": "설정 (JSON)", + "configHint": "전체 MCP 설정입니다. env, timeout, oauth 등을 추가하려면 직접 편집하세요.", + "adding": "추가 중...", + "addServer": "서버 추가", + "errors": { + "nameRequired": "서버 이름을 입력하세요", + "nameNoSpaces": "서버 이름에는 공백을 포함할 수 없습니다", + "configNotObject": "설정은 JSON 객체여야 합니다", + "invalidJson": "잘못된 JSON입니다", + "failedToAdd": "서버 추가 실패" + } + }, + "addSkill": { + "trigger": "새 스킬", + "title": "새 스킬 생성", + "importPlaceholder": "SKILL.md 파일의 URL을 붙여넣으세요...", + "importHint": "URL을 붙여넣으면 스킬 콘텐츠를 자동으로 가져옵니다 (예: SKILL.md의 raw GitHub URL)", + "nameLabel": "이름 *", + "namePlaceholder": "my-skill", + "nameHint": "소문자, 숫자, 하이픈만 사용하세요. skill/{name}/SKILL.md가 생성됩니다", + "descriptionLabel": "설명 *", + "descriptionPlaceholder": "이 스킬이 하는 일에 대한 간단한 설명", + "descriptionHint": "OpenCode에서 필수입니다. 에이전트가 이 스킬을 언제 사용할지 결정하는 데 도움이 됩니다.", + "contentLabel": "내용 (Markdown)", + "creating": "생성 중...", + "createSkill": "스킬 생성", + "createdToast": "스킬 생성됨: {name}", + "errors": { + "invalidUrl": "유효한 URL(http:// 또는 https://)을 입력하세요", + "nameRequired": "스킬 이름을 입력하세요", + "descriptionRequired": "스킬 설명을 입력하세요 (OpenCode에서 필수)", + "nameFormat": "이름은 소문자, 숫자, 단일 하이픈만 사용해야 합니다 (예: my-skill)", + "nameTooLong": "이름은 64자 이하여야 합니다", + "descriptionTooLong": "설명은 1024자 이하여야 합니다", + "createFailed": "스킬 생성 실패" + } + }, + "addPlugin": { + "trigger": "새 플러그인", + "title": "새 플러그인 생성", + "importPlaceholder": ".js 또는 .ts 파일의 URL을 붙여넣으세요...", + "importHint": "URL을 붙여넣으면 플러그인 콘텐츠를 자동으로 가져옵니다 (예: raw GitHub URL)", + "nameLabel": "플러그인 이름", + "namePlaceholder": "my-plugin", + "typeLabel": "유형", + "typeScript": "TypeScript", + "javaScript": "JavaScript", + "saveAsHint": "{fileName}(으)로 저장됩니다", + "templateLabel": "템플릿", + "contentLabel": "내용", + "creating": "생성 중...", + "createPlugin": "플러그인 생성", + "createdToast": "{name} 생성됨", + "addedToast": "설정에 플러그인 {count}개가 추가되었습니다", + "skippedToast": "이미 존재하는 {count}개를 건너뛰었습니다", + "templates": { + "basic": { + "name": "기본 플러그인", + "description": "session.idle 이벤트가 있는 최소 플러그인" + }, + "toolExecute": { + "name": "도구 실행 훅", + "description": "도구 실행 전/후에 코드를 실행합니다" + }, + "fileWatcher": { + "name": "파일 감시자", + "description": "파일 변경에 반응합니다" + }, + "messageHook": { + "name": "메시지 훅", + "description": "사용자/어시스턴트 메시지를 처리합니다" + }, + "sessionLifecycle": { + "name": "세션 라이프사이클", + "description": "세션 시작/종료 이벤트를 추적합니다" + }, + "gitHook": { + "name": "Git 훅", + "description": "git 작업에 반응합니다" + } + }, + "errors": { + "addToConfigFailed": "설정에 플러그인 추가 실패", + "invalidInput": "URL, npm 패키지 이름 또는 JSON 설정을 입력하세요", + "nameRequired": "플러그인 이름을 입력하세요", + "nameFormat": "이름에는 문자, 숫자, 하이픈, 밑줄만 사용할 수 있습니다", + "createFailed": "플러그인 생성 실패" + } + }, + "bulkImport": { + "trigger": "일괄 가져오기", + "titleSkills": "스킬 일괄 가져오기", + "titlePlugins": "플러그인 일괄 가져오기", + "placeholder": "URL을 한 줄에 하나씩 붙여넣으세요\n\n예시:\nhttps://raw.githubusercontent.com/.../SKILL.md\nhttps://raw.githubusercontent.com/.../another/SKILL.md", + "hintSkills": "SKILL.md 파일의 raw URL을 붙여넣으세요. 한 줄에 하나씩 입력하세요.", + "hintPlugins": "플러그인 파일의 raw URL을 붙여넣으세요. 한 줄에 하나씩 입력하세요.", + "fetchUrls": "URL 가져오기", + "fetching": "URL {count}개를 가져오는 중...", + "previewStatus": "{fetched}개 가져옴, {selected}개 선택됨", + "selectAll": "전체 선택", + "deselectAll": "전체 선택 해제", + "nameColumn": "이름", + "statusColumn": "상태", + "statusReady": "준비됨", + "statusExists": "이미 있음", + "importButton": "{type} {count}개 가져오기", + "importing": "가져오는 중 {current}/{total}...", + "importedToast": "{type} {success}/{total}개를 가져왔습니다", + "importFailedToast": "{type} {count}개 가져오기 실패", + "typeSkills": "스킬", + "typePlugins": "플러그인", + "errors": { + "noValidUrls": "유효한 URL이 없습니다. 한 줄에 하나씩 입력하세요.", + "maxUrls": "가져오기당 최대 50개의 URL이 허용됩니다.", + "fetchFailed": "URL을 가져오지 못했습니다", + "noItemsSelected": "가져올 항목이 선택되지 않았습니다." + } + }, + "pendingAction": { + "externalRequest": "외부 요청", + "mcpServer": "MCP 서버", + "skill": "스킬", + "plugin": "플러그인", + "commandLabel": "명령:", + "envLabel": "환경 변수:", + "toBeSet": "(설정 예정)", + "sourceUrlLabel": "소스 URL:", + "mcpWarning": "OpenCode 설정에 MCP 서버가 추가됩니다. 신뢰할 수 있는 출처인 경우에만 진행하세요.", + "skillDescription": "위 URL에서 스킬을 가져와 임포트합니다.", + "pluginWarning": "플러그인은 코드를 실행할 수 있습니다. 신뢰할 수 있는 출처에서만 가져오세요.", + "installMcpTitle": "MCP 서버를 설치할까요?", + "importSkillTitle": "스킬을 가져올까요?", + "importPluginTitle": "플러그인을 가져올까요?", + "installMcpDescription": "외부 링크가 MCP 서버 추가를 요청하고 있습니다.", + "importSkillDescription": "외부 링크가 스킬 가져오기를 요청하고 있습니다.", + "importPluginDescription": "외부 링크가 플러그인 가져오기를 요청하고 있습니다.", + "processing": "처리 중...", + "install": "설치", + "import": "가져오기", + "addedMcpToast": "MCP 서버 추가됨: {name}", + "importedSkillToast": "스킬 가져옴: {name}", + "importedPluginToast": "플러그인 가져옴: {name}", + "failedToast": "실패: {message}", + "actionCancelled": "작업이 취소되었습니다" + }, + "updateRequired": { + "title": "업데이트가 필요합니다", + "description": "백엔드 서버가 오래되어 이 버전의 OpenCode Studio와 호환되지 않습니다.", + "currentVersionLabel": "현재 버전:", + "unknown": "알 수 없음", + "requiredVersionLabel": "필요한 버전:", + "updateCommandLabel": "다음 명령을 실행해 업데이트하세요:", + "stopping": "중지 중...", + "stopServer": "서버 중지", + "serverStopped": "서버가 중지되었습니다. 업데이트를 실행한 후 다시 시작하세요.", + "checkAgain": "다시 확인", + "stepsHint": "서버 중지 → 업데이트 실행 → 서버 재시작 → 다시 확인" + } + }, + "appShell": { + "crimeTape": "작업 진행 중 • GitHub에 문제 보고 • 작업 진행 중 • GitHub에 문제 보고 • ", + "landing": { + "subtitle": "시각적 인터페이스로 OpenCode 설정을 관리하세요", + "launchBackend": "백엔드 실행", + "setupRequired": "설정 필요", + "step1Title": "1. OpenCode AI 설치", + "step2Title": "2. Studio 서버 설치", + "importantPrefix": "중요: 설치 후 한 번", + "importantSuffix": "명령을 실행해 설정을 초기화하세요.", + "github": "GitHub", + "npm": "npm", + "notConnectingPrefix": "연결되지 않나요? 다음을 시도해 보세요:", + "waiting": "백엔드 연결을 기다리는 중..." + } + } +} diff --git a/client-next/src/components/language-switcher.tsx b/client-next/src/components/language-switcher.tsx index b913269..adfe4d8 100644 --- a/client-next/src/components/language-switcher.tsx +++ b/client-next/src/components/language-switcher.tsx @@ -13,6 +13,7 @@ import { const locales = [ { code: "en", label: "English" }, { code: "zh-CN", label: "中文" }, + { code: "ko", label: "한국어" }, ] as const; export function LanguageSwitcher() { @@ -29,7 +30,7 @@ export function LanguageSwitcher() { From 6ce2c939987c559a4f7c08a2780237e9ac15adbf Mon Sep 17 00:00:00 2001 From: Microck Date: Fri, 10 Jul 2026 17:55:47 +0200 Subject: [PATCH 2/2] Update client-next/src/components/language-switcher.tsx Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- client-next/src/components/language-switcher.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client-next/src/components/language-switcher.tsx b/client-next/src/components/language-switcher.tsx index adfe4d8..f3c1f24 100644 --- a/client-next/src/components/language-switcher.tsx +++ b/client-next/src/components/language-switcher.tsx @@ -11,9 +11,9 @@ import { } from "@/components/ui/dropdown-menu"; const locales = [ - { code: "en", label: "English" }, - { code: "zh-CN", label: "中文" }, - { code: "ko", label: "한국어" }, + { code: "en", label: "English", triggerLabel: "EN" }, + { code: "zh-CN", label: "중文", triggerLabel: "中" }, + { code: "ko", label: "한국어", triggerLabel: "한" }, ] as const; export function LanguageSwitcher() {