시리즈 상세 - 번역 데이터가 있으면 번역 데이터를 표시하도록 수정

This commit is contained in:
2025-12-16 03:33:01 +09:00
parent 3bd8061a93
commit f0a2e2c46f
3 changed files with 68 additions and 13 deletions

View File

@@ -17,6 +17,7 @@ data class GetSeriesDetailResponse(
@SerializedName("writer") val writer: String?,
@SerializedName("studio") val studio: String?,
@SerializedName("publishedDate") val publishedDate: String,
@SerializedName("publishedDateUtc") val publishedDateUtc: String,
@SerializedName("creator") val creator: GetSeriesDetailCreator,
@SerializedName("rentalMinPrice") var rentalMinPrice: Int,
@SerializedName("rentalMaxPrice") var rentalMaxPrice: Int,
@@ -26,7 +27,9 @@ data class GetSeriesDetailResponse(
@SerializedName("keywordList") var keywordList: List<String>,
@SerializedName("publishedDaysOfWeek") var publishedDaysOfWeek: String,
@SerializedName("contentList") val contentList: List<GetSeriesContentListItem>,
@SerializedName("contentCount") val contentCount: Int
@SerializedName("contentCount") val contentCount: Int,
@SerializedName("translated") val translated: TranslatedSeries?,
@SerializedName("translatedGenre") val translatedGenre: String?
) : Parcelable {
@Parcelize
@Keep
@@ -38,3 +41,11 @@ data class GetSeriesDetailResponse(
@SerializedName("isNotify") var isNotify: Boolean
) : Parcelable
}
@Parcelize
@Keep
data class TranslatedSeries(
@SerializedName("title") val title: String,
@SerializedName("introduction") val introduction: String,
@SerializedName("keywords") val keywords: List<String>
) : Parcelable

View File

@@ -118,10 +118,13 @@ class SeriesDetailActivity : BaseActivity<ActivitySeriesDetailBinding>(
}
viewModel.seriesDetailLiveData.observe(this) {
// GetSeriesDetailResponse에 추가한대로 번역 데이터가 있으면 번역데이터 표시
// 없으면 지금과 동일하게 원본 데이터 표시
setSeriesBg(it.coverImage)
setSeriesInfo(it)
setSeriesCreator(it.creator)
setSeriesKeywordChipList(it.keywordList)
// 번역 키워드가 있으면 번역 키워드 표시, 없으면 기존 키워드 표시
setSeriesKeywordChipList(it.translated?.keywords ?: it.keywordList)
changeFragment("home")
}
@@ -160,8 +163,14 @@ class SeriesDetailActivity : BaseActivity<ActivitySeriesDetailBinding>(
transformations(RoundedCornersTransformation(5f.dpToPx()))
}
binding.tvTitle.text = seriesDetail.title
binding.tvGenre.text = seriesDetail.genre
// 번역 데이터 사용 우선, 없으면 원본 사용
val displayTitle = seriesDetail.translated?.title?.takeIf { it.isNotBlank() }
?: seriesDetail.title
val displayGenre = seriesDetail.translatedGenre?.takeIf { it.isNotBlank() }
?: seriesDetail.genre
binding.tvTitle.text = displayTitle
binding.tvGenre.text = displayGenre
val publishedDays = if (seriesDetail.publishedDaysOfWeek == getString(R.string.day_random)) {
getString(R.string.day_random)
} else {

View File

@@ -13,6 +13,9 @@ import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.databinding.FragmentSeriesDetailIntroductionBinding
import kr.co.vividnext.sodalive.extensions.dpToPx
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.TimeZone
class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntroductionBinding>(
FragmentSeriesDetailIntroductionBinding::inflate
@@ -38,8 +41,15 @@ class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntrod
super.onViewCreated(view, savedInstanceState)
if (seriesDetailResponse != null) {
setSeriesKeywordChipList(seriesDetailResponse!!.keywordList)
setSeriesIntroduction(seriesDetailResponse!!.introduction)
// 번역 데이터가 있으면 번역 데이터 우선 적용
setSeriesKeywordChipList(
seriesDetailResponse!!.translated?.keywords
?: seriesDetailResponse!!.keywordList
)
setSeriesIntroduction(
seriesDetailResponse!!.translated?.introduction
?: seriesDetailResponse!!.introduction
)
setSeriesPrice()
setSeriesInfo()
}
@@ -88,15 +98,20 @@ class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntrod
@SuppressLint("SetTextI18n")
private fun setSeriesInfo() {
binding.tvGenre.text = seriesDetailResponse!!.genre
// 장르는 번역 데이터가 있으면 번역 장르 사용
binding.tvGenre.text =
seriesDetailResponse!!.translatedGenre ?: seriesDetailResponse!!.genre
binding.tvIsAdult.text = if (seriesDetailResponse!!.isAdult) {
getString(R.string.screen_series_detail_age_19)
} else {
getString(R.string.screen_series_detail_age_all)
}
binding.tvPublishedDate.text = seriesDetailResponse!!.publishedDate
val publishedDays = if (seriesDetailResponse!!.publishedDaysOfWeek == getString(R.string.day_random)) {
// 공개일은 publishedDateUtc(UTC)를 단말 타임존으로 변환하여 표시
binding.tvPublishedDate.text =
formatPublishedDateUtc(seriesDetailResponse!!.publishedDateUtc)
val publishedDays =
if (seriesDetailResponse!!.publishedDaysOfWeek == getString(R.string.day_random)) {
getString(R.string.day_random)
} else {
seriesDetailResponse!!.publishedDaysOfWeek
@@ -127,6 +142,26 @@ class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntrod
}
}
private fun formatPublishedDateUtc(utcString: String): String {
return try {
val utcFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault()).apply {
timeZone = TimeZone.getTimeZone("UTC")
}
val date = utcFormat.parse(utcString)
if (date != null) {
val localFormat = SimpleDateFormat("yyyy.MM.dd", Locale.getDefault()).apply {
timeZone = TimeZone.getDefault()
}
localFormat.format(date)
} else {
// 파싱 실패 시 서버에서 제공한 기존 publishedDate로 폴백
seriesDetailResponse?.publishedDate ?: utcString
}
} catch (e: Exception) {
seriesDetailResponse?.publishedDate ?: utcString
}
}
private fun setSeriesIntroduction(introduction: String) {
binding.tvIntroduce.text = introduction
}