diff --git a/SodaLive/Sources/I18n/I18n.swift b/SodaLive/Sources/I18n/I18n.swift index fa628ee7..ef96fd66 100644 --- a/SodaLive/Sources/I18n/I18n.swift +++ b/SodaLive/Sources/I18n/I18n.swift @@ -3526,6 +3526,16 @@ If you block this user, the following features will be restricted. static var exitModalContinue: String { pick(ko: "계속 작성", en: "Keep writing", ja: "続ける") } } + enum CreatorChannelDonation { + static var emptyMessage: String { + pick( + ko: "아직 후원이 없습니다.\n처음으로 크리에이터를 후원해 보세요!", + en: "No support yet.\nBe the first to support this creator!", + ja: "まだサポートがありません。\n最初のサポートをしてみましょう!" + ) + } + } + enum HomeRecommendation { static var activityLive: String { pick(ko: "라이브", en: "Live", ja: "ライブ") diff --git a/SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationEmptyView.swift b/SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationEmptyView.swift index dacb715e..303f813a 100644 --- a/SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationEmptyView.swift +++ b/SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationEmptyView.swift @@ -6,7 +6,7 @@ struct CreatorChannelDonationEmptyView: View { var body: some View { VStack(spacing: SodaSpacing.s20) { - Text("아직 후원이 없습니다.\n처음으로 크리에이터를 후원해 보세요!") + Text(I18n.CreatorChannelDonation.emptyMessage) .appFont(size: 16, weight: .medium) .foregroundColor(Color.gray500) .multilineTextAlignment(.center) @@ -22,7 +22,7 @@ struct CreatorChannelDonationEmptyView: View { .scaledToFit() .frame(width: 20, height: 20) - Text("후원하기") + Text(I18n.ContentDetail.DonationDialog.title) .appFont(size: 16, weight: .medium) .foregroundColor(.white) .lineLimit(1) diff --git a/docs/20260704_크리에이터_채널_후원_탭/plan-task.md b/docs/20260704_크리에이터_채널_후원_탭/plan-task.md index d2b54d6a..4ec838b9 100644 --- a/docs/20260704_크리에이터_채널_후원_탭/plan-task.md +++ b/docs/20260704_크리에이터_채널_후원_탭/plan-task.md @@ -225,3 +225,41 @@ - 2026-07-04: 사용자 요청에 따라 내 채널인 경우 후원 탭 empty view 내부 후원하기 버튼과 우측하단 icon-only 후원하기 버튼을 모두 표시하지 않도록 범위를 보완했다. - 2026-07-04: 사용자 요청에 따라 후원 랭킹은 최대 8명만, 한 줄에 4명씩 표시하도록 범위를 보완했다. - 2026-07-08: 사용자 요청에 따라 공용 후원 item의 `can >= 501` 상단 영역에서 `nickname`은 white, 상대 시간은 `gray100`으로 표시하고, 그 외 후원 `can` 구간의 글자색은 기존 색상을 유지하도록 기록했다. + +### Phase 6: 후원 empty state 다국어 보강 + +- [x] **Task 6.1: 후원 empty 문구 정의** + - 대상 파일: + - 수정: `SodaLive/Sources/I18n/I18n.swift` + - 작업 내용: + - Empty 문구를 한국어 `아직 후원이 없습니다.\n처음으로 크리에이터를 후원해 보세요!`, 영어 `No support yet.\nBe the first to support this creator!`, 일본어 `まだサポートがありません。\n最初のサポートをしてみましょう!`로 정의한다. + - 지정된 `\n` 줄바꿈을 모든 언어에서 유지한다. + - 후원 버튼 문구용 신규 I18n 키는 추가하지 않는다. + - 검증 기준: + - 실행 명령: `rg -n "아직 후원이 없습니다|No support yet|まだサポートがありません|最初のサポートをしてみましょう" SodaLive/Sources/I18n/I18n.swift` + - 기대 결과: 후원 empty 문구의 ko/en/ja 값이 `pick(ko:en:ja:)`에서 확인된다. + +- [x] **Task 6.2: 후원 empty View에 기존 I18n 적용** + - 대상 파일: + - 수정: `SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationEmptyView.swift` + - 작업 내용: + - 하드코딩된 empty 문구를 Task 6.1의 I18n 값으로 교체한다. + - 하드코딩된 `후원하기`를 기존 `I18n.ContentDetail.DonationDialog.title`로 교체한다. + - 기존 후원 action과 내 채널 버튼 숨김 규칙을 유지한다. + - 후원 버튼은 `Color.soda400` 배경과 white 아이콘·텍스트를 유지한다. + - 검증 기준: + - 실행 명령: `rg -n "CreatorChannelDonationEmptyView|I18n\.|ContentDetail\.DonationDialog\.title|showsDonateButton|onTapDonate|아직 후원이 없습니다|Text\(\"후원하기\"\)" SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationEmptyView.swift` + - 기대 결과: empty 문구와 버튼은 I18n을 사용하고 기존 action·표시 조건을 유지하며 한국어 하드코딩이 없다. + +- [x] **Task 6.3: 정적 검사와 Debug 빌드 검증** + - 대상 파일: + - 확인: `SodaLive/Sources/I18n/I18n.swift` + - 확인: `SodaLive/Sources/V2/CreatorChannel/Donation/Components/CreatorChannelDonationEmptyView.swift` + - 검증 기준: + - 실행 명령: `git diff --check` + - 기대 결과: 출력 없이 exit code 0이다. + - 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` + - 기대 결과: `** BUILD SUCCEEDED **`. + +- 2026-08-14: 사용자 인터뷰로 후원 탭 empty 문구의 ko/en/ja 값을 확정하고 기존 후원 버튼 title 재사용을 Phase 6 미완료 후속 Task로 추가했다. 이번 작업은 문서만 보강했으며 Swift 구현과 빌드는 수행하지 않았다. +- 2026-08-14: Phase 6 구현을 완료했다. 후원 탭 empty 문구를 ko/en/ja I18n으로 교체하고 버튼은 기존 `I18n.ContentDetail.DonationDialog.title`을 재사용했으며 `Color.soda400` 배경과 white 아이콘·텍스트를 유지했다. 23개 정적 계약, `git diff --check`, iPhone 16 Pro 시뮬레이터 Debug 빌드가 통과했고, 세 언어 캡처와 두 독립 색상·CJK 리뷰에서 차단 항목 없이 PASS를 확인했다. diff --git a/docs/20260704_크리에이터_채널_후원_탭/prd.md b/docs/20260704_크리에이터_채널_후원_탭/prd.md index a2114b2a..034b8612 100644 --- a/docs/20260704_크리에이터_채널_후원_탭/prd.md +++ b/docs/20260704_크리에이터_채널_후원_탭/prd.md @@ -14,6 +14,7 @@ Figma 참조: - 현재 `CreatorChannelTab.donation`은 placeholder로 표시되어 실제 후원 랭킹과 후원 내역을 확인할 수 없다. - 기존 홈 탭에는 채널 후원 요약 섹션과 후원하기 액션이 있지만, 후원 탭 전용 API, 랭킹 섹션, 스크롤 페이징이 없다. - 후원 후 홈 탭 후원 섹션은 갱신되지만, 후원 탭이 구현되면 후원 탭 목록도 함께 갱신되어야 한다. +- 후원 탭 empty 문구와 `후원하기` 버튼이 한국어로 하드코딩되어 앱 언어 설정에 맞게 표시되지 않는다. ## 3. Goals - `CreatorChannelTab.donation` 선택 시 후원 탭 API를 호출하고 응답 데이터로 화면을 구성한다. @@ -142,8 +143,12 @@ data class CreatorChannelDonationResponse( ### 5.7 Empty and floating donation button - `rankings.isEmpty && donationCount == 0`이면 Figma `290:9009` 기준의 empty view를 표시한다. -- Empty 문구는 `아직 후원이 없습니다.\n처음으로 크리에이터를 후원해 보세요!`를 표시한다. -- Empty view에는 `ic_new_donation` 아이콘과 `후원하기` 텍스트가 있는 `Color.soda400` capsule button을 표시한다. +- Empty 문구는 아래 언어별 값을 사용한다. `\n`은 명시적 줄바꿈이다. + - 한국어: `아직 후원이 없습니다.\n처음으로 크리에이터를 후원해 보세요!` + - 영어: `No support yet.\nBe the first to support this creator!` + - 일본어: `まだサポートがありません。\n最初のサポートをしてみましょう!` +- Empty view에는 `ic_new_donation` 아이콘과 기존 `I18n.ContentDetail.DonationDialog.title` 텍스트가 있는 `Color.soda400` capsule button을 표시하고, 아이콘과 텍스트는 white를 사용한다. +- `후원하기`용 신규 I18n 키를 만들지 않는다. - 단, 내 채널인 경우 Empty view 내부 후원하기 버튼을 표시하지 않는다. - Empty view의 후원하기 버튼 tap은 홈 탭 후원하기 버튼 tap action과 동일하게 동작한다. - Empty 상태에서는 하단 고정 후원하기 버튼을 표시하지 않는다. @@ -159,6 +164,7 @@ data class CreatorChannelDonationResponse( - `donations` 목록은 기존 홈 탭 후원 카드와 같은 후원 금액별 상단 컬러, can pill, 상대 시간, 메시지 표시 규칙을 따른다. - 목록 하단 도달 시 `hasNext == true`이면 다음 페이지가 append된다. - `rankings.isEmpty && donationCount == 0`이면 Figma `290:9009` empty view가 표시되고, 하단 고정 후원하기 버튼은 숨겨진다. +- Empty 문구가 지정된 ko/en/ja 값과 줄바꿈으로 표시되고, 버튼 문구는 기존 `I18n.ContentDetail.DonationDialog.title`을 사용한다. - 내 채널인 경우 Empty view의 후원하기 버튼과 우측하단 icon-only 후원하기 버튼이 모두 표시되지 않는다. - Empty view의 후원하기 버튼을 누르면 홈 탭과 동일한 후원 dialog가 열린다. - `donationCount != 0 || !rankings.isEmpty`이면 홈 탭 plus button 위치에 `ic_new_donation` icon-only 후원하기 버튼이 표시된다. @@ -172,6 +178,7 @@ data class CreatorChannelDonationResponse( - `CreatorChannelDonationResponse`는 `Home/Models/CreatorChannelHomeResponse.swift`의 기존 타입을 재사용한다. - 후원 item UI는 기존 홈 탭 구현과 중복을 줄이기 위해 공용 컴포넌트로 추출하거나, 홈/후원 탭 양쪽에서 같은 하위 컴포넌트를 사용하도록 최소 범위로 조정한다. - 신규 문구가 필요하면 `SodaLive/Sources/I18n/I18n.swift`에 ko/en/ja를 추가한다. +- Empty 문구는 `pick(ko:en:ja:)`로 관리하고, 후원 버튼은 기존 `I18n.ContentDetail.DonationDialog.title`을 재사용한다. 신규 후원 버튼 문구, route, API, dependency는 추가하지 않는다. - 프로젝트 설정 변경은 신규 Swift 파일 target 등록이 필요한 경우에만 수행한다. ## 8. Open Questions @@ -182,3 +189,4 @@ data class CreatorChannelDonationResponse( - 2026-07-04: `CreatorChannelView`, `CreatorChannelDonationSection`, `CreatorChannelSortBar`, `ChannelDonationViewModel`, 기존 후원 전체 화면 코드를 확인해 재사용 경계를 정했다. - 2026-07-04: Figma `get_design_context`와 `get_screenshot`으로 empty view `290:9009`를 확인했다. - 2026-07-04: `UserProfileDonationAllView`와 `AppStep.userProfileDonationAll(userId:)` 기존 라우팅을 확인해 랭킹 전체보기 재사용 경계를 정했다. +- 2026-08-14: 사용자 인터뷰로 후원 탭 empty 문구의 ko/en/ja 값을 확정했다. `후원하기`는 기존 `I18n.ContentDetail.DonationDialog.title`을 재사용하며 이번 작업에서는 Swift 구현을 수행하지 않는다.