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

콘텐츠 등록 화면 텍스트와 버튼을 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
}

View File

@@ -116,8 +116,6 @@ final class ContentCreateViewModel: ObservableObject {
}
}
var placeholder = "내용을 입력하세요"
func uploadAudioContent() {
if !isLoading && validateData() {
isLoading = true