Skip to content
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
17182ae
Phase 1: 프로젝트 기반 구축
mapd3692 Mar 17, 2026
aac5a5c
Phase 2: 플러그인 코어 개발 — /lang 명령어 핸들러 완전 구현
mapd3692 Mar 17, 2026
9c55229
Phase 3: 한국어 언어팩 생성 및 locale-meta.json 업데이트
mapd3692 Mar 17, 2026
9cff0de
Add remaining Phase 1 files
mapd3692 Mar 17, 2026
ad2c33b
fix: Codex 리뷰 반영 — manifest id/configSchema, package extensions, cove…
mapd3692 Mar 18, 2026
93f2457
docs: README.md 한국어/영어 이중 언어 작성 (한국어 우선 배치)
mapd3692 Mar 18, 2026
1ceef37
fix: STATE_FILE 경로를 /app/data/로 이동 (자동 업데이트 복구)
mapd3692 Mar 18, 2026
73eb6d6
fix: extractNestedKeys lastIndex 업데이트로 nested 키 이중 카운팅 수정
mapd3692 Mar 18, 2026
decde8f
feat: scripts/en-keys/2026.3.13.txt 기준 키 파일 추가 (515개)
mapd3692 Mar 18, 2026
5e29ed5
fix: 플러그인 엔트리포인트를 register(api) API로 전환
mapd3692 Mar 18, 2026
b654983
fix: extract-keys.ts lastIndex 업데이트로 nested 키 이중 카운팅 수정
mapd3692 Mar 18, 2026
d461d80
fix: check-coverage.ts 참조 키 교집합 기반 coverage 계산
mapd3692 Mar 18, 2026
7bf0670
fix: check-coverage.yml에 pull-requests/issues write 권한 추가
mapd3692 Mar 18, 2026
9c5d2f2
fix: already-patched 상태 저장 누락 및 패치 앵커 실패 감지 추가
mapd3692 Mar 18, 2026
e38a566
chore: 스크립트 빌드 환경 설정 추가 (tsconfig.json, package.json, .gitignore)
mapd3692 Mar 18, 2026
37112e6
fix: CI 의존성 설치 방식을 npm ci로 변경
mapd3692 Mar 18, 2026
3261a2a
fix: check-coverage.ts 오류 메시지 및 coverage_markdown 줄바꿈 수정
mapd3692 Mar 18, 2026
ab71653
chore: plugin/index.ts writeState catch 블록 주석 수정
mapd3692 Mar 18, 2026
41e9206
fix: registerCommand/registerService를 OpenClaw 플러그인 API 명세에 맞게 수정
mapd3692 Mar 18, 2026
2b0eae9
fix: fork PR에서 코멘트 작성 실패 방지
mapd3692 Mar 18, 2026
97b7153
fix: OpenClaw 공식 타입 명세에 맞게 플러그인 API 시그니처 전면 교정
mapd3692 Mar 18, 2026
eeb0c6f
fix: Codex 리뷰 5차 반영 — default export, autoUpdate 안전성, 문법 검증 개선
mapd3692 Mar 18, 2026
9c0ba77
fix: Codex 리뷰 6차 반영 — ESM 파싱 수정, 로컬 개발 지원
mapd3692 Mar 19, 2026
5551ab5
fix: Codex 리뷰 7차 반영 — 런타임 경로 해결, http:// 지원, community chunk 거부
mapd3692 Mar 19, 2026
9fab1eb
fix: 문자열 리터럴 내 중괄호 파싱 수정 및 공식 locale 충돌 검사 추가
mapd3692 Mar 20, 2026
7abf45b
fix: Codex 리뷰 8차 반영 — 커버리지 중복 제거, coverage 필드 검증, README Gateway 재시작 안내
mapd3692 Mar 20, 2026
3c5d1ce
fix: Codex 리뷰 9차 반영 — exportName 구문 검사 강화 및 커뮤니티 alias 충돌 검사 추가
mapd3692 Mar 20, 2026
701441b
fix: Codex 리뷰 10차 반영 — orphan locale 파일 검사 및 exportName 변경 시 재패치
mapd3692 Mar 21, 2026
42cff50
fix: Codex 리뷰 11차 반영 — npm 미출시 설치 안내 제거 및 stateDir 기반 assets 경로 추론 수정
mapd3692 Mar 21, 2026
02fd143
fix: Codex 리뷰 12차 반영 — export 바인딩 검증, locale pack 버전 추적, find 경로 인용 처리
mapd3692 Mar 22, 2026
2f82372
fix: Codex 리뷰 13차 반영 — isAlreadyPatched 선행 확인 및 coverage CI 트리거 보완
mapd3692 Mar 23, 2026
12df569
fix: Codex 리뷰 14차 반영 — 재설치 시 chunk 갱신 및 CI 트리거 경로 보완
mapd3692 Mar 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions .github/ISSUE_TEMPLATE/new-locale.yml
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
68 changes: 68 additions & 0 deletions .github/ISSUE_TEMPLATE/translation-update.yml
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
23 changes: 23 additions & 0 deletions .github/pull_request_template.md
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` 필드에 반영됨
95 changes: 95 additions & 0 deletions .github/workflows/check-coverage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
name: 번역률 계산

on:
pull_request:
paths:
- "locales/**"
- "locale-meta.json"
push:
branches:
- main
paths:
- "locales/**"
- "locale-meta.json"

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: ts-node 설치
run: npm install -g ts-node typescript @types/node

- name: 번역률 계산
id: coverage
run: npx ts-node scripts/check-coverage.ts

- name: PR 코멘트 작성
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');

// 스크립트를 다시 실행하여 마크다운 결과 획득
const { execSync } = require('child_process');
let output;
try {
output = execSync('npx ts-node scripts/check-coverage.ts', { 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,
});
}
Loading
Loading