a11y: better voice over for voice messages
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
"a11y_notifications_muted" = "Muted";
|
||||
"a11y_page_n" = "Page %1$d";
|
||||
"a11y_pause" = "Pause";
|
||||
"a11y_paused_voice_message" = "Voice message, duration: %1$@, current position: %2$@";
|
||||
"a11y_pin_field" = "PIN field";
|
||||
"a11y_play" = "Play";
|
||||
"a11y_poll_end" = "Ended poll";
|
||||
@@ -22,6 +23,7 @@
|
||||
"a11y_show_password" = "Show password";
|
||||
"a11y_start_call" = "Start a call";
|
||||
"a11y_user_menu" = "User menu";
|
||||
"a11y_voice_message" = "Voice message, duration: %1$@";
|
||||
"a11y_voice_message_record" = "Record voice message.";
|
||||
"a11y_voice_message_stop_recording" = "Stop recording";
|
||||
"a11y.view_details" = "View details";
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"a11y_notifications_muted" = "Muted";
|
||||
"a11y_page_n" = "Page %1$d";
|
||||
"a11y_pause" = "Pause";
|
||||
"a11y_paused_voice_message" = "Voice message, duration: %1$@, current position: %2$@";
|
||||
"a11y_pin_field" = "PIN field";
|
||||
"a11y_play" = "Play";
|
||||
"a11y_poll_end" = "Ended poll";
|
||||
@@ -22,6 +23,7 @@
|
||||
"a11y_show_password" = "Show password";
|
||||
"a11y_start_call" = "Start a call";
|
||||
"a11y_user_menu" = "User menu";
|
||||
"a11y_voice_message" = "Voice message, duration: %1$@";
|
||||
"a11y_voice_message_record" = "Record voice message.";
|
||||
"a11y_voice_message_stop_recording" = "Stop recording";
|
||||
"a11y.view_details" = "View details";
|
||||
|
||||
@@ -34,6 +34,10 @@ internal enum L10n {
|
||||
}
|
||||
/// Pause
|
||||
internal static var a11yPause: String { return L10n.tr("Localizable", "a11y_pause") }
|
||||
/// Voice message, duration: %1$@, current position: %2$@
|
||||
internal static func a11yPausedVoiceMessage(_ p1: Any, _ p2: Any) -> String {
|
||||
return L10n.tr("Localizable", "a11y_paused_voice_message", String(describing: p1), String(describing: p2))
|
||||
}
|
||||
/// PIN field
|
||||
internal static var a11yPinField: String { return L10n.tr("Localizable", "a11y_pin_field") }
|
||||
/// Play
|
||||
@@ -76,6 +80,10 @@ internal enum L10n {
|
||||
internal static var a11yStartCall: String { return L10n.tr("Localizable", "a11y_start_call") }
|
||||
/// User menu
|
||||
internal static var a11yUserMenu: String { return L10n.tr("Localizable", "a11y_user_menu") }
|
||||
/// Voice message, duration: %1$@
|
||||
internal static func a11yVoiceMessage(_ p1: Any) -> String {
|
||||
return L10n.tr("Localizable", "a11y_voice_message", String(describing: p1))
|
||||
}
|
||||
/// Record voice message.
|
||||
internal static var a11yVoiceMessageRecord: String { return L10n.tr("Localizable", "a11y_voice_message_record") }
|
||||
/// Stop recording
|
||||
|
||||
@@ -14,7 +14,7 @@ private struct TimelineItemAccessibilityModifier: ViewModifier {
|
||||
@ViewBuilder
|
||||
func body(content: Content) -> some View {
|
||||
switch timelineItem {
|
||||
case is PollRoomTimelineItem, is VoiceMessageRoomTimelineItem:
|
||||
case is PollRoomTimelineItem:
|
||||
content
|
||||
.accessibilityActions {
|
||||
Button(L10n.commonMessageActions) {
|
||||
|
||||
@@ -16,7 +16,6 @@ struct VoiceMessageRoomTimelineView: View {
|
||||
TimelineStyler(timelineItem: timelineItem) {
|
||||
VoiceMessageRoomTimelineContent(timelineItem: timelineItem,
|
||||
playerState: playerState)
|
||||
.accessibilityLabel(L10n.commonVoiceMessage)
|
||||
.frame(maxWidth: 400)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,18 +18,6 @@ struct VoiceMessageRoomPlaybackView: View {
|
||||
let onPlayPause: () -> Void
|
||||
let onSeek: (Double) -> Void
|
||||
let onScrubbing: (Bool) -> Void
|
||||
|
||||
var timeLabelContent: String {
|
||||
// Display the duration if progress is 0.0
|
||||
let percent = playerState.progress > 0.0 ? playerState.progress : 1.0
|
||||
// If the duration is greater or equal 10 minutes, use the long format
|
||||
let elapsed = Date(timeIntervalSinceReferenceDate: playerState.duration * percent)
|
||||
if playerState.duration >= 600 {
|
||||
return DateFormatter.longElapsedTimeFormatter.string(from: elapsed)
|
||||
} else {
|
||||
return DateFormatter.elapsedTimeFormatter.string(from: elapsed)
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
HStack(spacing: 8) {
|
||||
@@ -54,6 +42,38 @@ struct VoiceMessageRoomPlaybackView: View {
|
||||
.onChange(of: isDragging) { _, newValue in
|
||||
onScrubbing(newValue)
|
||||
}
|
||||
.accessibilityLabel(accessibilityLabel)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private var durationString: String {
|
||||
let duration = Date(timeIntervalSinceReferenceDate: playerState.duration)
|
||||
return if playerState.duration >= 600 {
|
||||
DateFormatter.longElapsedTimeFormatter.string(from: duration)
|
||||
} else {
|
||||
DateFormatter.elapsedTimeFormatter.string(from: duration)
|
||||
}
|
||||
}
|
||||
|
||||
private var timeLabelContent: String {
|
||||
// Display the duration if progress is 0.0
|
||||
let percent = playerState.progress > 0.0 ? playerState.progress : 1.0
|
||||
// If the duration is greater or equal 10 minutes, use the long format
|
||||
let elapsed = Date(timeIntervalSinceReferenceDate: playerState.duration * percent)
|
||||
if playerState.duration >= 600 {
|
||||
return DateFormatter.longElapsedTimeFormatter.string(from: elapsed)
|
||||
} else {
|
||||
return DateFormatter.elapsedTimeFormatter.string(from: elapsed)
|
||||
}
|
||||
}
|
||||
|
||||
private var accessibilityLabel: String {
|
||||
if playerState.progress > 0.0 {
|
||||
L10n.a11yPausedVoiceMessage(durationString, timeLabelContent)
|
||||
} else {
|
||||
L10n.a11yVoiceMessage(durationString)
|
||||
}
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
|
||||
Reference in New Issue
Block a user