콘텐츠 등록 화면 텍스트와 버튼을 I18n 기반 번역 문자열로 교체 룰렛 설정과 미션 메뉴 버튼 라벨을 다국어 문자열로 통일 신규 텍스트를 String Catalog에 추가하여 네비게이션 타이틀 번역
118 lines
5.7 KiB
Swift
118 lines
5.7 KiB
Swift
//
|
|
// I18n.swift
|
|
// SodaLive
|
|
//
|
|
// Created by Junie (AI) on 2025/12/17.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
// MARK: - I18n 네임스페이스
|
|
// String Catalog를 사용하지 않는 컨텍스트에서 사용할 하드코딩 맵 기반 i18n.
|
|
// 기준 언어 선택은 LanguageHeaderProvider.current("ko"|"en"|"ja").
|
|
enum I18n {
|
|
enum Common {
|
|
static var viewAll: String { pick(ko: "전체보기", en: "View all", ja: "すべて見る") }
|
|
|
|
// 기본 샘플들
|
|
static var apply: String { pick(ko: "적용", en: "Apply", ja: "適用") }
|
|
static var confirm: String { pick(ko: "확인", en: "Confirm", ja: "確認") }
|
|
static var cancel: String { pick(ko: "취소", en: "Cancel", ja: "キャンセル") }
|
|
|
|
// 설정
|
|
static var settings: String { pick(ko: "설정", en: "Settings", ja: "設定") }
|
|
|
|
static var commonError: String { pick(ko: "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다.", en: "Settings", ja: "設定") }
|
|
|
|
static var roulette1: String { pick(ko: "룰렛 1", en: "Roulette 1", ja: "ルーレット1") }
|
|
static var roulette2: String { pick(ko: "룰렛 2", en: "Roulette 2", ja: "ルーレット2") }
|
|
static var roulette3: String { pick(ko: "룰렛 3", en: "Roulette 3", ja: "ルーレット3") }
|
|
}
|
|
|
|
enum MissionMenu {
|
|
static var menu1: String { pick(ko: "메뉴 1", en: "Menu 1", ja: "メニュー1") }
|
|
static var menu2: String { pick(ko: "메뉴 2", en: "Menu 2", ja: "メニュー2") }
|
|
static var menu3: String { pick(ko: "메뉴 3", en: "Menu 3", ja: "メニュー3") }
|
|
}
|
|
|
|
enum CreateContent {
|
|
static var selectFile: String { pick(ko: "파일 선택", en: "Select file", ja: "ファイル選択") }
|
|
static var selectTheme: String { pick(ko: "테마 선택", en: "Select theme", ja: "テーマを選択") }
|
|
static var uploadContentDescriptionHint: String { pick(ko: "내용을 입력하세요", en: "Enter a description", ja: "内容を入力してください") }
|
|
|
|
// 가격/구매 옵션
|
|
static var free: String { pick(ko: "무료", en: "Free", ja: "無料") }
|
|
static var paid: String { pick(ko: "유료", en: "Paid", ja: "有料") }
|
|
static var purchaseBoth: String { pick(ko: "소장/대여", en: "Buy/Rent", ja: "購入/レンタル") }
|
|
static var purchaseBuyOnly: String { pick(ko: "소장만", en: "Buy only", ja: "購入のみ") }
|
|
static var purchaseRentOnly: String { pick(ko: "대여만", en: "Rent only", ja: "レンタルのみ") }
|
|
static var unlimited: String { pick(ko: "무제한", en: "Unlimited", ja: "無制限") }
|
|
static var limitedEdition: String { pick(ko: "한정판", en: "Limited", ja: "限定版") }
|
|
|
|
// 포인트 사용
|
|
static var available: String { pick(ko: "가능", en: "Available", ja: "可能") }
|
|
static var unavailable: String { pick(ko: "불가능", en: "Unavailable", ja: "不可") }
|
|
|
|
// 미리듣기
|
|
static var generate: String { pick(ko: "생성", en: "Generate", ja: "生成") }
|
|
static var doNotGenerate: String { pick(ko: "생성 안 함", en: "Do not generate", ja: "生成しない") }
|
|
|
|
// 연령 제한
|
|
static var allAges: String { pick(ko: "전체 연령", en: "All ages", ja: "全年齢") }
|
|
static var over19: String { pick(ko: "19세 이상", en: "19+", ja: "19歳以上") }
|
|
|
|
// 댓글 가능 여부
|
|
static var commentAllowed: String { pick(ko: "댓글 가능", en: "Comments allowed", ja: "コメント可") }
|
|
static var commentNotAllowed: String { pick(ko: "댓글 불가", en: "Comments not allowed", ja: "コメント不可") }
|
|
|
|
// 공개 설정
|
|
static var publishNow: String { pick(ko: "지금 공개", en: "Publish now", ja: "今すぐ公開") }
|
|
static var publishReserved: String { pick(ko: "예약 공개", en: "Scheduled", ja: "予約公開") }
|
|
}
|
|
|
|
enum Category {
|
|
static var all: String { pick(ko: "전체", en: "All", ja: "すべて") }
|
|
}
|
|
|
|
enum RankingSort {
|
|
// 분석/지표 등
|
|
static var revenue: String { pick(ko: "매출", en: "Revenue", ja: "売上高") }
|
|
static var salesVolume: String { pick(ko: "판매량", en: "Sales", ja: "販売量") }
|
|
static var comments: String { pick(ko: "댓글", en: "Comments", ja: "コメント") }
|
|
static var likes: String { pick(ko: "좋아요", en: "Likes", ja: "いいね") }
|
|
}
|
|
|
|
enum Tab {
|
|
// 탭/도메인
|
|
static var character: String { pick(ko: "캐릭터", en: "Character", ja: "キャラクター") }
|
|
static var work: String { pick(ko: "작품별", en: "Works", ja: "作品別") }
|
|
static var talk: String { pick(ko: "톡", en: "Talk", ja: "トーク") }
|
|
static var workInfo: String { pick(ko: "작품정보", en: "Work info", ja: "作品情報") }
|
|
|
|
static var detail: String { pick(ko: "상세", en: "Details", ja: "詳細") }
|
|
static var gallery: String { pick(ko: "갤러리", en: "Gallery", ja: "ギャラリー") }
|
|
}
|
|
}
|
|
|
|
// MARK: - 내부 헬퍼
|
|
@inline(__always)
|
|
private func pick(ko: String, en: String, ja: String) -> String {
|
|
switch LanguageHeaderProvider.current {
|
|
case "ko": return ko
|
|
case "ja": return ja
|
|
default: return en
|
|
}
|
|
}
|
|
|
|
/*
|
|
사용 예시 (ViewModel, Service 등 Text 이외 컨텍스트):
|
|
|
|
// ViewModel 내부
|
|
let title = I18n.Common.all
|
|
|
|
// View 내부(Text 대신 다른 UI 요소 라벨 등)
|
|
let menuLabel = I18n.Common.settings
|
|
|
|
주의: 기존에 Text("...")와 같은 String Catalog 사용부는 그대로 유지합니다.
|
|
*/
|