시리즈 상세 문자열 리소스화

This commit is contained in:
2025-12-03 19:10:59 +09:00
parent 5ef7896f1d
commit f8769e97f9
10 changed files with 156 additions and 49 deletions

View File

@@ -38,7 +38,11 @@ class SeriesDetailActivity : BaseActivity<ActivitySeriesDetailBinding>(
val seriesId = intent.getLongExtra(Constants.EXTRA_SERIES_ID, 0)
if (seriesId <= 0) {
Toast.makeText(applicationContext, "잘못된 요청입니다.", Toast.LENGTH_LONG).show()
Toast.makeText(
applicationContext,
getString(R.string.screen_audio_content_error_invalid_request),
Toast.LENGTH_LONG
).show()
finish()
}
@@ -57,8 +61,14 @@ class SeriesDetailActivity : BaseActivity<ActivitySeriesDetailBinding>(
private fun setupTab() {
val tabs = binding.tabs
tabs.addTab(tabs.newTab().setText("").setTag("home"))
tabs.addTab(tabs.newTab().setText("작품소개").setTag("introduction"))
tabs.addTab(
tabs.newTab().setText(R.string.screen_series_detail_tab_home).setTag("home")
)
tabs.addTab(
tabs.newTab()
.setText(R.string.screen_series_detail_tab_introduction)
.setTag("introduction")
)
tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
@@ -152,7 +162,15 @@ class SeriesDetailActivity : BaseActivity<ActivitySeriesDetailBinding>(
binding.tvTitle.text = seriesDetail.title
binding.tvGenre.text = seriesDetail.genre
binding.tvPublishedDaysOfWeek.text = "${seriesDetail.publishedDaysOfWeek} 연재"
val publishedDays = if (seriesDetail.publishedDaysOfWeek == getString(R.string.day_random)) {
getString(R.string.day_random)
} else {
seriesDetail.publishedDaysOfWeek
}
binding.tvPublishedDaysOfWeek.text = getString(
R.string.screen_series_detail_published_days_format,
publishedDays
)
if (seriesDetail.isAdult) {
binding.tvAge19.visibility = View.VISIBLE

View File

@@ -5,8 +5,11 @@ import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
import kr.co.vividnext.sodalive.audio_content.series.content.SeriesContentAdapter
import kr.co.vividnext.sodalive.audio_content.series.content.SeriesContentAllActivity
@@ -44,9 +47,12 @@ class SeriesDetailHomeFragment : BaseFragment<FragmentSeriesDetailHomeBinding>(
}
}
@SuppressLint("SetTextI18n")
@OptIn(UnstableApi::class)
private fun setContent() {
binding.tvTotalCount.text = "(${seriesDetailResponse!!.contentCount})"
binding.tvTotalCount.text = getString(
R.string.screen_series_detail_content_count_format,
seriesDetailResponse!!.contentCount
)
binding.llContentAll.setOnClickListener {
startActivity(
Intent(requireActivity(), SeriesContentAllActivity::class.java).apply {

View File

@@ -53,22 +53,36 @@ class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntrod
binding.tvRentalPrice.text = if (rentalMinPrice == rentalMaxPrice) {
if (rentalMaxPrice == 0) {
"무료(5일)"
getString(R.string.screen_series_detail_price_rental_free)
} else {
"$rentalMaxPrice(5일)"
getString(R.string.screen_series_detail_price_rental_single, rentalMaxPrice)
}
} else {
"${if (rentalMinPrice == 0) "무료" else rentalMinPrice} ~ ${rentalMaxPrice}캔 (5일)"
val minText = if (rentalMinPrice == 0) {
getString(R.string.audio_content_price_free)
} else {
rentalMinPrice.toString()
}
getString(
R.string.screen_series_detail_price_rental_range,
minText,
rentalMaxPrice
)
}
binding.tvPrice.text = if (minPrice == maxPrice) {
if (maxPrice == 0) {
"무료"
getString(R.string.audio_content_price_free)
} else {
"$maxPrice"
getString(R.string.screen_series_detail_price_keep_single, maxPrice)
}
} else {
"${if (minPrice == 0) "무료" else minPrice} ~ ${maxPrice}"
val minText = if (minPrice == 0) {
getString(R.string.audio_content_price_free)
} else {
minPrice.toString()
}
getString(R.string.screen_series_detail_price_keep_range, minText, maxPrice)
}
}
@@ -76,18 +90,21 @@ class SeriesDetailIntroductionFragment : BaseFragment<FragmentSeriesDetailIntrod
private fun setSeriesInfo() {
binding.tvGenre.text = seriesDetailResponse!!.genre
binding.tvIsAdult.text = if (seriesDetailResponse!!.isAdult) {
"19세 이상"
getString(R.string.screen_series_detail_age_19)
} else {
"전체연령가"
getString(R.string.screen_series_detail_age_all)
}
binding.tvPublishedDate.text = seriesDetailResponse!!.publishedDate
binding.tvPublishedDaysOfWeek.text =
if (seriesDetailResponse!!.publishedDaysOfWeek == "랜덤") {
seriesDetailResponse!!.publishedDaysOfWeek
} else {
seriesDetailResponse!!.publishedDaysOfWeek
}
val publishedDays = if (seriesDetailResponse!!.publishedDaysOfWeek == getString(R.string.day_random)) {
getString(R.string.day_random)
} else {
seriesDetailResponse!!.publishedDaysOfWeek
}
binding.tvPublishedDaysOfWeek.text = getString(
R.string.screen_series_detail_published_days_format,
publishedDays
)
if (seriesDetailResponse!!.writer != null) {
binding.tvWriter.visibility = View.VISIBLE

View File

@@ -5,10 +5,12 @@ import androidx.lifecycle.MutableLiveData
import com.orhanobut.logger.Logger
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.audio_content.series.SeriesRepository
import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.user.UserRepository
import kr.co.vividnext.sodalive.common.SodaLiveApplicationHolder
class SeriesDetailViewModel(
private val repository: SeriesRepository,
@@ -29,6 +31,8 @@ class SeriesDetailViewModel(
var seriesId = 0L
lateinit var seriesDetailResponse: GetSeriesDetailResponse
private val unknownErrorMessage: String
get() = SodaLiveApplicationHolder.get().getString(R.string.common_error_unknown)
fun getSeriesDetail() {
_isLoading.value = true
@@ -46,18 +50,14 @@ class SeriesDetailViewModel(
seriesDetailResponse = it.data
_seriesDetailLiveData.value = seriesDetailResponse
} else {
if (it.message != null) {
_toastLiveData.value = it.message
} else {
_toastLiveData.value = "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
}
_toastLiveData.value = it.message ?: unknownErrorMessage
}
_isLoading.value = false
},
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
_toastLiveData.postValue(unknownErrorMessage)
}
)
)
@@ -84,20 +84,14 @@ class SeriesDetailViewModel(
if (it.success && it.data != null) {
onSuccess()
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
} else {
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
)
}
_toastLiveData.postValue(it.message ?: unknownErrorMessage)
}
_isLoading.value = false
},
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
_toastLiveData.postValue(unknownErrorMessage)
}
)
)

View File

@@ -108,7 +108,7 @@
android:fontFamily="@font/gmarket_sans_medium"
android:paddingHorizontal="5.3dp"
android:paddingVertical="3.3dp"
android:text="전체연령가"
android:text="@string/screen_series_detail_age_all"
android:textColor="@color/color_d2d2d2"
android:textSize="12sp" />
@@ -121,7 +121,7 @@
android:fontFamily="@font/gmarket_sans_medium"
android:paddingHorizontal="5.3dp"
android:paddingVertical="3.3dp"
android:text="19세"
android:text="@string/screen_series_detail_age_19_badge"
android:textColor="@color/color_f1291c"
android:textSize="12sp" />

View File

@@ -20,7 +20,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_bold"
android:text="전체회차 듣기"
android:text="@string/screen_series_content_all_title_default"
android:textColor="@color/color_3bb9f1"
android:textSize="16sp" />

View File

@@ -12,7 +12,7 @@
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="16dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="키워드"
android:text="@string/screen_series_detail_section_keywords"
android:textColor="@color/color_eeeeee"
android:textSize="14.7sp" />
@@ -35,7 +35,7 @@
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="16dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="작품 소개"
android:text="@string/screen_series_detail_section_introduction"
android:textColor="@color/color_eeeeee"
android:textSize="14.7sp" />
@@ -62,7 +62,7 @@
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="16dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="상세정보"
android:text="@string/screen_series_detail_section_info"
android:textColor="@color/color_eeeeee"
android:textSize="14.7sp" />
@@ -82,7 +82,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:text="장르"
android:text="@string/screen_series_detail_label_genre"
android:textColor="@color/color_777777"
android:textSize="14.7sp" />
@@ -91,7 +91,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:fontFamily="@font/gmarket_sans_medium"
android:text="연령제한"
android:text="@string/screen_series_detail_label_age"
android:textColor="@color/color_777777"
android:textSize="14.7sp" />
@@ -101,7 +101,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:fontFamily="@font/gmarket_sans_medium"
android:text="작가"
android:text="@string/screen_series_detail_label_writer"
android:textColor="@color/color_777777"
android:textSize="14.7sp" />
@@ -111,7 +111,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:fontFamily="@font/gmarket_sans_medium"
android:text="제작사"
android:text="@string/screen_series_detail_label_studio"
android:textColor="@color/color_777777"
android:textSize="14.7sp" />
@@ -120,7 +120,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:fontFamily="@font/gmarket_sans_medium"
android:text="연재"
android:text="@string/screen_series_detail_label_published_days"
android:textColor="@color/color_777777"
android:textSize="14.7sp" />
@@ -129,7 +129,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:fontFamily="@font/gmarket_sans_medium"
android:text="출시일"
android:text="@string/screen_series_detail_label_published_date"
android:textColor="@color/color_777777"
android:textSize="14.7sp" />
</LinearLayout>
@@ -207,7 +207,7 @@
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="18.7dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="가격"
android:text="@string/screen_series_detail_section_price"
android:textColor="@color/color_eeeeee"
android:textSize="14.7sp" />
@@ -227,7 +227,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_medium"
android:text="대여"
android:text="@string/screen_series_detail_price_rental_label"
android:textColor="@color/color_777777"
android:textSize="14.7sp" />
@@ -236,7 +236,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:fontFamily="@font/gmarket_sans_medium"
android:text="소장"
android:text="@string/screen_series_detail_price_keep_label"
android:textColor="@color/color_777777"
android:textSize="14.7sp" />
</LinearLayout>

View File

@@ -171,6 +171,30 @@
<string name="screen_series_content_all_title_default">Full episodes</string>
<string name="screen_series_content_sort_newest">Newest</string>
<string name="screen_series_content_sort_oldest">Oldest</string>
<string name="screen_series_detail_tab_home">Home</string>
<string name="screen_series_detail_tab_introduction">About</string>
<string name="screen_series_detail_published_days_format">Serial on %1$s</string>
<string name="screen_series_detail_age_all">All ages</string>
<string name="screen_series_detail_age_19">19+</string>
<string name="screen_series_detail_age_19_badge">19</string>
<string name="screen_series_detail_section_keywords">Keywords</string>
<string name="screen_series_detail_section_introduction">Introduction</string>
<string name="screen_series_detail_section_info">Details</string>
<string name="screen_series_detail_label_genre">Genre</string>
<string name="screen_series_detail_label_age">Age rating</string>
<string name="screen_series_detail_label_writer">Writer</string>
<string name="screen_series_detail_label_studio">Studio</string>
<string name="screen_series_detail_label_published_days">Schedule</string>
<string name="screen_series_detail_label_published_date">Release date</string>
<string name="screen_series_detail_section_price">Price</string>
<string name="screen_series_detail_price_rental_label">Rent</string>
<string name="screen_series_detail_price_keep_label">Own</string>
<string name="screen_series_detail_price_rental_free">Free (5 days)</string>
<string name="screen_series_detail_price_rental_single">%1$d cans (5 days)</string>
<string name="screen_series_detail_price_rental_range">%1$s ~ %2$d cans (5 days)</string>
<string name="screen_series_detail_price_keep_single">%1$d cans</string>
<string name="screen_series_detail_price_keep_range">%1$s ~ %2$d cans</string>
<string name="screen_series_detail_content_count_format">(%1$d)</string>
<string name="screen_series_main_title">All series</string>
<string name="screen_series_main_tab_home">Home</string>
<string name="screen_series_main_tab_day_of_week">By day</string>

View File

@@ -171,6 +171,30 @@
<string name="screen_series_content_all_title_default">全話を聴く</string>
<string name="screen_series_content_sort_newest">最新順</string>
<string name="screen_series_content_sort_oldest">登録順</string>
<string name="screen_series_detail_tab_home">ホーム</string>
<string name="screen_series_detail_tab_introduction">作品紹介</string>
<string name="screen_series_detail_published_days_format">%1$s 連載</string>
<string name="screen_series_detail_age_all">全年齢</string>
<string name="screen_series_detail_age_19">19歳以上</string>
<string name="screen_series_detail_age_19_badge">19歳</string>
<string name="screen_series_detail_section_keywords">キーワード</string>
<string name="screen_series_detail_section_introduction">作品紹介</string>
<string name="screen_series_detail_section_info">詳細情報</string>
<string name="screen_series_detail_label_genre">ジャンル</string>
<string name="screen_series_detail_label_age">年齢制限</string>
<string name="screen_series_detail_label_writer">作家</string>
<string name="screen_series_detail_label_studio">制作会社</string>
<string name="screen_series_detail_label_published_days">連載</string>
<string name="screen_series_detail_label_published_date">リリース日</string>
<string name="screen_series_detail_section_price">価格</string>
<string name="screen_series_detail_price_rental_label">レンタル</string>
<string name="screen_series_detail_price_keep_label">購入</string>
<string name="screen_series_detail_price_rental_free">無料(5日)</string>
<string name="screen_series_detail_price_rental_single">%1$dキャン(5日)</string>
<string name="screen_series_detail_price_rental_range">%1$s ~ %2$dキャン (5日)</string>
<string name="screen_series_detail_price_keep_single">%1$dキャン</string>
<string name="screen_series_detail_price_keep_range">%1$s ~ %2$dキャン</string>
<string name="screen_series_detail_content_count_format">(%1$d)</string>
<string name="screen_series_main_title">シリーズ一覧</string>
<string name="screen_series_main_tab_home">ホーム</string>
<string name="screen_series_main_tab_day_of_week">曜日別</string>

View File

@@ -170,6 +170,30 @@
<string name="screen_series_content_all_title_default">전체회차 듣기</string>
<string name="screen_series_content_sort_newest">최신순</string>
<string name="screen_series_content_sort_oldest">등록순</string>
<string name="screen_series_detail_tab_home"></string>
<string name="screen_series_detail_tab_introduction">작품소개</string>
<string name="screen_series_detail_published_days_format">%1$s 연재</string>
<string name="screen_series_detail_age_all">전체연령가</string>
<string name="screen_series_detail_age_19">19세 이상</string>
<string name="screen_series_detail_age_19_badge">19세</string>
<string name="screen_series_detail_section_keywords">키워드</string>
<string name="screen_series_detail_section_introduction">작품 소개</string>
<string name="screen_series_detail_section_info">상세정보</string>
<string name="screen_series_detail_label_genre">장르</string>
<string name="screen_series_detail_label_age">연령제한</string>
<string name="screen_series_detail_label_writer">작가</string>
<string name="screen_series_detail_label_studio">제작사</string>
<string name="screen_series_detail_label_published_days">연재</string>
<string name="screen_series_detail_label_published_date">출시일</string>
<string name="screen_series_detail_section_price">가격</string>
<string name="screen_series_detail_price_rental_label">대여</string>
<string name="screen_series_detail_price_keep_label">소장</string>
<string name="screen_series_detail_price_rental_free">무료(5일)</string>
<string name="screen_series_detail_price_rental_single">%1$d캔(5일)</string>
<string name="screen_series_detail_price_rental_range">%1$s ~ %2$d캔 (5일)</string>
<string name="screen_series_detail_price_keep_single">%1$d캔</string>
<string name="screen_series_detail_price_keep_range">%1$s ~ %2$d캔</string>
<string name="screen_series_detail_content_count_format">(%1$d)</string>
<string name="screen_series_main_title">시리즈 전체보기</string>
<string name="screen_series_main_tab_home"></string>
<string name="screen_series_main_tab_day_of_week">요일별</string>