Files
keyboard/keyBoard/Class/Pay/StoreKit2Manager/Locals/SubscriptionLocale.swift
2025-12-16 13:10:50 +08:00

1333 lines
61 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// SubscriptionLocale.swift
// StoreKit2Manager
//
// Created by xiaopin on 2025/12/6.
//
import Foundation
import StoreKit
///
public struct SubscriptionLocale {
/// StoreKit
/// - Parameter period:
/// - Returns: day, week, month, year
public static func getUnit(from period: Product.SubscriptionPeriod?) -> String {
guard let period = period else { return "day" }
let unit = period.unit
let numberOfUnits = period.value
switch unit {
case .day:
if numberOfUnits >= 365 {
return "year"
} else if numberOfUnits >= 30 {
return "month"
} else if numberOfUnits >= 7 {
return "week"
}
return "day"
case .week:
if numberOfUnits >= 52 {
return "year"
} else if numberOfUnits >= 4 {
return "month"
}
return "week"
case .month:
if numberOfUnits >= 12 {
return "year"
}
return "month"
case .year:
return "year"
@unknown default:
if numberOfUnits >= 365 {
return "year"
} else if numberOfUnits >= 30 {
return "month"
} else if numberOfUnits >= 7 {
return "week"
}
return "day"
}
}
///
/// - Parameters:
/// - languageCode:
/// - numberOfPeriods:
/// - unit: day, week, month, year
/// - Returns:
private static func getLocalizedUnit(languageCode: String, numberOfPeriods: Int, unit: String) -> String {
switch languageCode {
case "ar":
switch unit {
case "day": return numberOfPeriods == 1 ? "يوم" : "أيام"
case "week": return numberOfPeriods == 1 ? "أسبوع" : "أسابيع"
case "month": return numberOfPeriods == 1 ? "شهر" : "أشهر"
case "year": return numberOfPeriods == 1 ? "سنة" : "سنوات"
default: return numberOfPeriods == 1 ? "يوم" : "أيام"
}
case "de":
switch unit {
case "day": return "Täg"
case "week": return "Wochen"
case "month": return "Monat"
case "year": return "Jahr"
default: return "Täg"
}
case "en":
switch unit {
case "day": return numberOfPeriods == 1 ? "day" : "days"
case "week": return numberOfPeriods == 1 ? "week" : "weeks"
case "month": return numberOfPeriods == 1 ? "month" : "months"
case "year": return numberOfPeriods == 1 ? "year" : "years"
default: return numberOfPeriods == 1 ? "day" : "days"
}
case "es":
switch unit {
case "day": return numberOfPeriods == 1 ? "día" : "días"
case "week": return numberOfPeriods == 1 ? "semana" : "semanas"
case "month": return numberOfPeriods == 1 ? "mes" : "meses"
case "year": return numberOfPeriods == 1 ? "año" : "años"
default: return numberOfPeriods == 1 ? "día" : "días"
}
case "fil":
switch unit {
case "day": return "araw"
case "week": return "linggo"
case "month": return "buwan"
case "year": return "taon"
default: return "araw"
}
case "fr":
switch unit {
case "day": return numberOfPeriods == 1 ? "jour" : "jours"
case "week": return numberOfPeriods == 1 ? "semaine" : "semaines"
case "month": return numberOfPeriods == 1 ? "mois" : "mois"
case "year": return numberOfPeriods == 1 ? "an" : "ans"
default: return numberOfPeriods == 1 ? "jour" : "jours"
}
case "id":
switch unit {
case "day": return "hari"
case "week": return "minggu"
case "month": return "bulan"
case "year": return "tahun"
default: return "hari"
}
case "it":
switch unit {
case "day": return numberOfPeriods == 1 ? "giorno" : "giorni"
case "week": return numberOfPeriods == 1 ? "settimana" : "settimane"
case "month": return numberOfPeriods == 1 ? "mese" : "mesi"
case "year": return numberOfPeriods == 1 ? "anno" : "anni"
default: return numberOfPeriods == 1 ? "giorno" : "giorni"
}
case "ja":
switch unit {
case "day": return "日間"
case "week": return "週間"
case "month": return "ヶ月"
case "year": return "年間"
default: return "日間"
}
case "ko":
switch unit {
case "day": return ""
case "week": return ""
case "month": return "개월"
case "year": return ""
default: return ""
}
case "pl":
switch unit {
case "day": return numberOfPeriods == 1 ? "dzień" : "dni"
case "week": return numberOfPeriods == 1 ? "tydzień" : "tygodni"
case "month": return numberOfPeriods == 1 ? "miesiąc" : "miesięcy"
case "year": return numberOfPeriods == 1 ? "rok" : "lat"
default: return numberOfPeriods == 1 ? "dzień" : "dni"
}
case "pt":
switch unit {
case "day": return numberOfPeriods == 1 ? "dia" : "dias"
case "week": return numberOfPeriods == 1 ? "semana" : "semanas"
case "month": return numberOfPeriods == 1 ? "mês" : "meses"
case "year": return numberOfPeriods == 1 ? "ano" : "anos"
default: return numberOfPeriods == 1 ? "dia" : "dias"
}
case "ru":
switch unit {
case "day": return numberOfPeriods == 1 ? "день" : "дней"
case "week": return numberOfPeriods == 1 ? "неделя" : "недель"
case "month": return numberOfPeriods == 1 ? "месяц" : "месяцев"
case "year": return numberOfPeriods == 1 ? "год" : "лет"
default: return numberOfPeriods == 1 ? "день" : "дней"
}
case "th":
switch unit {
case "day": return "วัน"
case "week": return "สัปดาห์"
case "month": return "เดือน"
case "year": return "ปี"
default: return "วัน"
}
case "tr":
switch unit {
case "day": return "gün"
case "week": return "hafta"
case "month": return "ay"
case "year": return "yıl"
default: return "gün"
}
case "uk":
switch unit {
case "day": return numberOfPeriods == 1 ? "день" : "днів"
case "week": return numberOfPeriods == 1 ? "тиждень" : "тижнів"
case "month": return numberOfPeriods == 1 ? "місяць" : "місяців"
case "year": return numberOfPeriods == 1 ? "рік" : "років"
default: return numberOfPeriods == 1 ? "день" : "днів"
}
case "vi":
switch unit {
case "day": return "ngày"
case "week": return "tuần"
case "month": return "tháng"
case "year": return "năm"
default: return "ngày"
}
case "zh_Hans":
switch unit {
case "day": return ""
case "week": return ""
case "month": return ""
case "year": return ""
default: return ""
}
case "zh_Hant":
switch unit {
case "day": return ""
case "week": return ""
case "month": return ""
case "year": return ""
default: return ""
}
default:
switch unit {
case "day": return numberOfPeriods == 1 ? "day" : "days"
case "week": return numberOfPeriods == 1 ? "week" : "weeks"
case "month": return numberOfPeriods == 1 ? "month" : "months"
case "year": return numberOfPeriods == 1 ? "year" : "years"
default: return numberOfPeriods == 1 ? "day" : "days"
}
}
}
/// Product displayPrice
/// displayPrice
/// - Parameter product: Product
/// - Returns:
public static func getCurrencySymbol(from product: Product) -> String {
let displayPrice = product.displayPrice
let priceDecimal = product.price
let priceDouble = NSDecimalNumber(decimal: priceDecimal).doubleValue
//
var pricePatterns: [String] = []
// 1. "9.99"
pricePatterns.append(String(format: "%.2f", priceDouble))
// 2.
if priceDouble.truncatingRemainder(dividingBy: 1) == 0 {
pricePatterns.append(String(format: "%.0f", priceDouble))
}
// 3. "9.9"0
let priceString = String(format: "%.2f", priceDouble)
if priceString.hasSuffix("0") {
pricePatterns.append(String(format: "%.1f", priceDouble))
}
// 4. "1,234.56" "1.234,56"
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
if let localizedPrice = formatter.string(from: NSNumber(value: priceDouble)) {
pricePatterns.append(localizedPrice)
}
// 5.
if priceDouble.truncatingRemainder(dividingBy: 1) == 0 {
formatter.maximumFractionDigits = 0
if let localizedPrice = formatter.string(from: NSNumber(value: priceDouble)) {
pricePatterns.append(localizedPrice)
}
}
// displayPrice
var cleanedPrice = displayPrice
for pattern in pricePatterns {
//
cleanedPrice = cleanedPrice.replacingOccurrences(of: " \(pattern) ", with: " ")
cleanedPrice = cleanedPrice.replacingOccurrences(of: "\(pattern) ", with: " ")
cleanedPrice = cleanedPrice.replacingOccurrences(of: " \(pattern)", with: " ")
cleanedPrice = cleanedPrice.replacingOccurrences(of: pattern, with: "")
}
//
cleanedPrice = cleanedPrice.replacingOccurrences(of: #"\d"#, with: "", options: .regularExpression)
cleanedPrice = cleanedPrice.replacingOccurrences(of: #"[.,]"#, with: "", options: .regularExpression)
//
cleanedPrice = cleanedPrice.trimmingCharacters(in: .whitespaces)
cleanedPrice = cleanedPrice.replacingOccurrences(of: #"\s+"#, with: " ", options: .regularExpression)
cleanedPrice = cleanedPrice.trimmingCharacters(in: .whitespaces)
//
if !cleanedPrice.isEmpty {
return cleanedPrice
}
// 使 Locale.current.currencySymbol
return Locale.current.currencySymbol ?? "$"
}
// MARK: -
///
/// - Parameters:
/// - type:
/// - languageCode:
/// - Returns:
public static func subscriptionButtonText(type: SubscriptionButtonType, languageCode: String) -> String {
switch languageCode {
case "ar":
switch type {
case .standard: return "اشترك"
case .freeTrial: return "جرّب مجانًا"
case .payUpFront: return "ادفع الآن"
case .payAsYouGo: return "ادفع حسب الاستخدام"
case .lifetime: return "اشتر مدى الحياة"
}
case "de":
switch type {
case .standard: return "Abonnieren"
case .freeTrial: return "Kostenlos testen"
case .payUpFront: return "Jetzt bezahlen"
case .payAsYouGo: return "Bezahlen nach Nutzung"
case .lifetime: return "Lebenslang kaufen"
}
case "en":
switch type {
case .standard: return "Subscribe"
case .freeTrial: return "Start Free Trial"
case .payUpFront: return "Prepay Now"
case .payAsYouGo: return "Pay As You Go"
case .lifetime: return "Buy Lifetime"
}
case "es":
switch type {
case .standard: return "Suscribirse"
case .freeTrial: return "Prueba gratis"
case .payUpFront: return "Pagar ahora"
case .payAsYouGo: return "Pagar por uso"
case .lifetime: return "Comprar de por vida"
}
case "fil":
switch type {
case .standard: return "Mag-subscribe"
case .freeTrial: return "Subukan nang libre"
case .payUpFront: return "Magbayad ngayon"
case .payAsYouGo: return "Magbayad ayon sa paggamit"
case .lifetime: return "Bilhin ang panghabang-buhay"
}
case "fr":
switch type {
case .standard: return "S'abonner"
case .freeTrial: return "Essai gratuit"
case .payUpFront: return "Payer maintenant"
case .payAsYouGo: return "Payer à l'usage"
case .lifetime: return "Acheter à vie"
}
case "id":
switch type {
case .standard: return "Berlangganan"
case .freeTrial: return "Coba gratis"
case .payUpFront: return "Bayar sekarang"
case .payAsYouGo: return "Bayar sesuai pemakaian"
case .lifetime: return "Beli seumur hidup"
}
case "it":
switch type {
case .standard: return "Abbonati"
case .freeTrial: return "Prova gratuita"
case .payUpFront: return "Paga ora"
case .payAsYouGo: return "Paga a consumo"
case .lifetime: return "Acquista a vita"
}
case "ja":
switch type {
case .standard: return "購読する"
case .freeTrial: return "無料トライアル開始"
case .payUpFront: return "今すぐ支払う"
case .payAsYouGo: return "使った分だけ支払う"
case .lifetime: return "生涯購入"
}
case "ko":
switch type {
case .standard: return "구독하기"
case .freeTrial: return "무료 체험 시작"
case .payUpFront: return "지금 결제"
case .payAsYouGo: return "사용한 만큼 결제"
case .lifetime: return "평생 구매"
}
case "pl":
switch type {
case .standard: return "Subskrybuj"
case .freeTrial: return "Wypróbuj za darmo"
case .payUpFront: return "Zapłać teraz"
case .payAsYouGo: return "Płać zgodnie z użyciem"
case .lifetime: return "Kup na całe życie"
}
case "pt":
switch type {
case .standard: return "Assinar"
case .freeTrial: return "Teste grátis"
case .payUpFront: return "Pagar agora"
case .payAsYouGo: return "Pagar conforme o uso"
case .lifetime: return "Comprar vitalício"
}
case "ru":
switch type {
case .standard: return "Подписаться"
case .freeTrial: return "Попробовать бесплатно"
case .payUpFront: return "Оплатить сейчас"
case .payAsYouGo: return "Оплата по мере использования"
case .lifetime: return "Купить навсегда"
}
case "th":
switch type {
case .standard: return "สมัครสมาชิก"
case .freeTrial: return "ทดลองใช้ฟรี"
case .payUpFront: return "ชำระตอนนี้"
case .payAsYouGo: return "จ่ายตามการใช้งาน"
case .lifetime: return "ซื้อตลอดชีพ"
}
case "tr":
switch type {
case .standard: return "Abone ol"
case .freeTrial: return "Ücretsiz dene"
case .payUpFront: return "Şimdi öde"
case .payAsYouGo: return "Kullandıkça öde"
case .lifetime: return "Yaşam boyu satın al"
}
case "uk":
switch type {
case .standard: return "Підписатися"
case .freeTrial: return "Спробувати безкоштовно"
case .payUpFront: return "Оплатити зараз"
case .payAsYouGo: return "Оплата за мірою використання"
case .lifetime: return "Купити назавжди"
}
case "vi":
switch type {
case .standard: return "Đăng ký"
case .freeTrial: return "Dùng thử miễn phí"
case .payUpFront: return "Thanh toán ngay"
case .payAsYouGo: return "Trả theo nhu cầu"
case .lifetime: return "Mua trọn đời"
}
case "zh_Hans":
switch type {
case .standard: return "订阅"
case .freeTrial: return "开始免费试用"
case .payUpFront: return "立即支付"
case .payAsYouGo: return "按需付费"
case .lifetime: return "购买终身"
}
case "zh_Hant":
switch type {
case .standard: return "訂閱"
case .freeTrial: return "開始免費試用"
case .payUpFront: return "立即支付"
case .payAsYouGo: return "按需付費"
case .lifetime: return "購買終身"
}
default:
//
switch type {
case .standard: return "Subscribe"
case .freeTrial: return "Start Free Trial"
case .payUpFront: return "Prepay Now"
case .payAsYouGo: return "Pay As You Go"
case .lifetime: return "Buy Lifetime"
}
}
}
// MARK: -
///
/// - Parameters:
/// - periodType: week, month, year, lifetime
/// - languageCode:
/// - isShort: 使
/// - Returns:
public static func subscriptionTitle(periodType: SubscriptionPeriodType, languageCode: String, isShort: Bool = false) -> String {
switch languageCode {
case "ar":
switch periodType {
case .week: return isShort ? "أسبوعي" : "اشتراك أسبوعي"
case .month: return isShort ? "شهري" : "اشتراك شهري"
case .year: return isShort ? "سنوي" : "اشتراك سنوي"
case .lifetime: return isShort ? "مدى الحياة" : "اشتراك مدى الحياة"
}
case "de":
switch periodType {
case .week: return isShort ? "Woche" : "Wöchentliches Abo"
case .month: return isShort ? "Monat" : "Monatliches Abo"
case .year: return isShort ? "Jahr" : "Jährliches Abo"
case .lifetime: return isShort ? "Lebenslang" : "Lebenslanges Abo"
}
case "en":
switch periodType {
case .week: return isShort ? "Weekly" : "Weekly Subscription"
case .month: return isShort ? "Monthly" : "Monthly Subscription"
case .year: return isShort ? "Yearly" : "Annual Subscription"
case .lifetime: return isShort ? "Lifetime" : "Lifetime Membership"
}
case "es":
switch periodType {
case .week: return isShort ? "Semanal" : "Suscripción semanal"
case .month: return isShort ? "Mensual" : "Suscripción mensual"
case .year: return isShort ? "Anual" : "Suscripción anual"
case .lifetime: return isShort ? "De por vida" : "Suscripción de por vida"
}
case "fil":
switch periodType {
case .week: return isShort ? "Lingguhan" : "Lingguhang Subscription"
case .month: return isShort ? "Buwanang" : "Buwanang Subscription"
case .year: return isShort ? "Taunan" : "Taunang Subscription"
case .lifetime: return isShort ? "Panghabang-buhay" : "Panghabang-buhay na Subscription"
}
case "fr":
switch periodType {
case .week: return isShort ? "Hebdo" : "Abonnement hebdomadaire"
case .month: return isShort ? "Mensuel" : "Abonnement mensuel"
case .year: return isShort ? "Annuel" : "Abonnement annuel"
case .lifetime: return isShort ? "À vie" : "Abonnement à vie"
}
case "id":
switch periodType {
case .week: return isShort ? "Mingguan" : "Langganan mingguan"
case .month: return isShort ? "Bulanan" : "Langganan bulanan"
case .year: return isShort ? "Tahunan" : "Langganan tahunan"
case .lifetime: return isShort ? "Seumur hidup" : "Langganan seumur hidup"
}
case "it":
switch periodType {
case .week: return isShort ? "Sett." : "Abbonamento settimanale"
case .month: return isShort ? "Mese" : "Abbonamento mensile"
case .year: return isShort ? "Anno" : "Abbonamento annuale"
case .lifetime: return isShort ? "A vita" : "Abbonamento a vita"
}
case "ja":
switch periodType {
case .week: return isShort ? "週額" : "週額プラン"
case .month: return isShort ? "月額" : "月額プラン"
case .year: return isShort ? "年額" : "年額プラン"
case .lifetime: return isShort ? "生涯" : "生涯プラン"
}
case "ko":
switch periodType {
case .week: return isShort ? "주간" : "주간 구독"
case .month: return isShort ? "월간" : "월간 구독"
case .year: return isShort ? "연간" : "연간 구독"
case .lifetime: return isShort ? "평생" : "평생 회원권"
}
case "pl":
switch periodType {
case .week: return isShort ? "Tyg." : "Subskrypcja tygodniowa"
case .month: return isShort ? "Mies." : "Subskrypcja miesięczna"
case .year: return isShort ? "Rocznie" : "Subskrypcja roczna"
case .lifetime: return isShort ? "Dożywotnia" : "Subskrypcja dożywotnia"
}
case "pt":
switch periodType {
case .week: return isShort ? "Semanal" : "Assinatura semanal"
case .month: return isShort ? "Mensal" : "Assinatura mensal"
case .year: return isShort ? "Anual" : "Assinatura anual"
case .lifetime: return isShort ? "Vitalício" : "Assinatura vitalícia"
}
case "ru":
switch periodType {
case .week: return isShort ? "Неделя" : "Еженедельная подписка"
case .month: return isShort ? "Месяц" : "Ежемесячная подписка"
case .year: return isShort ? "Год" : "Годовая подписка"
case .lifetime: return isShort ? "Навсегда" : "Пожизненная подписка"
}
case "th":
switch periodType {
case .week: return isShort ? "รายสัปดาห์" : "สมัครสมาชิกแบบรายสัปดาห์"
case .month: return isShort ? "รายเดือน" : "สมัครสมาชิกแบบรายเดือน"
case .year: return isShort ? "รายปี" : "สมัครสมาชิกแบบรายปี"
case .lifetime: return isShort ? "ตลอดชีพ" : "สมาชิกตลอดชีพ"
}
case "tr":
switch periodType {
case .week: return isShort ? "Haftalık" : "Haftalık abonelik"
case .month: return isShort ? "Aylık" : "Aylık abonelik"
case .year: return isShort ? "Yıllık" : "Yıllık abonelik"
case .lifetime: return isShort ? "Ömür boyu" : "Ömür boyu abonelik"
}
case "uk":
switch periodType {
case .week: return isShort ? "Тиж." : "Тижнева підписка"
case .month: return isShort ? "Міс." : "Місячна підписка"
case .year: return isShort ? "Рік" : "Річна підписка"
case .lifetime: return isShort ? "Довічна" : "Довічна підписка"
}
case "vi":
switch periodType {
case .week: return isShort ? "Tuần" : "Gói thuê bao hàng tuần"
case .month: return isShort ? "Tháng" : "Gói thuê bao hàng tháng"
case .year: return isShort ? "Năm" : "Gói thuê bao hàng năm"
case .lifetime: return isShort ? "Trọn đời" : "Gói trọn đời"
}
case "zh_Hans":
switch periodType {
case .week: return isShort ? "周会员" : "每周会员"
case .month: return isShort ? "月会员" : "每月会员"
case .year: return isShort ? "年会员" : "年度会员"
case .lifetime: return isShort ? "终身会员" : "终身会员"
}
case "zh_Hant":
switch periodType {
case .week: return isShort ? "週會員" : "每週會員"
case .month: return isShort ? "月會員" : "每月會員"
case .year: return isShort ? "年會員" : "年度會員"
case .lifetime: return isShort ? "終身會員" : "終身會員"
}
default:
//
switch periodType {
case .week: return isShort ? "Weekly" : "Weekly Subscription"
case .month: return isShort ? "Monthly" : "Monthly Subscription"
case .year: return isShort ? "Yearly" : "Annual Subscription"
case .lifetime: return isShort ? "Lifetime" : "Lifetime Membership"
}
}
}
// MARK: -
///
/// - Parameters:
/// - periodType:
/// - languageCode:
/// - Returns:
private static func defaultSubDescWord(periodType: SubscriptionPeriodType, languageCode: String) -> String {
switch languageCode {
case "ar":
switch periodType {
case .week: return "مرونة"
case .month: return "قيمة ممتازة"
case .year: return "الأكثر توفيراً"
case .lifetime: return "اشتراك دائم بدون تجديد"
}
case "de":
switch periodType {
case .week: return "Flexibilität"
case .month: return "Bester Wert"
case .year: return "Meist gespart"
case .lifetime: return "Einmalig zahlen, dauerhaft nutzen"
}
case "en":
switch periodType {
case .week: return "Flexible"
case .month: return "Best Value"
case .year: return "Most Popular"
case .lifetime: return "Pay once, own forever"
}
case "es":
switch periodType {
case .week: return "Flexible"
case .month: return "Mejor Valor"
case .year: return "Más Popular"
case .lifetime: return "Paga una vez, disfruta siempre"
}
case "fil":
switch periodType {
case .week: return "Nakakalag"
case .month: return "Pinakamahusay na Halaga"
case .year: return "Pinakasikat"
case .lifetime: return "Isang beses lang, habambuhay na"
}
case "fr":
switch periodType {
case .week: return "Flexible"
case .month: return "Meilleur Rapport"
case .year: return "Plus Populaire"
case .lifetime: return "Achetez une fois, profitez à vie"
}
case "id":
switch periodType {
case .week: return "Fleksibel"
case .month: return "Nilai Terbaik"
case .year: return "Paling Populer"
case .lifetime: return "Bayar sekali, pakai selamanya"
}
case "it":
switch periodType {
case .week: return "Flessibile"
case .month: return "Miglior Valore"
case .year: return "Più Popolare"
case .lifetime: return "Paga una volta, usa per sempre"
}
case "ja":
switch periodType {
case .week: return "柔軟性"
case .month: return "お得"
case .year: return "人気"
case .lifetime: return "一度の支払いで永久利用"
}
case "ko":
switch periodType {
case .week: return "유연함"
case .month: return "최고 가치"
case .year: return "인기"
case .lifetime: return "한 번 결제로 평생 이용"
}
case "pl":
switch periodType {
case .week: return "Elastyczność"
case .month: return "Najlepsza Wartość"
case .year: return "Najpopularniejsze"
case .lifetime: return "Zapłać raz, korzystaj zawsze"
}
case "pt":
switch periodType {
case .week: return "Flexível"
case .month: return "Melhor Valor"
case .year: return "Mais Popular"
case .lifetime: return "Pague uma vez, use para sempre"
}
case "ru":
switch periodType {
case .week: return "Гибкость"
case .month: return "Лучшая Цена"
case .year: return "Популярный"
case .lifetime: return "Оплати один раз, используй всегда"
}
case "th":
switch periodType {
case .week: return "ยืดหยุ่น"
case .month: return "คุ้มค่าที่สุด"
case .year: return "ยอดนิยม"
case .lifetime: return "จ่ายครั้งเดียว ใช้ได้ตลอดชีพ"
}
case "tr":
switch periodType {
case .week: return "Esnek"
case .month: return "En İyi Değer"
case .year: return "En Popüler"
case .lifetime: return "Bir kez öde, sürekli kullan"
}
case "uk":
switch periodType {
case .week: return "Гнучкість"
case .month: return "Найкраща Ціна"
case .year: return "Популярний"
case .lifetime: return "Сплати один раз, використовуй завжди"
}
case "vi":
switch periodType {
case .week: return "Linh hoạt"
case .month: return "Giá trị tốt nhất"
case .year: return "Phổ biến nhất"
case .lifetime: return "Thanh toán một lần, sử dụng mãi mãi"
}
case "zh_Hans":
switch periodType {
case .week: return "灵活选择"
case .month: return "性价比之选"
case .year: return "最优惠"
case .lifetime: return "一次购买,终身访问"
}
case "zh_Hant":
switch periodType {
case .week: return "靈活選擇"
case .month: return "性價比之選"
case .year: return "最優惠"
case .lifetime: return "一次購買,終生訪問"
}
default:
switch periodType {
case .week: return "Flexible"
case .month: return "Best Value"
case .year: return "Most Popular"
case .lifetime: return "Pay once, own forever"
}
}
}
///
/// - Parameters:
/// - product:
/// - periodType:
/// - languageCode:
/// - Returns:
public static func defaultSubtitle(product: Product, periodType: SubscriptionPeriodType, languageCode: String) -> String {
let priceDouble = NSDecimalNumber(decimal: product.price).doubleValue
let priceString = String(format: "%.2f", priceDouble)
let currencySymbol = getCurrencySymbol(from: product)
var productUnit = periodType.rawValue
if let subscription = product.subscription {
productUnit = getLocalizedUnit(languageCode: languageCode, numberOfPeriods: 1, unit: getUnit(from: subscription.subscriptionPeriod))
}
//
let description = defaultSubDescWord(periodType: periodType, languageCode: languageCode)
if periodType == .lifetime {
//
return description
} else if periodType == .week {
return description + "," + buildDefaultSubtitle(languageCode: languageCode, price: priceString, currencySymbol: currencySymbol, productUnit: productUnit)
} else if periodType == .month {
return description + "," + buildMonthlySubtitle(languageCode: languageCode, price: priceString, currencySymbol: currencySymbol)
} else if periodType == .year {
return description + "," + buildYearlySubtitle(languageCode: languageCode, price: priceString, currencySymbol: currencySymbol)
}
return buildDefaultSubtitle(languageCode: languageCode, price: priceString, currencySymbol: currencySymbol, productUnit: productUnit)
}
///
/// - Parameters:
/// - product:
/// - languageCode:
/// - Returns:
public static func introductoryOfferSubtitle(product: Product, languageCode: String) async -> String {
guard let subscription = product.subscription,
let introductoryOffer = subscription.introductoryOffer else {
return ""
}
let priceDouble = NSDecimalNumber(decimal: product.price).doubleValue
let priceString = String(format: "%.2f", priceDouble)
let currencySymbol = getCurrencySymbol(from: product)
//print("introductoryOfferSubtitle:priceString \(priceString) currencySymbol: \(currencySymbol)")
//
let productUnit = getUnit(from: subscription.subscriptionPeriod)
let localizedUnit = getLocalizedUnit(languageCode: languageCode, numberOfPeriods: 1, unit: productUnit)
//
let introPrice = introductoryOffer.price
let introPriceDouble = NSDecimalNumber(decimal: introPrice).doubleValue
let introPriceString = String(format: "%.2f", introPriceDouble)
switch introductoryOffer.paymentMode {
case .payAsYouGo:
//
let numberOfPeriods = introductoryOffer.periodCount
return buildPayAsYouGoText(
languageCode: languageCode,
introPrice: introPriceString,
currencySymbol: currencySymbol,
productUnit: localizedUnit,
numberOfPeriods: numberOfPeriods
)
case .payUpFront:
//
return buildPayUpFrontText(
languageCode: languageCode,
introPrice: introPriceString,
originalPrice: priceString,
currencySymbol: currencySymbol,
productUnit: localizedUnit
)
case .freeTrial:
//
let trialPeriod = introductoryOffer.period
let numberOfPeriods = trialPeriod.value
let trialUnit = getUnit(from: trialPeriod)
let trialLocalizedUnit = getLocalizedUnit(languageCode: languageCode, numberOfPeriods: numberOfPeriods, unit: trialUnit)
return buildFreeTrialText(
languageCode: languageCode,
numberOfPeriods: numberOfPeriods,
trialPeriodUnit: trialLocalizedUnit,
productUnit: localizedUnit,
price: priceString,
currencySymbol: currencySymbol
)
default:
return ""
}
}
///
/// - Parameters:
/// - product:
/// - languageCode:
/// - Returns:
public static func promotionalOfferSubtitle(product: Product, languageCode: String) async -> String {
guard let subscription = product.subscription,
let promotionalOffer = subscription.promotionalOffers.first else {
return ""
}
let priceDouble = NSDecimalNumber(decimal: product.price).doubleValue
let priceString = String(format: "%.2f", priceDouble)
let currencySymbol = getCurrencySymbol(from: product)
//
let productUnit = getUnit(from: subscription.subscriptionPeriod)
let localizedUnit = getLocalizedUnit(languageCode: languageCode, numberOfPeriods: 1, unit: productUnit)
//
let discountPrice = promotionalOffer.price
let discountPriceDouble = NSDecimalNumber(decimal: discountPrice).doubleValue
let discountPriceString = String(format: "%.2f", discountPriceDouble)
switch promotionalOffer.paymentMode {
case .payAsYouGo:
//
let numberOfPeriods = promotionalOffer.periodCount
return buildPayAsYouGoText(
languageCode: languageCode,
introPrice: discountPriceString,
currencySymbol: currencySymbol,
productUnit: localizedUnit,
numberOfPeriods: numberOfPeriods
)
case .payUpFront:
//
return buildPayUpFrontText(
languageCode: languageCode,
introPrice: discountPriceString,
originalPrice: priceString,
currencySymbol: currencySymbol,
productUnit: localizedUnit
)
case .freeTrial:
//
let trialPeriod = promotionalOffer.period
let numberOfPeriods = trialPeriod.value
let trialUnit = getUnit(from: trialPeriod)
let trialLocalizedUnit = getLocalizedUnit(languageCode: languageCode, numberOfPeriods: numberOfPeriods, unit: trialUnit)
return buildFreeTrialText(
languageCode: languageCode,
numberOfPeriods: numberOfPeriods,
trialPeriodUnit: trialLocalizedUnit,
productUnit: localizedUnit,
price: priceString,
currencySymbol: currencySymbol
)
default:
return ""
}
}
// MARK: -
///
/// - Parameters:
/// - languageCode:
/// - price:
/// - currencySymbol:
/// - productUnit:
/// - Returns:
private static func buildDefaultSubtitle(languageCode: String, price: String, currencySymbol: String, productUnit: String) -> String {
switch languageCode {
case "ar", "de", "en", "es", "fil", "fr", "id", "it", "ja", "ko", "pl", "pt", "ru", "th", "tr", "uk", "vi":
return "\(currencySymbol)\(price)/\(productUnit)"
case "zh_Hans":
return "\(productUnit)\(currencySymbol)\(price)"
case "zh_Hant":
return "\(productUnit)\(currencySymbol)\(price)"
default:
return "\(currencySymbol)\(price)/\(productUnit)"
}
}
/// -
/// - Parameters:
/// - languageCode:
/// - price:
/// - currencySymbol:
/// - Returns:
private static func buildMonthlySubtitle(languageCode: String, price: String, currencySymbol: String) -> String {
let monthlyPrice = Double(price) ?? 0
let weeklyPrice = monthlyPrice / 4.33
let weeklyPriceString = String(format: "%.2f", weeklyPrice)
switch languageCode {
case "ar":
return "\(currencySymbol)\(price)/شهر · ~\(currencySymbol)\(weeklyPriceString)/أسبوع"
case "de":
return "\(currencySymbol)\(price)/Monat · ~\(currencySymbol)\(weeklyPriceString)/Woche"
case "en":
return "\(currencySymbol)\(price)/month · ~\(currencySymbol)\(weeklyPriceString)/week"
case "es":
return "\(currencySymbol)\(price)/mes · ~\(currencySymbol)\(weeklyPriceString)/semana"
case "fil":
return "\(currencySymbol)\(price)/buwan · ~\(currencySymbol)\(weeklyPriceString)/linggo"
case "fr":
return "\(currencySymbol)\(price)/mois · ~\(currencySymbol)\(weeklyPriceString)/semaine"
case "id":
return "\(currencySymbol)\(price)/bulan · ~\(currencySymbol)\(weeklyPriceString)/minggu"
case "it":
return "\(currencySymbol)\(price)/mese · ~\(currencySymbol)\(weeklyPriceString)/settimana"
case "ja":
return "\(currencySymbol)\(price)/月 · 約\(currencySymbol)\(weeklyPriceString)/週"
case "ko":
return "\(currencySymbol)\(price)/월 · 약\(currencySymbol)\(weeklyPriceString)/주"
case "pl":
return "\(currencySymbol)\(price)/miesiąc · ~\(currencySymbol)\(weeklyPriceString)/tydzień"
case "pt":
return "\(currencySymbol)\(price)/mês · ~\(currencySymbol)\(weeklyPriceString)/semana"
case "ru":
return "\(currencySymbol)\(price)/мес · ~\(currencySymbol)\(weeklyPriceString)/нед"
case "th":
return "\(currencySymbol)\(price)/เดือน · ~\(currencySymbol)\(weeklyPriceString)/สัปดาห์"
case "tr":
return "\(currencySymbol)\(price)/ay · ~\(currencySymbol)\(weeklyPriceString)/hafta"
case "uk":
return "\(currencySymbol)\(price)/міс · ~\(currencySymbol)\(weeklyPriceString)/тиж"
case "vi":
return "\(currencySymbol)\(price)/tháng · ~\(currencySymbol)\(weeklyPriceString)/tuần"
case "zh_Hans":
return "每月\(currencySymbol)\(price)元 · 约\(currencySymbol)\(weeklyPriceString)元/周"
case "zh_Hant":
return "每月\(currencySymbol)\(price) · 約\(currencySymbol)\(weeklyPriceString)/周"
default:
return "\(currencySymbol)\(price)/month · ~\(currencySymbol)\(weeklyPriceString)/week"
}
}
/// -
/// - Parameters:
/// - languageCode:
/// - price:
/// - currencySymbol:
/// - Returns:
private static func buildYearlySubtitle(languageCode: String, price: String, currencySymbol: String) -> String {
let yearlyPrice = Double(price) ?? 0
let weeklyPrice = yearlyPrice / 52
let weeklyPriceString = String(format: "%.2f", weeklyPrice)
switch languageCode {
case "ar":
return "\(currencySymbol)\(price)/سنة · فقط \(currencySymbol)\(weeklyPriceString)/أسبوع"
case "de":
return "\(currencySymbol)\(price)/Jahr · nur \(currencySymbol)\(weeklyPriceString)/Woche"
case "en":
return "\(currencySymbol)\(price)/year · only \(currencySymbol)\(weeklyPriceString)/week"
case "es":
return "\(currencySymbol)\(price)/año · solo \(currencySymbol)\(weeklyPriceString)/semana"
case "fil":
return "\(currencySymbol)\(price)/taon · \(currencySymbol)\(weeklyPriceString)/linggo lang"
case "fr":
return "\(currencySymbol)\(price)/an · seulement \(currencySymbol)\(weeklyPriceString)/semaine"
case "id":
return "\(currencySymbol)\(price)/tahun · hanya \(currencySymbol)\(weeklyPriceString)/minggu"
case "it":
return "\(currencySymbol)\(price)/anno · solo \(currencySymbol)\(weeklyPriceString)/settimana"
case "ja":
return "\(currencySymbol)\(price)/年 · わずか\(currencySymbol)\(weeklyPriceString)/週"
case "ko":
return "\(currencySymbol)\(price)/년 · 단\(currencySymbol)\(weeklyPriceString)/주"
case "pl":
return "\(currencySymbol)\(price)/rok · tylko \(currencySymbol)\(weeklyPriceString)/tydzień"
case "pt":
return "\(currencySymbol)\(price)/ano · apenas \(currencySymbol)\(weeklyPriceString)/semana"
case "ru":
return "\(currencySymbol)\(price)/год · всего \(currencySymbol)\(weeklyPriceString)/нед"
case "th":
return "\(currencySymbol)\(price)/ปี · เพียง \(currencySymbol)\(weeklyPriceString)/สัปดาห์"
case "tr":
return "\(currencySymbol)\(price)/yıl · sadece \(currencySymbol)\(weeklyPriceString)/hafta"
case "uk":
return "\(currencySymbol)\(price)/рік · ~\(currencySymbol)\(weeklyPriceString)/тиж"
case "vi":
return "\(currencySymbol)\(price)/năm · chỉ \(currencySymbol)\(weeklyPriceString)/tuần"
case "zh_Hans":
return "每年\(currencySymbol)\(price)元 · 仅\(currencySymbol)\(weeklyPriceString)元/周"
case "zh_Hant":
return "每年\(currencySymbol)\(price) · 僅\(currencySymbol)\(weeklyPriceString)/周"
default:
return "\(currencySymbol)\(price)/year · only \(currencySymbol)\(weeklyPriceString)/week"
}
}
// MARK: -
///
/// - Parameters:
/// - languageCode:
/// - introPrice:
/// - currencySymbol:
/// - productUnit:
/// - numberOfPeriods:
/// - Returns:
private static func buildPayAsYouGoText(languageCode: String, introPrice: String, currencySymbol: String, productUnit: String, numberOfPeriods: Int) -> String {
switch languageCode {
case "ar":
if numberOfPeriods == 1 {
return "عرض خاص: \(currencySymbol)\(introPrice)/\(productUnit) (الأسبوع الأول)"
} else {
return "عرض خاص: \(currencySymbol)\(introPrice)/\(productUnit) (الأسبوعين الأولين)"
}
case "de":
if numberOfPeriods == 1 {
return "Sonderangebot: \(currencySymbol)\(introPrice)/\(productUnit) (erste Woche)"
} else {
return "Sonderangebot: \(currencySymbol)\(introPrice)/\(productUnit) (erste \(numberOfPeriods) Wochen)"
}
case "en":
if numberOfPeriods == 1 {
return "Special offer: \(currencySymbol)\(introPrice)/\(productUnit) (first \(productUnit))"
} else {
return "Special offer: \(currencySymbol)\(introPrice)/\(productUnit) (first \(numberOfPeriods) \(productUnit)s)"
}
case "es":
if numberOfPeriods == 1 {
return "Oferta especial: \(currencySymbol)\(introPrice)/\(productUnit) (primer \(productUnit))"
} else {
return "Oferta especial: \(currencySymbol)\(introPrice)/\(productUnit) (primeros \(numberOfPeriods) \(productUnit)s)"
}
case "fil":
if numberOfPeriods == 1 {
return "Espesyal na alok: \(currencySymbol)\(introPrice)/\(productUnit) (unang \(productUnit))"
} else {
return "Espesyal na alok: \(currencySymbol)\(introPrice)/\(productUnit) (unang \(numberOfPeriods) \(productUnit)s)"
}
case "fr":
if numberOfPeriods == 1 {
return "Offre spéciale: \(currencySymbol)\(introPrice)/\(productUnit) (premier \(productUnit))"
} else {
return "Offre spéciale: \(currencySymbol)\(introPrice)/\(productUnit) (premiers \(numberOfPeriods) \(productUnit)s)"
}
case "id":
if numberOfPeriods == 1 {
return "Penawaran khusus: \(currencySymbol)\(introPrice)/\(productUnit) (\(productUnit) pertama)"
} else {
return "Penawaran khusus: \(currencySymbol)\(introPrice)/\(productUnit) (\(numberOfPeriods) \(productUnit) pertama)"
}
case "it":
if numberOfPeriods == 1 {
return "Offerta speciale: \(currencySymbol)\(introPrice)/\(productUnit) (primo \(productUnit))"
} else {
return "Offerta speciale: \(currencySymbol)\(introPrice)/\(productUnit) (primi \(numberOfPeriods) \(productUnit)s)"
}
case "ja":
if numberOfPeriods == 1 {
return "特別価格: \(currencySymbol)\(introPrice)/\(productUnit) (初回\(productUnit))"
} else {
return "特別価格: \(currencySymbol)\(introPrice)/\(productUnit) (初回\(numberOfPeriods)\(productUnit))"
}
case "ko":
if numberOfPeriods == 1 {
return "특별 할인: \(currencySymbol)\(introPrice)/\(productUnit) (첫 \(productUnit))"
} else {
return "특별 할인: \(currencySymbol)\(introPrice)/\(productUnit) (첫 \(numberOfPeriods)\(productUnit))"
}
case "pl":
if numberOfPeriods == 1 {
return "Oferta specjalna: \(currencySymbol)\(introPrice)/\(productUnit) (pierwszy \(productUnit))"
} else {
return "Oferta specjalna: \(currencySymbol)\(introPrice)/\(productUnit) (pierwsze \(numberOfPeriods) \(productUnit)s)"
}
case "pt":
if numberOfPeriods == 1 {
return "Oferta especial: \(currencySymbol)\(introPrice)/\(productUnit) (primeiro \(productUnit))"
} else {
return "Oferta especial: \(currencySymbol)\(introPrice)/\(productUnit) (primeiros \(numberOfPeriods) \(productUnit)s)"
}
case "ru":
if numberOfPeriods == 1 {
return "Специальное предложение: \(currencySymbol)\(introPrice)/\(productUnit) (первый \(productUnit))"
} else {
return "Специальное предложение: \(currencySymbol)\(introPrice)/\(productUnit) (первые \(numberOfPeriods) \(productUnit)s)"
}
case "th":
if numberOfPeriods == 1 {
return "ข้อเสนอพิเศษ: \(currencySymbol)\(introPrice)/\(productUnit) (\(productUnit)แรก)"
} else {
return "ข้อเสนอพิเศษ: \(currencySymbol)\(introPrice)/\(productUnit) (\(numberOfPeriods) \(productUnit)แรก)"
}
case "tr":
if numberOfPeriods == 1 {
return "Özel teklif: \(currencySymbol)\(introPrice)/\(productUnit) (ilk \(productUnit))"
} else {
return "Özel teklif: \(currencySymbol)\(introPrice)/\(productUnit) (ilk \(numberOfPeriods) \(productUnit))"
}
case "uk":
if numberOfPeriods == 1 {
return "Спеціальна пропозиція: \(currencySymbol)\(introPrice)/\(productUnit) (перший \(productUnit))"
} else {
return "Спеціальна пропозиція: \(currencySymbol)\(introPrice)/\(productUnit) (перші \(numberOfPeriods) \(productUnit)s)"
}
case "vi":
if numberOfPeriods == 1 {
return "Ưu đãi đặc biệt: \(currencySymbol)\(introPrice)/\(productUnit) (\(productUnit) đầu tiên)"
} else {
return "Ưu đãi đặc biệt: \(currencySymbol)\(introPrice)/\(productUnit) (\(numberOfPeriods) \(productUnit) đầu tiên)"
}
case "zh_Hans":
if numberOfPeriods == 1 {
return "限时优惠: 每\(productUnit)\(currencySymbol)\(introPrice)元(首\(productUnit)"
} else {
return "限时优惠: 每\(productUnit)\(currencySymbol)\(introPrice)元(前\(numberOfPeriods)\(productUnit)"
}
case "zh_Hant":
if numberOfPeriods == 1 {
return "限時優惠: 每\(productUnit)\(currencySymbol)\(introPrice)(首\(productUnit)"
} else {
return "限時優惠: 每\(productUnit)\(currencySymbol)\(introPrice)(前\(numberOfPeriods)\(productUnit)"
}
default:
if numberOfPeriods == 1 {
return "Special offer: \(currencySymbol)\(introPrice)/\(productUnit) (first \(productUnit))"
} else {
return "Special offer: \(currencySymbol)\(introPrice)/\(productUnit) (first \(numberOfPeriods) \(productUnit)s)"
}
}
}
///
/// - Parameters:
/// - languageCode:
/// - introPrice:
/// - originalPrice:
/// - currencySymbol:
/// - productUnit:
/// - Returns:
private static func buildPayUpFrontText(languageCode: String, introPrice: String, originalPrice: String, currencySymbol: String, productUnit: String) -> String {
//
let original = Double(originalPrice) ?? 0
let discounted = Double(introPrice) ?? 0
let discountPercent = original > 0 ? Int(((original - discounted) / original * 100).rounded()) : 0
switch languageCode {
case "ar":
return "وفر \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "de":
return "Spare \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "en":
return "Save \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "es":
return "Ahorra \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "fil":
return "Makatipid ng \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "fr":
return "Économisez \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "id":
return "Hemat \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "it":
return "Risparmia \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "ja":
return "\(discountPercent)%OFF: \(currencySymbol)\(introPrice)/\(productUnit)"
case "ko":
return "\(discountPercent)% 할인: \(currencySymbol)\(introPrice)/\(productUnit)"
case "pl":
return "Zaoszczędź \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "pt":
return "Economize \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "ru":
return "Экономия \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "th":
return "ประหยัด \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "tr":
return "%\(discountPercent) tasarruf: \(currencySymbol)\(introPrice)/\(productUnit)"
case "uk":
return "Економія \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "vi":
return "Tiết kiệm \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
case "zh_Hans":
return "节省\(discountPercent)%: 每\(productUnit)\(currencySymbol)\(introPrice)"
case "zh_Hant":
return "節省\(discountPercent)%: 每\(productUnit)\(currencySymbol)\(introPrice)"
default:
return "Save \(discountPercent)%: \(currencySymbol)\(introPrice)/\(productUnit)"
}
}
///
/// - Parameters:
/// - languageCode:
/// - numberOfPeriods:
/// - trialPeriodUnit:
/// - productUnit:
/// - price:
/// - currencySymbol:
/// - Returns:
private static func buildFreeTrialText(languageCode: String, numberOfPeriods: Int, trialPeriodUnit: String, productUnit: String, price: String, currencySymbol: String) -> String {
switch languageCode {
case "ar":
return "تجربة مجانية \(numberOfPeriods) \(trialPeriodUnit)، ثم \(currencySymbol)\(price)/\(productUnit)"
case "de":
return "\(numberOfPeriods)-\(trialPeriodUnit)ige kostenlose Testphase, dann \(currencySymbol)\(price)/\(productUnit)"
case "en":
return "Free trial \(numberOfPeriods) \(trialPeriodUnit), then \(currencySymbol)\(price)/\(productUnit)"
case "es":
return "Prueba gratuita \(numberOfPeriods) \(trialPeriodUnit), luego \(currencySymbol)\(price)/\(productUnit)"
case "fil":
return "Libreng pagsubok \(numberOfPeriods) \(trialPeriodUnit), pagkatapos \(currencySymbol)\(price)/\(productUnit)"
case "fr":
return "Essai gratuit \(numberOfPeriods) \(trialPeriodUnit), puis \(currencySymbol)\(price)/\(productUnit)"
case "id":
return "Coba gratis \(numberOfPeriods) \(trialPeriodUnit), lalu \(currencySymbol)\(price)/\(productUnit)"
case "it":
return "Prova gratuita \(numberOfPeriods) \(trialPeriodUnit), poi \(currencySymbol)\(price)/\(productUnit)"
case "ja":
return "\(numberOfPeriods)\(trialPeriodUnit)無料トライアル、その後\(currencySymbol)\(price)/\(productUnit)"
case "ko":
return "\(numberOfPeriods)\(trialPeriodUnit) 무료 체험, 이후 \(currencySymbol)\(price)/\(productUnit)"
case "pl":
return "Bezpłatny okres próbny \(numberOfPeriods) \(trialPeriodUnit), następnie \(currencySymbol)\(price)/\(productUnit)"
case "pt":
return "Teste gratuito \(numberOfPeriods) \(trialPeriodUnit), depois \(currencySymbol)\(price)/\(productUnit)"
case "ru":
return "Бесплатная пробная версия \(numberOfPeriods) \(trialPeriodUnit), затем \(currencySymbol)\(price)/\(productUnit)"
case "th":
return "ทดลองใช้ฟรี \(numberOfPeriods) \(trialPeriodUnit) จากนั้น \(currencySymbol)\(price)/\(productUnit)"
case "tr":
return "\(numberOfPeriods) \(trialPeriodUnit) ücretsiz deneme, sonrasında \(currencySymbol)\(price)/\(productUnit)"
case "uk":
return "Безкоштовна пробна версія \(numberOfPeriods) \(trialPeriodUnit), потім \(currencySymbol)\(price)/\(productUnit)"
case "vi":
return "Dùng thử miễn phí \(numberOfPeriods) \(trialPeriodUnit), sau đó \(currencySymbol)\(price)/\(productUnit)"
case "zh_Hans":
return "免费试用 \(numberOfPeriods) \(trialPeriodUnit),然后每\(productUnit)\(currencySymbol)\(price)"
case "zh_Hant":
return "免費試用 \(numberOfPeriods) \(trialPeriodUnit),然後每\(productUnit)\(currencySymbol)\(price)"
default:
return "Free trial \(numberOfPeriods) \(trialPeriodUnit), then \(currencySymbol)\(price)/\(productUnit)"
}
}
}