156 lines
9.3 KiB
Swift
156 lines
9.3 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") }
|
||
|
||
static var needMenu1First: String { pick(ko: "메뉴 1을 먼저 설정하세요", en: "Please set Menu 1 first", ja: "まずメニュー1を設定してください") }
|
||
static var needMenu1And2First: String { pick(ko: "메뉴 1과 메뉴 2를 먼저 설정하세요", en: "Please set Menu 1 and Menu 2 first", ja: "まずメニュー1とメニュー2を設定してください") }
|
||
}
|
||
|
||
enum CreateLive {
|
||
// 라이브 공지 입력 힌트
|
||
static var noticePlaceholder: String {
|
||
pick(ko: "라이브 공지를 입력하세요", en: "Enter live notice", ja: "ライブのお知らせを入力してください")
|
||
}
|
||
|
||
// 시간 설정
|
||
static var startNow: String { pick(ko: "지금 즉시", en: "Start now", ja: "今すぐ開始") }
|
||
static var schedule: String { pick(ko: "예약 설정", en: "Schedule", ja: "予約設定") }
|
||
|
||
// 공개 범위
|
||
static var publicRoom: String { pick(ko: "공개", en: "Public", ja: "公開") }
|
||
static var privateRoom: String { pick(ko: "비공개", en: "Private", ja: "非公開") }
|
||
|
||
// 참여 가능 여부
|
||
static var joinAllowed: String { pick(ko: "가능", en: "Allowed", ja: "可能") }
|
||
static var joinNotAllowed: String { pick(ko: "불가능", en: "Not allowed", ja: "不可") }
|
||
|
||
// 연령 제한
|
||
static var allAges: String { pick(ko: "전체 연령", en: "All ages", ja: "全年齢") }
|
||
static var over19: String { pick(ko: "19세 이상", en: "19+", ja: "19歳以上") }
|
||
|
||
// 최근 데이터 관련 토스트/알림
|
||
static var recentDataLoaded: String { pick(ko: "최근데이터를 불러왔습니다.", en: "Recent data has been loaded.", ja: "最新データを読み込みました。") }
|
||
static var recentDataLoadFailed: String { pick(ko: "최근데이터를 불러오지 못했습니다.\n다시 시도해 주세요.", en: "Failed to load recent data.\nPlease try again.", ja: "最新データを読み込めませんでした。\nもう一度お試しください。") }
|
||
static var createLiveFailedGeneric: String { pick(ko: "라이브를 만들지 못했습니다.\n다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다.", en: "Could not create the live.\nPlease try again.\nIf the problem persists, please contact customer support.", ja: "ライブを作成できませんでした。\nもう一度お試しください。\n問題が続く場合はカスタマーサポートにお問い合わせください。") }
|
||
|
||
// 검증 에러 메시지
|
||
static var selectCoverImage: String { pick(ko: "커버이미지를 선택해주세요.", en: "Please select a cover image.", ja: "カバー画像を選択してください。") }
|
||
static var enterTitle: String { pick(ko: "제목을 입력해 주세요.", en: "Please enter a title.", ja: "タイトルを入力してください。") }
|
||
static var enterNoticeMin5: String { pick(ko: "공지를 5자 이상 입력해주세요.", en: "Please enter at least 5 characters for the notice.", ja: "お知らせは5文字以上で入力してください。") }
|
||
static var enterPeopleRange: String { pick(ko: "인원을 3~999명 사이로 입력해주세요.", en: "Please enter the number of people between 3 and 999.", ja: "参加人数は3〜999の範囲で入力してください。") }
|
||
static var enterPassword6: String { pick(ko: "방 입장 비밀번호 6자리를 입력해 주세요.", en: "Please enter a 6-digit room entry password.", ja: "入室パスワード(6桁)を入力してください。") }
|
||
}
|
||
|
||
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 사용부는 그대로 유지합니다.
|
||
*/
|