콘텐츠 작성 및 라이브 메뉴 다국어화

콘텐츠 등록 화면 텍스트와 버튼을 I18n 기반 번역 문자열로 교체

룰렛 설정과 미션 메뉴 버튼 라벨을 다국어 문자열로 통일

신규 텍스트를 String Catalog에 추가하여 네비게이션 타이틀 번역
This commit is contained in:
Yu Sung
2025-12-17 18:47:46 +09:00
parent a0bb593431
commit 8efa89d564
7 changed files with 130 additions and 71 deletions

View File

@@ -24,7 +24,7 @@ struct ContentCreateView: View {
GeometryReader { proxy in
ZStack {
VStack(spacing: 0) {
DetailNavigationBar(title: "콘텐츠 등록")
DetailNavigationBar(title: String(localized: "콘텐츠 등록"))
ScrollView(.vertical, showsIndicators: false) {
VStack(spacing: 0) {
@@ -67,7 +67,7 @@ struct ContentCreateView: View {
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.top, 13.3)
Text(viewModel.fileName.trimmingCharacters(in: .whitespacesAndNewlines) == "" ? "파일선택" : viewModel.fileName)
Text(viewModel.fileName.trimmingCharacters(in: .whitespacesAndNewlines) == "" ? I18n.CreateContent.selectFile : viewModel.fileName)
.font(.custom(Font.medium.rawValue, size: 16.7))
.foregroundColor(Color.button)
.padding(.vertical, 10)
@@ -126,7 +126,7 @@ struct ContentCreateView: View {
TextViewWrapper(
text: $viewModel.detail,
placeholder: viewModel.placeholder,
placeholder: I18n.CreateContent.uploadContentDescriptionHint,
textColorHex: "eeeeee",
backgroundColorHex: "222222"
)
@@ -157,7 +157,7 @@ struct ContentCreateView: View {
Text(viewModel.theme != nil ?
viewModel.theme!.theme :
"테마 선택")
I18n.CreateContent.selectTheme)
.font(.custom(Font.bold.rawValue, size: 16.7))
.foregroundColor(Color.button)
}
@@ -209,13 +209,13 @@ struct ContentCreateView: View {
.frame(maxWidth: .infinity, alignment: .leading)
HStack(spacing: 13.3) {
SelectButtonView(title: "무료", isChecked: viewModel.isFree) {
SelectButtonView(title: I18n.CreateContent.free, isChecked: viewModel.isFree) {
if !viewModel.isFree {
viewModel.isFree = true
}
}
SelectButtonView(title: "유료", isChecked: !viewModel.isFree) {
SelectButtonView(title: I18n.CreateContent.paid, isChecked: !viewModel.isFree) {
if viewModel.isFree {
viewModel.isFree = false
}
@@ -230,19 +230,19 @@ struct ContentCreateView: View {
.frame(maxWidth: .infinity, alignment: .leading)
HStack(spacing: 6.7) {
SelectButtonView(title: "소장/대여", isChecked: viewModel.purchaseOption == .BOTH) {
SelectButtonView(title: I18n.CreateContent.purchaseBoth, isChecked: viewModel.purchaseOption == .BOTH) {
if viewModel.purchaseOption != .BOTH {
viewModel.purchaseOption = .BOTH
}
}
SelectButtonView(title: "소장만", isChecked: viewModel.purchaseOption == .BUY_ONLY) {
SelectButtonView(title: I18n.CreateContent.purchaseBuyOnly, isChecked: viewModel.purchaseOption == .BUY_ONLY) {
if viewModel.purchaseOption != .BUY_ONLY {
viewModel.purchaseOption = .BUY_ONLY
}
}
SelectButtonView(title: "대여만", isChecked: viewModel.purchaseOption == .RENT_ONLY) {
SelectButtonView(title: I18n.CreateContent.purchaseRentOnly, isChecked: viewModel.purchaseOption == .RENT_ONLY) {
if viewModel.purchaseOption != .RENT_ONLY {
viewModel.purchaseOption = .RENT_ONLY
}
@@ -310,13 +310,13 @@ struct ContentCreateView: View {
.frame(maxWidth: .infinity, alignment: .leading)
HStack(spacing: 13.3) {
SelectButtonView(title: "무제한", isChecked: !viewModel.isLimited) {
SelectButtonView(title: I18n.CreateContent.unlimited, isChecked: !viewModel.isLimited) {
if viewModel.isLimited {
viewModel.isLimited = false
}
}
SelectButtonView(title: "한정판", isChecked: viewModel.isLimited) {
SelectButtonView(title: I18n.CreateContent.limitedEdition, isChecked: viewModel.isLimited) {
if !viewModel.isLimited {
viewModel.isLimited = true
}
@@ -347,13 +347,13 @@ struct ContentCreateView: View {
.frame(maxWidth: .infinity, alignment: .leading)
HStack(spacing: 13.3) {
SelectButtonView(title: "가능", isChecked: viewModel.isPointAvailable) {
SelectButtonView(title: I18n.CreateContent.available, isChecked: viewModel.isPointAvailable) {
if !viewModel.isPointAvailable {
viewModel.isPointAvailable = true
}
}
SelectButtonView(title: "불가능", isChecked: !viewModel.isPointAvailable) {
SelectButtonView(title: I18n.CreateContent.unavailable, isChecked: !viewModel.isPointAvailable) {
if viewModel.isPointAvailable {
viewModel.isPointAvailable = false
}
@@ -369,13 +369,13 @@ struct ContentCreateView: View {
.frame(maxWidth: .infinity, alignment: .leading)
HStack(spacing: 13.3) {
SelectButtonView(title: "생성", isChecked: viewModel.isGeneratePreview) {
SelectButtonView(title: I18n.CreateContent.generate, isChecked: viewModel.isGeneratePreview) {
if !viewModel.isGeneratePreview {
viewModel.isGeneratePreview = true
}
}
SelectButtonView(title: "생성 안 함", isChecked: !viewModel.isGeneratePreview) {
SelectButtonView(title: I18n.CreateContent.doNotGenerate, isChecked: !viewModel.isGeneratePreview) {
if viewModel.isGeneratePreview {
viewModel.isGeneratePreview = false
}
@@ -451,13 +451,13 @@ struct ContentCreateView: View {
.frame(maxWidth: .infinity, alignment: .leading)
HStack(spacing: 13.3) {
SelectButtonView(title: "전체 연령", isChecked: !viewModel.isAdult) {
SelectButtonView(title: I18n.CreateContent.allAges, isChecked: !viewModel.isAdult) {
if viewModel.isAdult {
viewModel.isAdult = false
}
}
SelectButtonView(title: "19세 이상", isChecked: viewModel.isAdult) {
SelectButtonView(title: I18n.CreateContent.over19, isChecked: viewModel.isAdult) {
if !viewModel.isAdult {
viewModel.isAdult = true
}
@@ -480,13 +480,13 @@ struct ContentCreateView: View {
.frame(maxWidth: .infinity, alignment: .leading)
HStack(spacing: 13.3) {
SelectButtonView(title: "댓글 가능", isChecked: viewModel.isAvailableComment) {
SelectButtonView(title: I18n.CreateContent.commentAllowed, isChecked: viewModel.isAvailableComment) {
if !viewModel.isAvailableComment {
viewModel.isAvailableComment = true
}
}
SelectButtonView(title: "댓글 불가", isChecked: !viewModel.isAvailableComment) {
SelectButtonView(title: I18n.CreateContent.commentNotAllowed, isChecked: !viewModel.isAvailableComment) {
if viewModel.isAvailableComment {
viewModel.isAvailableComment = false
}
@@ -497,19 +497,19 @@ struct ContentCreateView: View {
.padding(.horizontal, 13.3)
VStack(spacing: 13.3) {
Text("예약 공개")
Text(I18n.CreateContent.publishReserved)
.font(.custom(Font.bold.rawValue, size: 16.7))
.foregroundColor(Color.grayee)
.frame(maxWidth: .infinity, alignment: .leading)
HStack(spacing: 13.3) {
SelectButtonView(title: "지금 공개", isChecked: !viewModel.isActiveReservation) {
SelectButtonView(title: I18n.CreateContent.publishNow, isChecked: !viewModel.isActiveReservation) {
if viewModel.isActiveReservation {
viewModel.isActiveReservation = false
}
}
SelectButtonView(title: "예약 공개", isChecked: viewModel.isActiveReservation) {
SelectButtonView(title: I18n.CreateContent.publishReserved, isChecked: viewModel.isActiveReservation) {
if !viewModel.isActiveReservation {
viewModel.isActiveReservation = true
}