diff --git a/firka/ios/TimetableWidget/TimeFormatHelper.swift b/firka/ios/TimetableWidget/TimeFormatHelper.swift index ff5c7bf..3c160f2 100644 --- a/firka/ios/TimetableWidget/TimeFormatHelper.swift +++ b/firka/ios/TimetableWidget/TimeFormatHelper.swift @@ -1,8 +1,9 @@ import Foundation +import ActivityKit struct TimeFormatHelper { - static func compactTime(remaining: TimeInterval) -> String { - let lang = Locale.current.languageCode ?? "hu" + static func compactTime(remaining: TimeInterval, labels: TimetableActivityAttributes.ContentState.Labels?) -> String { + let lang = detectLanguage(from: labels) let hours = Int(max(0, remaining)) / 3600 let minutes = (Int(max(0, remaining)) % 3600) / 60 @@ -14,8 +15,8 @@ struct TimeFormatHelper { } } - static func compactSeasonalBreak(from message: String) -> String { - let lang = Locale.current.languageCode ?? "hu" + static func compactSeasonalBreak(from message: String, labels: TimetableActivityAttributes.ContentState.Labels?) -> String { + let lang = detectLanguage(from: labels) let components = message.split(separator: " ") let number = components.first.map(String.init) ?? "" @@ -31,12 +32,34 @@ struct TimeFormatHelper { } } + // MARK: - Language Detection + + private static func detectLanguage(from labels: TimetableActivityAttributes.ContentState.Labels?) -> String { + guard let labels = labels else { + return Locale.current.languageCode ?? "hu" + } + + if let text = labels.remainingLabel ?? labels.cancelledText { + let lower = text.lowercased() + + if lower.contains("time") || lower.contains("remaining") || lower.contains("cancelled") { + return "en" + } else if lower.contains("verbleibende") || lower.contains("zeit") || lower.contains("entfallen") { + return "de" + } else { + return "hu" + } + } + + return Locale.current.languageCode ?? "hu" + } + // MARK: - Private Helpers private static func shortHours(_ hours: Int, language: String) -> String { switch language { case "en": return "\(hours)h" - case "de": return "\(hours)h" + case "de": return "\(hours)td" case "hu": return "\(hours)รณ" default: return "\(hours)h" } @@ -45,7 +68,7 @@ struct TimeFormatHelper { private static func shortMinutes(_ minutes: Int, language: String) -> String { switch language { case "en": return "\(minutes)m" - case "de": return "\(minutes)m" + case "de": return "\(minutes)Min" case "hu": return "\(minutes)p" default: return "\(minutes)m" } @@ -54,7 +77,7 @@ struct TimeFormatHelper { private static func shortDays(_ days: Int, language: String) -> String { switch language { case "en": return "\(days)d" - case "de": return "\(days)d" + case "de": return "\(days)T" case "hu": return "\(days)n" default: return "\(days)d" } diff --git a/firka/ios/TimetableWidget/TimetableLiveActivity.swift b/firka/ios/TimetableWidget/TimetableLiveActivity.swift index 8453d0f..9fc70b3 100644 --- a/firka/ios/TimetableWidget/TimetableLiveActivity.swift +++ b/firka/ios/TimetableWidget/TimetableLiveActivity.swift @@ -245,7 +245,10 @@ struct TimetableLiveActivity: Widget { } compactTrailing: { if mode == "seasonalBreak" { // Seasonal break: static short format from backend message - let compactText = TimeFormatHelper.compactSeasonalBreak(from: context.state.message ?? "") + let compactText = TimeFormatHelper.compactSeasonalBreak( + from: context.state.message ?? "", + labels: context.state.labels + ) Text(compactText) .font(.system(size: 12, weight: .semibold, design: .rounded)) @@ -259,10 +262,12 @@ struct TimetableLiveActivity: Widget { .font(.system(size: 12, weight: .semibold)) .frame(width: 50) } else { - // Dynamic short format for lesson/break/beforeSchool/newYearEve TimelineView(.periodic(from: context.state.currentTime, by: 60.0)) { timeline in let remaining = context.state.endTime.timeIntervalSince(timeline.date) - let compactText = TimeFormatHelper.compactTime(remaining: remaining) + let compactText = TimeFormatHelper.compactTime( + remaining: remaining, + labels: context.state.labels + ) Text(compactText) .font(.system(size: 12, weight: .semibold, design: .rounded))