diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentListFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentListFragment.kt index 36fdeafa..a9d53353 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentListFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentListFragment.kt @@ -17,6 +17,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.LoadingDialog +import kr.co.vividnext.sodalive.common.UiText import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.FragmentCharacterCommentListBinding import kr.co.vividnext.sodalive.extensions.dpToPx @@ -173,8 +174,7 @@ class CharacterCommentListFragment : BaseFragment - - msg?.let { showToast(it) } + msg?.let { showToast(it.asString(requireContext())) } } viewModel.totalCommentCount.observe(viewLifecycleOwner) { count -> diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentListViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentListViewModel.kt index 5a50d24f..d5d2b6e9 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentListViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentListViewModel.kt @@ -6,14 +6,16 @@ import com.orhanobut.logger.Logger import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers import kr.co.vividnext.sodalive.base.BaseViewModel +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.common.UiText import kr.co.vividnext.sodalive.common.SharedPreferenceManager class CharacterCommentListViewModel( private val repository: CharacterCommentRepository ) : BaseViewModel() { - private val _toastLiveData = MutableLiveData() - val toastLiveData: LiveData + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData get() = _toastLiveData private val _isLoading = MutableLiveData(false) @@ -80,14 +82,16 @@ class CharacterCommentListViewModel( // 응답 아이템 전달 (비어있어도 전달) — UI는 addAll 처리 _commentList.postValue(items) } else { - val message = resp.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + val message = resp.message?.takeIf { it.isNotBlank() } + ?.let { UiText.DynamicString(it) } + ?: UiText.StringResource(R.string.common_error_unknown) _toastLiveData.postValue(message) onFailure?.invoke() } }, { e -> _isLoading.value = false Logger.e(e, "Character comments load failed") - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(UiText.StringResource(R.string.common_error_unknown)) onFailure?.invoke() }) ) @@ -95,7 +99,7 @@ class CharacterCommentListViewModel( fun createComment(characterId: Long, comment: String) { if (comment.isBlank()) { - _toastLiveData.postValue("내용을 입력하세요") + _toastLiveData.postValue(UiText.StringResource(R.string.character_comment_error_empty)) return } if (_isLoading.value == true) return @@ -119,13 +123,15 @@ class CharacterCommentListViewModel( cursor = null getCommentList(characterId) } else { - val message = resp.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + val message = resp.message?.takeIf { it.isNotBlank() } + ?.let { UiText.DynamicString(it) } + ?: UiText.StringResource(R.string.common_error_unknown) _toastLiveData.postValue(message) } }, { e -> _isLoading.value = false Logger.e(e, "Character comment create failed") - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(UiText.StringResource(R.string.common_error_unknown)) }) ) } @@ -151,20 +157,24 @@ class CharacterCommentListViewModel( cursor = null getCommentList(characterId) } else { - val message = resp.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + val message = resp.message?.takeIf { it.isNotBlank() } + ?.let { UiText.DynamicString(it) } + ?: UiText.StringResource(R.string.common_error_unknown) _toastLiveData.postValue(message) } }, { e -> _isLoading.value = false Logger.e(e, "Character comment delete failed") - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(UiText.StringResource(R.string.common_error_unknown)) }) ) } fun reportComment(characterId: Long, commentId: Long, reason: String) { if (reason.isBlank()) { - _toastLiveData.postValue("신고 사유를 입력하세요") + _toastLiveData.postValue( + UiText.StringResource(R.string.character_comment_error_report_reason) + ) return } if (_isLoading.value == true) return @@ -182,15 +192,19 @@ class CharacterCommentListViewModel( .subscribe({ resp -> _isLoading.value = false if (resp.success) { - _toastLiveData.postValue("신고가 접수되었습니다.") + _toastLiveData.postValue( + UiText.StringResource(R.string.character_comment_report_submitted) + ) } else { - val message = resp.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + val message = resp.message?.takeIf { it.isNotBlank() } + ?.let { UiText.DynamicString(it) } + ?: UiText.StringResource(R.string.common_error_unknown) _toastLiveData.postValue(message) } }, { e -> _isLoading.value = false Logger.e(e, "Character comment report failed") - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(UiText.StringResource(R.string.common_error_unknown)) }) ) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyAdapter.kt index 8507b3c4..35e3d105 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyAdapter.kt @@ -60,6 +60,7 @@ class CharacterReplyHeaderVH( ) : CharacterReplyVH(binding) { override fun bind(item: Any) { val data = item as CharacterCommentResponse + val context = binding.root.context if (data.memberProfileImage.isNotBlank()) { binding.ivCommentProfile.load(data.memberProfileImage) { crossfade(true) @@ -71,7 +72,7 @@ class CharacterReplyHeaderVH( binding.ivCommentProfile.setImageResource(R.drawable.ic_placeholder_profile) } binding.tvCommentNickname.text = data.memberNickname - binding.tvCommentDate.text = timeAgo(data.createdAt) + binding.tvCommentDate.text = formatCommentTime(context, data.createdAt) binding.tvComment.text = data.comment binding.tvWriteReply.visibility = View.GONE binding.ivMenu.visibility = View.GONE @@ -86,6 +87,7 @@ class CharacterReplyItemVH( override fun bind(item: Any) { val data = item as CharacterReplyResponse + val context = binding.root.context if (data.memberProfileImage.isNotBlank()) { binding.ivCommentProfile.load(data.memberProfileImage) { crossfade(true) @@ -98,7 +100,7 @@ class CharacterReplyItemVH( } binding.tvCommentNickname.text = data.memberNickname - binding.tvCommentDate.text = timeAgo(data.createdAt) + binding.tvCommentDate.text = formatCommentTime(context, data.createdAt) binding.tvComment.text = data.comment val isOwner = data.memberId == currentUserId @@ -109,17 +111,3 @@ class CharacterReplyItemVH( } } } - -private fun timeAgo(createdAtMillis: Long): String { - val now = System.currentTimeMillis() - val diff = (now - createdAtMillis).coerceAtLeast(0) - val minutes = diff / 60_000 - if (minutes < 1) return "방금전" - if (minutes < 60) return "${minutes}분전" - val hours = minutes / 60 - if (hours < 24) return "${hours}시간전" - val days = hours / 24 - if (days < 365) return "${days}일전" - val years = days / 365 - return "${years}년전" -} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyFragment.kt index afbccabb..11054887 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyFragment.kt @@ -15,6 +15,7 @@ import coil.transform.CircleCropTransformation import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.LoadingDialog +import kr.co.vividnext.sodalive.common.UiText import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.FragmentCharacterCommentReplyBinding import kr.co.vividnext.sodalive.extensions.dpToPx @@ -179,7 +180,7 @@ class CharacterCommentReplyFragment : BaseFragment - msg?.let { showToast(it) } + msg?.let { showToast(it.asString(requireContext())) } } viewModel.replies.observe(viewLifecycleOwner) { list -> // 헤더(원본 댓글)는 index 0에 유지, 나머지를 교체 diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyViewModel.kt index 782db391..7dfef1fa 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReplyViewModel.kt @@ -6,14 +6,16 @@ import com.orhanobut.logger.Logger import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers import kr.co.vividnext.sodalive.base.BaseViewModel +import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.common.UiText class CharacterCommentReplyViewModel( private val repository: CharacterCommentRepository ) : BaseViewModel() { - private val _toastLiveData = MutableLiveData() - val toastLiveData: LiveData get() = _toastLiveData + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData get() = _toastLiveData private val _isLoading = MutableLiveData(false) val isLoading: LiveData get() = _isLoading @@ -65,20 +67,22 @@ class CharacterCommentReplyViewModel( cursor = resp.data.cursor page += 1 } else { - val message = resp.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + val message = resp.message?.takeIf { it.isNotBlank() } + ?.let { UiText.DynamicString(it) } + ?: UiText.StringResource(R.string.common_error_unknown) _toastLiveData.postValue(message) } }, { e -> _isLoading.value = false Logger.e(e, "Character replies load failed") - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(UiText.StringResource(R.string.common_error_unknown)) }) ) } fun createReply(characterId: Long, comment: String) { if (comment.isBlank()) { - _toastLiveData.postValue("내용을 입력하세요") + _toastLiveData.postValue(UiText.StringResource(R.string.character_comment_error_empty)) return } val originalId = _original.value?.commentId ?: return @@ -110,13 +114,15 @@ class CharacterCommentReplyViewModel( val current = _replies.value ?: emptyList() _replies.postValue(current + listOf(me)) } else { - val message = resp.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + val message = resp.message?.takeIf { it.isNotBlank() } + ?.let { UiText.DynamicString(it) } + ?: UiText.StringResource(R.string.common_error_unknown) _toastLiveData.postValue(message) } }, { e -> _isLoading.value = false Logger.e(e, "Character reply create failed") - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(UiText.StringResource(R.string.common_error_unknown)) }) ) } @@ -139,20 +145,24 @@ class CharacterCommentReplyViewModel( val current = _replies.value ?: emptyList() _replies.postValue(current.filterNot { it.replyId == replyId }) } else { - val message = resp.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + val message = resp.message?.takeIf { it.isNotBlank() } + ?.let { UiText.DynamicString(it) } + ?: UiText.StringResource(R.string.common_error_unknown) _toastLiveData.postValue(message) } }, { e -> _isLoading.value = false Logger.e(e, "Character reply delete failed") - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(UiText.StringResource(R.string.common_error_unknown)) }) ) } fun reportReply(characterId: Long, replyId: Long, reason: String) { if (reason.isBlank()) { - _toastLiveData.postValue("신고 사유를 입력하세요") + _toastLiveData.postValue( + UiText.StringResource(R.string.character_comment_error_report_reason) + ) return } if (_isLoading.value == true) return @@ -170,15 +180,19 @@ class CharacterCommentReplyViewModel( .subscribe({ resp -> _isLoading.value = false if (resp.success) { - _toastLiveData.postValue("신고가 접수되었습니다.") + _toastLiveData.postValue( + UiText.StringResource(R.string.character_comment_report_submitted) + ) } else { - val message = resp.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + val message = resp.message?.takeIf { it.isNotBlank() } + ?.let { UiText.DynamicString(it) } + ?: UiText.StringResource(R.string.common_error_unknown) _toastLiveData.postValue(message) } }, { e -> _isLoading.value = false Logger.e(e, "Character reply report failed") - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + _toastLiveData.postValue(UiText.StringResource(R.string.common_error_unknown)) }) ) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReportBottomSheet.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReportBottomSheet.kt index a9f02528..262bb1a1 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReportBottomSheet.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentReportBottomSheet.kt @@ -27,12 +27,14 @@ class CharacterCommentReportBottomSheet : BottomSheetDialogFragment() { var onSubmit: ((String) -> Unit)? = null - private var reasons: ArrayList? = null + private var reasons: ArrayList = ArrayList() private var selectedIndex: Int = -1 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - reasons = arguments?.getStringArrayList(ARG_REASONS) ?: DEFAULT_REASONS + val defaultReasons = resources.getStringArray(R.array.character_comment_report_reasons) + .toCollection(ArrayList()) + reasons = arguments?.getStringArrayList(ARG_REASONS) ?: defaultReasons } override fun onCreateView( @@ -49,7 +51,7 @@ class CharacterCommentReportBottomSheet : BottomSheetDialogFragment() { tvTitle.text = getString(R.string.report_title) setReportEnabled(btnReport, false) - val items = reasons ?: DEFAULT_REASONS + val items = reasons val textColor = ContextCompat.getColor(requireContext(), R.color.white) // RadioButton 동적 생성 및 단일 선택 처리 @@ -65,7 +67,8 @@ class CharacterCommentReportBottomSheet : BottomSheetDialogFragment() { // 폰트: pretendard_regular try { typeface = ResourcesCompat.getFont(context, R.font.pretendard_regular) - } catch (_: Exception) { /* 폰트 미존재 대비 안전 처리 */ } + } catch (_: Exception) { /* 폰트 미존재 대비 안전 처리 */ + } // 항목 간 간격: 기존 paddingVertical 12dp의 1.3배 -> 15.6dp val vPadPx = (14f * resources.displayMetrics.density).toInt() setPadding(paddingLeft, vPadPx, paddingRight, vPadPx) @@ -106,16 +109,6 @@ class CharacterCommentReportBottomSheet : BottomSheetDialogFragment() { companion object { private const val ARG_REASONS = "arg_reasons" - private val DEFAULT_REASONS = arrayListOf( - "원치 않는 상업성 콘텐츠 또는 스팸", - "아동 학대", - "증오시 표현 또는 노골적인 폭력", - "테러 조장", - "희롱 또는 괴롭힘", - "자살 또는 자해", - "잘못된 정보" - ) - fun newInstance(reasons: ArrayList? = null): CharacterCommentReportBottomSheet { return CharacterCommentReportBottomSheet().apply { arguments = bundleOf(ARG_REASONS to reasons) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentTimeFormatter.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentTimeFormatter.kt new file mode 100644 index 00000000..645a8180 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentTimeFormatter.kt @@ -0,0 +1,26 @@ +package kr.co.vividnext.sodalive.chat.character.comment + +import android.content.Context +import kr.co.vividnext.sodalive.R + +fun formatCommentTime(context: Context, createdAtMillis: Long): String { + val now = System.currentTimeMillis() + val diff = (now - createdAtMillis).coerceAtLeast(0) + val minutes = diff / 60_000 + return when { + minutes < 1 -> context.getString(R.string.character_comment_time_just_now) + minutes < 60 -> context.getString(R.string.character_comment_time_minutes, minutes) + minutes < 1_440 -> { + val hours = minutes / 60 + context.getString(R.string.character_comment_time_hours, hours) + } + minutes < 525_600 -> { + val days = minutes / 1_440 + context.getString(R.string.character_comment_time_days, days) + } + else -> { + val years = minutes / 525_600 + context.getString(R.string.character_comment_time_years, years) + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentsAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentsAdapter.kt index c5af658c..f981c241 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentsAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/character/comment/CharacterCommentsAdapter.kt @@ -1,5 +1,6 @@ package kr.co.vividnext.sodalive.chat.character.comment +import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -20,6 +21,7 @@ class CharacterCommentsAdapter( inner class VH(private val binding: ItemCharacterCommentBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(item: CharacterCommentResponse) { + val context = binding.root.context if (item.memberProfileImage.isNotBlank()) { binding.ivCommentProfile.load(item.memberProfileImage) { crossfade(true) @@ -32,12 +34,15 @@ class CharacterCommentsAdapter( } binding.tvCommentNickname.text = item.memberNickname - binding.tvCommentDate.text = timeAgo(item.createdAt) + binding.tvCommentDate.text = formatCommentTime(context, item.createdAt) binding.tvComment.text = item.comment binding.tvWriteReply.text = if (item.replyCount > 0) { - "답글 ${item.replyCount}개" + context.getString( + R.string.character_comment_reply_count, + item.replyCount + ) } else { - "답글 쓰기" + context.getString(R.string.character_comment_write_reply) } val isOwner = item.memberId == currentUserId @@ -61,17 +66,3 @@ class CharacterCommentsAdapter( override fun getItemCount(): Int = items.size } - -private fun timeAgo(createdAtMillis: Long): String { - val now = System.currentTimeMillis() - val diff = (now - createdAtMillis).coerceAtLeast(0) - val minutes = diff / 60_000 - if (minutes < 1) return "방금전" - if (minutes < 60) return "${minutes}분전" - val hours = minutes / 60 - if (hours < 24) return "${hours}시간전" - val days = hours / 24 - if (days < 365) return "${days}일전" - val years = days / 365 - return "${years}년전" -} diff --git a/app/src/main/res/layout/dialog_character_comment_more.xml b/app/src/main/res/layout/dialog_character_comment_more.xml index a431af94..235e9b9b 100644 --- a/app/src/main/res/layout/dialog_character_comment_more.xml +++ b/app/src/main/res/layout/dialog_character_comment_more.xml @@ -23,7 +23,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingVertical="16dp" - android:text="신고" + android:text="@string/report_title" android:textColor="@color/white" android:textSize="18sp" /> @@ -32,7 +32,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingVertical="16dp" - android:text="삭제" + android:text="@string/confirm_delete_title" android:textColor="#EF5350" android:textSize="18sp" /> diff --git a/app/src/main/res/layout/fragment_character_comment_list.xml b/app/src/main/res/layout/fragment_character_comment_list.xml index b702a584..9bedb33e 100644 --- a/app/src/main/res/layout/fragment_character_comment_list.xml +++ b/app/src/main/res/layout/fragment_character_comment_list.xml @@ -17,7 +17,7 @@ android:layout_height="wrap_content" android:layout_marginStart="13.3dp" android:fontFamily="@font/gmarket_sans_medium" - android:text="댓글" + android:text="@string/character_comment_title" android:textColor="@color/white" android:textSize="14.7sp" app:layout_constraintBottom_toBottomOf="@+id/iv_close" @@ -91,7 +91,7 @@ android:layout_weight="1" android:background="@android:color/transparent" android:fontFamily="@font/pretendard_regular" - android:hint="댓글을 입력해보세요" + android:hint="@string/character_comment_input_hint" android:imeOptions="actionSend" android:importantForAutofill="no" android:inputType="textCapSentences|textMultiLine" diff --git a/app/src/main/res/layout/fragment_character_comment_reply.xml b/app/src/main/res/layout/fragment_character_comment_reply.xml index cd316a9e..85b4d232 100644 --- a/app/src/main/res/layout/fragment_character_comment_reply.xml +++ b/app/src/main/res/layout/fragment_character_comment_reply.xml @@ -19,7 +19,7 @@ android:drawablePadding="6.7dp" android:fontFamily="@font/gmarket_sans_medium" android:gravity="center_vertical" - android:text="답글" + android:text="@string/character_comment_reply_title" android:textColor="@color/white" android:textSize="14.7sp" app:drawableStartCompat="@drawable/ic_back" @@ -79,7 +79,7 @@ android:layout_weight="1" android:background="@android:color/transparent" android:fontFamily="@font/pretendard_regular" - android:hint="댓글을 입력해보세요" + android:hint="@string/character_comment_input_hint" android:imeOptions="actionSend" android:importantForAutofill="no" android:inputType="textCapSentences|textMultiLine" diff --git a/app/src/main/res/layout/item_character_comment.xml b/app/src/main/res/layout/item_character_comment.xml index f2830c1d..03ce9f77 100644 --- a/app/src/main/res/layout/item_character_comment.xml +++ b/app/src/main/res/layout/item_character_comment.xml @@ -73,7 +73,7 @@ android:layout_height="wrap_content" android:layout_marginTop="8dp" android:fontFamily="@font/pretendard_bold" - android:text="답글 쓰기" + android:text="@string/character_comment_write_reply" android:textColor="@color/color_3bb9f1" android:textSize="14sp" app:layout_constraintStart_toStartOf="@+id/tv_comment" diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index eac276f0..157940ad 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -194,6 +194,37 @@ Buy with %1$d cans Failed to load gallery info. Failed to complete the purchase. + + Comments + Replies + @string/character_detail_comment_input_hint + Write a reply + %1$d replies + Just now + %1$d min ago + %1$d hr ago + %1$d day ago + %1$d yr ago + Please enter a message. + Please enter a report reason. + Report submitted. + @string/common_error_unknown + Unwanted commercial content or spam + Child abuse + Hate speech or graphic violence + Promoting terrorism + Harassment or bullying + Suicide or self-harm + Misinformation + + @string/character_comment_report_reason_commercial + @string/character_comment_report_reason_child_abuse + @string/character_comment_report_reason_hate_or_violence + @string/character_comment_report_reason_terror + @string/character_comment_report_reason_harassment + @string/character_comment_report_reason_self_harm + @string/character_comment_report_reason_misinformation + Recent characters Popular characters New characters diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 1e6c8c7a..9d240982 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -194,6 +194,37 @@ %1$dキャンで購入 ギャラリー情報を読み込めませんでした。 購入に失敗しました。 + + コメント + 返信 + @string/character_detail_comment_input_hint + 返信を書く + 返信 %1$d件 + たった今 + %1$d分前 + %1$d時間前 + %1$d日前 + %1$d年前 + 内容を入力してください。 + 通報理由を入力してください。 + 通報が受け付けられました。 + @string/common_error_unknown + 望まない商業コンテンツまたはスパム + 児童虐待 + ヘイトスピーチまたは露骨な暴力 + テロの助長 + 嫌がらせやいじめ + 自殺や自傷行為 + 誤情報 + + @string/character_comment_report_reason_commercial + @string/character_comment_report_reason_child_abuse + @string/character_comment_report_reason_hate_or_violence + @string/character_comment_report_reason_terror + @string/character_comment_report_reason_harassment + @string/character_comment_report_reason_self_harm + @string/character_comment_report_reason_misinformation + 最近話したキャラクター 人気キャラクター 新着キャラクター diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fb7671f9..9b578a25 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -193,6 +193,37 @@ %1$d캔으로 구매 갤러리 정보를 불러오지 못했습니다. 구매에 실패했습니다. + + 댓글 + 답글 + @string/character_detail_comment_input_hint + 답글 쓰기 + 답글 %1$d개 + 방금전 + %1$d분전 + %1$d시간전 + %1$d일전 + %1$d년전 + 내용을 입력하세요 + 신고 사유를 입력하세요 + 신고가 접수되었습니다. + @string/common_error_unknown + 원치 않는 상업성 콘텐츠 또는 스팸 + 아동 학대 + 증오시 표현 또는 노골적인 폭력 + 테러 조장 + 희롱 또는 괴롭힘 + 자살 또는 자해 + 잘못된 정보 + + @string/character_comment_report_reason_commercial + @string/character_comment_report_reason_child_abuse + @string/character_comment_report_reason_hate_or_violence + @string/character_comment_report_reason_terror + @string/character_comment_report_reason_harassment + @string/character_comment_report_reason_self_harm + @string/character_comment_report_reason_misinformation + 최근 대화한 캐릭터 인기 캐릭터 신규 캐릭터