ChatRoom 문자열 리소스화

This commit is contained in:
2025-12-01 16:32:53 +09:00
parent 37c1bc06d0
commit ebe5c342c9
11 changed files with 136 additions and 36 deletions

View File

@@ -76,7 +76,7 @@ class ChatBackgroundPickerDialogFragment : DialogFragment() {
private fun setupUi() {
binding.ivClose.setOnClickListener { dismiss() }
binding.tvTitle.text = "배경 사진 선택"
binding.tvTitle.setText(R.string.chat_background_picker_title)
binding.rvGrid.layoutManager = GridLayoutManager(requireContext(), 3)
adapter = BgAdapter { item ->

View File

@@ -583,7 +583,8 @@ class ChatMessageAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
// 접근성: 다국어 대응
val ctx = itemView.context
val messageWord = ctx.getString(R.string.a11y_message_word)
val spokenMain = if (isImageMsg) "이미지" else binding.tvMessage.text
val imageWord = ctx.getString(R.string.a11y_image)
val spokenMain = if (isImageMsg) imageWord else binding.tvMessage.text
itemView.contentDescription = buildString {
if (!isGrouped && !binding.tvName.text.isNullOrEmpty()) {
append(binding.tvName.text)

View File

@@ -104,8 +104,11 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
binding.ivBackgroundProfile.setImageResource(R.drawable.ic_placeholder_profile)
// 배경은 서버 응답 수신 시 적용 (기본은 플레이스홀더 유지)
// 배지는 기본 Clone으로 둔다가 실제 값으로 갱신 (디자인 기본 배경도 clone)
binding.tvCharacterTypeBadge.text = "Clone"
val badge = getString(R.string.chat_character_type_clone)
binding.tvCharacterTypeBadge.text = badge
binding.tvCharacterTypeBadge.setBackgroundResource(R.drawable.bg_character_status_clone)
binding.ivProfile.contentDescription =
getString(R.string.chat_profile_image_content_description, badge)
}
}
@@ -130,14 +133,15 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
// 타입 배지 텍스트 및 배경
val (badgeText, badgeBg) = when (info.characterType) {
CharacterType.CLONE -> "Clone" to R.drawable.bg_character_status_clone
CharacterType.CHARACTER -> "Character" to R.drawable.bg_character_status_character
CharacterType.CLONE -> getString(R.string.chat_character_type_clone) to R.drawable.bg_character_status_clone
CharacterType.CHARACTER -> getString(R.string.chat_character_type_character) to R.drawable.bg_character_status_character
}
binding.tvCharacterTypeBadge.text = badgeText
binding.tvCharacterTypeBadge.setBackgroundResource(badgeBg)
// 접근성
binding.ivProfile.contentDescription = "$badgeText 프로필 이미지"
binding.ivProfile.contentDescription =
getString(R.string.chat_profile_image_content_description, badgeText)
// 5.4: 캐릭터 타입에 맞춰 안내 메시지 텍스트 갱신
updateNoticeText()
@@ -384,7 +388,7 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
// 실패: 타이핑 인디케이터 제거 및 FAILED로 업데이트
chatAdapter.hideTypingIndicator()
updateUserMessageStatus(localId, MessageStatus.FAILED)
showToast(error.message ?: "메시지 전송에 실패했습니다.")
showToast(error.message ?: getString(R.string.chat_send_failed))
})
compositeDisposable.add(disposable)
}
@@ -445,7 +449,7 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
chatAdapter.hideTypingIndicator()
val now = System.currentTimeMillis()
val replyText = "안녕하세요! \"$userContent\"에 대한 답변입니다."
val replyText = getString(R.string.chat_mock_ai_reply, userContent)
val aiMsg = ChatMessage(
messageId = now,
message = replyText,
@@ -473,7 +477,7 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
SharedPreferenceManager.can = newCan
binding.tvCanBadge.text = newCan.moneyFormat()
}, { err ->
showToast(err.message ?: "결제에 실패했습니다.")
showToast(err.message ?: getString(R.string.chat_quota_purchase_failed))
})
)
}
@@ -665,7 +669,7 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
}, { error ->
isLoading = false
// 오프라인/실패 시: 로컬 데이터가 이미 표시되어 있으면 그대로 유지
showToast(error.message ?: "채팅방 데이터를 불러오지 못했습니다.")
showToast(error.message ?: getString(R.string.chat_room_load_failed))
})
compositeDisposable.add(networkDisposable)
}
@@ -776,7 +780,7 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
)
}, { error ->
isLoading = false
showToast(error.message ?: "이전 메시지를 불러오지 못했습니다.")
showToast(error.message ?: getString(R.string.chat_previous_messages_load_failed))
})
compositeDisposable.add(disposable)
@@ -793,15 +797,15 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
if (message.mine || !isLock) return
val priceText = message.price?.toString() ?: "0"
val title = "잠금된 메시지"
val desc = "이 메시지를 ${priceText}캔으로 잠금해제 하시겠습니까?"
val title = getString(R.string.chat_locked_message_title)
val desc = getString(R.string.chat_locked_message_desc, priceText)
SodaDialog(
activity = this,
layoutInflater = this.layoutInflater,
title = title,
desc = desc,
confirmButtonTitle = "잠금해제",
confirmButtonTitle = getString(R.string.chat_locked_message_confirm),
confirmButtonClick = {
val token = "Bearer ${SharedPreferenceManager.token}"
val disposable = chatRepository.purchaseMessage(
@@ -820,11 +824,11 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
chatAdapter.setItems(items)
}
}, { error ->
showToast(error.message ?: "구매에 실패했습니다.")
showToast(error.message ?: getString(R.string.chat_purchase_message_failed))
})
compositeDisposable.add(disposable)
},
cancelButtonTitle = "취소",
cancelButtonTitle = getString(R.string.cancel),
cancelButtonClick = { /* no-op */ }
).show(resources.displayMetrics.widthPixels)
}
@@ -903,19 +907,22 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
}
fun onResetChatRequested() {
val title = "대화 초기화"
val desc = "지금까지의 대화가 모두 초기화 되고 새롭게 대화를 시작합니다."
val title = getString(R.string.chat_reset_title)
val desc = getString(R.string.chat_reset_desc)
SodaDialog(
activity = this,
layoutInflater = this.layoutInflater,
title = title,
desc = desc,
confirmButtonTitle = "30캔으로 초기화",
confirmButtonTitle = getString(
R.string.chat_reset_confirm,
getString(R.string.chat_reset_can_price)
),
confirmButtonClick = {
val loadingDialog = LoadingDialog(this, layoutInflater)
loadingDialog.show(
screenWidth,
"대화 초기화 중..."
getString(R.string.chat_reset_loading)
)
val token = "Bearer ${SharedPreferenceManager.token}"
@@ -933,11 +940,11 @@ class ChatRoomActivity : BaseActivity<ActivityChatRoomBinding>(
startActivity(intent)
finish()
}, { error ->
showToast(error.message ?: "대화 초기화에 실패했어요.")
showToast(error.message ?: getString(R.string.chat_reset_failed))
})
compositeDisposable.add(disposable)
},
cancelButtonTitle = "취소",
cancelButtonTitle = getString(R.string.cancel),
cancelButtonClick = { /* no-op */ }
).show(resources.displayMetrics.widthPixels)
}