-
Notifications
You must be signed in to change notification settings - Fork 0
feat: Phase 1~3 — 프로젝트 기반, 플러그인 코어, 한국어 언어팩 #3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 31 commits
17182ae
aac5a5c
9c55229
9cff0de
ad2c33b
93f2457
1ceef37
73eb6d6
decde8f
5e29ed5
b654983
d461d80
7bf0670
9c5d2f2
e38a566
37112e6
3261a2a
ab71653
41e9206
2b0eae9
97b7153
eeb0c6f
9c0ba77
5551ab5
9fab1eb
7abf45b
3c5d1ce
701441b
42cff50
02fd143
2f82372
12df569
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| name: 새 언어 추가 요청 | ||
| description: 새로운 언어의 커뮤니티 번역을 추가합니다 | ||
| title: "[New Locale] " | ||
| labels: ["new-locale", "community"] | ||
| body: | ||
| - type: markdown | ||
| attributes: | ||
| value: | | ||
| 새로운 언어를 추가해 주셔서 감사합니다! 아래 정보를 채워주세요. | ||
|
|
||
| - type: input | ||
| id: locale-code | ||
| attributes: | ||
| label: 언어 코드 | ||
| description: "IETF 언어 태그 (예: ja-JP, vi-VN, fr-FR)" | ||
| placeholder: "ja-JP" | ||
| validations: | ||
| required: true | ||
|
|
||
| - type: input | ||
| id: locale-name | ||
| attributes: | ||
| label: 언어 이름 (원어) | ||
| description: "해당 언어의 원어 표기 (예: 日本語, Tiếng Việt, Français)" | ||
| placeholder: "日本語" | ||
| validations: | ||
| required: true | ||
|
|
||
| - type: input | ||
| id: aliases | ||
| attributes: | ||
| label: 별칭 (aliases) | ||
| description: "/lang 명령어에서 사용할 수 있는 별칭들 (쉼표 구분)" | ||
| placeholder: "ja, jp, japanese, 日本語" | ||
| validations: | ||
| required: true | ||
|
|
||
| - type: input | ||
| id: openclaw-version | ||
| attributes: | ||
| label: 대상 OpenClaw 버전 | ||
| description: "번역 대상 OpenClaw 버전" | ||
| placeholder: "2026.3.13" | ||
| validations: | ||
| required: true | ||
|
|
||
| - type: textarea | ||
| id: coverage | ||
| attributes: | ||
| label: 예상 번역률 | ||
| description: "전체 키 대비 번역한 키의 비율과 미번역 영역을 알려주세요" | ||
| placeholder: | | ||
| 번역률: 약 90% | ||
| 미번역: settings 섹션 일부 | ||
| validations: | ||
| required: true | ||
|
|
||
| - type: textarea | ||
| id: notes | ||
| attributes: | ||
| label: 참고사항 | ||
| description: "번역 시 참고한 자료나 특이사항이 있으면 알려주세요" | ||
| placeholder: "OpenClaw PR #44902의 번역을 기반으로 작업했습니다." | ||
|
|
||
| - type: checkboxes | ||
| id: checklist | ||
| attributes: | ||
| label: 체크리스트 | ||
| options: | ||
| - label: chunk 파일이 올바른 JS export 형식입니다 | ||
| required: true | ||
| - label: locale-meta.json에 언어 정보를 추가했습니다 | ||
| required: true | ||
| - label: aliases가 기존 언어와 중복되지 않습니다 | ||
| required: true | ||
| - label: CONTRIBUTING.md의 가이드를 읽었습니다 | ||
| required: true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,68 @@ | ||
| name: 번역 개선 요청 | ||
| description: 기존 번역의 오류 수정이나 품질 개선을 요청합니다 | ||
| title: "[Translation] " | ||
| labels: ["translation-update"] | ||
| body: | ||
| - type: markdown | ||
| attributes: | ||
| value: | | ||
| 번역 개선에 기여해 주셔서 감사합니다! | ||
|
|
||
| - type: input | ||
| id: locale-code | ||
| attributes: | ||
| label: 언어 코드 | ||
| description: "수정 대상 언어 코드 (예: ko-KR)" | ||
| placeholder: "ko-KR" | ||
| validations: | ||
| required: true | ||
|
|
||
| - type: input | ||
| id: openclaw-version | ||
| attributes: | ||
| label: OpenClaw 버전 | ||
| description: "해당 번역의 OpenClaw 버전" | ||
| placeholder: "2026.3.13" | ||
| validations: | ||
| required: true | ||
|
|
||
| - type: dropdown | ||
| id: type | ||
| attributes: | ||
| label: 요청 유형 | ||
| options: | ||
| - 오역 수정 | ||
| - 누락 번역 추가 | ||
| - 용어 통일 | ||
| - 문체 개선 | ||
| - 새 버전 키 추가 | ||
| validations: | ||
| required: true | ||
|
|
||
| - type: textarea | ||
| id: details | ||
| attributes: | ||
| label: 상세 내용 | ||
| description: "수정이 필요한 부분과 제안하는 번역을 알려주세요" | ||
| placeholder: | | ||
| 키: common.health | ||
| 현재 번역: 건강 상태 | ||
| 제안 번역: 시스템 상태 | ||
|
|
||
| 이유: OpenClaw 맥락에서 "health"는 시스템 상태를 의미합니다. | ||
| validations: | ||
| required: true | ||
|
|
||
| - type: textarea | ||
| id: context | ||
| attributes: | ||
| label: 참고 맥락 | ||
| description: "해당 번역이 사용되는 UI 화면이나 맥락을 알려주세요 (스크린샷 첨부 가능)" | ||
|
|
||
| - type: checkboxes | ||
| id: checklist | ||
| attributes: | ||
| label: 체크리스트 | ||
| options: | ||
| - label: OpenClaw UI에서 해당 번역의 맥락을 확인했습니다 | ||
| required: true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| ## 변경 내용 | ||
|
|
||
| <!-- 이 PR에서 변경한 내용을 간단히 설명해주세요 --> | ||
|
|
||
| ## 번역 정보 | ||
|
|
||
| - **언어**: <!-- 예: 한국어 (ko-KR) --> | ||
| - **OpenClaw 버전**: <!-- 예: 2026.3.13 --> | ||
| - **번역률**: <!-- 예: 98% --> | ||
|
|
||
| ## 테스트 방법 | ||
|
|
||
| 1. OpenClaw에 플러그인 설치: `openclaw plugins install -l ./plugin` | ||
| 2. `/lang <언어코드>` 명령어 실행 | ||
| 3. 브라우저 새로고침 후 설정에서 언어 변경 확인 | ||
|
|
||
| ## 체크리스트 | ||
|
|
||
| - [ ] chunk 파일이 올바른 JS export 형식 (`var e={...};export{e as xx_XX};`) | ||
| - [ ] `locale-meta.json`에 언어 정보가 올바르게 등록됨 | ||
| - [ ] aliases가 기존 언어와 중복되지 않음 | ||
| - [ ] `CONTRIBUTING.md`의 파일명 규칙을 따름 (`{locale-code}-community.js`) | ||
| - [ ] 번역률이 `locale-meta.json`의 `coverage` 필드에 반영됨 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,106 @@ | ||
| name: 번역률 계산 | ||
|
|
||
| on: | ||
| pull_request: | ||
| paths: | ||
| - "locales/**" | ||
| - "locale-meta.json" | ||
| - "scripts/check-coverage.ts" | ||
| - "scripts/en-keys/**" | ||
|
Comment on lines
+5
to
+9
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This workflow now reruns for locale files, the coverage script, and Useful? React with 👍 / 👎.
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 반영했습니다. 해당 파일들이 변경되는 PR(의존성 추가·제거, |
||
| push: | ||
| branches: | ||
| - main | ||
| paths: | ||
| - "locales/**" | ||
| - "locale-meta.json" | ||
| - "scripts/check-coverage.ts" | ||
| - "scripts/en-keys/**" | ||
|
|
||
| permissions: | ||
| pull-requests: write # fork PR에서 PR 코멘트 작성에 필요 | ||
| issues: write # issues.createComment / issues.updateComment 호출에 필요 | ||
| contents: read | ||
|
|
||
| jobs: | ||
| check-coverage: | ||
| name: 번역률 계산 | ||
| runs-on: ubuntu-latest | ||
|
|
||
| steps: | ||
| - name: 체크아웃 | ||
| uses: actions/checkout@v4 | ||
|
|
||
| - name: Node.js 설정 | ||
| uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: "20" | ||
|
|
||
| - name: 의존성 설치 | ||
| run: npm ci | ||
|
|
||
| - name: 번역률 계산 | ||
| id: coverage | ||
| run: npm run check-coverage | ||
|
|
||
| - name: PR 코멘트 작성 | ||
| # fork PR / Dependabot PR은 read-only 토큰이므로 코멘트 작성 건너뜀 | ||
| # 동일 레포 PR에서만 실행 (외부 기여자는 Actions 탭 로그로 결과 확인) | ||
| if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository | ||
| uses: actions/github-script@v7 | ||
| with: | ||
| script: | | ||
| const fs = require('fs'); | ||
|
|
||
| // 스크립트를 다시 실행하여 마크다운 결과 획득 | ||
| const { execSync } = require('child_process'); | ||
| let output; | ||
| try { | ||
| output = execSync('npm run check-coverage --silent', { encoding: 'utf-8' }); | ||
| } catch (e) { | ||
| output = e.stdout || '번역률 계산 중 오류가 발생했습니다.'; | ||
| } | ||
|
|
||
| // 번역률 테이블을 마크다운으로 변환 | ||
| const lines = output.split('\n'); | ||
| const tableLines = lines.filter(l => l.startsWith('|') || l.includes('===')); | ||
| let body = '## 📊 번역률 계산 결과\n\n'; | ||
|
|
||
| if (tableLines.length > 0) { | ||
| body += tableLines.filter(l => l.startsWith('|')).join('\n') + '\n'; | ||
| } else { | ||
| body += '번역 파일이 없습니다.\n'; | ||
| } | ||
|
|
||
| // 80% 미만 경고 | ||
| if (output.includes('⚠️')) { | ||
| body += '\n> ⚠️ **주의**: 번역률이 80% 미만인 언어가 있습니다.\n'; | ||
| } | ||
|
|
||
| body += '\n---\n🤖 *자동 생성된 코멘트 — [check-coverage.yml](.github/workflows/check-coverage.yml)*'; | ||
|
|
||
| // 기존 코멘트 찾아서 업데이트 또는 새로 생성 | ||
| const { data: comments } = await github.rest.issues.listComments({ | ||
| owner: context.repo.owner, | ||
| repo: context.repo.repo, | ||
| issue_number: context.issue.number, | ||
| }); | ||
|
|
||
| const botComment = comments.find(c => | ||
| c.body.includes('📊 번역률 계산 결과') && c.user.type === 'Bot' | ||
| ); | ||
|
|
||
| if (botComment) { | ||
| await github.rest.issues.updateComment({ | ||
| owner: context.repo.owner, | ||
| repo: context.repo.repo, | ||
| comment_id: botComment.id, | ||
| body, | ||
| }); | ||
| } else { | ||
| await github.rest.issues.createComment({ | ||
| owner: context.repo.owner, | ||
| repo: context.repo.repo, | ||
| issue_number: context.issue.number, | ||
| body, | ||
| }); | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.