fix(report): 사용자 차단 다이얼로그 문구를 국제화한다

This commit is contained in:
Yu Sung
2026-02-25 22:30:22 +09:00
parent c7ec9045ff
commit a4d6de83db
3 changed files with 108 additions and 14 deletions

View File

@@ -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: "応援削除") }

View File

@@ -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 {

View File

@@ -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.`)