feat(i18n): 콘텐츠 상세/댓글 하드코딩 문구를 I18n 키로 통일한다

This commit is contained in:
Yu Sung
2026-04-01 16:50:56 +09:00
parent a90996603b
commit c039931f34
30 changed files with 503 additions and 202 deletions

View File

@@ -69,14 +69,14 @@ final class ContentDetailViewModel: ObservableObject {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
print(error)
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
@@ -110,13 +110,13 @@ final class ContentDetailViewModel: ObservableObject {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
@@ -148,13 +148,13 @@ final class ContentDetailViewModel: ObservableObject {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
@@ -186,13 +186,13 @@ final class ContentDetailViewModel: ObservableObject {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
@@ -212,7 +212,7 @@ final class ContentDetailViewModel: ObservableObject {
self.shareMessage = shareUrl
self.isShowShareView = true
} else {
self.errorMessage = "공유링크를 생성하지 못했습니다.\n다시 시도해 주세요."
self.errorMessage = I18n.ContentDetail.shareLinkCreateFailed
self.isShowPopup = true
}
@@ -248,13 +248,13 @@ final class ContentDetailViewModel: ObservableObject {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
@@ -286,26 +286,26 @@ final class ContentDetailViewModel: ObservableObject {
AppState.shared.purchasedContentOrderType = .KEEP
self.orderType = nil
self.errorMessage = orderType == .RENTAL ? "대여가 완료되었습니다." : "구매가 완료되었습니다."
self.errorMessage = orderType == .RENTAL ? I18n.ContentDetail.rentalCompleted : I18n.ContentDetail.purchaseCompleted
self.isShowPopup = true
self.getAudioContentDetail()
ContentPlayManager.shared.conditionalStopAudio(contentId: contentId)
} else {
if let message = decoded.message {
self.errorMessage = message
if message.contains("캔이 부족합니다") {
if isInsufficientCanError(message: message, errorProperty: decoded.errorProperty) {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
AppState.shared.setAppStep(step: .canCharge(refresh: {}, afterCompletionToGoBack: true))
}
}
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
@@ -335,12 +335,12 @@ final class ContentDetailViewModel: ObservableObject {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
@@ -368,20 +368,20 @@ final class ContentDetailViewModel: ObservableObject {
if decoded.success {
self.orderType = nil
self.errorMessage = "삭제되었습니다"
self.errorMessage = I18n.ContentDetail.deleteCompleted
self.isShowPopup = true
onSuccess()
} else {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
@@ -390,10 +390,10 @@ final class ContentDetailViewModel: ObservableObject {
func donation(can: Int, comment: String) {
if can <= 0 {
self.errorMessage = "1캔 이상 후원하실 수 있습니다."
self.errorMessage = I18n.LiveRoom.atLeastOneCanDonationMessage
self.isShowPopup = true
} else if comment.trimmingCharacters(in: .whitespaces).isEmpty {
self.errorMessage = "함께 보낼 메시지를 입력하세요."
self.errorMessage = I18n.ContentDetail.donationMessageRequired
self.isShowPopup = true
} else {
isLoading = true
@@ -415,7 +415,7 @@ final class ContentDetailViewModel: ObservableObject {
if decoded.success {
UserDefaults.set(UserDefaults.int(forKey: .can) - can, forKey: .can)
self.errorMessage = "\(can)캔을 후원하셨습니다."
self.errorMessage = I18n.ContentDetail.donationCompleted(can)
self.isShowPopup = true
self.getAudioContentDetail()
@@ -423,13 +423,13 @@ final class ContentDetailViewModel: ObservableObject {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
@@ -456,7 +456,7 @@ final class ContentDetailViewModel: ObservableObject {
let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData)
if decoded.success {
self.errorMessage = "고정되었습니다"
self.errorMessage = I18n.ContentDetail.pinCompleted
self.isShowPopup = true
self.getAudioContentDetail()
@@ -464,13 +464,13 @@ final class ContentDetailViewModel: ObservableObject {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
@@ -496,7 +496,7 @@ final class ContentDetailViewModel: ObservableObject {
let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData)
if decoded.success {
self.errorMessage = "해제되었습니다"
self.errorMessage = I18n.ContentDetail.unpinCompleted
self.isShowPopup = true
self.getAudioContentDetail()
@@ -504,16 +504,40 @@ final class ContentDetailViewModel: ObservableObject {
if let message = decoded.message {
self.errorMessage = message
} else {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
}
self.isShowPopup = true
}
} catch {
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
self.errorMessage = I18n.Common.commonError
self.isShowPopup = true
}
}
.store(in: &subscription)
}
private func isInsufficientCanError(message: String, errorProperty: String?) -> Bool {
let normalizedErrorProperty = errorProperty?.lowercased() ?? ""
if normalizedErrorProperty.contains("not_enough_can") ||
normalizedErrorProperty.contains("insufficient_can") ||
normalizedErrorProperty.contains("lack_of_can")
{
return true
}
let normalizedMessage = message.lowercased()
let insufficientCanPatterns = [
"캔이 부족",
"캔 부족",
"not enough can",
"insufficient can",
"not enough cans",
"insufficient cans",
"canが不足"
]
return insufficientCanPatterns.contains { normalizedMessage.contains($0) }
}
}