feat(chat): 채팅 모듈 하드코딩 문구를 I18n 키로 통일한다

This commit is contained in:
Yu Sung
2026-03-31 16:30:48 +09:00
parent 222520d5e9
commit 47085dc1ca
27 changed files with 464 additions and 128 deletions

View File

@@ -110,34 +110,34 @@
- [x] `SodaLive/Sources/Audition/Role/AuditionRoleDetailViewModel.swift`
### Chat (28)
- [ ] `SodaLive/Sources/Chat/Character/CharacterItemView.swift`
- [ ] `SodaLive/Sources/Chat/Character/CharacterSectionView.swift`
- [ ] `SodaLive/Sources/Chat/Character/CharacterView.swift`
- [ ] `SodaLive/Sources/Chat/Character/CharacterViewModel.swift`
- [ ] `SodaLive/Sources/Chat/Character/Detail/CharacterDetailView.swift`
- [ ] `SodaLive/Sources/Chat/Character/Detail/Gallery/CharacterDetailGalleryView.swift`
- [ ] `SodaLive/Sources/Chat/Character/New/ViewModels/NewCharacterListViewModel.swift`
- [ ] `SodaLive/Sources/Chat/Character/New/Views/NewCharacterListView.swift`
- [ ] `SodaLive/Sources/Chat/Character/Recent/RecentCharacterItemView.swift`
- [ ] `SodaLive/Sources/Chat/Character/Recent/RecentCharacterSectionView.swift`
- [ ] `SodaLive/Sources/Chat/ChatTabView.swift`
- [ ] `SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailHeaderView.swift`
- [ ] `SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailView.swift`
- [ ] `SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailViewModel.swift`
- [ ] `SodaLive/Sources/Chat/Original/OriginalTabItemView.swift`
- [ ] `SodaLive/Sources/Chat/Original/OriginalWorkViewModel.swift`
- [ ] `SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift`
- [ ] `SodaLive/Sources/Chat/Talk/Room/ChatRoomViewModel.swift`
- [ ] `SodaLive/Sources/Chat/Talk/Room/Message/AiMessageItemView.swift`
- [ ] `SodaLive/Sources/Chat/Talk/Room/Message/TypingIndicatorItemView.swift`
- [ ] `SodaLive/Sources/Chat/Talk/Room/Message/UserMessageItemView.swift`
- [ ] `SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaNoticeItemView.swift`
- [ ] `SodaLive/Sources/Chat/Talk/Room/Settings/ChatBgSelectionView.swift`
- [ ] `SodaLive/Sources/Chat/Talk/Room/Settings/ChatBgSelectionViewModel.swift`
- [ ] `SodaLive/Sources/Chat/Talk/Room/Settings/ChatSettingsView.swift`
- [ ] `SodaLive/Sources/Chat/Talk/TalkItemView.swift`
- [ ] `SodaLive/Sources/Chat/Talk/TalkView.swift`
- [ ] `SodaLive/Sources/Chat/Talk/TalkViewModel.swift`
- [x] `SodaLive/Sources/Chat/Character/CharacterItemView.swift`
- [x] `SodaLive/Sources/Chat/Character/CharacterSectionView.swift`
- [x] `SodaLive/Sources/Chat/Character/CharacterView.swift`
- [x] `SodaLive/Sources/Chat/Character/CharacterViewModel.swift`
- [x] `SodaLive/Sources/Chat/Character/Detail/CharacterDetailView.swift`
- [x] `SodaLive/Sources/Chat/Character/Detail/Gallery/CharacterDetailGalleryView.swift`
- [x] `SodaLive/Sources/Chat/Character/New/ViewModels/NewCharacterListViewModel.swift`
- [x] `SodaLive/Sources/Chat/Character/New/Views/NewCharacterListView.swift`
- [x] `SodaLive/Sources/Chat/Character/Recent/RecentCharacterItemView.swift`
- [x] `SodaLive/Sources/Chat/Character/Recent/RecentCharacterSectionView.swift`
- [x] `SodaLive/Sources/Chat/ChatTabView.swift`
- [x] `SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailHeaderView.swift`
- [x] `SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailView.swift`
- [x] `SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailViewModel.swift`
- [x] `SodaLive/Sources/Chat/Original/OriginalTabItemView.swift`
- [x] `SodaLive/Sources/Chat/Original/OriginalWorkViewModel.swift`
- [x] `SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift`
- [x] `SodaLive/Sources/Chat/Talk/Room/ChatRoomViewModel.swift`
- [x] `SodaLive/Sources/Chat/Talk/Room/Message/AiMessageItemView.swift`
- [x] `SodaLive/Sources/Chat/Talk/Room/Message/TypingIndicatorItemView.swift`
- [x] `SodaLive/Sources/Chat/Talk/Room/Message/UserMessageItemView.swift`
- [x] `SodaLive/Sources/Chat/Talk/Room/Quota/ChatQuotaNoticeItemView.swift`
- [x] `SodaLive/Sources/Chat/Talk/Room/Settings/ChatBgSelectionView.swift`
- [x] `SodaLive/Sources/Chat/Talk/Room/Settings/ChatBgSelectionViewModel.swift`
- [x] `SodaLive/Sources/Chat/Talk/Room/Settings/ChatSettingsView.swift`
- [x] `SodaLive/Sources/Chat/Talk/TalkItemView.swift`
- [x] `SodaLive/Sources/Chat/Talk/TalkView.swift`
- [x] `SodaLive/Sources/Chat/Talk/TalkViewModel.swift`
### Content (78)
- [ ] `SodaLive/Sources/Content/All/ByTheme/ContentAllByThemeView.swift`
@@ -559,3 +559,31 @@
- Audition 모듈 하드코딩 한글 재검증 결과, 남은 문자열은 Preview 샘플/DEBUG_LOG/서버 메시지 분기 비교(비노출 로직)만 존재.
- 빌드 검증: `SodaLive`, `SodaLive-dev` Debug 빌드 모두 성공(`** BUILD SUCCEEDED **`).
- 테스트 검증: 두 스킴 모두 `Scheme ... is not currently configured for the test action.`로 테스트 액션 미구성 확인(코드 실패 아님, 스킴 제약).
### 7차 구현 (Chat 모듈 28개 i18n 전환, 2026-03-31)
- 무엇/왜/어떻게:
- 무엇: 변경 대상 목록의 `Chat` 모듈 28개 파일을 전수 처리해 사용자 노출 하드코딩 문구를 `I18n.*` 참조로 교체.
- 왜: Chat 영역에 `String(localized:)` 직접 참조, 뷰 리터럴 문구, ViewModel 반복 오류 문구가 혼재되어 다국어 일관성이 깨져 있었기 때문.
- 어떻게: explore/librarian/oracle + `grep`/`ast_grep_search`/`rg`(미설치 확인) 병렬 탐색으로 런타임 노출 문자열을 추출하고, `I18n.swift``I18n.Chat` 네임스페이스를 추가한 뒤 호출부를 치환.
- 실행 명령/도구:
- `task(subagent_type="explore", ...)` x2 (`bg_c33457a5`, `bg_e543550a`)
- `task(subagent_type="librarian", ...)` x2 (`bg_47a108d5`, `bg_91c00954`)
- `task(subagent_type="oracle", ...)` x1 (`bg_a6465165`)
- `grep("\"[^\"]*[가-힣][^\"]*\"", include=*.swift, path=SodaLive/Sources/Chat)`
- `grep("String\\(localized:|LocalizedStringKey\\(|NSLocalizedString\\(", include=*.swift, path=SodaLive/Sources/Chat)`
- `ast_grep_search(pattern="Text(\"$TEXT\")", lang=swift, paths=[SodaLive/Sources/Chat])`
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build`
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build` (Oracle 후속 보정 후 재검증)
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` (Oracle 후속 보정 후 재검증)
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test`
- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test`
- 결과:
- `I18n.swift``I18n.Chat`(Auth/Character/Original/Talk/Room) 키셋 추가.
- Chat 섹션 28개 파일 체크박스 전체 완료 처리.
- 실치환 24개 파일 + Preview/비노출 예외 4개 파일(샘플 데이터 등)로 전수 처리 완료.
- Chat 모듈의 `String(localized:)` 직접 참조 제거 확인.
- Oracle 후속 보정: Bootpay 입력값(`payload.pg`/`payload.method`/`payload.orderName`) 고정값 복원, `characterType.rawValue` 직접 출력 제거, 전송 실패 시 `error.localizedDescription` 사용자 노출 제거(`I18n.Common.commonError`), 최근 대화 헤더 trailing space 제거.
- Chat 모듈 하드코딩 한글 재검증 결과, 남은 문자열은 Preview 샘플/SDK 입력값/비노출 분기 로직만 존재.
- 빌드 검증: `SodaLive`, `SodaLive-dev` Debug 빌드 모두 성공(`** BUILD SUCCEEDED **`).
- 테스트 검증: 두 스킴 모두 `Scheme ... is not currently configured for the test action.`로 테스트 액션 미구성 확인(코드 실패 아님, 스킴 제약).