Files
sodalive-ios/docs/20260704_크리에이터_채널_후원_탭/reviews/phase3-donation-localization-audit.md
T

8.7 KiB

후원 랭킹·공용 카드 다국어 점검 보고서

1. 리뷰 정보

항목 내용
리뷰 대상 Phase 3 / Task 3.2~3.3 및 직접 호출 경로
기준 commit 또는 working tree e46198f87a1b6a4357f5bb5b5358e8635383b3a6; 사용자 소유 project.pbxproj, CreatorChannelDonationRankingSection.swift 변경은 리뷰 범위에서 보존
리뷰 일자 2026-08-26
리뷰어 Codex
기준 문서 docs/20260704_크리에이터_채널_후원_탭/prd.md, docs/20260704_크리에이터_채널_후원_탭/plan-task.md
리뷰 상태 판정 완료, 구현 대기

2. 리뷰 목적과 범위

목적

  • CreatorChannelDonationRankingSection과 CreatorChannelDonationCard의 런타임 고정 문구가 앱 언어 설정을 따르는지 확인한다.
  • 두 컴포넌트의 직접 호출 경로에 같은 유형의 미적용 문구가 있는지 확인한다.

포함 범위

  • 코드: CreatorChannelDonationRankingSection.swift, CreatorChannelDonationCard.swift
  • 호출 경로: CreatorChannelDonationTabView.swift, CreatorChannelDonationCountBar.swift, CreatorChannelDonationEmptyView.swift, CreatorChannelDonationFloatingButton.swift, CreatorChannelDonationSection.swift, CreatorChannelView.swift
  • 공용 경계: DateParser.relativeTimeText, 관련 I18n 정의

제외 범위

  • PreviewProvider의 닉네임·메시지 등 개발용 fixture
  • 후원 기능 밖의 크리에이터 채널 섹션과 기존 전역 I18n 문구 품질
  • Swift·I18n 구현, Simulator 실행, 빌드

3. 판정 기준

런타임에서 사용자가 보는 고정 문구가 I18n을 거치지 않아 ko/en/ja 설정에 따라 바뀌지 않으면 확정 문제로 판정한다. 서버 데이터, 숫자 순위, URL, asset name과 Preview fixture는 하드코딩 다국어 대상에서 제외한다.

4. 검토한 근거

문서와 코드

  • 요구사항: PRD §5.3, §5.4, §7
  • 계획: 기존 Task 3.2, Task 3.3, 신규 P7-R1
  • 코드: Ranking section의 title·action, 공용 card의 can pill·빈 메시지 fallback
  • 호출 관계: 공용 card는 후원 탭과 홈 탭에서 모두 사용한다.

실행 환경

OS: macOS 26.0 (25A354)
검증 방식: rg·sed·git diff 기반 정적 점검
Simulator/빌드: 사용자 지시에 따라 미실행

실행한 검증

명령 또는 수동 검증 결과 핵심 증거
`rg -n --glob '*.swift' 'Text( I18n. relativeTimeText' <대상 및 호출 경로>`
rg -n 'CreatorChannelDonationRankingSection|CreatorChannelDonationCard' SodaLive/Sources 성공 후원 탭·홈 탭 직접 호출 위치 확인
sed -n으로 관련 View와 DateParser.swift, I18n.swift 확인 성공 count bar·empty·dialog·상대 시간은 이미 I18n 사용
ko/en/ja Simulator 확인 불가 이번 작업은 문서 전용이며 코드 구현을 금지함

5. 발견 사항 요약

ID 심각도 상태 제목 소유 Task 후속 goal
REV-P3-001 Medium 확정 랭킹 title과 전체보기 action이 한국어로 고정됨 Task 7.1 P7-R1
REV-P3-002 Medium 확정 공용 카드의 can pill과 빈 메시지가 한국어로 고정됨 Task 7.1 P7-R1

6. 발견 사항 상세

REV-P3-001 — 랭킹 title과 전체보기 action이 한국어로 고정됨

  • 심각도: Medium
  • 상태: 확정
  • 관련 요구사항: PRD §5.3
  • 관련 계약: 없음
  • 소유 Task: Task 7.1 / P7-R1

관찰 내용

CreatorChannelDonationRankingSection의 title과 action label이 문자열 literal을 사용해 영어·일본어 설정에서도 한국어로 표시된다.

근거

  • 코드: CreatorChannelDonationRankingSection.swift:10, :22
  • 기존 I18n: I18n.Explorer.donationRankingTitle, I18n.CreatorChannelHome.viewAll
  • 인터뷰 결정: title은 기존 후원랭킹 키를 재사용한다.

재현 또는 검증 절차

  1. 소스에서 Text("후원랭킹"), Text("전체보기")를 확인한다.
  2. 두 값이 LanguageHeaderProvider.current를 읽는 I18n을 거치지 않는 것을 확인한다.
  3. 앱 언어 변경과 무관하게 literal이 유지되는 구조임을 판정한다.

영향

후원 랭킹이 표시되는 채널에서 영어·일본어 사용자에게 한국어 title과 action이 노출된다.

권장 조치

기존 I18n.Explorer.donationRankingTitle과 I18n.CreatorChannelHome.viewAll을 직접 재사용한다. 신규 title·action 키는 추가하지 않는다.

판정 기록

  • 2026-08-26 — 정적 코드와 기존 I18n 정의로 확정.
  • 2026-08-26 — 사용자 인터뷰에서 기존 후원랭킹 키 재사용을 확정.

REV-P3-002 — 공용 카드의 can pill과 빈 메시지가 한국어로 고정됨

  • 심각도: Medium
  • 상태: 확정
  • 관련 요구사항: PRD §5.4
  • 관련 계약: 없음
  • 소유 Task: Task 7.1 / P7-R1

관찰 내용

CreatorChannelDonationCard의 can pill과 빈 message fallback이 한국어 literal을 조합한다. 이 카드는 후원 탭과 홈 탭에서 공용이므로 두 화면이 함께 영향을 받는다.

근거

  • 코드: CreatorChannelDonationCard.swift:60, :75
  • 호출: CreatorChannelDonationTabView.swift:38, CreatorChannelDonationSection.swift:38
  • 기존 I18n: I18n.LiveChat.canWithUnit(_:)은 동일한 ko/en/ja can 형식을 제공한다.
  • 인터뷰 결정: 공개 카드의 영어 fallback은 Donated {can} cans. 전용 문구를 사용한다.

재현 또는 검증 절차

  1. 소스에서 Text("\(donation.can)캔")과 "\(can)캔을 후원하였습니다"를 확인한다.
  2. message가 공백이면 fallback이 런타임에 표시되는 것을 코드 경로로 확인한다.
  3. 공용 카드의 두 호출 위치를 확인한다.

영향

영어·일본어 사용자에게 can 단위와 빈 메시지가 한국어로 표시되며, 홈 탭과 후원 탭에 동시에 노출된다.

권장 조치

can pill은 I18n.LiveChat.canWithUnit(_:)을 재사용한다. 빈 메시지만 I18n.CreatorChannelDonation.defaultMessage(_:)로 추가하고 ko {can}캔을 후원하였습니다, en Donated {can} cans., ja {can}canをサポートしました。를 제공한다.

판정 기록

  • 2026-08-26 — 정적 코드와 두 직접 호출 위치로 확정.
  • 2026-08-26 — 사용자 인터뷰에서 카드 전용 fallback을 확정.

연결 경로 추가 점검

  • CreatorChannelDonationCountBar: I18n.CreatorChannelCommunity.totalLabel 사용.
  • CreatorChannelDonationEmptyView: empty 문구와 후원 action 모두 I18n 사용.
  • CreatorChannelDonationFloatingButton: 사용자 노출 텍스트가 없는 icon-only 컴포넌트.
  • CreatorChannelDonationSection: section·empty·후원 action 문구 모두 I18n 사용.
  • CreatorChannelView: 연결된 후원 dialog 문구는 I18n 사용.
  • DateParser.relativeTimeText: I18n.Time을 사용.

추가 확정 발견 사항은 없다.

7. 확정 항목의 plan·goal 전환

plan-task.md에 Phase 7, Task 7.1, P7-R1을 추가했다. 사용자 지시에 따라 goal 생성과 구현은 수행하지 않았다.

8. 리뷰 종료 판정

판정 항목 결과 근거
리뷰 범위 전체 확인 충족 두 대상과 직접 호출·공용 시간 경계 확인
후보 항목 판정 완료 충족 REV-P3-001, REV-P3-002 확정
확정 항목 plan 반영 충족 Phase 7 / Task 7.1 / P7-R1
보류 항목의 담당·재개 조건 기록 해당 없음 인터뷰 결정 완료
검증 명령과 결과 기록 충족 정적 점검 명령과 Simulator 미실행 사유 기록

최종 결론: 수정 goal 필요

남은 항목: P7-R1의 Swift·I18n 구현과 ko/en/ja Gate 검증. 이번 작업에서는 수행하지 않는다.

9. 수정 후 검증 기록

  • 2026-08-26 (구현 전): 아직 구현하지 않아 기록 없음.
  • 2026-08-26: REV-P3-001, REV-P3-002를 Task 7.1에서 수정했다. 랭킹 title·전체보기 action·can pill은 확정된 기존 I18n을 재사용하고, 공용 카드 빈 메시지 fallback만 I18n.CreatorChannelDonation.defaultMessage(_:)로 추가했다.
  • 2026-08-26: 변경 전 정적 계약은 랭킹과 카드 모두 exit 1, 변경 후 Phase 7 Gate와 git diff --check는 exit 0이었다. xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build는 BUILD SUCCEEDED, 독립 리뷰는 APPROVED였다.
  • 2026-08-26: 사용자 요청에 따라 visual QA를 실행하지 않았다. 따라서 ko/en/ja 실제 화면 수동 검증은 미실행 상태로 plan-task.md에 남겼다.