로컬라이징 문자열 정비

탭, 상세, 설정 화면 텍스트를 I18n 키로 교체

신규 캐릭터 전체보기 등 문자열 번역을 추가
This commit is contained in:
Yu Sung
2025-12-17 15:55:11 +09:00
parent fa163ec83d
commit a0bb593431
8 changed files with 117 additions and 63 deletions

View File

@@ -246,13 +246,13 @@
"en" : { "en" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "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" : { "ja" : {
"stringUnit" : { "stringUnit" : {
"state" : "translated", "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" : { "localizations" : {
"en" : { "en" : {
@@ -4113,6 +4097,22 @@
} }
} }
}, },
"목" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Thu"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "木"
}
}
}
},
"무료" : { "무료" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@@ -5089,6 +5089,22 @@
} }
} }
}, },
"설정" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Settings"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "設定"
}
}
}
},
"설정완료" : { "설정완료" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@@ -5569,6 +5585,22 @@
} }
} }
}, },
"신규 캐릭터 전체보기" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "View all new characters"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "新規キャラクターをすべて見る"
}
}
}
},
"신작" : { "신작" : {
"localizations" : { "localizations" : {
"en" : { "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" : { "localizations" : {
"en" : { "en" : {
@@ -6833,6 +6833,22 @@
} }
} }
}, },
"이벤트" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Events"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "イベント"
}
}
}
},
"이벤트 참여하기" : { "이벤트 참여하기" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@@ -7009,6 +7025,22 @@
} }
} }
}, },
"일" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Sun"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "日"
}
}
}
},
"일간 랭킹" : { "일간 랭킹" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@@ -8497,6 +8529,22 @@
} }
} }
}, },
"캐릭터 정보" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Character info"
}
},
"ja" : {
"stringUnit" : {
"state" : "translated",
"value" : "キャラクター情報"
}
}
}
},
"캔 충전" : { "캔 충전" : {
"localizations" : { "localizations" : {
"en" : { "en" : {
@@ -9715,4 +9763,4 @@
} }
}, },
"version" : "1.1" "version" : "1.1"
} }

View File

@@ -54,7 +54,7 @@ struct CharacterView: View {
title: "신규 캐릭터", title: "신규 캐릭터",
items: viewModel.newCharacters, items: viewModel.newCharacters,
isShowRank: false, isShowRank: false,
trailingTitle: "전체보기", trailingTitle: I18n.Common.viewAll,
onTapTrailing: { onTapTrailing: {
onSelectNewCharacterAll() onSelectNewCharacterAll()
}, },

View File

@@ -25,8 +25,8 @@ struct CharacterDetailView: View {
var title: String { var title: String {
switch self { switch self {
case .detail: return "상세" case .detail: return I18n.Tab.detail
case .gallery: return "갤러리" case .gallery: return I18n.Tab.gallery
} }
} }
} }
@@ -34,7 +34,7 @@ struct CharacterDetailView: View {
var body: some View { var body: some View {
BaseView(isLoading: $viewModel.isLoading) { BaseView(isLoading: $viewModel.isLoading) {
VStack(spacing: 0) { VStack(spacing: 0) {
DetailNavigationBar(title: "캐릭터 정보") { DetailNavigationBar(title: String(localized: "캐릭터 정보")) {
if presentationMode.wrappedValue.isPresented { if presentationMode.wrappedValue.isPresented {
presentationMode.wrappedValue.dismiss() presentationMode.wrappedValue.dismiss()
} else { } else {

View File

@@ -18,7 +18,7 @@ struct NewCharacterListView: View {
BaseView(isLoading: $viewModel.isLoading) { BaseView(isLoading: $viewModel.isLoading) {
VStack(spacing: 8) { VStack(spacing: 8) {
// Toolbar // Toolbar
DetailNavigationBar(title: "신규 캐릭터 전체보기") DetailNavigationBar(title: String(localized: "신규 캐릭터 전체보기"))
VStack(alignment: .leading, spacing: 12) { VStack(alignment: .leading, spacing: 12) {
// n // n

View File

@@ -21,9 +21,9 @@ struct ChatTabView: View {
var title: String { var title: String {
switch self { switch self {
case .character: return "캐릭터" case .character: return I18n.Tab.character
case .original: return "작품별" case .original: return I18n.Tab.work
case .talk: return "" case .talk: return I18n.Tab.talk
} }
} }
} }

View File

@@ -53,7 +53,7 @@ struct OriginalWorkDetailView: View {
HStack(spacing: 0) { HStack(spacing: 0) {
SeriesDetailTabView( SeriesDetailTabView(
title: "캐릭터", title: I18n.Tab.character,
width: screenSize().width / 2, width: screenSize().width / 2,
isSelected: viewModel.currentTab == .character isSelected: viewModel.currentTab == .character
) { ) {
@@ -63,7 +63,7 @@ struct OriginalWorkDetailView: View {
} }
SeriesDetailTabView( SeriesDetailTabView(
title: "작품정보", title: I18n.Tab.workInfo,
width: screenSize().width / 2, width: screenSize().width / 2,
isSelected: viewModel.currentTab == .info isSelected: viewModel.currentTab == .info
) { ) {

View File

@@ -12,6 +12,8 @@ import Foundation
// LanguageHeaderProvider.current("ko"|"en"|"ja"). // LanguageHeaderProvider.current("ko"|"en"|"ja").
enum I18n { enum I18n {
enum Common { enum Common {
static var viewAll: String { pick(ko: "전체보기", en: "View all", ja: "すべて見る") }
// //
static var apply: String { pick(ko: "적용", en: "Apply", ja: "適用") } static var apply: String { pick(ko: "적용", en: "Apply", ja: "適用") }
static var confirm: String { pick(ko: "확인", en: "Confirm", ja: "確認") } static var confirm: String { pick(ko: "확인", en: "Confirm", ja: "確認") }
@@ -38,8 +40,12 @@ enum I18n {
enum Tab { enum Tab {
// / // /
static var character: String { pick(ko: "캐릭터", en: "Character", ja: "キャラクター") } 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 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: "ギャラリー") }
} }
} }

View File

@@ -20,7 +20,7 @@ struct SettingsView: View {
BaseView(isLoading: $viewModel.isLoading) { BaseView(isLoading: $viewModel.isLoading) {
GeometryReader { geo in GeometryReader { geo in
VStack(spacing: 0) { VStack(spacing: 0) {
DetailNavigationBar(title: "설정") DetailNavigationBar(title: String(localized: "설정"))
ScrollView(.vertical, showsIndicators: false) { ScrollView(.vertical, showsIndicators: false) {
VStack(spacing: 0) { VStack(spacing: 0) {