From dbc4e40904091afc1c0cbc9a45c6051efb52f8e2 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Fri, 19 Dec 2025 22:12:41 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B1=84=ED=8C=85=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EA=B3=BC=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=9E=AC?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=ED=98=84=EC=A7=80=ED=99=94=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 채팅방 잠금 및 초기화 안내 문구와 설정, 비밀번호 재설정\n제목을 다국어 문자열로 제공한다. --- SodaLive/Resources/Localizable.xcstrings | 92 ++++++++++++++----- .../Sources/Chat/Talk/Room/ChatRoomView.swift | 16 ++-- .../Room/Settings/ChatBgSelectionView.swift | 2 +- .../Talk/Room/Settings/ChatSettingsView.swift | 2 +- SodaLive/Sources/I18n/I18n.swift | 40 ++++++++ .../User/FindPassword/FindPasswordView.swift | 2 +- 6 files changed, 121 insertions(+), 33 deletions(-) diff --git a/SodaLive/Resources/Localizable.xcstrings b/SodaLive/Resources/Localizable.xcstrings index f9f6cc5..109f7da 100644 --- a/SodaLive/Resources/Localizable.xcstrings +++ b/SodaLive/Resources/Localizable.xcstrings @@ -3320,6 +3320,22 @@ } } }, + "대화 설정" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chat settings" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "チャット設定" + } + } + } + }, "대화 중인 톡이 없습니다" : { "localizations" : { "en" : { @@ -4088,18 +4104,18 @@ } } }, - "모집완료" : { + "모든 기기에서 로그아웃" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Recruitment closed" + "value" : "Log out from all devices" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "募集終了" + "value" : "すべての端末でログアウト" } } } @@ -4120,18 +4136,18 @@ } } }, - "모든 기기에서 로그아웃" : { + "모집완료" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Log out from all devices" + "value" : "Recruitment closed" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "すべての端末でログアウト" + "value" : "募集終了" } } } @@ -4440,6 +4456,22 @@ } } }, + "배경 이미지 선택" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Select background image" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "背景画像を選択" + } + } + } + }, "보관" : { "localizations" : { "en" : { @@ -4824,6 +4856,22 @@ } } }, + "비밀번호 재설정" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reset password" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "パスワード再設定" + } + } + } + }, "비밀번호 표시" : { "localizations" : { "en" : { @@ -8552,22 +8600,6 @@ } } }, - "캐릭터 정보" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Character info" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "キャラクター情報" - } - } - } - }, "캔" : { "localizations" : { "en" : { @@ -8584,6 +8616,22 @@ } } }, + "캐릭터 정보" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Character info" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "キャラクター情報" + } + } + } + }, "캔 충전" : { "localizations" : { "en" : { diff --git a/SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift b/SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift index 5be5a16..4e83f2f 100644 --- a/SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift +++ b/SodaLive/Sources/Chat/Talk/Room/ChatRoomView.swift @@ -227,13 +227,13 @@ struct ChatRoomView: View { if let message = viewModel.selectedMessage, viewModel.selectedMessageIndex >= 0 { SodaDialog( - title: "잠금된 메시지", - desc: "이 메시지를 \(message.price ?? 5)캔으로 잠금해제 하시겠습니까?", - confirmButtonTitle: "잠금해제", + title: I18n.ChatRoom.lockedMessageTitle, + desc: I18n.ChatRoom.unlockMessageDescription(message.price ?? 5), + confirmButtonTitle: I18n.ChatRoom.unlock, confirmButtonAction: { viewModel.purchaseChatMessage() }, - cancelButtonTitle: "취소" + cancelButtonTitle: I18n.Common.cancel ) { viewModel.selectedMessage = nil viewModel.selectedMessageIndex = -1 @@ -265,14 +265,14 @@ struct ChatRoomView: View { Color.black.opacity(0.7) SodaDialog( - title: "대화 초기화", - desc: "지금까지의 대화가 모두 초기화 되고 새롭게 대화를 시작합니다.", - confirmButtonTitle: "30캔으로 초기화", + title: I18n.ChatRoom.resetTitle, + desc: I18n.ChatRoom.resetDescription, + confirmButtonTitle: I18n.ChatRoom.resetWithCans(30), confirmButtonAction: { viewModel.resetChatRoom() viewModel.isShowingChatResetConfirmDialog = false }, - cancelButtonTitle: "취소", + cancelButtonTitle: I18n.Common.cancel, cancelButtonAction: { viewModel.isShowingChatResetConfirmDialog = false } diff --git a/SodaLive/Sources/Chat/Talk/Room/Settings/ChatBgSelectionView.swift b/SodaLive/Sources/Chat/Talk/Room/Settings/ChatBgSelectionView.swift index b22ed6f..6295822 100644 --- a/SodaLive/Sources/Chat/Talk/Room/Settings/ChatBgSelectionView.swift +++ b/SodaLive/Sources/Chat/Talk/Room/Settings/ChatBgSelectionView.swift @@ -26,7 +26,7 @@ struct ChatBgSelectionView: View { var body: some View { BaseView(isLoading: $viewModel.isLoading) { VStack(spacing: 0) { - DetailNavigationBar(title: "배경 이미지 선택") { + DetailNavigationBar(title: String(localized: "배경 이미지 선택")) { isShowing = false } // 갤러리 그리드 diff --git a/SodaLive/Sources/Chat/Talk/Room/Settings/ChatSettingsView.swift b/SodaLive/Sources/Chat/Talk/Room/Settings/ChatSettingsView.swift index 9857521..65e48d0 100644 --- a/SodaLive/Sources/Chat/Talk/Room/Settings/ChatSettingsView.swift +++ b/SodaLive/Sources/Chat/Talk/Room/Settings/ChatSettingsView.swift @@ -17,7 +17,7 @@ struct ChatSettingsView: View { var body: some View { VStack(spacing: 0) { - DetailNavigationBar(title: "대화 설정") { + DetailNavigationBar(title: String(localized: "대화 설정")) { isShowing = false } diff --git a/SodaLive/Sources/I18n/I18n.swift b/SodaLive/Sources/I18n/I18n.swift index c20400a..82ab38d 100644 --- a/SodaLive/Sources/I18n/I18n.swift +++ b/SodaLive/Sources/I18n/I18n.swift @@ -11,6 +11,46 @@ import Foundation // String Catalog를 사용하지 않는 컨텍스트에서 사용할 하드코딩 맵 기반 i18n. // 기준 언어 선택은 LanguageHeaderProvider.current("ko"|"en"|"ja"). enum I18n { + // 채팅방(캐릭터 톡) 관련 문자열 + enum ChatRoom { + // 잠금된 메시지 다이얼로그 + static var lockedMessageTitle: String { + pick(ko: "잠금된 메시지", en: "Locked message", ja: "ロックされたメッセージ") + } + + static func unlockMessageDescription(_ price: Int) -> String { + pick( + ko: "이 메시지를 \(price)캔으로 잠금해제 하시겠습니까?", + en: "Do you want to unlock this message for \(price) cans?", + ja: "このメッセージを\(price)缶で解除しますか?" + ) + } + + static var unlock: String { + pick(ko: "잠금해제", en: "Unlock", ja: "解除する") + } + + // 대화 초기화 다이얼로그 + static var resetTitle: String { + pick(ko: "대화 초기화", en: "Reset conversation", ja: "会話をリセット") + } + + static var resetDescription: String { + pick( + ko: "지금까지의 대화가 모두 초기화 되고 새롭게 대화를 시작합니다.", + en: "All previous messages will be cleared and a new conversation will begin.", + ja: "これまでの会話がすべて初期化され、新しい会話を開始します。" + ) + } + + static func resetWithCans(_ cans: Int) -> String { + pick( + ko: "\(cans)캔으로 초기화", + en: "Reset with \(cans) cans", + ja: "\(cans)缶でリセット" + ) + } + } // 검색 관련 문자열 enum Search { // 검색 입력 플레이스홀더: 2글자 이상 안내 diff --git a/SodaLive/Sources/User/FindPassword/FindPasswordView.swift b/SodaLive/Sources/User/FindPassword/FindPasswordView.swift index 0868348..fc90946 100644 --- a/SodaLive/Sources/User/FindPassword/FindPasswordView.swift +++ b/SodaLive/Sources/User/FindPassword/FindPasswordView.swift @@ -17,7 +17,7 @@ struct FindPasswordView: View { BaseView(isLoading: $viewModel.isLoading) { GeometryReader { proxy in VStack(spacing: 0) { - DetailNavigationBar(title: "비밀번호 재설정") + DetailNavigationBar(title: String(localized: "비밀번호 재설정")) ScrollView(.vertical, showsIndicators: false) { VStack(spacing: 0) {