From 159a5ae8b398f16e6f6fc569d6e0add14a3826b6 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 1 Dec 2025 15:19:01 +0900 Subject: [PATCH] =?UTF-8?q?=EC=98=A4=EB=94=94=EC=85=98=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=EB=A6=AC=EC=86=8C?= =?UTF-8?q?=EC=8A=A4=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuditionApplicantMediaPlayerManager.kt | 7 +++++- .../applicant/AuditionApplyDialogFragment.kt | 5 ++-- .../audition/detail/AuditionDetailActivity.kt | 18 ++++++++------ .../detail/AuditionDetailRoleAdapter.kt | 4 ++-- .../detail/AuditionDetailViewModel.kt | 14 +++++++---- .../res/layout/activity_audition_detail.xml | 6 ++--- .../res/layout/dialog_application_method.xml | 8 +++---- .../layout/fragment_audition_apply_dialog.xml | 24 +++++++++---------- app/src/main/res/values-en/strings.xml | 20 ++++++++++++++++ app/src/main/res/values-ja/strings.xml | 20 ++++++++++++++++ app/src/main/res/values/strings.xml | 20 ++++++++++++++++ 11 files changed, 110 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audition/applicant/AuditionApplicantMediaPlayerManager.kt b/app/src/main/java/kr/co/vividnext/sodalive/audition/applicant/AuditionApplicantMediaPlayerManager.kt index ce1b75fd..06d06531 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audition/applicant/AuditionApplicantMediaPlayerManager.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audition/applicant/AuditionApplicantMediaPlayerManager.kt @@ -13,6 +13,7 @@ import androidx.media3.common.util.UnstableApi import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerService import java.io.IOException +import kr.co.vividnext.sodalive.R @OptIn(UnstableApi::class) class AuditionApplicantMediaPlayerManager( @@ -101,7 +102,11 @@ class AuditionApplicantMediaPlayerManager( } } catch (e: IOException) { e.printStackTrace() - Toast.makeText(context, "콘텐츠를 재생하지 못했습니다.\n다시 시도해 주세요", Toast.LENGTH_SHORT).show() + Toast.makeText( + context, + context.getString(R.string.screen_audition_play_error), + Toast.LENGTH_SHORT + ).show() showLoadingDialog(false) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audition/applicant/AuditionApplyDialogFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audition/applicant/AuditionApplyDialogFragment.kt index 9acf28a7..d224bf45 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audition/applicant/AuditionApplyDialogFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audition/applicant/AuditionApplyDialogFragment.kt @@ -11,6 +11,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import kr.co.vividnext.sodalive.databinding.FragmentAuditionApplyDialogBinding +import kr.co.vividnext.sodalive.R class AuditionApplyDialogFragment( private val fileName: String, @@ -59,13 +60,13 @@ class AuditionApplyDialogFragment( if (phoneNumber.isBlank() || phoneNumber.length != 11) { Toast.makeText( activity, - "잘못된 연락처 입니다.\n다시 입력해 주세요.", + getString(R.string.dialog_audition_apply_error_invalid_phone), Toast.LENGTH_LONG ).show() } else if (!binding.tvAgree.isSelected) { Toast.makeText( activity, - "연락처 수집 및 활용에 동의하셔야 오디션 지원이 가능합니다.", + getString(R.string.dialog_audition_apply_error_need_agreement), Toast.LENGTH_LONG ).show() } else { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailActivity.kt index 7fdc86ad..30dd8fab 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailActivity.kt @@ -7,8 +7,6 @@ import android.view.View import android.widget.Toast import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import coil.load -import coil.transform.RoundedCornersTransformation import com.bumptech.glide.Glide import com.bumptech.glide.load.MultiTransformation import com.bumptech.glide.load.resource.bitmap.CenterCrop @@ -19,6 +17,7 @@ import kr.co.vividnext.sodalive.audition.role.AuditionRoleDetailActivity import kr.co.vividnext.sodalive.base.BaseActivity import kr.co.vividnext.sodalive.common.Constants import kr.co.vividnext.sodalive.common.LoadingDialog +import kr.co.vividnext.sodalive.common.ToastMessage import kr.co.vividnext.sodalive.databinding.ActivityAuditionDetailBinding import kr.co.vividnext.sodalive.extensions.dpToPx import org.koin.android.ext.android.inject @@ -40,7 +39,7 @@ class AuditionDetailActivity : BaseActivity( if (auditionId <= 0) { Toast.makeText( applicationContext, - "잘못된 요청입니다.\n다시 시도해 주세요.", + getString(R.string.screen_audition_error_invalid_request), Toast.LENGTH_LONG ).show() @@ -60,7 +59,7 @@ class AuditionDetailActivity : BaseActivity( isOpenInformation = !isOpenInformation if (isOpenInformation) { binding.tvInformation.maxLines = Int.MAX_VALUE - binding.tvOpen.text = "접기" + binding.tvOpen.text = getString(R.string.screen_audition_detail_collapse) binding.tvOpen.setCompoundDrawablesWithIntrinsicBounds( R.drawable.ic_live_detail_top, 0, @@ -69,7 +68,7 @@ class AuditionDetailActivity : BaseActivity( ) } else { binding.tvInformation.maxLines = 3 - binding.tvOpen.text = "펼치기" + binding.tvOpen.text = getString(R.string.screen_audition_detail_expand) binding.tvOpen.setCompoundDrawablesWithIntrinsicBounds( R.drawable.ic_live_detail_bottom, 0, @@ -125,8 +124,13 @@ class AuditionDetailActivity : BaseActivity( } private fun bindData() { - viewModel.toastLiveData.observe(this) { - it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() } + viewModel.toastLiveData.observe(this) { toastMessage -> + toastMessage?.let { + val message = it.message ?: it.resId?.let(::getString) + message?.let { text -> + Toast.makeText(applicationContext, text, Toast.LENGTH_LONG).show() + } + } } viewModel.isLoading.observe(this) { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailRoleAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailRoleAdapter.kt index 20d5d413..18af1bae 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailRoleAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailRoleAdapter.kt @@ -60,11 +60,11 @@ class AuditionDetailRoleAdapter( if (item.isComplete) { binding.blackCover.visibility = View.VISIBLE - binding.tvStatus.text = "모집완료" + binding.tvStatus.text = context.getString(R.string.screen_audition_status_closed) binding.tvStatus.setBackgroundResource(R.drawable.bg_round_corner_13_3_909090) } else { binding.blackCover.visibility = View.GONE - binding.tvStatus.text = "모집중" + binding.tvStatus.text = context.getString(R.string.screen_audition_status_open) binding.tvStatus.setBackgroundResource(R.drawable.bg_round_corner_13_3_3bb9f1) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailViewModel.kt index 350f8dbc..c066a9cd 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audition/detail/AuditionDetailViewModel.kt @@ -7,13 +7,15 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers import kr.co.vividnext.sodalive.audition.AuditionRepository import kr.co.vividnext.sodalive.base.BaseViewModel +import kr.co.vividnext.sodalive.common.ToastMessage import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.R class AuditionDetailViewModel( private val repository: AuditionRepository ) : BaseViewModel() { - private val _toastLiveData = MutableLiveData() - val toastLiveData: LiveData + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData get() = _toastLiveData private var _isLoading = MutableLiveData(false) @@ -39,10 +41,10 @@ class AuditionDetailViewModel( _auditionDetailLiveData.value = it.data } else { if (it.message != null) { - _toastLiveData.postValue(it.message) + _toastLiveData.postValue(ToastMessage(message = it.message)) } else { _toastLiveData.postValue( - "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ToastMessage(resId = R.string.common_error_unknown) ) } @@ -56,7 +58,9 @@ class AuditionDetailViewModel( { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue( + ToastMessage(resId = R.string.common_error_unknown) + ) if (onFailure != null) { onFailure() } diff --git a/app/src/main/res/layout/activity_audition_detail.xml b/app/src/main/res/layout/activity_audition_detail.xml index f02cd5a4..641e3d6f 100644 --- a/app/src/main/res/layout/activity_audition_detail.xml +++ b/app/src/main/res/layout/activity_audition_detail.xml @@ -47,7 +47,7 @@ android:layout_height="wrap_content" android:layout_marginTop="15dp" android:fontFamily="@font/gmarket_sans_bold" - android:text="오디션 정보" + android:text="@string/screen_audition_detail_info_title" android:textColor="@color/color_eeeeee" android:textSize="14.7sp" app:layout_constraintEnd_toEndOf="parent" @@ -75,7 +75,7 @@ android:drawablePadding="6.7dp" android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" - android:text="펼치기" + android:text="@string/screen_audition_detail_expand" android:textColor="@color/color_bbbbbb" android:textSize="12sp" app:drawableStartCompat="@drawable/ic_live_detail_bottom" @@ -89,7 +89,7 @@ android:layout_height="wrap_content" android:layout_marginTop="18dp" android:fontFamily="@font/gmarket_sans_bold" - android:text="오디션 캐릭터" + android:text="@string/screen_audition_detail_roles_title" android:textColor="@color/color_eeeeee" android:textSize="14.7sp" /> diff --git a/app/src/main/res/layout/dialog_application_method.xml b/app/src/main/res/layout/dialog_application_method.xml index 52130240..1c653556 100644 --- a/app/src/main/res/layout/dialog_application_method.xml +++ b/app/src/main/res/layout/dialog_application_method.xml @@ -23,7 +23,7 @@ android:layout_marginTop="33.3dp" android:fontFamily="@font/gmarket_sans_bold" android:gravity="center" - android:text="오디션 지원방식" + android:text="@string/dialog_audition_method_title" android:textColor="@color/color_bbbbbb" android:textSize="18.3sp" app:layout_constraintEnd_toEndOf="parent" @@ -60,7 +60,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/gmarket_sans_medium" - android:text="파일 업로드" + android:text="@string/dialog_audition_method_upload" android:textColor="@color/color_3bb9f1" android:textSize="14.7sp" /> @@ -86,7 +86,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/gmarket_sans_medium" - android:text="바로 녹음" + android:text="@string/dialog_audition_method_record" android:textColor="@color/color_3bb9f1" android:textSize="14.7sp" /> @@ -97,7 +97,7 @@ android:layout_height="wrap_content" android:layout_marginTop="13.3dp" android:fontFamily="@font/gmarket_sans_medium" - android:text="※ 파일은 mp3, aac만 업로드 가능" + android:text="@string/dialog_audition_method_note" android:textColor="@color/color_777777" android:textSize="12sp" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/fragment_audition_apply_dialog.xml b/app/src/main/res/layout/fragment_audition_apply_dialog.xml index ff147bb3..e232a6fb 100644 --- a/app/src/main/res/layout/fragment_audition_apply_dialog.xml +++ b/app/src/main/res/layout/fragment_audition_apply_dialog.xml @@ -21,7 +21,7 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:fontFamily="@font/gmarket_sans_medium" - android:text="오디션 지원" + android:text="@string/dialog_audition_apply_title" android:textColor="@color/white" android:textSize="18.3sp" /> @@ -39,7 +39,7 @@ android:layout_height="wrap_content" android:layout_marginTop="20dp" android:fontFamily="@font/gmarket_sans_bold" - android:text="녹음파일" + android:text="@string/dialog_audition_apply_audio_file_title" android:textColor="@color/color_eeeeee" android:textSize="16.7sp" /> @@ -72,7 +72,7 @@ android:layout_height="wrap_content" android:layout_marginTop="15dp" android:fontFamily="@font/gmarket_sans_bold" - android:text="연락처" + android:text="@string/dialog_audition_apply_phone_title" android:textColor="@color/color_eeeeee" android:textSize="16.7sp" /> @@ -83,7 +83,7 @@ android:layout_marginTop="10dp" android:background="@drawable/bg_round_corner_5_3_13181b" android:fontFamily="@font/gmarket_sans_medium" - android:hint="합격시 연락받을 연락처를 남겨주세요" + android:hint="@string/dialog_audition_apply_phone_hint" android:importantForAutofill="no" android:inputType="numberSigned" android:maxEms="12" @@ -113,13 +113,13 @@ + android:layout_height="wrap_content" + android:layout_marginStart="13.3dp" + android:fontFamily="@font/gmarket_sans_medium" + android:lineSpacingMultiplier="1.25" + android:text="@string/dialog_audition_apply_agreement" + android:textColor="@color/color_eeeeee" + android:textSize="13.3sp" /> diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index d1faf75a..9f4f5af9 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -192,6 +192,26 @@ Total %1$d How to use VoiceOn audition See details> + Invalid request.\nPlease try again. + Audition info + Audition roles + Expand + Collapse + Open + Closed + How to apply + Upload file + Record now + ※ Only mp3 or aac files can be uploaded + Apply for audition + Recording file + Contact + Leave a contact number for results + I agree to the collection and use of my personal contact information for notification if I pass the VoiceOn audio drama audition.\nYou may refuse to consent, but the audition application will be canceled if you do not agree. + Submit audition application + Invalid contact number.\nPlease try again. + You must agree to the collection and use of contact information to apply for the audition. + Could not play the content.\nPlease try again. Settings diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index b6f310a7..9c2ab124 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -192,6 +192,26 @@ 合計 %1$d件 ボイスオンオーディションの利用方法 詳しく> + 不正なリクエストです。\nもう一度お試しください。 + オーディション情報 + オーディションキャラクター + 展開 + 閉じる + 募集中 + 募集終了 + オーディション応募方法 + ファイルアップロード + すぐ録音 + ※ファイルはmp3, aacのみアップロード可能 + オーディション応募 + 録音ファイル + 連絡先 + 合格時に連絡を受ける電話番号を入力してください + ボイスオンオーディオドラマオーディション合格時の連絡のため、連絡先の収集・利用に同意します。\nオーディション応募者は同意を拒否する権利がありますが、同意しない場合応募はキャンセルされます。 + オーディションに応募する + 正しくない連絡先です。\nもう一度入力してください。 + 連絡先の収集および利用に同意する必要があります。 + コンテンツを再生できませんでした。\nもう一度お試しください 設定 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f4f429f2..36687e49 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -191,6 +191,26 @@ 총 %1$d개 보이스온 오디션 이용방법 자세히> + 잘못된 요청입니다.\n다시 시도해 주세요. + 오디션 정보 + 오디션 캐릭터 + 펼치기 + 접기 + 모집중 + 모집완료 + 오디션 지원방식 + 파일 업로드 + 바로 녹음 + ※ 파일은 mp3, aac만 업로드 가능 + 오디션 지원 + 녹음파일 + 연락처 + 합격 시 연락받을 연락처를 남겨주세요 + 보이스온 오디오 드라마 오디션 합격 시 개인 연락을 위한 개인 정보(연락처) 수집 및 활용에 동의합니다.\n오디션 지원자는 개인정보 수집 및 활용 동의에 거부할 권리가 있으며 비동의 시 오디션 지원은 취소됩니다. + 오디션 지원하기 + 잘못된 연락처 입니다.\n다시 입력해 주세요. + 연락처 수집 및 활용에 동의하셔야 오디션 지원이 가능합니다. + 콘텐츠를 재생하지 못했습니다.\n다시 시도해 주세요 설정