Files
sodalive-ios/SodaLive/Sources/I18n/I18n.swift

277 lines
17 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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 Time {
static var justNow: String {
pick(ko: "방금 전", en: "Just now", ja: "たった今")
}
static func minutesAgo(_ minutes: Int) -> String {
pick(
ko: "\(minutes)분 전",
en: "\(minutes) minute\(minutes == 1 ? "" : "s") ago",
ja: "\(minutes)分前"
)
}
static func hoursAgo(_ hours: Int) -> String {
pick(
ko: "\(hours)시간 전",
en: "\(hours) hour\(hours == 1 ? "" : "s") ago",
ja: "\(hours)時間前"
)
}
static func daysAgo(_ days: Int) -> String {
pick(
ko: "\(days)일 전",
en: "\(days) day\(days == 1 ? "" : "s") ago",
ja: "\(days)日前"
)
}
static func monthsAgo(_ months: Int) -> String {
pick(
ko: "\(months)개월 전",
en: "\(months) month\(months == 1 ? "" : "s") ago",
ja: "\(months)か月前"
)
}
static func yearsAgo(_ years: Int) -> String {
pick(
ko: "\(years)년 전",
en: "\(years) year\(years == 1 ? "" : "s") ago",
ja: "\(years)年前"
)
}
}
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 delete: String { pick(ko: "삭제", en: "Delete", ja: "削除") }
//
static var settings: String { pick(ko: "설정", en: "Settings", ja: "設定") }
static var commonError: String { pick(ko: "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다.", en: "Please try again.\nIf the problem persists, please contact customer support.", ja: "もう一度お試しください。\n問題が続く場合はカスタマーサポートにお問い合わせください。") }
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") }
static var confirmDeleteQuestion: String { pick(ko: "삭제하시겠습니까?", en: "Are you sure you want to delete?", ja: "削除しますか?") }
static var followers: String { pick(ko: "팔로워", en: "Followers", ja: "フォロワー") }
static var latestContent: String { pick(ko: "최신 콘텐츠", en: "Latest content", ja: "最新コンテンツ") }
static var openScheduled: String { pick(ko: "오픈예정", en: "Scheduled to open", ja: "オープン予定") }
static var points: String { pick(ko: "포인트", en: "Points", ja: "ポイント") }
}
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: "ギャラリー") }
}
enum MemberChannel {
//
static var all: String { pick(ko: "모두 알림", en: "All notifications", ja: "すべて通知") }
static var none: String { pick(ko: "알림 없음", en: "No notifications", ja: "通知なし") }
static var unfollow: String { pick(ko: "팔로우 취소", en: "Unfollow", ja: "フォロー解除") }
static var liveOnNow: String { pick(ko: "현재 라이브 중입니다.", en: "Live is currently ongoing.", ja: "現在ライブ配信中です。") }
static var cannotReserveOwnLive: String { pick(ko: "내가 만든 라이브는 예약할 수 없습니다.", en: "You cannot reserve your own live.", ja: "自分が作成したライブは予約できません。") }
static var enterLiveFailed: String { pick(ko: "라이브에 입장하지 못했습니다.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다.", en: "Could not enter the live.\nIf the problem persists, please contact customer support.", ja: "ライブに入室できませんでした。\n問題が続く場合はカスタマーサポートにお問い合わせください。") }
static var fetchLiveInfoFailed: String { pick(ko: "라이브 정보를 가져오지 못했습니다.\n다시 시도해 주세요.", en: "Failed to fetch live information.\nPlease try again.", ja: "ライブ情報を取得できませんでした。\nもう一度お試しください。") }
static var userBlocked: String { pick(ko: "차단하였습니다.", en: "User has been blocked.", ja: "ブロックしました。") }
static var userUnblocked: String { pick(ko: "차단이 해제 되었습니다.", en: "User has been unblocked.", ja: "ブロックを解除しました。") }
static var shareLinkCreateFailed: String { pick(ko: "공유링크를 생성하지 못했습니다.\n다시 시도해 주세요.", en: "Failed to create a share link.\nPlease try again.", ja: "共有リンクを作成できませんでした。\nもう一度お試しください。") }
static var cheersDeleteTitle: String { pick(ko: "응원글 삭제", en: "Delete Cheer", ja: "応援メッセージを削除") }
static var liveHeader: String { pick(ko: "라이브", en: "Live", ja: "ライブ") }
static var rouletteSettings: String { pick(ko: "룰렛 설정", en: "Roulette settings", ja: "ルーレット設定") }
static var menuSettings: String { pick(ko: "메뉴 설정", en: "Menu settings", ja: "メニュー設定") }
static var communityHeader: String { pick(ko: "커뮤니티", en: "Community", ja: "コミュニティ") }
static var followersList: String { pick(ko: "팔로워 리스트", en: "Followers list", ja: "フォロワーリスト") }
static var followerCount: (Int) -> String = { count in
pick(ko: "팔로워 \(count)", en: "\(count) followers", ja: "フォロワー\(count)")
}
static func channelTitle(_ nickname: String) -> String {
pick(ko: "\(nickname)님의 채널", en: "\(nickname)'s channel", ja: "\(nickname)のチャンネル")
}
static func shareChannelMessage(_ nickname: String) -> String {
pick(ko: "보이스온 \(nickname)님의 채널입니다.", en: "This is \(nickname)'s channel on VoiceOn.", ja: "ボイスオンの\(nickname)さんのチャンネルです。")
}
static func reserveWithCansTitle(_ price: Int) -> String {
pick(ko: "\(price)캔으로 예약", en: "Reserve with \(price) cans", ja: "\(price)缶で予約")
}
static func reservePaymentDesc(_ title: String) -> String {
pick(ko: "'\(title)' 라이브에 참여하기 위해 결제합니다.", en: "Payment is required to join '\(title)' live.", ja: "\(title)』ライブに参加するには決済が必要です。")
}
static var reservePaymentConfirmTitle: String { pick(ko: "결제 후 예약하기", en: "Pay and reserve", ja: "決済して予約") }
static var paidLiveEnterTitle: String { pick(ko: "유료 라이브 입장", en: "Enter paid live", ja: "有料ライブに入場") }
static func paidLiveEnterDesc(_ price: Int) -> String {
pick(ko: "\(price)캔을 차감하고\n라이브에 입장 하시겠습니까?", en: "\(price) cans will be used.\nDo you want to enter the live?", ja: "\(price)缶が消費されます。\nライブに入場しますか?")
}
static var paidLiveConfirmTitle: String { pick(ko: "결제 후 참여하기", en: "Pay and join", ja: "決済して参加") }
static func elapsedLiveWarning(hours: Int, minutes: Int) -> String {
pick(
ko: "라이브를 시작한 지 \(hours)시간 \(minutes)분이 지났습니다. 라이브에 입장 후 30분 이내에 라이브가 종료될 수도 있습니다.",
en: "It has been \(hours) hour(s) and \(minutes) minute(s) since the live started. The live may end within 30 minutes after you enter.",
ja: "ライブ開始から\(hours)時間\(minutes)分が経過しています。入場後30分以内に終了する場合があります。"
)
}
}
enum Series {
static var new: String { pick(ko: "신작", en: "New", ja: "新作") }
static var complete: String { pick(ko: "완결", en: "Completed", ja: "完結") }
static var popular: String { pick(ko: "인기", en: "Popular", ja: "人気") }
static var totalEpisodes: (Int) -> String = { count in
pick(ko: "\(count)", en: "Total \(count) episodes", ja: "\(count)")
}
}
}
// 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 .
*/