# userfront locale 전환 문제 분석 및 대응

## 증상
- URL은 `/ko` ↔ `/en`으로 변경되지만 실제 텍스트가 바뀌지 않음.
- 브라우저에서 `window.localStorage.getItem('locale')`가 계속 `null`.
- 빌드/배포 후에도 동일 증상 유지.

## 현재 구조 요약
- Flutter Web + `easy_localization` 사용.
- 경로 기반 로케일: `/:locale` 라우트 + `LocaleGate`로 로케일 적용.
- 번역 리소스: `userfront/assets/translations/*.toml`.
- 로케일 저장: `localStorage` key `locale`.

## 이미 적용한 변경
- `easy_localization` + TOML loader 적용.
- `LocaleGate`에서 로케일 적용 및 저장.
- `LanguageSelector`에서 로케일 저장 + URL 변경.
- `userfront/assets/translations`에 `en.toml`, `ko.toml`, `template.toml` 포함.
- `pubspec.yaml` assets 등록.
- GoRouter 호환성 수정(빌드 오류 대응).

## 원인 후보(우선순위)
1) **로케일 저장이 실제로 실행되지 않음**
   - `LanguageSelector` 클릭 이벤트가 동작하지 않거나,
   - `LocaleGate`가 호출되지 않는 라우트 진입(예: 라우트 변경 없이 SPA 상태만 변경).

2) **서비스 워커/캐시로 인해 구 번들이 계속 로드됨**
   - Flutter Web 기본 `flutter_service_worker.js`가 캐시를 고정.
   - 기존 번들이 남아 `LocaleStorage.write()` 반영 전 코드가 계속 실행될 가능성.

3) **번역 리소스 미로딩**
   - `assets/translations/en.toml`, `ko.toml` 요청이 404 또는 미요청.
   - Nginx 경로/정적 파일 설정에서 `assets/`가 누락된 경우.

4) **en.toml 키 누락으로 fallback 문자열이 표시됨**
   - UI에서 `tr(..., fallback: '한국어')`를 쓰는 경우,
     en.toml에 키가 없으면 한국어가 그대로 노출됨.

## 확인 방법(권장 순서)
1) **로케일 저장 확인**
   - 언어 변경 후 콘솔:
     - `window.localStorage.getItem('locale')`
   - `null`이면 저장 로직 실행 실패.

2) **번역 리소스 요청 확인**
   - DevTools Network에서:
     - `/assets/translations/ko.toml`
     - `/assets/translations/en.toml`
   - 404 또는 미요청이면 assets 로딩 문제.

3) **로케일 반영 확인**
   - UI 내 임시 텍스트로 `context.locale.languageCode` 출력
   - 로케일이 바뀌는데 텍스트가 그대로면 TOML 키 누락 가능성.

4) **캐시 무효화**
   - 하드 리로드(Shift+Reload)
   - service worker 제거 후 재접속

## 현재까지 실행한 대응
- `LocaleGate`에서 로케일 동일 여부와 상관없이 `LocaleStorage.write()`가 실행되도록 수정.
- 라우터 로케일 파싱/전환 로직 보강.
- 번역 리소스 파일 배치 및 assets 등록.

## 앞으로의 대응 계획
1) **서비스 워커 캐시 무효화 전략**
   - `flutter_service_worker.js` 버전 갱신 또는 Nginx 캐시 무력화 정책 적용.
   - 배포 시 `index.html`/`flutter_service_worker.js` 캐시 제어 헤더 추가.

2) **번역 파일 누락 방지**
   - `scripts/sync_userfront_locales.sh`를 CI에서 자동 실행.
   - en/ko 키 누락 검증 테스트 추가.

3) **로케일 저장 검증**
   - 언어 변경 후 `localStorage`에 값이 반드시 들어오는지 E2E 체크 추가.

4) **fallback 사용 최소화**
   - userfront에서 `fallback` 문자열(한국어) 남용 구간 정리.
   - en.toml에 키가 없을 때 한국어가 보이는 현상 방지.

## 참고 파일
- `userfront/lib/core/i18n/locale_gate.dart`
- `userfront/lib/core/widgets/language_selector.dart`
- `userfront/lib/core/i18n/locale_storage_web.dart`
- `userfront/lib/core/i18n/toml_asset_loader.dart`
- `userfront/assets/translations/en.toml`
- `userfront/assets/translations/ko.toml`
