feat(i18n): 콘텐츠 상세/댓글 하드코딩 문구를 I18n 키로 통일한다

This commit is contained in:
Yu Sung
2026-04-01 16:50:56 +09:00
parent a90996603b
commit c039931f34
30 changed files with 503 additions and 202 deletions

View File

@@ -373,6 +373,10 @@ enum I18n {
}
enum ContentDetail {
static var title: String {
pick(ko: "콘텐츠 상세", en: "Content details", ja: "コンテンツ詳細")
}
static var creatorOtherContents: String {
pick(
ko: "크리에이터의 다른 콘텐츠",
@@ -420,6 +424,208 @@ enum I18n {
ja: "このコンテンツを固定しますかチャンネルには最大3件まで固定できます。このコンテンツを固定すると最も古い固定コンテンツが置き換えられます。"
)
}
static var soldOutNotice: String {
pick(ko: "해당 콘텐츠가 매진되었습니다.", en: "This content is sold out.", ja: "このコンテンツは売り切れです。")
}
static var deleteAgreementRequired: String {
pick(ko: "동의하셔야 삭제할 수 있습니다.", en: "You must agree before deleting.", ja: "同意いただくと削除できます。")
}
static var shareLinkCreateFailed: String {
pick(ko: "공유링크를 생성하지 못했습니다.\n다시 시도해 주세요.", en: "Failed to create a share link.\nPlease try again.", ja: "共有リンクを作成できませんでした。\nもう一度お試しください。")
}
static var rentalCompleted: String {
pick(ko: "대여가 완료되었습니다.", en: "Rental completed.", ja: "レンタルが完了しました。")
}
static var purchaseCompleted: String {
pick(ko: "구매가 완료되었습니다.", en: "Purchase completed.", ja: "購入が完了しました。")
}
static var deleteCompleted: String {
pick(ko: "삭제되었습니다", en: "Deleted.", ja: "削除されました。")
}
static var pinCompleted: String {
pick(ko: "고정되었습니다", en: "Pinned.", ja: "固定されました。")
}
static var unpinCompleted: String {
pick(ko: "해제되었습니다", en: "Unpinned.", ja: "固定解除されました。")
}
static var donationMessageRequired: String {
pick(ko: "함께 보낼 메시지를 입력하세요.", en: "Please enter a message to send together.", ja: "一緒に送るメッセージを入力してください。")
}
static func donationCompleted(_ can: Int) -> String {
pick(ko: "\(can)캔을 후원하셨습니다.", en: "You donated \(can) cans.", ja: "\(can)canを後援しました。")
}
enum Info {
static var share: String {
pick(ko: "공유", en: "Share", ja: "共有")
}
static var donation: String {
pick(ko: "후원", en: "Donate", ja: "後援")
}
static var previewAlertMessage: String {
pick(ko: "미리듣기 중입니다.\n콘텐츠 구매 후 전체를 감상해 보세요.", en: "You are listening to a preview.\nPurchase this content to listen to the full version.", ja: "現在は試聴中です。\nコンテンツ購入後に全編をお楽しみください。")
}
}
enum Menu {
static var pinToMyChannel: String {
pick(ko: "내 채널에 고정", en: "Pin to my channel", ja: "マイチャンネルに固定")
}
static var unpinFromMyChannel: String {
pick(ko: "내 채널에 고정 취소", en: "Unpin from my channel", ja: "マイチャンネルの固定を解除")
}
static var edit: String {
pick(ko: "수정", en: "Edit", ja: "編集")
}
static var report: String {
pick(ko: "신고", en: "Report", ja: "通報")
}
}
enum DeleteDialog {
static var title: String {
pick(ko: "콘텐츠 삭제", en: "Delete content", ja: "コンテンツ削除")
}
static func confirmQuestion(_ title: String) -> String {
pick(ko: "[\(title)]을 삭제하시겠습니까?", en: "Do you want to delete [\(title)]?", ja: "[\(title)]を削除しますか?")
}
static var irreversibleAcknowledgement: String {
pick(ko: "삭제된 콘텐츠는 되돌릴 수 없음을 알고 있습니다.", en: "I understand deleted content cannot be restored.", ja: "削除されたコンテンツは元に戻せないことを理解しています。")
}
static var purchasedUserNotice: String {
pick(ko: "콘텐츠를 삭제하더라도 이미 구매한\n사용자는 콘텐츠를 이용할 수 있습니다.", en: "Even if the content is deleted, users who already purchased it can still use it.", ja: "コンテンツを削除しても、すでに購入した\nユーザーは引き続き利用できます。")
}
}
enum ReportDialog {
static var title: String {
pick(ko: "콘텐츠 신고", en: "Report content", ja: "コンテンツ通報")
}
static var reasons: [String] {
[
reasonHarassment,
reasonPrivacy,
reasonImpersonation,
reasonViolentThreat,
reasonChildAbuse,
reasonHateSpeech,
reasonSpamScam
]
}
static var reasonHarassment: String { pick(ko: "괴롭힘 및 사이버 폭력", en: "Harassment and cyberbullying", ja: "嫌がらせ・サイバーいじめ") }
static var reasonPrivacy: String { pick(ko: "개인정보 침해", en: "Privacy violation", ja: "個人情報の侵害") }
static var reasonImpersonation: String { pick(ko: "명의도용", en: "Impersonation", ja: "なりすまし") }
static var reasonViolentThreat: String { pick(ko: "폭력적 위협", en: "Violent threats", ja: "暴力的な脅迫") }
static var reasonChildAbuse: String { pick(ko: "아동학대", en: "Child abuse", ja: "児童虐待") }
static var reasonHateSpeech: String { pick(ko: "보호대상 집단에 대한 증오심 표현", en: "Hate speech against protected groups", ja: "保護対象集団へのヘイト表現") }
static var reasonSpamScam: String { pick(ko: "스팸 및 사기", en: "Spam and scams", ja: "スパム・詐欺") }
static var notice: String {
pick(ko: "신고한 콘텐츠를 관리자가 확인 후, 서비스정책을\n위반한 경우 삭제 조치할 예정입니다.", en: "After review by administrators, reported content that violates service policy will be removed.", ja: "通報されたコンテンツは管理者が確認し、\nサービス方針違反の場合は削除対応されます。")
}
static var reportAction: String {
pick(ko: "신고", en: "Report", ja: "通報")
}
}
enum Comment {
static var title: String { pick(ko: "댓글", en: "Comments", ja: "コメント") }
static var secretComment: String { pick(ko: "비밀댓글", en: "Secret comment", ja: "秘密コメント") }
static var inputPlaceholder: String { pick(ko: "댓글을 입력해 보세요.", en: "Enter a comment.", ja: "コメントを入力してください。") }
static var replyTitle: String { pick(ko: "답글", en: "Replies", ja: "返信") }
static var writeReply: String { pick(ko: "답글 쓰기", en: "Write reply", ja: "返信を書く") }
static func replyCount(_ count: Int) -> String { pick(ko: "답글 \(count)", en: "\(count) replies", ja: "返信\(count)") }
static var edit: String { pick(ko: "수정", en: "Edit", ja: "編集") }
static var noChanges: String { pick(ko: "변경사항이 없습니다.", en: "No changes.", ja: "変更事項がありません。") }
static var inputContent: String { pick(ko: "내용을 입력하세요.", en: "Please enter content.", ja: "内容を入力してください。") }
}
enum LimitedEdition {
static var title: String { pick(ko: "한정판", en: "Limited edition", ja: "限定版") }
static var remainingCount: String { pick(ko: "잔여수량", en: "Remaining", ja: "残り数量") }
static var buyers: String { pick(ko: "구매자", en: "Buyers", ja: "購入者") }
}
enum Mosaic {
static var adultRestrictionNotice: String {
pick(ko: "본 콘텐츠는 만 19세 미만의 청소년이\n이용할 수 없습니다.\n본인인증 후 콘텐츠를 이용해 주세요.", en: "This content is not available to users under 19.\nPlease verify your identity to access this content.", ja: "このコンテンツは19歳未満の方は\n利用できません。\n本人認証後にご利用ください。")
}
static var verifyIdentity: String {
pick(ko: "본인인증", en: "Verify identity", ja: "本人認証")
}
}
enum OtherContent {
static func preparingMessage(_ title: String) -> String {
pick(ko: "\(title)를 준비중입니다.\n조금만 기다려주세요.", en: "\(title) is being prepared.\nPlease wait a little longer.", ja: "\(title)を準備中です。\nしばらくお待ちください。")
}
}
enum Navigation {
static var previousEpisode: String { pick(ko: "이전화", en: "Previous", ja: "前話") }
static var nextEpisode: String { pick(ko: "다음화", en: "Next", ja: "次話") }
}
enum Purchase {
static var withWon: String { pick(ko: "원으로", en: " KRW", ja: "ウォンで") }
static var withCan: String { pick(ko: "캔으로", en: " cans", ja: "canで") }
static var wonUnit: String { pick(ko: "", en: " KRW", ja: "ウォン") }
}
enum OrderDialog {
static var rent: String { pick(ko: "대여", en: "Rent", ja: "レンタル") }
static var rentPeriod: String { pick(ko: "(이용기간 5일)", en: "(5-day access)", ja: "(利用期間5日)") }
static var buy: String { pick(ko: "소장", en: "Buy", ja: "購入") }
static var buyPeriod: String { pick(ko: "(서비스 종료시까지)", en: "(Until service end)", ja: "(サービス終了まで)") }
}
enum OrderConfirmDialog {
static var title: String { pick(ko: "구매확인", en: "Purchase confirmation", ja: "購入確認") }
static var rentQuestion: String { pick(ko: "콘텐츠를 대여하시겠습니까?", en: "Do you want to rent this content?", ja: "このコンテンツをレンタルしますか?") }
static var buyQuestion: String { pick(ko: "콘텐츠를 소장하시겠습니까?", en: "Do you want to buy this content?", ja: "このコンテンツを購入しますか?") }
static var deductionNotice: String { pick(ko: "아래 금액이 차감됩니다.", en: "The amount below will be deducted.", ja: "下記金額が差し引かれます。") }
}
enum DonationDialog {
static var title: String { pick(ko: "후원하기", en: "Donate", ja: "後援する") }
static var charge: String { pick(ko: "충전", en: "Charge", ja: "チャージ") }
static var minimumOneCanPlaceholder: String { pick(ko: "1캔 이상 입력하세요", en: "Enter 1 can or more", ja: "1can以上入力してください") }
static var minimumTenCanPlaceholder: String { pick(ko: "10캔 이상 입력하세요", en: "Enter 10 cans or more", ja: "10can以上入力してください") }
static func messagePlaceholder(isSecret: Bool, limit: Int) -> String {
let koPrefix = isSecret ? "비밀 " : ""
let enPrefix = isSecret ? "secret " : ""
let jaPrefix = isSecret ? "秘密" : ""
return pick(
ko: "함께 보낼 \(koPrefix)메시지 입력(최대 \(limit)자)",
en: "Enter a \(enPrefix)message (max \(limit) chars)",
ja: "一緒に送る\(jaPrefix)メッセージを入力(最大\(limit)文字)"
)
}
static var donateAction: String { pick(ko: "후원하기", en: "Donate", ja: "後援する") }
}
}
enum ContentBox {
static var title: String {
@@ -543,6 +749,25 @@ enum I18n {
)
}
}
enum Banner {
static var loadFailed: String {
pick(
ko: "배너를 불러오지 못했습니다. 다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다.",
en: "Failed to load banners. Please try again.\nIf the issue persists, contact customer support.",
ja: "バナーを読み込めませんでした。もう一度お試しください。\n問題が続く場合はカスタマーサポートにお問い合わせください。"
)
}
}
enum Playlist {
static var createNewAction: String { pick(ko: "+ 새 재생목록 만들기", en: "+ Create new playlist", ja: "+ 新しいプレイリストを作成") }
static var emptyTitle: String { pick(ko: "재생목록이 비어있습니다.", en: "Your playlist is empty.", ja: "プレイリストが空です。") }
static var emptyDescription: String { pick(ko: "자주 듣는 콘텐츠를\n재생목록으로 만들어 보세요.", en: "Create a playlist with\nyour frequently listened content.", ja: "よく聴くコンテンツで\nプレイリストを作ってみましょう。") }
static var totalLabel: String { pick(ko: "전체", en: "Total", ja: "全体") }
static func totalCount(_ count: Int) -> String { pick(ko: "\(count)", en: "Total \(count)", ja: "\(count)") }
static func itemCount(_ count: Int) -> String { pick(ko: "\(count)", en: "Total \(count)", ja: "\(count)") }
}
}
enum CharacterDetailGallery {
@@ -2339,6 +2564,9 @@ enum I18n {
static var uploadContentDescriptionHint: String { pick(ko: "내용을 입력하세요", en: "Enter the details.", ja: "内容を入力してください") }
static var uploadTitle: String { pick(ko: "콘텐츠 업로드", en: "Content upload", ja: "コンテンツ投稿") }
static var uploadAction: String { pick(ko: "콘텐츠 업로드", en: "Upload content", ja: "コンテンツを投稿") }
static var modifyTitle: String { pick(ko: "콘텐츠 수정", en: "Edit content", ja: "コンテンツ編集") }
static var modifyAction: String { pick(ko: "수정", en: "Save changes", ja: "修正") }
static var modifySuccess: String { pick(ko: "콘텐츠가 수정되었습니다.", en: "Content has been updated.", ja: "コンテンツが修正されました。") }
static var registerTitle: String { pick(ko: "콘텐츠 등록", en: "Register content", ja: "コンテンツ登録") }
static var thumbnail: String { pick(ko: "썸네일", en: "Thumbnail", ja: "サムネイル") }
static var registerSectionTitle: String { pick(ko: "등록", en: "Upload", ja: "登録") }