From a4d6de83db077865ce57ccc6eb07477949a74769 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Wed, 25 Feb 2026 22:30:22 +0900 Subject: [PATCH] =?UTF-8?q?fix(report):=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=B0=A8=EB=8B=A8=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EB=AC=B8=EA=B5=AC=EB=A5=BC=20=EA=B5=AD=EC=A0=9C?= =?UTF-8?q?=ED=99=94=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SodaLive/Sources/I18n/I18n.swift | 77 +++++++++++++++++++ .../Report/UserBlockConfirmDialogView.swift | 24 +++--- docs/20260225_사용자차단다이얼로그문구수정.md | 21 +++++ 3 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 docs/20260225_사용자차단다이얼로그문구수정.md diff --git a/SodaLive/Sources/I18n/I18n.swift b/SodaLive/Sources/I18n/I18n.swift index c8c8c4d..7c5b507 100644 --- a/SodaLive/Sources/I18n/I18n.swift +++ b/SodaLive/Sources/I18n/I18n.swift @@ -896,6 +896,83 @@ enum I18n { static var fetchLiveInfoFailed: String { pick(ko: "라이브 정보를 가져오지 못했습니다.\n다시 시도해 주세요.", en: "Failed to fetch live information.\nPlease try again.", ja: "ライブ情報を取得できませんでした。\nもう一度お試しください。") } static var userBlocked: String { pick(ko: "차단하였습니다.", en: "User has been blocked.", ja: "ブロックしました。") } static var userUnblocked: String { pick(ko: "차단이 해제 되었습니다.", en: "User has been unblocked.", ja: "ブロックを解除しました。") } + static var blockDialogTitle: String { pick(ko: "사용자 차단", en: "Block User", ja: "ユーザーブロック") } + static func blockConfirmQuestion(_ nickname: String) -> String { + pick( + ko: "\(nickname)님을 차단하시겠습니까?", + en: "Do you want to block \(nickname)?", + ja: "\(nickname)さんをブロックしますか?" + ) + } + static func blockCreatorNotice(_ nickname: String) -> String { + pick( + ko: """ +사용자를 차단하면 해당 사용자는 아래 기능이 제한됩니다. + +- 내 채널 접근 제한 +- 내가 개설한 라이브 입장 불가 +- 내가 등록한 콘텐츠 접근 불가 +- 나에게 메시지 보내기 불가 +- \(nickname)님이 작성한 댓글보기 제한 +- \(nickname)님의 라이브 채팅보기 제한 +""", + en: """ +If you block this user, the following features will be restricted for that user. + +- Access to my channel restricted +- Cannot enter live streams I created +- Cannot access content I registered +- Cannot send me messages +- Restricted from viewing comments written by \(nickname) +- Restricted from viewing \(nickname)'s live chats +""", + ja: """ +このユーザーをブロックすると、以下の機能がそのユーザーに対して制限されます。 + +- 私のチャンネルへのアクセス制限 +- 私が開設したライブへの入場不可 +- 私が登録したコンテンツへのアクセス不可 +- 私へのメッセージ送信不可 +- \(nickname)さんが作成したコメントの閲覧制限 +- \(nickname)さんのライブチャット閲覧制限 +""" + ) + } + static func blockListenerNotice(_ nickname: String) -> String { + pick( + ko: """ +사용자를 차단하면 아래 기능이 제한됩니다. + +- \(nickname)님의 채널 접근 제한 +- \(nickname)님의 콘텐츠 보기 제한 +- \(nickname)님의 라이브 보기 제한 +- \(nickname)님에게 메시지 보내기 제한 +- \(nickname)님이 작성한 댓글보기 제한 +- \(nickname)님의 라이브 채팅보기 제한 +""", + en: """ +If you block this user, the following features will be restricted. + +- Access to \(nickname)'s channel restricted +- Restricted from viewing \(nickname)'s content +- Restricted from viewing \(nickname)'s live streams +- Restricted from sending messages to \(nickname) +- Restricted from viewing comments written by \(nickname) +- Restricted from viewing \(nickname)'s live chats +""", + ja: """ +このユーザーをブロックすると、以下の機能が制限されます。 + +- \(nickname)さんのチャンネルへのアクセス制限 +- \(nickname)さんのコンテンツ閲覧制限 +- \(nickname)さんのライブ閲覧制限 +- \(nickname)さんへのメッセージ送信制限 +- \(nickname)さんが作成したコメントの閲覧制限 +- \(nickname)さんのライブチャット閲覧制限 +""" + ) + } + static var blockAction: String { pick(ko: "차단", en: "Block", ja: "ブロック") } static var shareLinkCreateFailed: String { pick(ko: "공유링크를 생성하지 못했습니다.\n다시 시도해 주세요.", en: "Failed to create a share link.\nPlease try again.", ja: "共有リンクを作成できませんでした。\nもう一度お試しください。") } static var cheersDeleteTitle: String { pick(ko: "응원글 삭제", en: "Delete Cheer", ja: "応援削除") } diff --git a/SodaLive/Sources/Report/UserBlockConfirmDialogView.swift b/SodaLive/Sources/Report/UserBlockConfirmDialogView.swift index bfa035f..7cc2188 100644 --- a/SodaLive/Sources/Report/UserBlockConfirmDialogView.swift +++ b/SodaLive/Sources/Report/UserBlockConfirmDialogView.swift @@ -14,15 +14,11 @@ struct UserBlockConfirmDialogView: View { let nickname: String let confirmAction: () -> Void - let notice = """ -사용자를 차단하면 사용자는 아래 기능이 제한됩니다. - -- 내가 개설한 라이브 입장 불가 -- 나에게 메시지 보내기 불가 -- 내 채널의 팬Talk 작성불가 -""" - - let notice2 = "- 사용자를 차단하면 '차단한 사용자의 라이브 중 채팅'이 보이지 않습니다." + var notice: String { + UserDefaults.string(forKey: .role) == MemberRole.CREATOR.rawValue + ? I18n.MemberChannel.blockCreatorNotice(nickname) + : I18n.MemberChannel.blockListenerNotice(nickname) + } var body: some View { ZStack { @@ -32,16 +28,16 @@ struct UserBlockConfirmDialogView: View { .onTapGesture { isShowing = false } VStack(spacing: 13.3) { - Text("사용자 차단") + Text(I18n.MemberChannel.blockDialogTitle) .appFont(size: 16.7, weight: .medium) .foregroundColor(.white) - Text("\(nickname)님을 차단하시겠습니까?") + Text(I18n.MemberChannel.blockConfirmQuestion(nickname)) .appFont(size: 13.3, weight: .medium) .foregroundColor(.white) HStack(spacing: 0) { - Text(UserDefaults.string(forKey: .role) == MemberRole.CREATOR.rawValue ? notice : notice2) + Text(notice) .appFont(size: 13.3, weight: .medium) .foregroundColor(.white) @@ -51,14 +47,14 @@ struct UserBlockConfirmDialogView: View { HStack(spacing: 26.7) { Spacer() - Text("취소") + Text(I18n.Common.cancel) .appFont(size: 13.3, weight: .medium) .foregroundColor(Color.button) .onTapGesture { isShowing = false } - Text("차단") + Text(I18n.MemberChannel.blockAction) .appFont(size: 13.3, weight: .medium) .foregroundColor(Color.button) .onTapGesture { diff --git a/docs/20260225_사용자차단다이얼로그문구수정.md b/docs/20260225_사용자차단다이얼로그문구수정.md new file mode 100644 index 0000000..7ec4470 --- /dev/null +++ b/docs/20260225_사용자차단다이얼로그문구수정.md @@ -0,0 +1,21 @@ +# 2026-02-25 사용자 차단 다이얼로그 문구 수정 + +## 구현 체크리스트 +- [x] 사용자 차단 다이얼로그 문구 위치 확인 및 분기 방식 점검 +- [x] `role == CREATOR` 문구를 요구사항 기준으로 교체 +- [x] `role != CREATOR` 문구를 요구사항 기준으로 교체 +- [x] 사용자 차단 다이얼로그 문구 국제화(`I18n.MemberChannel`) 적용 +- [x] 진단/빌드 검증 수행 및 결과 기록 + +## 검증 기록 +- 무엇/왜/어떻게: 사용자 요청에 따라 사용자 차단 다이얼로그의 역할별 안내 문구를 유지하면서 `I18n.MemberChannel` 기반으로 국제화 적용했다. `UserBlockConfirmDialogView`는 하드코딩 문자열 대신 국제화 키를 사용하고, 닉네임 치환이 필요한 문구는 `I18n` 함수로 분리했다. +- 실행 명령: `lsp_diagnostics` (`SodaLive/Sources/I18n/I18n.swift`, `SodaLive/Sources/Report/UserBlockConfirmDialogView.swift`) +- 결과: SourceKit 인덱싱 한계로 외부 심볼(`LanguageHeaderProvider`, `MemberRole`, `appFont`, `screenSize`, `Color.gray22`) 미해석 오류가 보고되어 신뢰 가능한 정적 진단이 어려움. 실제 컴파일 검증은 `xcodebuild` 성공으로 확인. +- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build -quiet` +- 결과: 성공 (경고만 존재, 빌드 완료) +- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build -quiet` +- 결과: 성공 (경고만 존재, 빌드 완료) +- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test -quiet` +- 결과: 실패 (`Scheme SodaLive is not currently configured for the test action.`) +- 실행 명령: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test -quiet` +- 결과: 실패 (`Scheme SodaLive-dev is not currently configured for the test action.`)