forked from baron/baron-sso
3.6 KiB
3.6 KiB
userfront locale 전환 문제 분석 및 대응
증상
- URL은
/ko↔/en으로 변경되지만 실제 텍스트가 바뀌지 않음. - 브라우저에서
window.localStorage.getItem('locale')가 계속null. - 빌드/배포 후에도 동일 증상 유지.
현재 구조 요약
- Flutter Web +
easy_localization사용. - 경로 기반 로케일:
/:locale라우트 +LocaleGate로 로케일 적용. - 번역 리소스:
userfront/assets/translations/*.toml. - 로케일 저장:
localStoragekeylocale.
이미 적용한 변경
easy_localization+ TOML loader 적용.LocaleGate에서 로케일 적용 및 저장.LanguageSelector에서 로케일 저장 + URL 변경.userfront/assets/translations에en.toml,ko.toml,template.toml포함.pubspec.yamlassets 등록.- GoRouter 호환성 수정(빌드 오류 대응).
원인 후보(우선순위)
-
로케일 저장이 실제로 실행되지 않음
LanguageSelector클릭 이벤트가 동작하지 않거나,LocaleGate가 호출되지 않는 라우트 진입(예: 라우트 변경 없이 SPA 상태만 변경).
-
서비스 워커/캐시로 인해 구 번들이 계속 로드됨
- Flutter Web 기본
flutter_service_worker.js가 캐시를 고정. - 기존 번들이 남아
LocaleStorage.write()반영 전 코드가 계속 실행될 가능성.
- Flutter Web 기본
-
번역 리소스 미로딩
assets/translations/en.toml,ko.toml요청이 404 또는 미요청.- Nginx 경로/정적 파일 설정에서
assets/가 누락된 경우.
-
en.toml 키 누락으로 fallback 문자열이 표시됨
- UI에서
tr(..., fallback: '한국어')를 쓰는 경우, en.toml에 키가 없으면 한국어가 그대로 노출됨.
- UI에서
확인 방법(권장 순서)
-
로케일 저장 확인
- 언어 변경 후 콘솔:
window.localStorage.getItem('locale')
null이면 저장 로직 실행 실패.
- 언어 변경 후 콘솔:
-
번역 리소스 요청 확인
- DevTools Network에서:
/assets/translations/ko.toml/assets/translations/en.toml
- 404 또는 미요청이면 assets 로딩 문제.
- DevTools Network에서:
-
로케일 반영 확인
- UI 내 임시 텍스트로
context.locale.languageCode출력 - 로케일이 바뀌는데 텍스트가 그대로면 TOML 키 누락 가능성.
- UI 내 임시 텍스트로
-
캐시 무효화
- 하드 리로드(Shift+Reload)
- service worker 제거 후 재접속
현재까지 실행한 대응
LocaleGate에서 로케일 동일 여부와 상관없이LocaleStorage.write()가 실행되도록 수정.- 라우터 로케일 파싱/전환 로직 보강.
- 번역 리소스 파일 배치 및 assets 등록.
앞으로의 대응 계획
-
서비스 워커 캐시 무효화 전략
flutter_service_worker.js버전 갱신 또는 Nginx 캐시 무력화 정책 적용.- 배포 시
index.html/flutter_service_worker.js캐시 제어 헤더 추가.
-
번역 파일 누락 방지
scripts/sync_userfront_locales.sh를 CI에서 자동 실행.- en/ko 키 누락 검증 테스트 추가.
-
로케일 저장 검증
- 언어 변경 후
localStorage에 값이 반드시 들어오는지 E2E 체크 추가.
- 언어 변경 후
-
fallback 사용 최소화
- userfront에서
fallback문자열(한국어) 남용 구간 정리. - en.toml에 키가 없을 때 한국어가 보이는 현상 방지.
- userfront에서
참고 파일
userfront/lib/core/i18n/locale_gate.dartuserfront/lib/core/widgets/language_selector.dartuserfront/lib/core/i18n/locale_storage_web.dartuserfront/lib/core/i18n/toml_asset_loader.dartuserfront/assets/translations/en.tomluserfront/assets/translations/ko.toml