feat(i18n): 라이브 룸 하드코딩 문구를 I18n 키로 통일한다

This commit is contained in:
Yu Sung
2026-04-01 13:52:02 +09:00
parent 540238eb48
commit bceec46ebc
36 changed files with 571 additions and 324 deletions

View File

@@ -19,14 +19,14 @@ struct RouletteSettingsOptionView: View {
var body: some View {
VStack(spacing: 6.7) {
HStack(spacing: 0) {
Text("옵션 \(index + 1)")
Text(I18n.CreateLive.rouletteOptionTitle(index))
.appFont(size: 14.7, weight: .medium)
.foregroundColor(Color(hex: "eeeeee"))
Spacer()
if index > 1 {
Text("삭제")
Text(I18n.CreateLive.rouletteDeleteAction)
.appFont(size: 14.7, weight: .medium)
.foregroundColor(Color(hex: "ff5c49"))
.onTapGesture { onClickDelete() }
@@ -34,7 +34,7 @@ struct RouletteSettingsOptionView: View {
}
HStack(spacing: 8) {
TextField("옵션을 입력하세요", text: $option.title)
TextField(I18n.CreateLive.rouletteOptionPlaceholder, text: $option.title)
.autocapitalization(.none)
.disableAutocorrection(true)
.appFont(size: 13.3, weight: .medium)

View File

@@ -28,7 +28,7 @@ struct RouletteSettingsView: View {
GeometryReader { proxy in
BaseView(isLoading: $viewModel.isLoading) {
VStack(spacing: 0) {
DetailNavigationBar(title: String(localized: "룰렛 설정")) {
DetailNavigationBar(title: I18n.CreateLive.rouletteSettingsTitle) {
isShowing = false
}
@@ -73,7 +73,7 @@ struct RouletteSettingsView: View {
if availableActive {
HStack(spacing: 0) {
Text("룰렛을 활성화 하시겠습니까?")
Text(I18n.CreateLive.rouletteActivatePrompt)
.appFont(size: 16, weight: .bold)
.foregroundColor(Color.grayee)
@@ -90,12 +90,12 @@ struct RouletteSettingsView: View {
}
VStack(alignment: .leading, spacing: 13.3) {
Text("룰렛 금액 설정")
Text(I18n.CreateLive.rouletteCanSettingTitle)
.appFont(size: 16, weight: .bold)
.foregroundColor(Color.grayee)
HStack(spacing: 8) {
TextField("룰렛 금액을 입력해 주세요 (최소 5캔)", text: Binding(
TextField(I18n.CreateLive.rouletteCanPlaceholder, text: Binding(
get: {
self.viewModel.canText
},
@@ -117,7 +117,7 @@ struct RouletteSettingsView: View {
Spacer()
Text("")
Text(I18n.CreateLive.canUnit)
.appFont(size: 16.7, weight: .bold)
.foregroundColor(Color.grayee)
}
@@ -126,12 +126,12 @@ struct RouletteSettingsView: View {
.id("roulette_can_input")
VStack(alignment: .leading, spacing: 21.3) {
Text("룰렛 옵션 설정")
Text(I18n.CreateLive.rouletteOptionSettingTitle)
.appFont(size: 16, weight: .bold)
.foregroundColor(Color.grayee)
HStack(spacing: 0) {
Text("※ 룰렛 옵션은 최소 2개,\n최대 10개까지 설정할 수 있습니다.")
Text(I18n.CreateLive.rouletteOptionLimitNotice)
.appFont(size: 13.3, weight: .medium)
.foregroundColor(Color.mainRed)
@@ -144,7 +144,7 @@ struct RouletteSettingsView: View {
.padding(.top, 26.7)
HStack(spacing: 0) {
Text("옵션 확률 합계")
Text(I18n.CreateLive.rouletteProbabilitySum)
.appFont(size: 14.7, weight: .medium)
.foregroundColor(Color.grayee)
@@ -186,7 +186,7 @@ struct RouletteSettingsView: View {
Spacer()
HStack(spacing: 13.3) {
Text("미리보기")
Text(I18n.CreateLive.roulettePreviewAction)
.appFont(size: 18.3, weight: .bold)
.foregroundColor(Color.button)
.padding(.vertical, 16)
@@ -200,7 +200,7 @@ struct RouletteSettingsView: View {
viewModel.onClickPreview()
}
Text("설정완료")
Text(I18n.CreateLive.rouletteCompleteAction)
.appFont(size: 18.3, weight: .bold)
.foregroundColor(.white)
.padding(.vertical, 16)
@@ -232,7 +232,7 @@ struct RouletteSettingsView: View {
if let preview = viewModel.previewData, viewModel.isShowPreview {
RoulettePreviewDialog(
isShowing: $viewModel.isShowPreview,
title: "룰렛 미리보기",
title: I18n.CreateLive.roulettePreviewTitle,
onClickSpin: nil,
previewList: [preview]
)

View File

@@ -86,11 +86,11 @@ final class RouletteSettingsViewModel: ObservableObject {
rouletteList.append(contentsOf: data)
selectRoulette(selectedRoulette: .ROULETTE_1)
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowErrorPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowErrorPopup = true
}
}
@@ -104,7 +104,7 @@ final class RouletteSettingsViewModel: ObservableObject {
for option in options {
if option.title.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
isLoading = false
errorMessage = "옵션은 빈칸일 수 없습니다."
errorMessage = I18n.CreateLive.rouletteOptionEmptyError
isShowErrorPopup = true
return
}
@@ -137,7 +137,7 @@ final class RouletteSettingsViewModel: ObservableObject {
for option in options {
if option.title.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
isLoading = false
errorMessage = "옵션은 빈칸일 수 없습니다."
errorMessage = I18n.CreateLive.rouletteOptionEmptyError
isShowErrorPopup = true
return false
}
@@ -149,7 +149,7 @@ final class RouletteSettingsViewModel: ObservableObject {
if totalPercentage > Float(100.1) || totalPercentage <= Float(99.99) {
isLoading = false
errorMessage = "확률이 100%가 아닙니다"
errorMessage = I18n.CreateLive.rouletteProbabilityInvalidError
isShowErrorPopup = true
return false
}
@@ -170,23 +170,23 @@ final class RouletteSettingsViewModel: ObservableObject {
switch (self.selectedRoulette) {
case .ROULETTE_2:
selectedRouletteTitle = "룰렛 2"
selectedRouletteTitle = I18n.Common.roulette2
case .ROULETTE_3:
selectedRouletteTitle = "룰렛 3"
selectedRouletteTitle = I18n.Common.roulette3
default:
selectedRouletteTitle = "룰렛 1"
selectedRouletteTitle = I18n.Common.roulette1
}
if availableActive {
if isActive {
successMessage = "\(selectedRouletteTitle)로 설정하였습니다."
successMessage = I18n.CreateLive.rouletteSetAsSuccess(selectedRouletteTitle)
} else {
successMessage = "\(selectedRouletteTitle)을 설정했습니다."
successMessage = I18n.CreateLive.rouletteSetSuccess(selectedRouletteTitle)
}
} else {
successMessage = "\(selectedRouletteTitle)을 생성했습니다."
successMessage = I18n.CreateLive.rouletteCreatedSuccess(selectedRouletteTitle)
}
let request = CreateRouletteRequest(can: can, isActive: isActive, items: items)
@@ -209,11 +209,11 @@ final class RouletteSettingsViewModel: ObservableObject {
if decoded.success {
onSuccess(isActive, successMessage)
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowErrorPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowErrorPopup = true
}
}
@@ -230,7 +230,7 @@ final class RouletteSettingsViewModel: ObservableObject {
let selectedRoulette = rouletteList[selectedRoulette!.rawValue]
if selectedRoulette.isActive == isActive && selectedRoulette.can == can && selectedRoulette.items == items {
self.errorMessage = "변동사항이 없습니다."
self.errorMessage = I18n.CreateLive.rouletteNoChangesMessage
self.isShowErrorPopup = true
self.isLoading = false
return
@@ -241,23 +241,23 @@ final class RouletteSettingsViewModel: ObservableObject {
switch (self.selectedRoulette) {
case .ROULETTE_2:
selectedRouletteTitle = "룰렛 2"
selectedRouletteTitle = I18n.Common.roulette2
case .ROULETTE_3:
selectedRouletteTitle = "룰렛 3"
selectedRouletteTitle = I18n.Common.roulette3
default:
selectedRouletteTitle = "룰렛 1"
selectedRouletteTitle = I18n.Common.roulette1
}
if availableActive {
if isActive {
successMessage = "\(selectedRouletteTitle)을 활성화 했습니다."
successMessage = I18n.CreateLive.rouletteActivatedSuccess(selectedRouletteTitle)
} else {
successMessage = "\(selectedRouletteTitle)을 비활성화 했습니다."
successMessage = I18n.CreateLive.rouletteDeactivatedSuccess(selectedRouletteTitle)
}
} else {
successMessage = "\(selectedRouletteTitle)을 변경했습니다."
successMessage = I18n.CreateLive.rouletteChangedSuccess(selectedRouletteTitle)
}
let request = UpdateRouletteRequest(id: rouletteId, can: can, isActive: isActive, items: items)
@@ -280,11 +280,11 @@ final class RouletteSettingsViewModel: ObservableObject {
if decoded.success {
onSuccess(isActive, successMessage)
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowErrorPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowErrorPopup = true
}
}
@@ -293,13 +293,13 @@ final class RouletteSettingsViewModel: ObservableObject {
func selectRoulette(selectedRoulette: SelectedRoulette) {
if rouletteList.isEmpty && (selectedRoulette == .ROULETTE_2 || selectedRoulette == .ROULETTE_3) {
errorMessage = "룰렛 1을 먼저 설정하세요"
errorMessage = I18n.CreateLive.rouletteNeedFirstMessage
isShowErrorPopup = true
return
}
if rouletteList.count == 1 && selectedRoulette == .ROULETTE_3 {
errorMessage = "룰렛 1과 룰렛 2를 먼저 설정하세요"
errorMessage = I18n.CreateLive.rouletteNeedFirstAndSecondMessage
isShowErrorPopup = true
return
}