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

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("writer") val writer: String?,
@SerializedName("studio") val studio: String?, @SerializedName("studio") val studio: String?,
@SerializedName("publishedDate") val publishedDate: String, @SerializedName("publishedDate") val publishedDate: String,
@SerializedName("publishedDateUtc") val publishedDateUtc: String,
@SerializedName("creator") val creator: GetSeriesDetailCreator, @SerializedName("creator") val creator: GetSeriesDetailCreator,
@SerializedName("rentalMinPrice") var rentalMinPrice: Int, @SerializedName("rentalMinPrice") var rentalMinPrice: Int,
@SerializedName("rentalMaxPrice") var rentalMaxPrice: Int, @SerializedName("rentalMaxPrice") var rentalMaxPrice: Int,
@@ -26,7 +27,9 @@ data class GetSeriesDetailResponse(
@SerializedName("keywordList") var keywordList: List<String>, @SerializedName("keywordList") var keywordList: List<String>,
@SerializedName("publishedDaysOfWeek") var publishedDaysOfWeek: String, @SerializedName("publishedDaysOfWeek") var publishedDaysOfWeek: String,
@SerializedName("contentList") val contentList: List<GetSeriesContentListItem>, @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 { ) : Parcelable {
@Parcelize @Parcelize
@Keep @Keep
@@ -38,3 +41,11 @@ data class GetSeriesDetailResponse(
@SerializedName("isNotify") var isNotify: Boolean @SerializedName("isNotify") var isNotify: Boolean
) : Parcelable ) : 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) { viewModel.seriesDetailLiveData.observe(this) {
// GetSeriesDetailResponse에 추가한대로 번역 데이터가 있으면 번역데이터 표시
// 없으면 지금과 동일하게 원본 데이터 표시
setSeriesBg(it.coverImage) setSeriesBg(it.coverImage)
setSeriesInfo(it) setSeriesInfo(it)
setSeriesCreator(it.creator) setSeriesCreator(it.creator)
setSeriesKeywordChipList(it.keywordList) // 번역 키워드가 있으면 번역 키워드 표시, 없으면 기존 키워드 표시
setSeriesKeywordChipList(it.translated?.keywords ?: it.keywordList)
changeFragment("home") changeFragment("home")
} }
@@ -160,8 +163,14 @@ class SeriesDetailActivity : BaseActivity<ActivitySeriesDetailBinding>(
transformations(RoundedCornersTransformation(5f.dpToPx())) 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)) { val publishedDays = if (seriesDetail.publishedDaysOfWeek == getString(R.string.day_random)) {
getString(R.string.day_random) getString(R.string.day_random)
} else { } 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.common.Constants
import kr.co.vividnext.sodalive.databinding.FragmentSeriesDetailIntroductionBinding import kr.co.vividnext.sodalive.databinding.FragmentSeriesDetailIntroductionBinding
import kr.co.vividnext.sodalive.extensions.dpToPx import kr.co.vividnext.sodalive.extensions.dpToPx
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.TimeZone
class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntroductionBinding>( class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntroductionBinding>(
FragmentSeriesDetailIntroductionBinding::inflate FragmentSeriesDetailIntroductionBinding::inflate
@@ -38,8 +41,15 @@ class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntrod
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
if (seriesDetailResponse != null) { if (seriesDetailResponse != null) {
setSeriesKeywordChipList(seriesDetailResponse!!.keywordList) // 번역 데이터가 있으면 번역 데이터 우선 적용
setSeriesIntroduction(seriesDetailResponse!!.introduction) setSeriesKeywordChipList(
seriesDetailResponse!!.translated?.keywords
?: seriesDetailResponse!!.keywordList
)
setSeriesIntroduction(
seriesDetailResponse!!.translated?.introduction
?: seriesDetailResponse!!.introduction
)
setSeriesPrice() setSeriesPrice()
setSeriesInfo() setSeriesInfo()
} }
@@ -88,19 +98,24 @@ class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntrod
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun setSeriesInfo() { private fun setSeriesInfo() {
binding.tvGenre.text = seriesDetailResponse!!.genre // 장르는 번역 데이터가 있으면 번역 장르 사용
binding.tvGenre.text =
seriesDetailResponse!!.translatedGenre ?: seriesDetailResponse!!.genre
binding.tvIsAdult.text = if (seriesDetailResponse!!.isAdult) { binding.tvIsAdult.text = if (seriesDetailResponse!!.isAdult) {
getString(R.string.screen_series_detail_age_19) getString(R.string.screen_series_detail_age_19)
} else { } else {
getString(R.string.screen_series_detail_age_all) getString(R.string.screen_series_detail_age_all)
} }
binding.tvPublishedDate.text = seriesDetailResponse!!.publishedDate // 공개일은 publishedDateUtc(UTC)를 단말 타임존으로 변환하여 표시
val publishedDays = if (seriesDetailResponse!!.publishedDaysOfWeek == getString(R.string.day_random)) { binding.tvPublishedDate.text =
getString(R.string.day_random) formatPublishedDateUtc(seriesDetailResponse!!.publishedDateUtc)
} else { val publishedDays =
seriesDetailResponse!!.publishedDaysOfWeek if (seriesDetailResponse!!.publishedDaysOfWeek == getString(R.string.day_random)) {
} getString(R.string.day_random)
} else {
seriesDetailResponse!!.publishedDaysOfWeek
}
binding.tvPublishedDaysOfWeek.text = getString( binding.tvPublishedDaysOfWeek.text = getString(
R.string.screen_series_detail_published_days_format, R.string.screen_series_detail_published_days_format,
publishedDays publishedDays
@@ -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) { private fun setSeriesIntroduction(introduction: String) {
binding.tvIntroduce.text = introduction binding.tvIntroduce.text = introduction
} }