diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentActivity.kt index ebdf617c..50c30d24 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentActivity.kt @@ -38,6 +38,7 @@ class AudioContentActivity : BaseActivity( private var userId: Long = 0 private lateinit var activityResultLauncher: ActivityResultLauncher + private val allCategoryLabel by lazy { getString(R.string.audio_content_label_all) } override fun onCreate(savedInstanceState: Bundle?) { userId = intent.getLongExtra(Constants.EXTRA_USER_ID, 0) @@ -53,7 +54,11 @@ class AudioContentActivity : BaseActivity( super.onCreate(savedInstanceState) if (userId <= 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() } @@ -64,7 +69,7 @@ class AudioContentActivity : BaseActivity( override fun setupView() { loadingDialog = LoadingDialog(this, layoutInflater) - binding.toolbar.tvBack.text = "콘텐츠 전체보기" + binding.toolbar.tvBack.text = getString(R.string.screen_audio_content_title) binding.toolbar.tvBack.setOnClickListener { finish() } audioContentAdapter = AudioContentAdapter { @@ -75,7 +80,9 @@ class AudioContentActivity : BaseActivity( activityResultLauncher.launch(intent) } - categoryAdapter = AudioContentCategoryAdapter { + categoryAdapter = AudioContentCategoryAdapter( + allCategoryLabel = allCategoryLabel + ) { viewModel.selectCategory(it, userId = userId) } @@ -259,7 +266,7 @@ class AudioContentActivity : BaseActivity( if (it.isNotEmpty()) { binding.rvCategory.visibility = View.VISIBLE val items = it as MutableList - items.add(0, GetCategoryListResponse(0, "전체")) + items.add(0, GetCategoryListResponse(0, allCategoryLabel)) categoryAdapter.addItems(items = items) } else { binding.rvCategory.visibility = View.GONE diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentAdapter.kt index 9c33e651..81a84f1c 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentAdapter.kt @@ -66,7 +66,8 @@ class AudioContentAdapter( } else { binding.tvPrice.visibility = View.VISIBLE if (item.price < 1) { - binding.tvPrice.text = "무료" + binding.tvPrice.text = + binding.root.context.getString(R.string.audio_content_price_free) binding.tvPrice.setCompoundDrawables(null, null, null, null) } else { binding.tvPrice.text = item.price.moneyFormat() diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentViewModel.kt index 082fea3c..7ebd406d 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentViewModel.kt @@ -6,9 +6,11 @@ import com.google.gson.annotations.SerializedName 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.category.GetCategoryListResponse import kr.co.vividnext.sodalive.base.BaseViewModel import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.common.SodaLiveApplicationHolder import kr.co.vividnext.sodalive.explorer.profile.GetAudioContentListResponse class AudioContentViewModel(private val repository: AudioContentRepository) : BaseViewModel() { @@ -80,7 +82,8 @@ class AudioContentViewModel(private val repository: AudioContentRepository) : Ba _toastLiveData.postValue(it.message) } else { _toastLiveData.postValue( - "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + SodaLiveApplicationHolder.get() + .getString(R.string.common_error_unknown) ) } @@ -94,7 +97,10 @@ class AudioContentViewModel(private val repository: AudioContentRepository) : Ba { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + SodaLiveApplicationHolder.get() + .getString(R.string.common_error_unknown) + ) if (onFailure != null) { onFailure() } @@ -134,7 +140,8 @@ class AudioContentViewModel(private val repository: AudioContentRepository) : Ba _toastLiveData.postValue(it.message) } else { _toastLiveData.postValue( - "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + SodaLiveApplicationHolder.get() + .getString(R.string.common_error_unknown) ) } } @@ -144,7 +151,10 @@ class AudioContentViewModel(private val repository: AudioContentRepository) : Ba { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + SodaLiveApplicationHolder.get() + .getString(R.string.common_error_unknown) + ) } ) ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllActivity.kt index b8a3dfce..00ca6e9b 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllActivity.kt @@ -57,9 +57,9 @@ class AudioContentAllActivity : BaseActivity( override fun setupView() { loadingDialog = LoadingDialog(this, layoutInflater) binding.toolbar.tvBack.text = when { - isPointOnly -> "포인트 대여 전체" - isFree -> "무료 콘텐츠 전체" - else -> "콘텐츠 전체보기" + isPointOnly -> getString(R.string.screen_audio_content_all_title_point_only) + isFree -> getString(R.string.screen_audio_content_all_title_free) + else -> getString(R.string.screen_audio_content_title) } binding.toolbar.tvBack.setOnClickListener { finish() } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllViewModel.kt index bff846eb..990eb924 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentAllViewModel.kt @@ -5,9 +5,11 @@ 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.AudioContentRepository import kr.co.vividnext.sodalive.audio_content.AudioContentViewModel import kr.co.vividnext.sodalive.base.BaseViewModel +import kr.co.vividnext.sodalive.common.SodaLiveApplicationHolder import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.home.AudioContentMainItem @@ -46,6 +48,7 @@ class AudioContentAllViewModel( isFree: Boolean? = null, isPointAvailableOnly: Boolean? = null ) { + val unknownError = SodaLiveApplicationHolder.get().getString(R.string.common_error_unknown) compositeDisposable.add( repository.getAudioContentActiveThemeList( isFree = isFree, @@ -60,22 +63,20 @@ class AudioContentAllViewModel( _themeListLiveData.postValue(it.data) } else { if (it.message != null) { - _toastLiveData.postValue(it.message) - } else { - _toastLiveData.postValue( - "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." - ) - } + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue(unknownError) } - - _isLoading.value = false - }, - { - _isLoading.value = false - it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") } - ) + + _isLoading.value = false + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue(unknownError) + } + ) ) } @@ -85,6 +86,7 @@ class AudioContentAllViewModel( ) { if (_isLoading.value == true || isLast) return _isLoading.value = true + val unknownError = SodaLiveApplicationHolder.get().getString(R.string.common_error_unknown) compositeDisposable.add( repository.getAllAudioContents( @@ -110,7 +112,7 @@ class AudioContentAllViewModel( _isLoading.value = false }, { t -> _isLoading.value = false - _toastLiveData.postValue(t.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(t.message ?: unknownError) }) ) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/category/AudioContentCategoryAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/category/AudioContentCategoryAdapter.kt index 22f21f3b..848a46d0 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/category/AudioContentCategoryAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/category/AudioContentCategoryAdapter.kt @@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.databinding.ItemContentCategoryBinding class AudioContentCategoryAdapter( + private val allCategoryLabel: String, private val onClick: (Long) -> Unit ) : RecyclerView.Adapter() { @@ -24,7 +25,7 @@ class AudioContentCategoryAdapter( fun bind(item: GetCategoryListResponse) { if ( item.category == selectedCategory || - (selectedCategory == "" && item.category == "전체") + (selectedCategory.isEmpty() && item.category == allCategoryLabel) ) { binding.tvCategory.setBackgroundResource( R.drawable.bg_round_corner_16_7_transparent_3bb9f1 diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/AudioContentPlaylistListAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/AudioContentPlaylistListAdapter.kt index 08cbdd57..eed32400 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/AudioContentPlaylistListAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/AudioContentPlaylistListAdapter.kt @@ -7,9 +7,9 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import coil.load import coil.transform.RoundedCornersTransformation -import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.databinding.ItemPlaylistListBinding import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.R class AudioContentPlaylistListAdapter( private val onClickItem: (Long) -> Unit @@ -20,7 +20,6 @@ class AudioContentPlaylistListAdapter( inner class ViewHolder( private val binding: ItemPlaylistListBinding ) : RecyclerView.ViewHolder(binding.root) { - @SuppressLint("SetTextI18n") fun bind(item: GetPlaylistsItem) { binding.ivCover.load(item.coverImageUrl) { crossfade(true) @@ -29,7 +28,10 @@ class AudioContentPlaylistListAdapter( } binding.tvTitle.text = item.title - binding.tvContentCount.text = "총 ${item.contentCount}개" + binding.tvContentCount.text = binding.root.context.getString( + R.string.audio_content_playlist_content_count, + item.contentCount + ) if (item.desc.isNotBlank()) { binding.tvDesc.text = item.desc diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/AudioContentPlaylistListFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/AudioContentPlaylistListFragment.kt index e367b8ce..9ca3c8ab 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/AudioContentPlaylistListFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/AudioContentPlaylistListFragment.kt @@ -1,14 +1,16 @@ package kr.co.vividnext.sodalive.audio_content.playlist -import android.annotation.SuppressLint import android.content.Intent import android.graphics.Rect import android.os.Bundle import android.view.View import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.OptIn import androidx.appcompat.app.AppCompatActivity.RESULT_OK +import androidx.media3.common.util.UnstableApi import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.audio_content.playlist.create.AudioContentPlaylistCreateActivity import kr.co.vividnext.sodalive.audio_content.playlist.detail.AudioContentPlaylistDetailActivity import kr.co.vividnext.sodalive.base.BaseFragment @@ -43,6 +45,7 @@ class AudioContentPlaylistListFragment : BaseFragment @@ -107,7 +110,6 @@ class AudioContentPlaylistListFragment : BaseFragment Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + SodaLiveApplicationHolder.get() + .getString(R.string.common_error_unknown) + ) } ) ) diff --git a/app/src/main/res/layout/activity_audio_content.xml b/app/src/main/res/layout/activity_audio_content.xml index fd4c5ae4..904c3157 100644 --- a/app/src/main/res/layout/activity_audio_content.xml +++ b/app/src/main/res/layout/activity_audio_content.xml @@ -28,7 +28,7 @@ android:fontFamily="@font/gmarket_sans_bold" android:gravity="center" android:paddingVertical="17dp" - android:text="새로운 콘텐츠 등록하기" + android:text="@string/screen_audio_content_new_content" android:textColor="@color/white" android:textSize="14.7sp" android:visibility="gone" /> @@ -49,7 +49,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" - android:text="최신순" + android:text="@string/screen_audio_content_sort_newest" android:textColor="@color/color_88e2e2e2" android:textSize="13.3sp" /> @@ -60,7 +60,7 @@ android:layout_marginHorizontal="13.3dp" android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" - android:text="높은 가격순" + android:text="@string/screen_audio_content_sort_price_high" android:textColor="@color/color_88e2e2e2" android:textSize="13.3sp" /> @@ -70,7 +70,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" - android:text="낮은 가격순" + android:text="@string/screen_audio_content_sort_price_low" android:textColor="@color/color_88e2e2e2" android:textSize="13.3sp" /> @@ -88,7 +88,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" - android:text="전체" + android:text="@string/audio_content_label_all" android:textColor="@color/color_e2e2e2" android:textSize="13.3sp" /> @@ -109,7 +109,7 @@ android:layout_marginStart="2dp" android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" - android:text="개" + android:text="@string/audio_content_total_unit" android:textColor="@color/color_e2e2e2" android:textSize="13.3sp" /> diff --git a/app/src/main/res/layout/activity_audio_content_all.xml b/app/src/main/res/layout/activity_audio_content_all.xml index 22339a11..03799c97 100644 --- a/app/src/main/res/layout/activity_audio_content_all.xml +++ b/app/src/main/res/layout/activity_audio_content_all.xml @@ -32,7 +32,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/pretendard_medium" android:gravity="center" - android:text="최신순" + android:text="@string/screen_audio_content_sort_newest" android:textColor="@color/color_88e2e2e2" android:textSize="16sp" /> @@ -43,7 +43,7 @@ android:layout_marginStart="12dp" android:fontFamily="@font/pretendard_medium" android:gravity="center" - android:text="인기순" + android:text="@string/screen_audio_content_sort_popularity" android:textColor="@color/color_88e2e2e2" android:textSize="16sp" /> @@ -67,7 +67,7 @@ diff --git a/app/src/main/res/layout/fragment_audio_content_playlist_list.xml b/app/src/main/res/layout/fragment_audio_content_playlist_list.xml index 7b85c3db..50765a8b 100644 --- a/app/src/main/res/layout/fragment_audio_content_playlist_list.xml +++ b/app/src/main/res/layout/fragment_audio_content_playlist_list.xml @@ -16,7 +16,7 @@ android:fontFamily="@font/gmarket_sans_bold" android:gravity="center" android:paddingVertical="13.3dp" - android:text="+ 새 재생목록 만들기" + android:text="@string/audio_content_playlist_create" android:textColor="@color/white" android:textSize="14.7sp" app:layout_constraintEnd_toEndOf="parent" @@ -38,7 +38,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/gmarket_sans_medium" - android:text="전체" + android:text="@string/audio_content_label_all" android:textColor="@color/white" android:textSize="14.7sp" /> @@ -82,7 +82,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/gmarket_sans_bold" - android:text="재생목록이 비어있습니다." + android:text="@string/audio_content_playlist_empty_title" android:textColor="@color/color_eeeeee" android:textSize="14.7sp" /> @@ -92,7 +92,7 @@ android:layout_marginTop="13.3dp" android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" - android:text="자주 듣는 콘텐츠를\n재생목록으로 만들어 보세요." + android:text="@string/audio_content_playlist_empty_desc" android:textColor="@color/color_bbbbbb" android:textSize="11sp" /> diff --git a/app/src/main/res/layout/item_audio_content.xml b/app/src/main/res/layout/item_audio_content.xml index 25a2f0e3..abf31043 100644 --- a/app/src/main/res/layout/item_audio_content.xml +++ b/app/src/main/res/layout/item_audio_content.xml @@ -36,7 +36,7 @@ android:background="@drawable/bg_round_corner_2_6_003851" android:fontFamily="@font/gmarket_sans_medium" android:padding="2.6dp" - android:text="오픈예정" + android:text="@string/audio_content_badge_scheduled" android:textColor="@color/color_3bb9f1" android:textSize="8sp" android:visibility="gone" @@ -78,7 +78,7 @@ android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" android:padding="2.6dp" - android:text="포인트" + android:text="@string/audio_content_badge_point" android:textColor="@color/white" android:textSize="8sp" android:visibility="gone" @@ -196,7 +196,7 @@ android:fontFamily="@font/gmarket_sans_medium" android:paddingHorizontal="5.3dp" android:paddingVertical="2.7dp" - android:text="소장중" + android:text="@string/audio_content_badge_owned" android:textColor="@color/color_111111" android:textSize="13.3sp" android:visibility="gone" /> @@ -209,7 +209,7 @@ android:fontFamily="@font/gmarket_sans_medium" android:paddingHorizontal="5.3dp" android:paddingVertical="2.7dp" - android:text="대여중" + android:text="@string/audio_content_badge_rented" android:textColor="@color/white" android:textSize="13.3sp" android:visibility="gone" /> @@ -222,7 +222,7 @@ android:fontFamily="@font/gmarket_sans_medium" android:paddingHorizontal="5.3dp" android:paddingVertical="3.3dp" - android:text="Sold Out" + android:text="@string/audio_content_badge_sold_out" android:textColor="@color/color_d2d2d2" android:textSize="12sp" android:visibility="gone" /> diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index c5d216ca..da067e2f 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -831,6 +831,31 @@ Delete account Please select a reason for deleting your account. + + View all content + All free content + All point rentals + Invalid request. + Add new content + Newest + Price: High to Low + Price: Low to High + Popularity + No content to display. + All + items + Free + Coming soon + Points + Owned + Rented + Sold Out + + Create new playlist + %1$d items + Total %1$d items + No playlists yet. + Create a playlist with your favorite content. + hh:mm MMM d diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f356864f..43bc1810 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -831,6 +831,31 @@ 退会する 退会理由を選択してください。 + + コンテンツをすべて見る + すべての無料コンテンツ + ポイントレンタル一覧 + 無効なリクエストです。 + 新しいコンテンツを登録 + 最新順 + 価格が高い順 + 価格が低い順 + 人気順 + 表示できるコンテンツがありません。 + すべて + + 無料 + オープン予定 + ポイント + 所持中 + レンタル中 + 売り切れ + + 新しいプレイリストを作成 + %1$d件 + 合計 %1$d件 + プレイリストが空です。 + よく聴くコンテンツで\nプレイリストを作成してください。 + hh:mm M月 d日 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5c239b7b..b29ad684 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -830,6 +830,31 @@ 탈퇴하기 계정을 삭제하려는 이유를 선택해 주세요. + + 콘텐츠 전체보기 + 무료 콘텐츠 전체 + 포인트 대여 전체 + 잘못된 요청입니다. + 새로운 콘텐츠 등록하기 + 최신순 + 높은 가격순 + 낮은 가격순 + 인기순 + 표시할 콘텐츠가 없습니다. + 전체 + + 무료 + 오픈예정 + 포인트 + 소장중 + 대여중 + Sold Out + + 새 재생목록 만들기 + %1$d개 + 총 %1$d개 + 재생목록이 비어있습니다. + 자주 듣는 콘텐츠를\n재생목록으로 만들어 보세요. + hh:mm MM월 dd일