claude-code-kr 0.2.2 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -10
- package/lib/locales/ko.json +147 -0
- package/lib/patcher.js +4 -1
- package/package.json +10 -3
- package/scripts/extract.js +205 -0
- package/lib/patches/stable.js +0 -178
package/README.md
CHANGED
|
@@ -94,15 +94,17 @@ claude-code-kr/
|
|
|
94
94
|
│ └── cc-kr.js # CLI 진입점 (cckr 명령어)
|
|
95
95
|
├── lib/
|
|
96
96
|
│ ├── patcher.js # 패치 엔진 (string + regex 매칭, 마커 스킵)
|
|
97
|
-
│ ├── mappings.js # 한글 커맨드 매핑
|
|
97
|
+
│ ├── mappings.js # 한글 커맨드 매핑 52개
|
|
98
98
|
│ ├── hooks.js # SessionStart hook 관리
|
|
99
|
+
│ ├── locales/
|
|
100
|
+
│ │ └── ko.json # 번역 카탈로그 (145개 정적 문자열)
|
|
99
101
|
│ └── patches/
|
|
100
|
-
│ ├── stable.js # 정적 문자열 교체 (안정)
|
|
101
102
|
│ ├── fragile.js # regex backreference (변수명 독립)
|
|
102
103
|
│ └── structural.js # 코드 구조 변경 (tab completion 등)
|
|
103
104
|
├── scripts/
|
|
104
105
|
│ ├── postinstall.js # npm install 시 자동 패치
|
|
105
|
-
│
|
|
106
|
+
│ ├── preuninstall.js # npm uninstall 시 자동 복원
|
|
107
|
+
│ └── extract.js # 번들 AST 파싱 → 번역 후보 추출 (devDep)
|
|
106
108
|
├── test/
|
|
107
109
|
│ └── patcher.test.js # 패치 테스트 25개
|
|
108
110
|
├── index.js # 모듈 진입점
|
|
@@ -118,13 +120,22 @@ claude-code-kr/
|
|
|
118
120
|
|
|
119
121
|
### 패치 구조
|
|
120
122
|
|
|
121
|
-
|
|
123
|
+
패치를 세 계층으로 관리합니다:
|
|
122
124
|
|
|
123
|
-
| 계층 | 안정성 | 매칭 방식 | CC 업데이트 시 |
|
|
124
|
-
|
|
125
|
-
| **안정 (stable)** | 높음 | 정적 문자열 (`"Yes"` → `"네"`) | Anthropic이 영어를 바꿀 때만 깨짐 |
|
|
126
|
-
| **가변 (fragile)** | 중간 | **regex backreference** (`/return (\w+)\?\`Reading \$\{\1\}\`/`) | 구조가 크게 바뀔 때만 깨짐 |
|
|
127
|
-
| **구조 (structural)** | 낮음 | 큰 코드 블록 (tab completion, autocomplete) | 함수 구조 변경 시 깨짐 |
|
|
125
|
+
| 계층 | 저장소 | 안정성 | 매칭 방식 | CC 업데이트 시 |
|
|
126
|
+
|------|--------|--------|----------|----------------|
|
|
127
|
+
| **안정 (stable)** | `lib/locales/ko.json` | 높음 | 정적 문자열 (`"Yes"` → `"네"`) | Anthropic이 영어를 바꿀 때만 깨짐 |
|
|
128
|
+
| **가변 (fragile)** | `lib/patches/fragile.js` | 중간 | **regex backreference** (`/return (\w+)\?\`Reading \$\{\1\}\`/`) | 구조가 크게 바뀔 때만 깨짐 |
|
|
129
|
+
| **구조 (structural)** | `lib/patches/structural.js` | 낮음 | 큰 코드 블록 (tab completion, autocomplete) | 함수 구조 변경 시 깨짐 |
|
|
130
|
+
|
|
131
|
+
**안정 패치는 카탈로그 기반**: `ko.json`에 `{"english": "한글"}` 한 줄만 추가하면 끝. regex 작성 불필요.
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"\"Do you want to proceed?\"": "\"실행할까요?\"",
|
|
136
|
+
"label:\"Yes\",value:\"yes\"": "label:\"네\",value:\"yes\""
|
|
137
|
+
}
|
|
138
|
+
```
|
|
128
139
|
|
|
129
140
|
**가변 패치의 핵심 — regex backreference**:
|
|
130
141
|
|
|
@@ -240,6 +251,33 @@ claude-code-kr/
|
|
|
240
251
|
- **CC 업데이트 시 가변 패치 깨질 수 있음** — `cckr apply -v`로 확인. 안정 패치는 유지됨.
|
|
241
252
|
- **한글 autocomplete** — IME 조합 중에는 자동완성이 트리거되지 않을 수 있음. 조합 완료 후 동작.
|
|
242
253
|
|
|
254
|
+
## 번역 추가 워크플로우 (contributor)
|
|
255
|
+
|
|
256
|
+
새 영어 텍스트를 발견하면:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
# 1. 번들에서 해당 텍스트 검색 (AST 컨텍스트 포함)
|
|
260
|
+
npm run find "Do you want"
|
|
261
|
+
|
|
262
|
+
# 출력:
|
|
263
|
+
# right: "Do you want to proceed?" ✓ ← 이미 번역됨
|
|
264
|
+
# arguments: "Do you want to allow this" ← 미번역
|
|
265
|
+
|
|
266
|
+
# 2. lib/locales/ko.json 에 번역 추가
|
|
267
|
+
# {
|
|
268
|
+
# "\"Do you want to allow this\"": "\"이 작업을 허용할까요?\""
|
|
269
|
+
# }
|
|
270
|
+
|
|
271
|
+
# 3. 적용
|
|
272
|
+
cckr apply --force
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
전체 후보 추출:
|
|
276
|
+
```bash
|
|
277
|
+
npm run extract
|
|
278
|
+
# → lib/locales/candidates.txt 에 1000+ 후보 저장
|
|
279
|
+
```
|
|
280
|
+
|
|
243
281
|
## 원리
|
|
244
282
|
|
|
245
283
|
Claude Code의 `cli.js` 번들을 문자열 매칭으로 패치합니다:
|
|
@@ -252,7 +290,7 @@ Claude Code의 `cli.js` 번들을 문자열 매칭으로 패치합니다:
|
|
|
252
290
|
{name:"btw", aliases:["근데"], description:"대화 흐름을 끊지 않고 사이드 질문하기"}
|
|
253
291
|
```
|
|
254
292
|
|
|
255
|
-
- 테스트 기준: Claude Code v2.1.98
|
|
293
|
+
- 테스트 기준: Claude Code v2.1.98 ~ v2.1.105
|
|
256
294
|
|
|
257
295
|
## License
|
|
258
296
|
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title:\"Bypass Permissions\",shortTitle:\"Bypass\"": "title:\"확인 생략\",shortTitle:\"생략\"",
|
|
3
|
+
"title:\"Accept edits\",shortTitle:\"Accept\"": "title:\"수정 허용\",shortTitle:\"허용\"",
|
|
4
|
+
"title:\"Don't Ask\",shortTitle:\"DontAsk\"": "title:\"묻지 않기\",shortTitle:\"자동\"",
|
|
5
|
+
"title:\"Auto mode\",shortTitle:\"Auto\"": "title:\"자동 모드\",shortTitle:\"자동\"",
|
|
6
|
+
"label:\"accept edits on\"": "label:\"수정 허용 모드\"",
|
|
7
|
+
"label:\"auto mode on\"": "label:\"자동 모드\"",
|
|
8
|
+
"\"Do you want to proceed?\"": "\"실행할까요?\"",
|
|
9
|
+
"\"Yes, and don't ask again for \"": "\"네, 다시 묻지 않기: \"",
|
|
10
|
+
"\"Yes, and don't ask again for\"": "\"네, 다시 묻지 않기:\"",
|
|
11
|
+
"\" commands in\"": "\" 명령어\"",
|
|
12
|
+
"\"commands in \"": "\"명령어 \"",
|
|
13
|
+
"label:\"Yes, and bypass permissions\"": "label:\"네, 확인 생략\"",
|
|
14
|
+
"label:\"Yes, and use auto mode\"": "label:\"네, 자동 모드 사용\"",
|
|
15
|
+
"label:\"Yes, auto-accept edits\"": "label:\"네, 수정 자동 허용\"",
|
|
16
|
+
"label:\"Yes, enable auto mode\"": "label:\"네, 자동 모드 활성화\"",
|
|
17
|
+
"label:\"Yes, enter plan mode\"": "label:\"네, 계획 모드 진입\"",
|
|
18
|
+
"label:\"Yes, and make it my default mode\"": "label:\"네, 기본 모드로 설정\"",
|
|
19
|
+
"label:\"Yes, for this session\"": "label:\"네, 이 세션에서\"",
|
|
20
|
+
"label:\"Yes, delete\"": "label:\"네, 삭제\"",
|
|
21
|
+
"label:\"Yes\",value:\"yes\"": "label:\"네\",value:\"yes\"",
|
|
22
|
+
"label:\"No, cancel\"": "label:\"아니요, 취소\"",
|
|
23
|
+
"label:\"No, exit\"": "label:\"아니요, 종료\"",
|
|
24
|
+
"label:\"No, exit Claude Code\"": "label:\"아니요, Claude Code 종료\"",
|
|
25
|
+
"label:\"Not now\"": "label:\"나중에\"",
|
|
26
|
+
"label:\"No, not now\"": "label:\"아니요, 나중에\"",
|
|
27
|
+
"label:\"No\",value:\"no\"": "label:\"아니요\",value:\"no\"",
|
|
28
|
+
"\"tell Claude what to do next\"": "\"다음에 할 일을 알려주세요\"",
|
|
29
|
+
"\"tell Claude what to do differently\"": "\"다르게 할 일을 알려주세요\"",
|
|
30
|
+
"\"What would you like to do?\"": "\"무엇을 할까요?\"",
|
|
31
|
+
"\"Yes, allow all edits during this session\"": "\"네, 이 세션에서 모든 수정 허용\"",
|
|
32
|
+
"\"Approved Plan\"": "\"계획 승인됨\"",
|
|
33
|
+
"\"Approved Plan (edited by user)\"": "\"계획 승인됨 (사용자 수정)\"",
|
|
34
|
+
"description:\"expand history\"": "description:\"기록 펼치기\"",
|
|
35
|
+
"description:\"expand\"": "description:\"펼치기\"",
|
|
36
|
+
"action:\"cycle\"": "action:\"전환하기\"",
|
|
37
|
+
"action:\"expand\"": "action:\"펼쳐보기\"",
|
|
38
|
+
"action:\"cancel\"": "action:\"취소\"",
|
|
39
|
+
"action:\"amend\"": "action:\"수정\"",
|
|
40
|
+
"action:\"confirm\"": "action:\"확인\"",
|
|
41
|
+
"action:\"select\"": "action:\"선택\"",
|
|
42
|
+
"action:\"navigate\"": "action:\"이동\"",
|
|
43
|
+
"action:\"continue\"": "action:\"계속\"",
|
|
44
|
+
"action:\"close\"": "action:\"닫기\"",
|
|
45
|
+
"action:\"go back\"": "action:\"뒤로\"",
|
|
46
|
+
"action:\"toggle\"": "action:\"전환\"",
|
|
47
|
+
"action:\"stop\"": "action:\"중지\"",
|
|
48
|
+
"action:\"skip\"": "action:\"건너뛰기\"",
|
|
49
|
+
"action:\"copy\"": "action:\"복사\"",
|
|
50
|
+
"\"Compound commands with cd and git require approval to prevent bare repository attacks\"": "\"cd+git 복합 명령어는 보안을 위해 승인이 필요합니다\"",
|
|
51
|
+
"\"Compound commands with cd and git require permission checks for enhanced security\"": "\"cd+git 복합 명령어는 보안 강화를 위해 권한 확인이 필요합니다\"",
|
|
52
|
+
"\"Space, Enter, or Escape to dismiss\"": "\"Space·Enter·Esc로 닫기\"",
|
|
53
|
+
"\" to cycle permission modes. Each mode c\"": "\" 권한 모드 전환\"",
|
|
54
|
+
"\"Showing detailed transcript · \"": "\"상세 기록 표시 중 · \"",
|
|
55
|
+
"\" to toggle\"": "\"으로 전환\"",
|
|
56
|
+
"\"collapse\":\"show all\"": "\"접기\":\"모두 보기\"",
|
|
57
|
+
"\" · n/N to navigate\"": "\" · n/N 탐색\"",
|
|
58
|
+
"scroll · home/end top/bottom": "스크롤 · home/end 처음/끝",
|
|
59
|
+
"\" tokens\"": "\" 토큰\"",
|
|
60
|
+
"\"Reading Plan\"": "\"계획 읽는 중\"",
|
|
61
|
+
"\"Running command\"": "\"명령어 실행 중\"",
|
|
62
|
+
" · /effort`": " · /노력`",
|
|
63
|
+
"\"! for bash mode\"": "\"! bash 모드\"",
|
|
64
|
+
"\"/ for commands\"": "\"/ 커맨드\"",
|
|
65
|
+
"\"@ for file paths\"": "\"@ 파일 경로\"",
|
|
66
|
+
"\"& for background\"": "\"& 백그라운드\"",
|
|
67
|
+
"\"/btw for side question\"": "\"/근데 사이드 질문\"",
|
|
68
|
+
"\"double tap esc to clear input\"": "\"esc 두 번 입력 지우기\"",
|
|
69
|
+
"\" for verbose output\"": "\" 자세히 보기\"",
|
|
70
|
+
"\" to paste images\"": "\" 이미지 붙여넣기\"",
|
|
71
|
+
"\" to switch model\"": "\" 모델 전환\"",
|
|
72
|
+
"\" for newline\"": "\" 줄바꿈\"",
|
|
73
|
+
"\" to customize\"": "\" 단축키 설정\"",
|
|
74
|
+
"\"For more help:\"": "\"도움말:\"",
|
|
75
|
+
"\"Interrupted \"": "\"중단됨 \"",
|
|
76
|
+
"\"· What should Claude do instead?\"": "\"· 대신 무엇을 할까요?\"",
|
|
77
|
+
"Claude Code has switched from npm to native installer. Run `claude install` or see https://docs.anthropic.com/en/docs/claude-code/getting-started for more options.": "Claude Code가 npm에서 네이티브 설치로 전환되었습니다. `claude install`을 실행하거나 https://docs.anthropic.com/en/docs/claude-code/getting-started 을 참고하세요.",
|
|
78
|
+
"\"Welcome back!\"": "\"다시 오셨네요!\"",
|
|
79
|
+
"\"Welcome to Claude Code\"": "\"Claude Code에 오신 것을 환영합니다\"",
|
|
80
|
+
"\"No recent activity\"": "\"최근 활동 없음\"",
|
|
81
|
+
"\"No conversations found to resume.\"": "\"이어서 할 대화가 없습니다.\"",
|
|
82
|
+
"\"Resuming session…\"": "\"세션 이어서 하는 중…\"",
|
|
83
|
+
"\"Compacting conversation…\"": "\"대화 압축 중…\"",
|
|
84
|
+
"\"Compacting conversation\"": "\"대화 압축 중\"",
|
|
85
|
+
"\"Conversation compacted\"": "\"대화 압축 완료\"",
|
|
86
|
+
"\" says: \"": "\": \"",
|
|
87
|
+
"\"Advisor unavailable (\"": "\"조언자 사용 불가 (\"",
|
|
88
|
+
"title:\"Accessing workspace:\"": "title:\"작업 폴더 접근:\"",
|
|
89
|
+
"\"Quick safety check: Is this a project you created or one you trust? (Like your own code, a well-known open source project, or work from your team). If not, take a moment to review what\"": "\"안전 확인: 직접 만들었거나 신뢰할 수 있는 프로젝트인가요? (본인 코드, 유명 오픈소스, 팀 프로젝트 등). 아니라면 이 폴더의 내용을 먼저 확인하세요\"",
|
|
90
|
+
"\"s in this folder first.\"": "\"\"",
|
|
91
|
+
"\"ll be able to read, edit, and execute files here.\"": "\"이 폴더의 파일을 읽고, 수정하고, 실행할 수 있습니다.\"",
|
|
92
|
+
"\"Security guide\"": "\"보안 가이드\"",
|
|
93
|
+
"label:\"Yes, I trust this folder\"": "label:\"네, 이 폴더를 신뢰합니다\"",
|
|
94
|
+
"label:\"Yes, I trust these settings\"": "label:\"네, 이 설정을 신뢰합니다\"",
|
|
95
|
+
"\"Tips for getting started\"": "\"시작 가이드\"",
|
|
96
|
+
"\"Recent activity\"": "\"최근 활동\"",
|
|
97
|
+
"\"Run /init to create a CLAUDE.md file with instructions for Claude\"": "\"/init으로 Claude 지시사항 CLAUDE.md 파일 만들기\"",
|
|
98
|
+
"\"Answering…\"": "\"답변 중…\"",
|
|
99
|
+
"\"Initializing…\"": "\"초기화 중…\"",
|
|
100
|
+
"\"Shortcuts\"": "\"단축키\"",
|
|
101
|
+
"progressMessage:\"creating commit\"": "progressMessage:\"커밋 생성 중\"",
|
|
102
|
+
"progressMessage:\"creating commit and PR\"": "progressMessage:\"커밋 및 PR 생성 중\"",
|
|
103
|
+
"progressMessage:\"reviewing pull request\"": "progressMessage:\"풀 리퀘스트 리뷰 중\"",
|
|
104
|
+
"progressMessage:\"analyzing your sessions\"": "progressMessage:\"세션 분석 중\"",
|
|
105
|
+
"\"Baked\",\"Brewed\",\"Churned\",\"Cogitated\",\"Cooked\",\"Crunched\",\"Sautéed\",\"Worked\"": "\"처리 완료\",\"처리 완료\",\"처리 완료\",\"처리 완료\",\"처리 완료\",\"처리 완료\",\"처리 완료\",\"처리 완료\"",
|
|
106
|
+
"\"Start with small features or bug fixes, tell Claude to propose a plan, and verify its suggested edits\"": "\"작은 기능이나 버그 수정부터 시작하고, Claude에게 계획을 제안하게 한 뒤 수정 사항을 확인하세요\"",
|
|
107
|
+
"\"Use /config to change your default permission mode (including Plan Mode)\"": "\"/config로 기본 권한 모드를 변경할 수 있습니다 (계획 모드 포함)\"",
|
|
108
|
+
"\"Use git worktrees to run multiple Claude sessions in parallel.\"": "\"git worktree로 여러 Claude 세션을 병렬 실행할 수 있습니다.\"",
|
|
109
|
+
"\"Running multiple Claude sessions? Use /color and /rename to tell them apart at a glance.\"": "\"여러 Claude 세션 실행 중? /color와 /rename으로 구분하세요.\"",
|
|
110
|
+
"\"Use /memory to view and manage Claude memory\"": "\"/memory로 Claude 메모리를 관리하세요\"",
|
|
111
|
+
"\"Use /theme to change the color theme\"": "\"/theme으로 색상 테마를 변경하세요\"",
|
|
112
|
+
"\"Try setting environment variable COLORTERM=truecolor for richer colors\"": "\"환경변수 COLORTERM=truecolor를 설정하면 더 풍부한 색상을 사용할 수 있습니다\"",
|
|
113
|
+
"\"Use /statusline to set up a custom status line that will display beneath the input box\"": "\"/statusline으로 입력창 아래에 커스텀 상태줄을 설정하세요\"",
|
|
114
|
+
"\"Hit Enter to queue up additional messages while Claude is working.\"": "\"Claude 작업 중 Enter를 눌러 추가 메시지를 대기열에 넣으세요.\"",
|
|
115
|
+
"\"Send messages to Claude while it works to steer Claude in real-time\"": "\"Claude 작업 중 메시지를 보내 실시간으로 방향을 조정하세요\"",
|
|
116
|
+
"\"Ask Claude to create a todo list when working on complex tasks to track progress and remain on track\"": "\"복잡한 작업 시 Claude에게 할 일 목록을 만들게 하면 진행 상황을 추적할 수 있습니다\"",
|
|
117
|
+
"\"Connect Claude to your IDE · /ide\"": "\"Claude를 IDE에 연결하세요 · /ide\"",
|
|
118
|
+
"\"Run /install-github-app to tag @claude right from your Github issues and PRs\"": "\"/install-github-app으로 GitHub 이슈와 PR에서 @claude를 태그하세요\"",
|
|
119
|
+
"\"Run /install-slack-app to use Claude in Slack\"": "\"/install-slack-app으로 Slack에서 Claude를 사용하세요\"",
|
|
120
|
+
"\"Use /permissions to pre-approve and pre-deny bash, edit, and MCP tools\"": "\"/permissions로 bash, edit, MCP 도구를 미리 허용/거부하세요\"",
|
|
121
|
+
"\"Did you know you can drag and drop image files into your terminal?\"": "\"터미널에 이미지 파일을 드래그 앤 드롭할 수 있습니다\"",
|
|
122
|
+
"\"Paste images into Claude Code using control+v (not cmd+v!)\"": "\"control+v로 Claude Code에 이미지를 붙여넣으세요 (cmd+v 아님!)\"",
|
|
123
|
+
"\"Double-tap esc to rewind the conversation to a previous point in time\"": "\"esc 두 번 눌러 대화를 이전 시점으로 되돌리세요\"",
|
|
124
|
+
"\"Double-tap esc to rewind the code and/or conversation to a previous point in time\"": "\"esc 두 번 눌러 코드와 대화를 이전 시점으로 되돌리세요\"",
|
|
125
|
+
"\"Run claude --continue or claude --resume to resume a conversation\"": "\"claude --continue 또는 --resume으로 대화를 이어서 하세요\"",
|
|
126
|
+
"\"Name your conversations with /rename to find them easily in /resume later\"": "\"/rename으로 대화 이름을 지정하면 /resume에서 쉽게 찾을 수 있습니다\"",
|
|
127
|
+
"\"Create skills by adding .md files to .claude/skills/ in your project or ~/.claude/skills/ for skills that work in any project\"": "\".claude/skills/에 .md 파일을 추가해 스킬을 만드세요. ~/.claude/skills/는 모든 프로젝트에서 사용 가능\"",
|
|
128
|
+
"\"Use /agents to optimize specific tasks. Eg. Software Architect, Code Writer, Code Reviewer\"": "\"/agents로 특정 작업을 최적화하세요. 예: Software Architect, Code Writer, Code Reviewer\"",
|
|
129
|
+
"\"Use --agent <agent_name> to directly start a conversation with a subagent\"": "\"--agent <에이전트명>으로 서브에이전트와 직접 대화를 시작하세요\"",
|
|
130
|
+
"\"Run Claude Code locally or remotely using the Claude desktop app: clau.de/desktop\"": "\"Claude 데스크톱 앱으로 로컬/원격에서 실행하세요: clau.de/desktop\"",
|
|
131
|
+
"\"Run tasks in the cloud while you keep coding locally · clau.de/web\"": "\"로컬에서 코딩하면서 클라우드에서 작업 실행 · clau.de/web\"",
|
|
132
|
+
"\"/mobile to use Claude Code from the Claude app on your phone\"": "\"/mobile로 휴대폰 Claude 앱에서 Claude Code 사용\"",
|
|
133
|
+
"\"Use /feedback to help us improve!\"": "\"/feedback으로 개선에 도움을 주세요!\"",
|
|
134
|
+
"\"chat:imagePaste\",\"Chat\",\"ctrl+v\")} to paste images from your clipboard": "\"chat:imagePaste\",\"Chat\",\"ctrl+v\")}로 클립보드 이미지를 붙여넣으세요",
|
|
135
|
+
"Use Plan Mode to prepare for a complex request before making changes. Press ${": "복잡한 요청 전 계획 모드로 준비하세요. ${",
|
|
136
|
+
"\"chat:cycleMode\",\"Chat\",\"shift+tab\")} twice to enable.": "\"chat:cycleMode\",\"Chat\",\"shift+tab\")}를 두 번 눌러 활성화하세요.",
|
|
137
|
+
"\"chat:cycleMode\",\"Chat\",\"shift+tab\")} to cycle between default mode, auto-accept edit mode, and plan mode": "\"chat:cycleMode\",\"Chat\",\"shift+tab\")}로 기본 모드, 수정 허용, 계획 모드를 전환하세요",
|
|
138
|
+
"\"chat:cycleMode\",\"Chat\",\"shift+tab\")} twice to activate Plan Mode and plan with Claude Opus.": "\"chat:cycleMode\",\"Chat\",\"shift+tab\")}를 두 번 눌러 계획 모드를 활성화하세요.",
|
|
139
|
+
"Your default model setting is Opus Plan Mode. Press ${": "기본 모델이 Opus 계획 모드입니다. ${",
|
|
140
|
+
"Continue your session in Claude Code Desktop with ${": "Claude Code Desktop에서 세션 이어가기: ${",
|
|
141
|
+
"\"Run /terminal-setup to enable convenient terminal integration like Option + Enter for new line and more\"": "\"/terminal-setup으로 Option+Enter 줄바꿈 등 터미널 연동을 설정하세요\"",
|
|
142
|
+
"\"Run /terminal-setup to enable convenient terminal integration like Shift + Enter for new line and more\"": "\"/terminal-setup으로 Shift+Enter 줄바꿈 등 터미널 연동을 설정하세요\"",
|
|
143
|
+
"\"Press Option+Enter to send a multi-line message\"": "\"Option+Enter로 여러 줄 메시지를 보내세요\"",
|
|
144
|
+
"\"Press Shift+Enter to send a multi-line message\"": "\"Shift+Enter로 여러 줄 메시지를 보내세요\"",
|
|
145
|
+
"\"Run /terminal-setup to enable Option+Enter for new lines\"": "\"/terminal-setup으로 Option+Enter 줄바꿈을 설정하세요\"",
|
|
146
|
+
"\"Run /terminal-setup to enable Shift+Enter for new lines\"": "\"/terminal-setup으로 Shift+Enter 줄바꿈을 설정하세요\""
|
|
147
|
+
}
|
package/lib/patcher.js
CHANGED
|
@@ -2,12 +2,15 @@ const fs = require('fs');
|
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const { execSync } = require('child_process');
|
|
4
4
|
const mappings = require('./mappings');
|
|
5
|
-
const
|
|
5
|
+
const koCatalog = require('./locales/ko.json');
|
|
6
6
|
const fragilePatches = require('./patches/fragile');
|
|
7
7
|
const structuralPatches = require('./patches/structural');
|
|
8
8
|
const { TESTED_CC_VERSION } = require('./patches/fragile');
|
|
9
9
|
const pkg = require('../package.json');
|
|
10
10
|
|
|
11
|
+
// 카탈로그를 [old, new] 배열로 변환 (runtime 변환, 0ms)
|
|
12
|
+
const stablePatches = Object.entries(koCatalog);
|
|
13
|
+
|
|
11
14
|
function findCliJs() {
|
|
12
15
|
try {
|
|
13
16
|
const bin = execSync('which claude', { encoding: 'utf8' }).trim();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-code-kr",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Claude Code 한글 패치 CLI — /btw → /근데, /help → /도움, /compact → /압축",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"bin": {
|
|
@@ -9,13 +9,17 @@
|
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
11
|
"postinstall": "node ./scripts/postinstall.js",
|
|
12
|
-
"preuninstall": "node ./scripts/preuninstall.js"
|
|
12
|
+
"preuninstall": "node ./scripts/preuninstall.js",
|
|
13
|
+
"test": "node test/patcher.test.js",
|
|
14
|
+
"extract": "node scripts/extract.js --write",
|
|
15
|
+
"find": "node scripts/extract.js"
|
|
13
16
|
},
|
|
14
17
|
"files": [
|
|
15
18
|
"bin/",
|
|
16
19
|
"lib/",
|
|
17
20
|
"scripts/",
|
|
18
|
-
"index.js"
|
|
21
|
+
"index.js",
|
|
22
|
+
"!lib/locales/candidates.txt"
|
|
19
23
|
],
|
|
20
24
|
"keywords": [
|
|
21
25
|
"claude-code",
|
|
@@ -40,5 +44,8 @@
|
|
|
40
44
|
"homepage": "https://github.com/shallwefootball/cc-kr#readme",
|
|
41
45
|
"engines": {
|
|
42
46
|
"node": ">=18"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@babel/parser": "^7.29.2"
|
|
43
50
|
}
|
|
44
51
|
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// cli.js AST를 파싱해서 사용자 대상 영어 문자열 후보를 추출.
|
|
4
|
+
// 이미 번역된 것은 제외. 결과는 stdout 또는 candidates.txt로.
|
|
5
|
+
//
|
|
6
|
+
// 사용법:
|
|
7
|
+
// node scripts/extract.js # 후보 목록을 stdout에
|
|
8
|
+
// node scripts/extract.js --write # locales/candidates.txt 에 저장
|
|
9
|
+
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const parser = require('@babel/parser');
|
|
13
|
+
const { findCliJs } = require('../lib/patcher');
|
|
14
|
+
const catalog = require('../lib/locales/ko.json');
|
|
15
|
+
|
|
16
|
+
const cliJs = findCliJs();
|
|
17
|
+
if (!cliJs) {
|
|
18
|
+
console.error('Claude Code가 설치되어 있지 않습니다.');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const bakPath = cliJs + '.bak';
|
|
23
|
+
const sourcePath = fs.existsSync(bakPath) ? bakPath : cliJs;
|
|
24
|
+
console.error(`파싱 중: ${sourcePath}`);
|
|
25
|
+
|
|
26
|
+
const source = fs.readFileSync(sourcePath, 'utf8');
|
|
27
|
+
const start = Date.now();
|
|
28
|
+
const ast = parser.parse(source, {
|
|
29
|
+
errorRecovery: true,
|
|
30
|
+
sourceType: 'unambiguous',
|
|
31
|
+
plugins: ['jsx'],
|
|
32
|
+
});
|
|
33
|
+
console.error(`파싱 완료: ${Date.now() - start}ms`);
|
|
34
|
+
|
|
35
|
+
// 이미 카탈로그에 있는 문자열 (quoted 형태와 raw 형태 둘 다)
|
|
36
|
+
const known = new Set();
|
|
37
|
+
for (const key of Object.keys(catalog)) {
|
|
38
|
+
// "..." 형태면 raw 추출
|
|
39
|
+
const m = key.match(/^"(.*)"$/);
|
|
40
|
+
if (m) known.add(m[1]);
|
|
41
|
+
else known.add(key);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 휴리스틱: 사용자 대상 영어 문자열
|
|
45
|
+
const MIN_LENGTH = 5;
|
|
46
|
+
const MAX_LENGTH = 500;
|
|
47
|
+
const ENGLISH_PATTERN = /^[\x20-\x7E]+$/;
|
|
48
|
+
|
|
49
|
+
// 사용자 대상 property key (여기 나오는 문자열은 높은 확률로 UI)
|
|
50
|
+
const UI_PROPS = new Set([
|
|
51
|
+
'label', 'title', 'description', 'message', 'placeholder',
|
|
52
|
+
'hint', 'tooltip', 'text', 'displayText', 'shortTitle',
|
|
53
|
+
'whenToUse', 'confirmLabel', 'cancelLabel', 'errorMessage',
|
|
54
|
+
'subtitle', 'summary', 'body', 'content',
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
// 2단어 이상이거나, 구두점이 있거나, 특수 패턴
|
|
58
|
+
function looksLikeSentence(str) {
|
|
59
|
+
const trimmed = str.trim();
|
|
60
|
+
if (trimmed.length === 0) return false;
|
|
61
|
+
// 양쪽 공백 문자열 (형식용)
|
|
62
|
+
if (str !== trimmed && !trimmed.includes(' ')) return false;
|
|
63
|
+
// 최소 2단어 OR 구두점 (?, ., !)
|
|
64
|
+
const wordCount = trimmed.split(/\s+/).length;
|
|
65
|
+
const hasPunct = /[.?!]/.test(trimmed);
|
|
66
|
+
if (wordCount < 2 && !hasPunct) return false;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function isLikelyCode(str) {
|
|
71
|
+
// JS 코드 조각
|
|
72
|
+
if (/[\[\]{}()]|=>|\$\{|&&|\|\||===|!==/.test(str)) return true;
|
|
73
|
+
// URL / 경로
|
|
74
|
+
if (/https?:\/\/|^[./~]|\\\\/.test(str)) return true;
|
|
75
|
+
// 개행/탭 escape
|
|
76
|
+
if (/\\n|\\t|\\r/.test(str)) return true;
|
|
77
|
+
// 카멜케이스/스네이크 식별자
|
|
78
|
+
if (/^[a-z][a-zA-Z0-9_]*$/.test(str)) return true;
|
|
79
|
+
// 이벤트 ID 형식 (chat:cycleMode 등)
|
|
80
|
+
if (/^[a-z]+:[a-zA-Z]+$/.test(str)) return true;
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// 번들된 라이브러리 에러/설명 문자열 (CC가 아닌 dep)
|
|
85
|
+
function isLibraryNoise(str) {
|
|
86
|
+
// validation 에러 (joi/zod/jwt 등)
|
|
87
|
+
if (/\bmust be (a |an |the )?(valid |string|boolean|number|array|object|integer|positive)/.test(str)) return true;
|
|
88
|
+
if (/\bshould be (a |an )?(number|string|valid)/.test(str)) return true;
|
|
89
|
+
// AWS/SDK 설명
|
|
90
|
+
if (/SDK for |Client for (Node\.js|Browser)| client library/.test(str)) return true;
|
|
91
|
+
// 일반 에러/스택트레이스
|
|
92
|
+
if (/^Error: |^TypeError:|^RangeError:|^SyntaxError:/.test(str)) return true;
|
|
93
|
+
if (/<tool_use_error>/.test(str)) return true;
|
|
94
|
+
// 파서/라이브러리 내부
|
|
95
|
+
if (/unexpected (token|end|character)|parsing error|invalid (character|escape)/i.test(str)) return true;
|
|
96
|
+
// HTTP/네트워킹 라이브러리
|
|
97
|
+
if (/\b(getaddrinfo|ECONNREFUSED|ENOTFOUND|ETIMEDOUT)\b/.test(str)) return true;
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function isUserFacing(str, fromUIProp = false) {
|
|
102
|
+
if (str.length < MIN_LENGTH || str.length > MAX_LENGTH) return false;
|
|
103
|
+
if (!ENGLISH_PATTERN.test(str)) return false;
|
|
104
|
+
if (known.has(str)) return false;
|
|
105
|
+
if (isLikelyCode(str)) return false;
|
|
106
|
+
if (isLibraryNoise(str)) return false;
|
|
107
|
+
// UI property의 value는 조금 더 관대 (단일 단어도 허용)
|
|
108
|
+
if (fromUIProp) {
|
|
109
|
+
if (str.length < 2) return false;
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
return looksLikeSentence(str);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const candidates = new Set();
|
|
116
|
+
const uiPropCandidates = new Set();
|
|
117
|
+
let totalLiterals = 0;
|
|
118
|
+
|
|
119
|
+
function walk(node, parent, parentKey) {
|
|
120
|
+
if (!node || typeof node !== 'object') return;
|
|
121
|
+
|
|
122
|
+
if (node.type === 'StringLiteral' && typeof node.value === 'string') {
|
|
123
|
+
totalLiterals++;
|
|
124
|
+
// UI property의 값인지 체크
|
|
125
|
+
const isUiValue = parent?.type === 'ObjectProperty'
|
|
126
|
+
&& parent.value === node
|
|
127
|
+
&& parent.key?.type === 'Identifier'
|
|
128
|
+
&& UI_PROPS.has(parent.key.name);
|
|
129
|
+
if (isUiValue) {
|
|
130
|
+
if (isUserFacing(node.value, true)) uiPropCandidates.add(node.value);
|
|
131
|
+
} else {
|
|
132
|
+
if (isUserFacing(node.value, false)) candidates.add(node.value);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (node.type === 'TemplateElement' && node.value?.raw) {
|
|
136
|
+
totalLiterals++;
|
|
137
|
+
if (isUserFacing(node.value.raw, false)) candidates.add(node.value.raw);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
for (const key in node) {
|
|
141
|
+
if (key === 'loc' || key === 'range' || key === 'start' || key === 'end') continue;
|
|
142
|
+
const val = node[key];
|
|
143
|
+
if (Array.isArray(val)) {
|
|
144
|
+
for (const item of val) walk(item, node, key);
|
|
145
|
+
} else if (val && typeof val === 'object') {
|
|
146
|
+
walk(val, node, key);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// find 모드: 특정 문자열 검색
|
|
152
|
+
const findArg = process.argv.slice(2).find(a => !a.startsWith('-'));
|
|
153
|
+
if (findArg) {
|
|
154
|
+
const matches = [];
|
|
155
|
+
function findWalk(node, parent, parentKey) {
|
|
156
|
+
if (!node || typeof node !== 'object') return;
|
|
157
|
+
if (node.type === 'StringLiteral' && typeof node.value === 'string' && node.value.includes(findArg)) {
|
|
158
|
+
matches.push({
|
|
159
|
+
value: node.value,
|
|
160
|
+
parentType: parent?.type,
|
|
161
|
+
parentKey: parent?.key?.name || parentKey,
|
|
162
|
+
line: node.loc?.start?.line,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
for (const key in node) {
|
|
166
|
+
if (key === 'loc' || key === 'range') continue;
|
|
167
|
+
const val = node[key];
|
|
168
|
+
if (Array.isArray(val)) for (const item of val) findWalk(item, node, key);
|
|
169
|
+
else if (val && typeof val === 'object') findWalk(val, node, key);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
findWalk(ast.program || ast, null, null);
|
|
173
|
+
console.error(`"${findArg}" 매칭: ${matches.length}개\n`);
|
|
174
|
+
for (const m of matches.slice(0, 20)) {
|
|
175
|
+
const known_mark = known.has(m.value) ? ' ✓' : '';
|
|
176
|
+
console.log(`${m.parentKey || '?'}: ${JSON.stringify(m.value)}${known_mark}`);
|
|
177
|
+
}
|
|
178
|
+
if (matches.length > 20) console.error(`... +${matches.length - 20}개 더`);
|
|
179
|
+
process.exit(0);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
walk(ast.program || ast, null, null);
|
|
183
|
+
console.error(`총 문자열 리터럴: ${totalLiterals}`);
|
|
184
|
+
console.error(`UI property 값: ${uiPropCandidates.size}`);
|
|
185
|
+
console.error(`일반 후보 (문장): ${candidates.size}`);
|
|
186
|
+
|
|
187
|
+
// UI property 후보가 우선 (정확도 높음), 그 다음 일반
|
|
188
|
+
const ui = [...uiPropCandidates].sort();
|
|
189
|
+
const general = [...candidates].sort();
|
|
190
|
+
|
|
191
|
+
const output = [
|
|
192
|
+
'# UI property (label/title/description 등)',
|
|
193
|
+
...ui,
|
|
194
|
+
'',
|
|
195
|
+
'# 일반 후보 (멀티워드 / 구두점 있는 문장)',
|
|
196
|
+
...general,
|
|
197
|
+
].join('\n');
|
|
198
|
+
|
|
199
|
+
if (process.argv.includes('--write')) {
|
|
200
|
+
const outPath = path.join(__dirname, '..', 'lib', 'locales', 'candidates.txt');
|
|
201
|
+
fs.writeFileSync(outPath, output + '\n');
|
|
202
|
+
console.error(`저장됨: ${outPath}`);
|
|
203
|
+
} else {
|
|
204
|
+
console.log(output);
|
|
205
|
+
}
|
package/lib/patches/stable.js
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
// ──────────────────────────────────────────────────────────
|
|
2
|
-
// stable — 정적 문자열만 사용. CC 업데이트에도 안정적.
|
|
3
|
-
// 순수 "quoted string" 또는 property:"value" 패턴.
|
|
4
|
-
// minify된 변수명에 의존하지 않음.
|
|
5
|
-
// ──────────────────────────────────────────────────────────
|
|
6
|
-
module.exports = [
|
|
7
|
-
// 권한 모드 title/shortTitle
|
|
8
|
-
['title:"Bypass Permissions",shortTitle:"Bypass"', 'title:"확인 생략",shortTitle:"생략"'],
|
|
9
|
-
['title:"Accept edits",shortTitle:"Accept"', 'title:"수정 허용",shortTitle:"허용"'],
|
|
10
|
-
['title:"Don\'t Ask",shortTitle:"DontAsk"', 'title:"묻지 않기",shortTitle:"자동"'],
|
|
11
|
-
['title:"Auto mode",shortTitle:"Auto"', 'title:"자동 모드",shortTitle:"자동"'],
|
|
12
|
-
// 권한 모드 label
|
|
13
|
-
['label:"accept edits on"', 'label:"수정 허용 모드"'],
|
|
14
|
-
['label:"auto mode on"', 'label:"자동 모드"'],
|
|
15
|
-
// 권한 대화상자
|
|
16
|
-
['"Do you want to proceed?"', '"실행할까요?"'],
|
|
17
|
-
['"Yes, and don\'t ask again for "', '"네, 다시 묻지 않기: "'],
|
|
18
|
-
['"Yes, and don\'t ask again for"', '"네, 다시 묻지 않기:"'],
|
|
19
|
-
['" commands in"', '" 명령어"'],
|
|
20
|
-
['"commands in "', '"명령어 "'],
|
|
21
|
-
['label:"Yes, and bypass permissions"', 'label:"네, 확인 생략"'],
|
|
22
|
-
['label:"Yes, and use auto mode"', 'label:"네, 자동 모드 사용"'],
|
|
23
|
-
['label:"Yes, auto-accept edits"', 'label:"네, 수정 자동 허용"'],
|
|
24
|
-
['label:"Yes, enable auto mode"', 'label:"네, 자동 모드 활성화"'],
|
|
25
|
-
['label:"Yes, enter plan mode"', 'label:"네, 계획 모드 진입"'],
|
|
26
|
-
['label:"Yes, and make it my default mode"', 'label:"네, 기본 모드로 설정"'],
|
|
27
|
-
['label:"Yes, for this session"', 'label:"네, 이 세션에서"'],
|
|
28
|
-
['label:"Yes, delete"', 'label:"네, 삭제"'],
|
|
29
|
-
['label:"Yes",value:"yes"', 'label:"네",value:"yes"'],
|
|
30
|
-
['label:"No, cancel"', 'label:"아니요, 취소"'],
|
|
31
|
-
['label:"No, exit"', 'label:"아니요, 종료"'],
|
|
32
|
-
['label:"No, exit Claude Code"', 'label:"아니요, Claude Code 종료"'],
|
|
33
|
-
['label:"Not now"', 'label:"나중에"'],
|
|
34
|
-
['label:"No, not now"', 'label:"아니요, 나중에"'],
|
|
35
|
-
['label:"No",value:"no"', 'label:"아니요",value:"no"'],
|
|
36
|
-
['"tell Claude what to do next"', '"다음에 할 일을 알려주세요"'],
|
|
37
|
-
['"tell Claude what to do differently"', '"다르게 할 일을 알려주세요"'],
|
|
38
|
-
['"What would you like to do?"', '"무엇을 할까요?"'],
|
|
39
|
-
['"Yes, allow all edits during this session"', '"네, 이 세션에서 모든 수정 허용"'],
|
|
40
|
-
['"Approved Plan"', '"계획 승인됨"'],
|
|
41
|
-
['"Approved Plan (edited by user)"', '"계획 승인됨 (사용자 수정)"'],
|
|
42
|
-
// UI 힌트 — action/description 속성값
|
|
43
|
-
['description:"expand history"', 'description:"기록 펼치기"'],
|
|
44
|
-
['description:"expand"', 'description:"펼치기"'],
|
|
45
|
-
['action:"cycle"', 'action:"전환하기"'],
|
|
46
|
-
['action:"expand"', 'action:"펼쳐보기"'],
|
|
47
|
-
['action:"cancel"', 'action:"취소"'],
|
|
48
|
-
['action:"amend"', 'action:"수정"'],
|
|
49
|
-
['action:"confirm"', 'action:"확인"'],
|
|
50
|
-
['action:"select"', 'action:"선택"'],
|
|
51
|
-
['action:"navigate"', 'action:"이동"'],
|
|
52
|
-
['action:"continue"', 'action:"계속"'],
|
|
53
|
-
['action:"close"', 'action:"닫기"'],
|
|
54
|
-
['action:"go back"', 'action:"뒤로"'],
|
|
55
|
-
['action:"toggle"', 'action:"전환"'],
|
|
56
|
-
['action:"stop"', 'action:"중지"'],
|
|
57
|
-
['action:"skip"', 'action:"건너뛰기"'],
|
|
58
|
-
['action:"copy"', 'action:"복사"'],
|
|
59
|
-
// 안내 메시지
|
|
60
|
-
['"Compound commands with cd and git require approval to prevent bare repository attacks"', '"cd+git 복합 명령어는 보안을 위해 승인이 필요합니다"'],
|
|
61
|
-
['"Compound commands with cd and git require permission checks for enhanced security"', '"cd+git 복합 명령어는 보안 강화를 위해 권한 확인이 필요합니다"'],
|
|
62
|
-
['"Space, Enter, or Escape to dismiss"', '"Space·Enter·Esc로 닫기"'],
|
|
63
|
-
['" to cycle permission modes. Each mode c"', '" 권한 모드 전환"'],
|
|
64
|
-
// 트랜스크립트 모드 footer
|
|
65
|
-
['"Showing detailed transcript · "', '"상세 기록 표시 중 · "'],
|
|
66
|
-
['" to toggle"', '"으로 전환"'],
|
|
67
|
-
['"collapse":"show all"', '"접기":"모두 보기"'],
|
|
68
|
-
['" · n/N to navigate"', '" · n/N 탐색"'],
|
|
69
|
-
['scroll · home/end top/bottom', '스크롤 · home/end 처음/끝'],
|
|
70
|
-
// tokens (전역)
|
|
71
|
-
['" tokens"', '" 토큰"'],
|
|
72
|
-
// 도구 표시 — 정적 문자열
|
|
73
|
-
['"Reading Plan"', '"계획 읽는 중"'],
|
|
74
|
-
['"Running command"', '"명령어 실행 중"'],
|
|
75
|
-
// 검색/읽기/목록 동사 (정적 문자열 값)
|
|
76
|
-
// "Searching for":"searching for" / "Searched for":"searched for"
|
|
77
|
-
// → fragile.js 에서 regex로 처리 (z6/X6/... 변수 독립)
|
|
78
|
-
// 상태바
|
|
79
|
-
[' · /effort`', ' · /노력`'],
|
|
80
|
-
// 도움말 화면
|
|
81
|
-
['"! for bash mode"', '"! bash 모드"'],
|
|
82
|
-
['"/ for commands"', '"/ 커맨드"'],
|
|
83
|
-
['"@ for file paths"', '"@ 파일 경로"'],
|
|
84
|
-
['"& for background"', '"& 백그라운드"'],
|
|
85
|
-
['"/btw for side question"', '"/근데 사이드 질문"'],
|
|
86
|
-
['"double tap esc to clear input"', '"esc 두 번 입력 지우기"'],
|
|
87
|
-
['" for verbose output"', '" 자세히 보기"'],
|
|
88
|
-
['" to paste images"', '" 이미지 붙여넣기"'],
|
|
89
|
-
['" to switch model"', '" 모델 전환"'],
|
|
90
|
-
['" for newline"', '" 줄바꿈"'],
|
|
91
|
-
['" to customize"', '" 단축키 설정"'],
|
|
92
|
-
['"For more help:"', '"도움말:"'],
|
|
93
|
-
// 중단 메시지
|
|
94
|
-
['"Interrupted "', '"중단됨 "'],
|
|
95
|
-
['"· What should Claude do instead?"', '"· 대신 무엇을 할까요?"'],
|
|
96
|
-
// 시스템 메시지
|
|
97
|
-
['Claude Code has switched from npm to native installer. Run `claude install` or see https://docs.anthropic.com/en/docs/claude-code/getting-started for more options.', 'Claude Code가 npm에서 네이티브 설치로 전환되었습니다. `claude install`을 실행하거나 https://docs.anthropic.com/en/docs/claude-code/getting-started 을 참고하세요.'],
|
|
98
|
-
// 환영/세션
|
|
99
|
-
['"Welcome back!"', '"다시 오셨네요!"'],
|
|
100
|
-
['"Welcome to Claude Code"', '"Claude Code에 오신 것을 환영합니다"'],
|
|
101
|
-
['"No recent activity"', '"최근 활동 없음"'],
|
|
102
|
-
['"No conversations found to resume."', '"이어서 할 대화가 없습니다."'],
|
|
103
|
-
['"Resuming session…"', '"세션 이어서 하는 중…"'],
|
|
104
|
-
// 압축
|
|
105
|
-
['"Compacting conversation…"', '"대화 압축 중…"'],
|
|
106
|
-
['"Compacting conversation"', '"대화 압축 중"'],
|
|
107
|
-
['"Conversation compacted"', '"대화 압축 완료"'],
|
|
108
|
-
// hook
|
|
109
|
-
['" says: "', '": "'],
|
|
110
|
-
['"Advisor unavailable ("', '"조언자 사용 불가 ("'],
|
|
111
|
-
// 작업 폴더 신뢰 대화상자
|
|
112
|
-
['title:"Accessing workspace:"', 'title:"작업 폴더 접근:"'],
|
|
113
|
-
['"Quick safety check: Is this a project you created or one you trust? (Like your own code, a well-known open source project, or work from your team). If not, take a moment to review what"', '"안전 확인: 직접 만들었거나 신뢰할 수 있는 프로젝트인가요? (본인 코드, 유명 오픈소스, 팀 프로젝트 등). 아니라면 이 폴더의 내용을 먼저 확인하세요"'],
|
|
114
|
-
['"s in this folder first."', '""'],
|
|
115
|
-
['"ll be able to read, edit, and execute files here."', '"이 폴더의 파일을 읽고, 수정하고, 실행할 수 있습니다."'],
|
|
116
|
-
['"Security guide"', '"보안 가이드"'],
|
|
117
|
-
['label:"Yes, I trust this folder"', 'label:"네, 이 폴더를 신뢰합니다"'],
|
|
118
|
-
['label:"Yes, I trust these settings"', 'label:"네, 이 설정을 신뢰합니다"'],
|
|
119
|
-
// 시작 화면
|
|
120
|
-
['"Tips for getting started"', '"시작 가이드"'],
|
|
121
|
-
['"Recent activity"', '"최근 활동"'],
|
|
122
|
-
['"Run /init to create a CLAUDE.md file with instructions for Claude"', '"/init으로 Claude 지시사항 CLAUDE.md 파일 만들기"'],
|
|
123
|
-
// 상태 표시
|
|
124
|
-
['"Answering…"', '"답변 중…"'],
|
|
125
|
-
['"Initializing…"', '"초기화 중…"'],
|
|
126
|
-
['"Shortcuts"', '"단축키"'],
|
|
127
|
-
// progressMessage
|
|
128
|
-
['progressMessage:"creating commit"', 'progressMessage:"커밋 생성 중"'],
|
|
129
|
-
['progressMessage:"creating commit and PR"', 'progressMessage:"커밋 및 PR 생성 중"'],
|
|
130
|
-
['progressMessage:"reviewing pull request"', 'progressMessage:"풀 리퀘스트 리뷰 중"'],
|
|
131
|
-
['progressMessage:"analyzing your sessions"', 'progressMessage:"세션 분석 중"'],
|
|
132
|
-
// 턴 완료 동사
|
|
133
|
-
['"Baked","Brewed","Churned","Cogitated","Cooked","Crunched","Sautéed","Worked"', '"처리 완료","처리 완료","처리 완료","처리 완료","처리 완료","처리 완료","처리 완료","처리 완료"'],
|
|
134
|
-
// 팁 메시지 — 정적 문자열
|
|
135
|
-
['"Start with small features or bug fixes, tell Claude to propose a plan, and verify its suggested edits"', '"작은 기능이나 버그 수정부터 시작하고, Claude에게 계획을 제안하게 한 뒤 수정 사항을 확인하세요"'],
|
|
136
|
-
['"Use /config to change your default permission mode (including Plan Mode)"', '"/config로 기본 권한 모드를 변경할 수 있습니다 (계획 모드 포함)"'],
|
|
137
|
-
['"Use git worktrees to run multiple Claude sessions in parallel."', '"git worktree로 여러 Claude 세션을 병렬 실행할 수 있습니다."'],
|
|
138
|
-
['"Running multiple Claude sessions? Use /color and /rename to tell them apart at a glance."', '"여러 Claude 세션 실행 중? /color와 /rename으로 구분하세요."'],
|
|
139
|
-
['"Use /memory to view and manage Claude memory"', '"/memory로 Claude 메모리를 관리하세요"'],
|
|
140
|
-
['"Use /theme to change the color theme"', '"/theme으로 색상 테마를 변경하세요"'],
|
|
141
|
-
['"Try setting environment variable COLORTERM=truecolor for richer colors"', '"환경변수 COLORTERM=truecolor를 설정하면 더 풍부한 색상을 사용할 수 있습니다"'],
|
|
142
|
-
['"Use /statusline to set up a custom status line that will display beneath the input box"', '"/statusline으로 입력창 아래에 커스텀 상태줄을 설정하세요"'],
|
|
143
|
-
['"Hit Enter to queue up additional messages while Claude is working."', '"Claude 작업 중 Enter를 눌러 추가 메시지를 대기열에 넣으세요."'],
|
|
144
|
-
['"Send messages to Claude while it works to steer Claude in real-time"', '"Claude 작업 중 메시지를 보내 실시간으로 방향을 조정하세요"'],
|
|
145
|
-
['"Ask Claude to create a todo list when working on complex tasks to track progress and remain on track"', '"복잡한 작업 시 Claude에게 할 일 목록을 만들게 하면 진행 상황을 추적할 수 있습니다"'],
|
|
146
|
-
['"Connect Claude to your IDE · /ide"', '"Claude를 IDE에 연결하세요 · /ide"'],
|
|
147
|
-
['"Run /install-github-app to tag @claude right from your Github issues and PRs"', '"/install-github-app으로 GitHub 이슈와 PR에서 @claude를 태그하세요"'],
|
|
148
|
-
['"Run /install-slack-app to use Claude in Slack"', '"/install-slack-app으로 Slack에서 Claude를 사용하세요"'],
|
|
149
|
-
['"Use /permissions to pre-approve and pre-deny bash, edit, and MCP tools"', '"/permissions로 bash, edit, MCP 도구를 미리 허용/거부하세요"'],
|
|
150
|
-
['"Did you know you can drag and drop image files into your terminal?"', '"터미널에 이미지 파일을 드래그 앤 드롭할 수 있습니다"'],
|
|
151
|
-
['"Paste images into Claude Code using control+v (not cmd+v!)"', '"control+v로 Claude Code에 이미지를 붙여넣으세요 (cmd+v 아님!)"'],
|
|
152
|
-
['"Double-tap esc to rewind the conversation to a previous point in time"', '"esc 두 번 눌러 대화를 이전 시점으로 되돌리세요"'],
|
|
153
|
-
['"Double-tap esc to rewind the code and/or conversation to a previous point in time"', '"esc 두 번 눌러 코드와 대화를 이전 시점으로 되돌리세요"'],
|
|
154
|
-
['"Run claude --continue or claude --resume to resume a conversation"', '"claude --continue 또는 --resume으로 대화를 이어서 하세요"'],
|
|
155
|
-
['"Name your conversations with /rename to find them easily in /resume later"', '"/rename으로 대화 이름을 지정하면 /resume에서 쉽게 찾을 수 있습니다"'],
|
|
156
|
-
['"Create skills by adding .md files to .claude/skills/ in your project or ~/.claude/skills/ for skills that work in any project"', '".claude/skills/에 .md 파일을 추가해 스킬을 만드세요. ~/.claude/skills/는 모든 프로젝트에서 사용 가능"'],
|
|
157
|
-
['"Use /agents to optimize specific tasks. Eg. Software Architect, Code Writer, Code Reviewer"', '"/agents로 특정 작업을 최적화하세요. 예: Software Architect, Code Writer, Code Reviewer"'],
|
|
158
|
-
['"Use --agent <agent_name> to directly start a conversation with a subagent"', '"--agent <에이전트명>으로 서브에이전트와 직접 대화를 시작하세요"'],
|
|
159
|
-
['"Run Claude Code locally or remotely using the Claude desktop app: clau.de/desktop"', '"Claude 데스크톱 앱으로 로컬/원격에서 실행하세요: clau.de/desktop"'],
|
|
160
|
-
['"Run tasks in the cloud while you keep coding locally · clau.de/web"', '"로컬에서 코딩하면서 클라우드에서 작업 실행 · clau.de/web"'],
|
|
161
|
-
['"/mobile to use Claude Code from the Claude app on your phone"', '"/mobile로 휴대폰 Claude 앱에서 Claude Code 사용"'],
|
|
162
|
-
['"Use /feedback to help us improve!"', '"/feedback으로 개선에 도움을 주세요!"'],
|
|
163
|
-
// 동적 팁 — 정적 부분만 (파라미터 문자열은 안정적)
|
|
164
|
-
['"chat:imagePaste","Chat","ctrl+v")} to paste images from your clipboard', '"chat:imagePaste","Chat","ctrl+v")}로 클립보드 이미지를 붙여넣으세요'],
|
|
165
|
-
['Use Plan Mode to prepare for a complex request before making changes. Press ${', '복잡한 요청 전 계획 모드로 준비하세요. ${'],
|
|
166
|
-
['"chat:cycleMode","Chat","shift+tab")} twice to enable.', '"chat:cycleMode","Chat","shift+tab")}를 두 번 눌러 활성화하세요.'],
|
|
167
|
-
['"chat:cycleMode","Chat","shift+tab")} to cycle between default mode, auto-accept edit mode, and plan mode', '"chat:cycleMode","Chat","shift+tab")}로 기본 모드, 수정 허용, 계획 모드를 전환하세요'],
|
|
168
|
-
['"chat:cycleMode","Chat","shift+tab")} twice to activate Plan Mode and plan with Claude Opus.', '"chat:cycleMode","Chat","shift+tab")}를 두 번 눌러 계획 모드를 활성화하세요.'],
|
|
169
|
-
['Your default model setting is Opus Plan Mode. Press ${', '기본 모델이 Opus 계획 모드입니다. ${'],
|
|
170
|
-
['Continue your session in Claude Code Desktop with ${', 'Claude Code Desktop에서 세션 이어가기: ${'],
|
|
171
|
-
// 동적 팁 — 조건분기 (ternary) 정적 문자열
|
|
172
|
-
['"Run /terminal-setup to enable convenient terminal integration like Option + Enter for new line and more"', '"/terminal-setup으로 Option+Enter 줄바꿈 등 터미널 연동을 설정하세요"'],
|
|
173
|
-
['"Run /terminal-setup to enable convenient terminal integration like Shift + Enter for new line and more"', '"/terminal-setup으로 Shift+Enter 줄바꿈 등 터미널 연동을 설정하세요"'],
|
|
174
|
-
['"Press Option+Enter to send a multi-line message"', '"Option+Enter로 여러 줄 메시지를 보내세요"'],
|
|
175
|
-
['"Press Shift+Enter to send a multi-line message"', '"Shift+Enter로 여러 줄 메시지를 보내세요"'],
|
|
176
|
-
['"Run /terminal-setup to enable Option+Enter for new lines"', '"/terminal-setup으로 Option+Enter 줄바꿈을 설정하세요"'],
|
|
177
|
-
['"Run /terminal-setup to enable Shift+Enter for new lines"', '"/terminal-setup으로 Shift+Enter 줄바꿈을 설정하세요"'],
|
|
178
|
-
];
|