chore(brand): 앱 명칭을 소다라이브로 변경한다

This commit is contained in:
Yu Sung
2026-08-25 14:05:28 +09:00
parent 6820a18691
commit 670ae76c73
15 changed files with 58 additions and 58 deletions

View File

@@ -5,7 +5,7 @@
Created by klaus on 12/5/25.
*/
"CFBundleDisplayName" = "VoiceOn-Test";
"CFBundleDisplayName" = "SodaLive-Test";
"NSPhotoLibraryUsageDescription" = "Allow access to your photo library to select photos.";
"NSMicrophoneUsageDescription" = "Allow access to your microphone to record audio.";
"NSUserTrackingUsageDescription" = "Allow tracking to deliver personalized ads.";

View File

@@ -5,7 +5,7 @@
Created by klaus on 12/5/25.
*/
"CFBundleDisplayName" = "ボイスオン-テスト";
"CFBundleDisplayName" = "ソーダライブ-テスト";
"NSPhotoLibraryUsageDescription" = "写真を選択するために写真ライブラリへのアクセスが必要です。";
"NSMicrophoneUsageDescription" = "音声を録音するためにマイクへのアクセスが必要です。";
"NSUserTrackingUsageDescription" = "パーソナライズされた広告のためにトラッキングを許可してください。";

View File

@@ -5,7 +5,7 @@
Created by klaus on 12/5/25.
*/
"CFBundleDisplayName" = "보이스온-테스트";
"CFBundleDisplayName" = "소다라이브-테스트";
"NSPhotoLibraryUsageDescription" = "사진을 선택하려면 사진 라이브러리 접근이 필요합니다.";
"NSMicrophoneUsageDescription" = "음성 녹음을 위해 마이크 접근이 필요합니다.";
"NSUserTrackingUsageDescription" = "맞춤형 광고 제공을 위해 추적을 허용해 주세요.";

View File

@@ -5,7 +5,7 @@
Created by klaus on 12/5/25.
*/
"CFBundleDisplayName" = "VoiceOn";
"CFBundleDisplayName" = "SodaLive";
"NSPhotoLibraryUsageDescription" = "Allow access to your photo library to select photos.";
"NSMicrophoneUsageDescription" = "Allow access to your microphone to record audio.";
"NSUserTrackingUsageDescription" = "Allow tracking to deliver personalized ads.";

View File

@@ -5,7 +5,7 @@
Created by klaus on 12/5/25.
*/
"CFBundleDisplayName" = "ボイスオン";
"CFBundleDisplayName" = "ソーダライブ";
"NSPhotoLibraryUsageDescription" = "写真を選択するために写真ライブラリへのアクセスが必要です。";
"NSMicrophoneUsageDescription" = "音声を録音するためにマイクへのアクセスが必要です。";
"NSUserTrackingUsageDescription" = "パーソナライズされた広告のためにトラッキングを許可してください。";

View File

@@ -5,7 +5,7 @@
Created by klaus on 12/5/25.
*/
"CFBundleDisplayName" = "보이스온";
"CFBundleDisplayName" = "소다라이브";
"NSPhotoLibraryUsageDescription" = "사진을 선택하려면 사진 라이브러리 접근이 필요합니다.";
"NSMicrophoneUsageDescription" = "음성 녹음을 위해 마이크 접근이 필요합니다.";
"NSUserTrackingUsageDescription" = "맞춤형 광고 제공을 위해 추적을 허용해 주세요.";

View File

@@ -95,7 +95,7 @@ struct OriginalWorkDetailHeaderView: View {
contentType: "웹소설",
category: "로맨스",
isAdult: true,
description: "작품설명입니다.보이스온의 오픈월드 캐릭터톡은 청소년 보호를 위해 본인인증한성인만 이용이 가능합니다.캐릭터톡 서비스를 이용하시려면 본인인증을 하고 이용해주세요.",
description: "작품설명입니다.소다라이브의 오픈월드 캐릭터톡은 청소년 보호를 위해 본인인증한성인만 이용이 가능합니다.캐릭터톡 서비스를 이용하시려면 본인인증을 하고 이용해주세요.",
originalWork: nil,
originalLink: "https://apple.com",
writer: nil,

View File

@@ -25,7 +25,7 @@ struct SeriesListAllView: View {
if isCompleted {
DetailNavigationBar(title: I18n.Series.completedSectionTitle)
} else if isOriginal {
DetailNavigationBar(title: I18n.Series.voiceOnOnlyTitle)
DetailNavigationBar(title: I18n.Series.sodaLiveOnlyTitle)
} else {
DetailNavigationBar(title: I18n.Series.viewAllByCreator(creatorNickname ?? ""))
}

View File

@@ -212,7 +212,7 @@ struct HomeTabView: View {
if !viewModel.originalAudioDramaList.isEmpty {
VStack(alignment: .leading, spacing: 16) {
HStack(spacing: 0) {
Text(I18n.Home.onlyOnVoiceOnSectionTitle)
Text(I18n.Home.onlyOnSodaLiveSectionTitle)
.appFont(size: 24, weight: .bold)
.foregroundColor(.white)

View File

@@ -90,9 +90,9 @@ enum I18n {
static var dialogDescription: String {
pick(
ko: "보이스온의 오픈월드 캐릭터톡은\n청소년 보호를 위해 본인인증한\n성인만 이용이 가능합니다.\n캐릭터톡 서비스를 이용하시려면\n본인인증을 하고 이용해주세요.",
en: "VoiceOn Open World Character Talk is available only to adults who complete identity verification for youth protection.\nPlease complete identity verification to use Character Talk.",
ja: "VoiceOnオープンワールドキャラクタートークは、青少年保護のため本人認証を完了した成人のみ利用できます。\nキャラクタートークを利用するには本人認証を完了してください。"
ko: "소다라이브의 오픈월드 캐릭터톡은\n청소년 보호를 위해 본인인증한\n성인만 이용이 가능합니다.\n캐릭터톡 서비스를 이용하시려면\n본인인증을 하고 이용해주세요.",
en: "SodaLive Open World Character Talk is available only to adults who complete identity verification for youth protection.\nPlease complete identity verification to use Character Talk.",
ja: "SodaLiveオープンワールドキャラクタートークは、青少年保護のため本人認証を完了した成人のみ利用できます。\nキャラクタートークを利用するには本人認証を完了してください。"
)
}
@@ -164,9 +164,9 @@ enum I18n {
static var detailConversationGuideDescription1: String {
pick(
ko: "보이스온의 오픈월드 캐릭터톡은 대화의 자유도가 높아 대화에 참여하는 당신은 누구든 될 수 있습니다. 세계관 속 연관 캐릭터가 되어 대화를 하거나 완전히 새로운 인물이 되어 캐릭터와 당신만의 스토리를 만들어 갈 수 있습니다.",
en: "VoiceOn Open World Character Talk gives you high conversational freedom. You can become a related character in the world or a completely new persona and build your own story with the character.",
ja: "VoiceOnオープンワールドキャラクタートークは会話の自由度が高く、世界観の関連キャラクターとして会話したり、まったく新しい人物になってキャラクターとあなただけの物語を作れます。"
ko: "소다라이브의 오픈월드 캐릭터톡은 대화의 자유도가 높아 대화에 참여하는 당신은 누구든 될 수 있습니다. 세계관 속 연관 캐릭터가 되어 대화를 하거나 완전히 새로운 인물이 되어 캐릭터와 당신만의 스토리를 만들어 갈 수 있습니다.",
en: "SodaLive Open World Character Talk gives you high conversational freedom. You can become a related character in the world or a completely new persona and build your own story with the character.",
ja: "SodaLiveオープンワールドキャラクタートークは会話の自由度が高く、世界観の関連キャラクターとして会話したり、まったく新しい人物になってキャラクターとあなただけの物語を作れます。"
)
}
@@ -254,9 +254,9 @@ enum I18n {
enum Room {
static var noticeForCharacter: String {
pick(
ko: "보이스온 AI캐릭터톡은 대화의 자유도가 높아 대화에 참여하는 당신은 누구든 될 수 있습니다.\n세계관 속 캐릭터로 대화를 하거나 새로운 인물로 캐릭터와 당신만의 스토리를 만들어보세요.\n※ AI캐릭터톡은 오픈베타 서비스 중이며, 캐릭터의 대화가 어색하거나 불완전할 수 있습니다.",
en: "VoiceOn AI Character Talk offers a high degree of conversational freedom.\nTalk as a character in the world or as a new persona and create your own story with the character.\n※ AI Character Talk is in open beta, so responses may be awkward or incomplete.",
ja: "VoiceOn AIキャラクタートークは会話の自由度が高く、会話に参加するあなたは誰にでもなれます。\n世界観のキャラクターとして会話したり、新しい人物としてキャラクターとあなただけの物語を作ってみてください。\n※ AIキャラクタートークはオープンベータ中のため、会話が不自然または不完全な場合があります。"
ko: "소다라이브 AI캐릭터톡은 대화의 자유도가 높아 대화에 참여하는 당신은 누구든 될 수 있습니다.\n세계관 속 캐릭터로 대화를 하거나 새로운 인물로 캐릭터와 당신만의 스토리를 만들어보세요.\n※ AI캐릭터톡은 오픈베타 서비스 중이며, 캐릭터의 대화가 어색하거나 불완전할 수 있습니다.",
en: "SodaLive AI Character Talk offers a high degree of conversational freedom.\nTalk as a character in the world or as a new persona and create your own story with the character.\n※ AI Character Talk is in open beta, so responses may be awkward or incomplete.",
ja: "SodaLive AIキャラクタートークは会話の自由度が高く、会話に参加するあなたは誰にでもなれます。\n世界観のキャラクターとして会話したり、新しい人物としてキャラクターとあなただけの物語を作ってみてください。\n※ AIキャラクタートークはオープンベータ中のため、会話が不自然または不完全な場合があります。"
)
}
@@ -954,15 +954,15 @@ enum I18n {
}
static var defaultTitle: String {
pick(ko: "보이스온", en: "VoiceOn", ja: "ボイスオン")
pick(ko: "소다라이브", en: "SodaLive", ja: "ソーダライブ")
}
enum List {
static var usageGuide: String {
pick(
ko: "보이스온 오디션 이용방법",
en: "How to use VoiceOn Audition",
ja: "ボイスオンオーディション利用方法"
ko: "소다라이브 오디션 이용방법",
en: "How to use SodaLive Audition",
ja: "ソーダライブオーディション利用方法"
)
}
@@ -1036,9 +1036,9 @@ enum I18n {
static var privacyAgreement: String {
pick(
ko: "보이스온 오디오 드라마 오디션 합격시 개인 연락을 위한 개인 정보(연락처) 수집 및 활용에 동의합니다.\n오디션 지원자는 개인정보 수집 및 활용 동의에 거부할 권리가 있으며 비동의시 오디션 지원은 취소 됩니다.",
en: "I agree to the collection and use of personal information (contact) for personal contact if selected for the VoiceOn audio drama audition.\nApplicants have the right to refuse consent to the collection and use of personal information, and if they do not consent, the audition application will be canceled.",
ja: "ボイスオンオーディオドラマオーディション合格時の個別連絡のため、個人情報(連絡先)の収集および利用に同意します。\n応募者は個人情報の収集および利用への同意を拒否する権利があり、同意しない場合はオーディション応募が取り消されます。"
ko: "소다라이브 오디오 드라마 오디션 합격시 개인 연락을 위한 개인 정보(연락처) 수집 및 활용에 동의합니다.\n오디션 지원자는 개인정보 수집 및 활용 동의에 거부할 권리가 있으며 비동의시 오디션 지원은 취소 됩니다.",
en: "I agree to the collection and use of personal information (contact) for personal contact if selected for the SodaLive audio drama audition.\nApplicants have the right to refuse consent to the collection and use of personal information, and if they do not consent, the audition application will be canceled.",
ja: "ソーダライブオーディオドラマオーディション合格時の個別連絡のため、個人情報(連絡先)の収集および利用に同意します。\n応募者は個人情報の収集および利用への同意を拒否する権利があり、同意しない場合はオーディション応募が取り消されます。"
)
}
@@ -2316,16 +2316,16 @@ enum I18n {
static var releasedStaffByHostMessage: String { pick(ko: "방장님이 스탭에서 해제했습니다.", en: "Host removed your staff role.", ja: "配信者があなたのスタッフ権限を解除しました。") }
static func invitePrivateLiveMessage(_ nickname: String, _ shareUrl: String, _ password: String) -> String {
pick(
ko: "\(nickname)님이 귀하를 보이스온 비공개라이브에 초대하였습니다.\n※ 라이브 참여: \(shareUrl)\n(입장 비밀번호: \(password))",
en: "\(nickname) invited you to a private VoiceOn live.\n※ Join live: \(shareUrl)\n(Entry password: \(password))",
ja: "\(nickname)さんがあなたをVoiceOn非公開ライブに招待しました。\n※ ライブ参加: \(shareUrl)\n(入場パスワード: \(password))"
ko: "\(nickname)님이 귀하를 소다라이브 비공개라이브에 초대하였습니다.\n※ 라이브 참여: \(shareUrl)\n(입장 비밀번호: \(password))",
en: "\(nickname) invited you to a private SodaLive live.\n※ Join live: \(shareUrl)\n(Entry password: \(password))",
ja: "\(nickname)さんがあなたをSodaLive非公開ライブに招待しました。\n※ ライブ参加: \(shareUrl)\n(入場パスワード: \(password))"
)
}
static func invitePublicLiveMessage(_ nickname: String, _ shareUrl: String) -> String {
pick(
ko: "\(nickname)님이 귀하를 보이스온 공개라이브에 초대하였습니다.\n※ 라이브 참여: \(shareUrl)",
en: "\(nickname) invited you to a public VoiceOn live.\n※ Join live: \(shareUrl)",
ja: "\(nickname)さんがあなたをVoiceOn公開ライブに招待しました。\n※ ライブ参加: \(shareUrl)"
ko: "\(nickname)님이 귀하를 소다라이브 공개라이브에 초대하였습니다.\n※ 라이브 참여: \(shareUrl)",
en: "\(nickname) invited you to a public SodaLive live.\n※ Join live: \(shareUrl)",
ja: "\(nickname)さんがあなたをSodaLive公開ライブに招待しました。\n※ ライブ参加: \(shareUrl)"
)
}
@@ -2879,7 +2879,7 @@ If you block this user, the following features will be restricted.
}
static func shareChannelMessage(_ nickname: String) -> String {
pick(ko: "보이스온 \(nickname)님의 채널입니다.", en: "This is \(nickname)'s channel on VoiceOn.", ja: "ボイスオン\(nickname)さんのチャンネルです。")
pick(ko: "소다라이브 \(nickname)님의 채널입니다.", en: "This is \(nickname)'s channel on SodaLive.", ja: "ソーダライブ\(nickname)さんのチャンネルです。")
}
static func reserveWithCansTitle(_ price: Int) -> String {
@@ -3100,8 +3100,8 @@ If you block this user, the following features will be restricted.
pick(ko: "New&Hot", en: "New&Hot", ja: "New&Hot")
}
static var voiceOnOnlySectionTitle: String {
pick(ko: "오직 보이스온에서만!", en: "Only on VoiceOn!", ja: "VOICE ON限定")
static var sodaLiveOnlySectionTitle: String {
pick(ko: "오직 소다라이브에서만!", en: "Only on SodaLive!", ja: "SODALIVE限定")
}
static var freeAudioSectionTitle: String {
@@ -3222,8 +3222,8 @@ If you block this user, the following features will be restricted.
pick(ko: "인기 크리에이터", en: "Popular creators", ja: "人気クリエイター")
}
static var onlyOnVoiceOnSectionTitle: String {
pick(ko: "오직 보이스온에서만", en: "Only on VoiceOn", ja: "VoiceOnだけで")
static var onlyOnSodaLiveSectionTitle: String {
pick(ko: "오직 소다라이브에서만", en: "Only on SodaLive", ja: "SodaLiveだけで")
}
static var popularCharacterChatSectionTitle: String {
@@ -3247,7 +3247,7 @@ If you block this user, the following features will be restricted.
}
static var weeklyChartSectionTitle: String {
pick(ko: "보온 주간 차트", en: "VoiceOn weekly chart", ja: "ボイスオン週間チャート")
pick(ko: "보온 주간 차트", en: "SodaLive weekly chart", ja: "ソーダライブ週間チャート")
}
enum RecommendChannel {
@@ -4031,9 +4031,9 @@ If you block this user, the following features will be restricted.
enum ApplyAuditionComplete {
static var thankYouDescription: String {
pick(
ko: "보이스온 오디션에 지원해 주셔서 감사합니다.",
en: "Thank you for applying to the VoiceOn audition.",
ja: "VoiceOnオーディションにご応募いただきありがとうございます。"
ko: "소다라이브 오디션에 지원해 주셔서 감사합니다.",
en: "Thank you for applying to the SodaLive audition.",
ja: "SodaLiveオーディションにご応募いただきありがとうございます。"
)
}
}
@@ -4343,7 +4343,7 @@ If you block this user, the following features will be restricted.
static var completedSectionTitle: String { pick(ko: "완결 시리즈", en: "Completed series", ja: "完結シリーズ") }
static var recommendedSectionTitle: String { pick(ko: "추천 시리즈", en: "Recommended series", ja: "おすすめシリーズ") }
static var byDaySectionTitle: String { pick(ko: "요일별 시리즈", en: "Series by day", ja: "曜日別シリーズ") }
static var voiceOnOnlyTitle: String { pick(ko: "오직 보이스온에서만", en: "Only on VoiceOn", ja: "VoiceOn限定") }
static var sodaLiveOnlyTitle: String { pick(ko: "오직 소다라이브에서만", en: "Only on SodaLive", ja: "SodaLive限定") }
static var allEpisodesListen: String { pick(ko: "전체회차 듣기", en: "Listen to all episodes", ja: "全話を聴く") }
static func allEpisodesTitle(_ seriesTitle: String) -> String { pick(ko: "\(seriesTitle) - 전체회차 듣기", en: "\(seriesTitle) - All episodes", ja: "\(seriesTitle) - 全話を聴く") }
static var registeredOrder: String { pick(ko: "등록순", en: "Oldest", ja: "登録順") }
@@ -4721,9 +4721,9 @@ If you block this user, the following features will be restricted.
static var noticeTermsReference: String {
pick(
ko: "자세한 내용은 보이스온 이용약관에서 확인할 수 있습니다.",
en: "For details, please check the VoiceOn Terms of Service.",
ja: "詳細はVoiceOn利用規約をご確認ください。"
ko: "자세한 내용은 소다라이브 이용약관에서 확인할 수 있습니다.",
en: "For details, please check the SodaLive Terms of Service.",
ja: "詳細はSodaLive利用規約をご確認ください。"
)
}
@@ -5091,7 +5091,7 @@ If you block this user, the following features will be restricted.
enum ServiceCenter {
static var buttonTitle: String {
pick(ko: "보이스온 고객센터", en: "VoiceOn customer center", ja: "VoiceOnカスタマーセンター")
pick(ko: "소다라이브 고객센터", en: "SodaLive customer center", ja: "SodaLiveカスタマーセンター")
}
static var talkInquiry: String {
@@ -5236,7 +5236,7 @@ If you block this user, the following features will be restricted.
}
static var signUpPrompt: String {
pick(ko: "보이스온 회원이 아닌가요? 지금 가입하세요.", en: "Not a VoiceOn member? Sign up now.", ja: "VoiceOnの会員ではありませんか?今すぐ登録してください。")
pick(ko: "소다라이브 회원이 아닌가요? 지금 가입하세요.", en: "Not a SodaLive member? Sign up now.", ja: "SodaLiveの会員ではありませんか?今すぐ登録してください。")
}
static var appleAuthorizationFailed: String {

View File

@@ -136,7 +136,7 @@ struct MyPageView: View {
if let url = URL(string: "https://bit.ly/4h7pVks"),
UIApplication.shared.canOpenURL(url) {
// Voice On Banner
// SodaLive Banner
Image("img_apply_creator")
.resizable()
.frame(maxWidth: .infinity)
@@ -148,7 +148,7 @@ struct MyPageView: View {
if let url = URL(string: "https://blog.naver.com/sodalive_official"),
UIApplication.shared.canOpenURL(url) {
// Voice On Banner
// SodaLive Banner
Image("img_introduce_voiceon")
.resizable()
.frame(maxWidth: .infinity)

View File

@@ -49,7 +49,7 @@ struct MainContentView: View {
onTapSeries: onTapSeries,
onTapLatestAudioAll: { applyAllTab(type: .audio, sort: .latest) },
onTapNewAndHotAll: onTapNewAndHotAll,
onTapVoiceOnOnlyAll: { applyAllTab(type: .original, sort: .latest) },
onTapSodaLiveOnlyAll: { applyAllTab(type: .original, sort: .latest) },
onTapFreeAudioAll: { applyAllTab(type: .free, sort: .popular) },
onTapPointAudioAll: { applyAllTab(type: .point, sort: .popular) }
)

View File

@@ -6,7 +6,7 @@ struct MainContentRecommendationView: View {
let onTapSeries: (Int) -> Void
let onTapLatestAudioAll: () -> Void
let onTapNewAndHotAll: () -> Void
let onTapVoiceOnOnlyAll: () -> Void
let onTapSodaLiveOnlyAll: () -> Void
let onTapFreeAudioAll: () -> Void
let onTapPointAudioAll: () -> Void
@@ -31,9 +31,9 @@ struct MainContentRecommendationView: View {
)
MainContentVoiceOnOnlySection(
title: I18n.MainContentRecommendation.voiceOnOnlySectionTitle,
title: I18n.MainContentRecommendation.sodaLiveOnlySectionTitle,
items: recommendations.originalSeries,
action: onTapVoiceOnOnlyAll,
action: onTapSodaLiveOnlyAll,
onTapSeries: onTapSeries
)