# 2026-03-27: 다국어 지원(i18n) 구현

## 개요
Kord 봇의 모든 사용자 표시 텍스트를 다국어로 제공하는 i18n 시스템을 구현했습니다.

## 변경된 파일

### 신규 생성
| 파일 | 설명 |
|------|------|
| `src/i18n/types.ts` | `I18nProvider` 인터페이스, `TranslationSchema`, `SupportedLocale` 타입 정의 |
| `src/i18n/index.ts` | `t()` 번역 함수, `resolveLocale()`, `StaticI18nProvider`, `setI18nProvider()` |
| `src/i18n/locales/en.ts` | 영어 번역 (전체 키 — 에러, 음성채널, 명령어, 모달, 셀렉트 메뉴) |
| `src/i18n/locales/ko.ts` | 한국어 번역 |
| `src/i18n/localeHelper.ts` | `getInteractionLocale()`, `getContextLocale()` 헬퍼 |
| `src/commands/language.ts` | `/language` 슬래시 명령어 (user/server scope) |
| `tests/i18n/i18n.test.ts` | i18n 유닛 테스트 (14 tests) |

### 수정
| 파일 | 변경 내용 |
|------|-----------|
| `src/errors/BotError.ts` | `userMessage`/`resolution` → `messageKey` (i18n 키) |
| `src/errors/ErrorCodes.ts` | `BotError` 인스턴스 → `ErrorDef` 경량 정의 객체 |
| `src/errors/ErrorReporter.ts` | `locale` 파라미터 추가, `t()` 함수로 메시지 해석 |
| `src/events/interactionCreate.ts` | 모든 하드코딩 문자열 → `t(locale, key, vars)` |
| `src/services/VoiceService.ts` | 컨트롤 패널, 채널명, 응답 → `t()` 사용 |
| `src/commands/voiceSetup.ts` | 응답 + `setDescriptionLocalizations()` 적용 |
| `prisma/schema.prisma` | `GuildConfig.locale` 추가, `UserLocale` 모델 신설 |

## 아키텍처 결정

1. **I18nProvider 인터페이스**: `setI18nProvider()`로 런타임에 번역 백엔드 교체 가능
2. **TypeScript 객체 기반 번역**: 타입 안전성 + IDE 자동완성 활용
3. **Locale 우선순위**: 사용자 DB → 서버 DB → Discord Auto-detect → 영어 fallback
4. **서버 로그는 영어 고정**: 개발자/운영자 전용

## 검증 결과
- **TypeScript 빌드**: 성공 (0 errors)
- **테스트**: 6 suites, 39 tests 전체 통과
- **DB 마이그레이션**: `add-i18n-locale-support` 완료
