Repository navigation
출력 로케일 추가 (한국어와 영문) - #6
Merged
Merged
Conversation
- `Locale` 과 `tr!` 매크로로 한국어와 영문 메시지 중 하나를 고름 - 결정 순서는 `AIRLOCK_LANG` 과 구성 파일 `locale` 키와 `LANG` 접두 감지 순이고 기본은 한국어 - 로케일을 정책 파일이 아니라 `~/.config/airlock/config.toml` 에 두어 표시 언어가 정책 다이제스트를 바꾸지 않음 - 브로커와 정책 엔진의 의존성 트리에 들어가므로 의존을 하나도 두지 않고 최소 스캐너를 직접 둠 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
- 승인 프롬프트와 강제 층 한계 목록과 오류 메시지를 두 언어로 냄 - 생성되는 Seatbelt 프로파일 주석도 로케일을 따름 - 규칙 id 와 중계 수준 이름 같은 기계 판독 값은 로케일과 무관하게 고정 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
- `LoadError` 와 `LoadWarning` 과 감사 검증 실패 사유와 확인 기록 판정을 두 언어로 냄 - 다이제스트에 인코딩되는 베이스라인 규칙 근거는 번역하지 않아 로케일이 정책 다이제스트를 바꾸지 않음 - 프록시 층은 비테스트 출력이 프로토콜 토큰뿐이라 그대로 둠 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
- 도움말과 배너와 한계 목록과 세션 요약과 감사 보고를 두 언어로 냄 - `audit report --json` 에 `locale` 필드를 넣어 어느 로케일로 만든 보고인지 남김 - 통합 테스트는 `AIRLOCK_LANG=ko` 로 고정해 호스트 로케일에 흔들리지 않음 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
- 첫 질문이 출력 언어이고 고른 값을 구성 파일에 저장해 다음 실행부터 적용됨 - 프리셋과 직접 설정 산출물의 주석이 고른 언어로 나감 - 영문 프리셋 세 벌을 넣고 한국어판과 다이제스트가 같음을 테스트로 강제 - `check.sh` 가 영문 프리셋도 검증하고 패키징 게이트를 무의존 리프로 옮김 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
- `i18n.md` 를 새로 두어 결정 순서와 무엇이 로케일을 따르는지 규격화 - `design.md` 확정 결정과 `limitations.md` 에 리포트 다이제스트와 로케일 결합을 밝힘 - `audit-format.md` 에 `locale` 필드와 report 와 ack 의 로케일 일치 요구를 적음 - README 와 `CHANGELOG.md` 와 `setup-wizard.md` 갱신 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
airlock 의 모든 사람용 출력을 한국어와 영문 중에서 고를 수 있게 합니다. 기본은 한국어이며, 어떤 환경 신호도 없으면 기존 동작이 그대로 유지됩니다.
이루어진 작업
새 크레이트 airlock-i18n 이 Locale 과 tr 매크로와 로케일 결정을 담당합니다. 결정 순서는 AIRLOCK_LANG 환경 변수, 구성 파일 ~/.config/airlock/config.toml 의 locale 키, LC_ALL 과 LC_MESSAGES 와 LANG 의 언어 접두 감지, 기본값 한국어 순입니다. 모르는 값은 추측하지 않고 다음 순서로 내려갑니다.
설치 마법사 airlock setup 의 첫 질문이 언어 선택입니다. 답하는 즉시 나머지 질문이 고른 언어로 나가고 그 선택이 구성 파일에 저장되어 다음 실행부터 적용됩니다. 생성되는 정책 파일의 주석도 고른 언어를 따르며, 이를 위해 영문 프리셋 세 벌을 examples/policy/en 아래에 새로 두었습니다.
CLI 도움말과 실행 배너와 한계 목록과 세션 요약, /dev/tty 승인 프롬프트, audit 의 verify 와 show 와 report 와 ack, policy 의 check 와 explain, 그리고 모든 오류와 경고 산문을 여섯 개 크레이트에 걸쳐 575개 문자열 쌍으로 전환했습니다. 한국어 원문은 바이트 단위로 보존했기 때문에 기존 테스트가 손대지 않고 그대로 통과합니다.
설계 결정
로케일은 표시 계층만 바꿉니다. JSON 키와 kind 와 status 와 verdict 같은 기계 판독 값, 스키마 이름, 규칙 id 는 로케일과 무관하게 고정입니다. SIEM 파이프라인은 산문이 아니라 그 필드를 분류 기준으로 써야 합니다.
로케일을 정책 파일이 아니라 별도 구성 파일에 둡니다. 정책 파일에 두면 표시 언어를 바꿀 때마다 정책 다이제스트가 달라져 감사 로그에 소음이 생깁니다. 같은 이유로 정책 다이제스트에 인코딩되는 베이스라인 규칙의 근거 문구는 번역하지 않았습니다. 한국어판 프리셋과 영문판 프리셋의 다이제스트가 같다는 사실은 테스트가 강제합니다.
airlock-i18n 에는 의존이 하나도 없습니다. 이 크레이트는 브로커와 정책 엔진의 의존성 트리에 들어가므로, TOML 파서 하나만 들여도 setup-wizard 문서가 정해 둔 UI 의존성 경계가 무너집니다. 구성 파일에서 읽는 것이 짧은 문자열 하나뿐이라 최소 스캐너를 직접 두었습니다. 저장할 때는 locale 줄 하나만 바꾸거나 넣고 나머지 줄은 한 바이트도 건드리지 않으므로, 사람이 적어 둔 주석과 이 크레이트가 이해하지 못하는 내용이 보존됩니다.
발견 결합
감사 보고의 본문 다이제스트에는 이상 detail 산문이 들어가므로, 이상이 있는 보고는 다이제스트가 생성 로케일에 묶입니다. 곧 report 와 ack 를 같은 로케일에서 돌려야 사람이 본 다이제스트와 확인 도장이 일치합니다. 두 명령이 같은 구성 파일을 읽는 한 자연히 일치하며, 이상이 없는 보고에는 산문이 없어 로케일과 무관하게 같은 값이 나옵니다. 진단을 위해 JSON 출력에 locale 필드를 넣었고, 이 결합 자체는 limitations 문서에 한계로 적어 두었습니다.
검증
scripts/check.sh 가 전부 통과합니다. fmt 와 clippy 와 워크스페이스 테스트 582개와 라이브러리 unwrap 금지 검사와 프리셋 여섯 벌 검증과 배포 메타데이터와 패키징을 포함합니다. CI 가 도는 x86_64 와 aarch64 리눅스 크로스 컴파일도 로컬에서 통과했습니다. 커밋 여섯 개는 각각 따로 컴파일되므로 bisect 가 깨지지 않습니다.
실제 바이너리로 두 로케일의 실행 배너와 감사 보고와 확인 도장을 확인했고, 환경 변수 없이 구성 파일만으로 전환되는 것과 report 와 ack 의 다이제스트가 일치하는 것도 확인했습니다.
부수 수정
check.sh 의 프리셋 검증이 최상위 examples/policy 만 보고 있어 새로 추가한 영문 프리셋이 게이트 밖에 있었습니다. 그것을 게이트 안으로 넣었습니다.
airlock-canonical 이 더는 무의존 리프가 아니게 되면서 패키징 게이트가 깨졌습니다. 그 게이트를 새 무의존 리프인 airlock-i18n 으로 옮겼습니다.
이 PR은 Claude Fable 5로 작성되었습니다.