// // 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 사용부는 그대로 유지합니다. */