diff --git a/SodaLive/Resources/Localizable.xcstrings b/SodaLive/Resources/Localizable.xcstrings index 07910be..ddb053b 100644 --- a/SodaLive/Resources/Localizable.xcstrings +++ b/SodaLive/Resources/Localizable.xcstrings @@ -246,13 +246,13 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "- Company name: SodaLive Co., Ltd.\\n\\n- Representative: Jae Hyung Lee\\n\\n- Address: 5th Fl., 563A, 10 Hwangsaeul-ro 335beon-gil, Bundang-gu, Seongnam-si, Gyeonggi-do\\n\\n- Business registration number: 870-81-03220\\n\\n- Mail-order business report: 2024-SeongnamBundangB-1012\\n\\n- Customer center: 02.2055.1477 (Hours 10:00~19:00)\\n\\n- Representative email: sodalive.official@gmail.com" + "value" : "- Company name: SodaLive Co., Ltd.\n\n- Representative: Jae Hyung Lee\n\n- Address: 5th Fl., 563A, 10 Hwangsaeul-ro 335beon-gil, Bundang-gu, Seongnam-si, Gyeonggi-do\n\n- Business registration number: 870-81-03220\n\n- Mail-order business report: 2024-SeongnamBundangB-1012\n\n- Customer center: 02.2055.1477 (Hours 10:00~19:00)\n\n- Representative email: sodalive.official@gmail.com" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "- 会社名 : 株式会社ソダライブ\\n\\n- 代表者 : イ・ジェヒョン\\n\\n- 住所 : 京畿道 城南市 盆唐区 ファンセウル路335番キル10 5階 563A号\\n\\n- 事業者登録番号 : 870-81-03220\\n\\n- 通信販売業申告 : 第2024-城南盆唐B-1012号\\n\\n- カスタマーセンター : 02.2055.1477 (利用時間 10:00~19:00)\\n\\n- 代表メール : sodalive.official@gmail.com" + "value" : "- 会社名 : 株式会社ソダライブ\n\n- 代表者 : イ・ジェヒョン\n\n- 住所 : 京畿道 城南市 盆唐区 ファンセウル路335番キル10 5階 563A号\n\n- 事業者登録番号 : 870-81-03220\n\n- 通信販売業申告 : 第2024-城南盆唐B-1012号\n\n- カスタマーセンター : 02.2055.1477 (利用時間 10:00~19:00)\n\n- 代表メール : sodalive.official@gmail.com" } } } @@ -4049,22 +4049,6 @@ } } }, - "목" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thu" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "木" - } - } - } - }, "모든 기기에서 로그아웃" : { "localizations" : { "en" : { @@ -4113,6 +4097,22 @@ } } }, + "목" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thu" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "木" + } + } + } + }, "무료" : { "localizations" : { "en" : { @@ -5089,6 +5089,22 @@ } } }, + "설정" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Settings" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "設定" + } + } + } + }, "설정완료" : { "localizations" : { "en" : { @@ -5569,6 +5585,22 @@ } } }, + "신규 캐릭터 전체보기" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "View all new characters" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "新規キャラクターをすべて見る" + } + } + } + }, "신작" : { "localizations" : { "en" : { @@ -6753,38 +6785,6 @@ } } }, - "이벤트" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Events" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "イベント" - } - } - } - }, - "일" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sun" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "日" - } - } - } - }, "이메일을 입력하세요" : { "localizations" : { "en" : { @@ -6833,6 +6833,22 @@ } } }, + "이벤트" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Events" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "イベント" + } + } + } + }, "이벤트 참여하기" : { "localizations" : { "en" : { @@ -7009,6 +7025,22 @@ } } }, + "일" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sun" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日" + } + } + } + }, "일간 랭킹" : { "localizations" : { "en" : { @@ -8497,6 +8529,22 @@ } } }, + "캐릭터 정보" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Character info" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "キャラクター情報" + } + } + } + }, "캔 충전" : { "localizations" : { "en" : { @@ -9715,4 +9763,4 @@ } }, "version" : "1.1" -} \ No newline at end of file +} diff --git a/SodaLive/Sources/Chat/Character/CharacterView.swift b/SodaLive/Sources/Chat/Character/CharacterView.swift index bc061a7..84decd8 100644 --- a/SodaLive/Sources/Chat/Character/CharacterView.swift +++ b/SodaLive/Sources/Chat/Character/CharacterView.swift @@ -54,7 +54,7 @@ struct CharacterView: View { title: "신규 캐릭터", items: viewModel.newCharacters, isShowRank: false, - trailingTitle: "전체보기", + trailingTitle: I18n.Common.viewAll, onTapTrailing: { onSelectNewCharacterAll() }, diff --git a/SodaLive/Sources/Chat/Character/Detail/CharacterDetailView.swift b/SodaLive/Sources/Chat/Character/Detail/CharacterDetailView.swift index 30038c7..caf8a14 100644 --- a/SodaLive/Sources/Chat/Character/Detail/CharacterDetailView.swift +++ b/SodaLive/Sources/Chat/Character/Detail/CharacterDetailView.swift @@ -25,8 +25,8 @@ struct CharacterDetailView: View { var title: String { switch self { - case .detail: return "상세" - case .gallery: return "갤러리" + case .detail: return I18n.Tab.detail + case .gallery: return I18n.Tab.gallery } } } @@ -34,7 +34,7 @@ struct CharacterDetailView: View { var body: some View { BaseView(isLoading: $viewModel.isLoading) { VStack(spacing: 0) { - DetailNavigationBar(title: "캐릭터 정보") { + DetailNavigationBar(title: String(localized: "캐릭터 정보")) { if presentationMode.wrappedValue.isPresented { presentationMode.wrappedValue.dismiss() } else { diff --git a/SodaLive/Sources/Chat/Character/New/Views/NewCharacterListView.swift b/SodaLive/Sources/Chat/Character/New/Views/NewCharacterListView.swift index b4c266d..b6d738c 100644 --- a/SodaLive/Sources/Chat/Character/New/Views/NewCharacterListView.swift +++ b/SodaLive/Sources/Chat/Character/New/Views/NewCharacterListView.swift @@ -18,7 +18,7 @@ struct NewCharacterListView: View { BaseView(isLoading: $viewModel.isLoading) { VStack(spacing: 8) { // Toolbar - DetailNavigationBar(title: "신규 캐릭터 전체보기") + DetailNavigationBar(title: String(localized: "신규 캐릭터 전체보기")) VStack(alignment: .leading, spacing: 12) { // 전체 n개 diff --git a/SodaLive/Sources/Chat/ChatTabView.swift b/SodaLive/Sources/Chat/ChatTabView.swift index eb81433..a031681 100644 --- a/SodaLive/Sources/Chat/ChatTabView.swift +++ b/SodaLive/Sources/Chat/ChatTabView.swift @@ -21,9 +21,9 @@ struct ChatTabView: View { var title: String { switch self { - case .character: return "캐릭터" - case .original: return "작품별" - case .talk: return "톡" + case .character: return I18n.Tab.character + case .original: return I18n.Tab.work + case .talk: return I18n.Tab.talk } } } diff --git a/SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailView.swift b/SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailView.swift index b376886..0ce3905 100644 --- a/SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailView.swift +++ b/SodaLive/Sources/Chat/Original/Detail/OriginalWorkDetailView.swift @@ -53,7 +53,7 @@ struct OriginalWorkDetailView: View { HStack(spacing: 0) { SeriesDetailTabView( - title: "캐릭터", + title: I18n.Tab.character, width: screenSize().width / 2, isSelected: viewModel.currentTab == .character ) { @@ -63,7 +63,7 @@ struct OriginalWorkDetailView: View { } SeriesDetailTabView( - title: "작품정보", + title: I18n.Tab.workInfo, width: screenSize().width / 2, isSelected: viewModel.currentTab == .info ) { diff --git a/SodaLive/Sources/I18n/I18n.swift b/SodaLive/Sources/I18n/I18n.swift index ae788aa..bf4e4bd 100644 --- a/SodaLive/Sources/I18n/I18n.swift +++ b/SodaLive/Sources/I18n/I18n.swift @@ -12,6 +12,8 @@ import Foundation // 기준 언어 선택은 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: "確認") } @@ -38,8 +40,12 @@ enum I18n { enum Tab { // 탭/도메인 static var character: String { pick(ko: "캐릭터", en: "Character", ja: "キャラクター") } - static var work: String { pick(ko: "작품", en: "Work", 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: "ギャラリー") } } } diff --git a/SodaLive/Sources/Settings/SettingsView.swift b/SodaLive/Sources/Settings/SettingsView.swift index c89ec38..e7d57ec 100644 --- a/SodaLive/Sources/Settings/SettingsView.swift +++ b/SodaLive/Sources/Settings/SettingsView.swift @@ -20,7 +20,7 @@ struct SettingsView: View { BaseView(isLoading: $viewModel.isLoading) { GeometryReader { geo in VStack(spacing: 0) { - DetailNavigationBar(title: "설정") + DetailNavigationBar(title: String(localized: "설정")) ScrollView(.vertical, showsIndicators: false) { VStack(spacing: 0) {