diff --git a/ElementX/Resources/Localizations/en.lproj/Localizable.strings b/ElementX/Resources/Localizations/en.lproj/Localizable.strings index c068db9ce..c1594e4cd 100644 --- a/ElementX/Resources/Localizations/en.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/en.lproj/Localizable.strings @@ -12,6 +12,7 @@ "a11y_pin_field" = "PIN field"; "a11y_play" = "Play"; "a11y_poll_end" = "Ended poll"; +"a11y_polls_winning_answer" = "This is the winning answer"; "a11y_react_with" = "React with %1$@"; "a11y_react_with_other_emojis" = "React with other emojis"; "a11y_read_receipts_multiple" = "Read by %1$@ and %2$@"; @@ -135,10 +136,12 @@ "banner_migrate_to_native_sliding_sync_title" = "Upgrade available"; "banner_set_up_recovery_content" = "Recover your cryptographic identity and message history with a recovery key if you have lost all your existing devices."; "banner_set_up_recovery_title" = "Set up recovery to protect your account"; +"call_invalid_audio_device_bluetooth_devices_disabled" = "Element Call does not support using Bluetooth audio devices in this Android version. Please select a different audio device."; "common_about" = "About"; "common_acceptable_use_policy" = "Acceptable use policy"; "common_adding_caption" = "Adding caption"; "common_advanced_settings" = "Advanced settings"; +"common_an_image" = "an image"; "common_analytics" = "Analytics"; "common_appearance" = "Appearance"; "common_audio" = "Audio"; @@ -242,6 +245,7 @@ "common_sending" = "Sending…"; "common_sending_failed" = "Sending failed"; "common_sent" = "Sent"; +"common_sentence_delimiter" = ". "; "common_server_not_supported" = "Server not supported"; "common_server_url" = "Server URL"; "common_settings" = "Settings"; @@ -432,6 +436,10 @@ "screen_bottom_sheet_manage_room_member_unban_member_confirmation_description" = "They would be able to join the room again if invited"; "screen_bottom_sheet_manage_room_member_unban_member_confirmation_title" = "Are you sure you want to unban this member?"; "screen_bottom_sheet_manage_room_member_unbanning_user" = "Unbanning %1$@"; +"screen_create_poll_option_accessibility_label" = "%1$@: %2$@"; +"screen_create_poll_options_section_title" = "Options"; +"screen_create_poll_remove_accessibility_label" = "Remove %1$@"; +"screen_create_poll_settings_section_title" = "Settings"; "screen_create_room_room_access_section_anyone_option_description" = "Anyone can join this room"; "screen_create_room_room_access_section_anyone_option_title" = "Anyone"; "screen_create_room_room_access_section_header" = "Room Access"; @@ -658,6 +666,7 @@ "screen_create_poll_anonymous_headline" = "Hide votes"; "screen_create_poll_answer_hint" = "Option %1$d"; "screen_create_poll_cancel_confirmation_title_ios" = "Cancel Poll"; +"screen_create_poll_delete_option_a11y" = "Delete option %1$@"; "screen_create_poll_question_desc" = "Question or topic"; "screen_create_poll_question_hint" = "What is the poll about?"; "screen_create_poll_title" = "Create Poll"; @@ -967,13 +976,14 @@ "screen_room_roles_and_permissions_roles_header" = "Roles"; "screen_room_roles_and_permissions_room_details" = "Room details"; "screen_room_roles_and_permissions_title" = "Roles and permissions"; -"screen_room_timeline_add_reaction" = "Add emoji"; +"screen_room_timeline_add_reaction" = "Add a reaction"; "screen_room_timeline_beginning_of_room" = "This is the beginning of %1$@."; "screen_room_timeline_beginning_of_room_no_name" = "This is the beginning of this conversation."; "screen_room_timeline_legacy_call" = "Unsupported call. Ask if the caller can use the new Element X app."; "screen_room_timeline_less_reactions" = "Show less"; "screen_room_timeline_message_copied" = "Message copied"; "screen_room_timeline_no_permission_to_post" = "You do not have permission to post to this room"; +"screen_room_timeline_reaction_you_a11y" = "You reacted with %1$@"; "screen_room_timeline_reactions_show_more" = "Show more"; "screen_room_timeline_read_marker_title" = "New"; "screen_room_title" = "Chat"; diff --git a/ElementX/Resources/Localizations/en.lproj/Localizable.stringsdict b/ElementX/Resources/Localizations/en.lproj/Localizable.stringsdict index 9aa07f915..0223b8c80 100644 --- a/ElementX/Resources/Localizations/en.lproj/Localizable.stringsdict +++ b/ElementX/Resources/Localizations/en.lproj/Localizable.stringsdict @@ -18,6 +18,22 @@ %1$d digits entered + a11y_polls_percent_of_total + + NSStringLocalizedFormatKey + %#@COUNT@ + COUNT + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %1$d percent of total votes + other + %1$d percents of total votes + + a11y_read_receipts_multiple_with_others NSStringLocalizedFormatKey @@ -258,6 +274,38 @@ %1$@ +%2$d others want to join this room + screen_room_timeline_reaction_a11y + + NSStringLocalizedFormatKey + %#@COUNT@ + COUNT + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %1$d member reacted with %2$@ + other + %1$d members reacted with %2$@ + + + screen_room_timeline_reaction_including_you_a11y + + NSStringLocalizedFormatKey + %#@COUNT@ + COUNT + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + You and %1$d member reacted with %2$@ + other + You and %1$d members reacted with %2$@ + + screen_room_timeline_state_changes NSStringLocalizedFormatKey diff --git a/ElementX/Sources/Generated/Strings.swift b/ElementX/Sources/Generated/Strings.swift index 429c6a4a5..49a016b84 100644 --- a/ElementX/Sources/Generated/Strings.swift +++ b/ElementX/Sources/Generated/Strings.swift @@ -46,6 +46,12 @@ internal enum L10n { internal static var a11yPoll: String { return L10n.tr("Localizable", "a11y_poll") } /// Ended poll internal static var a11yPollEnd: String { return L10n.tr("Localizable", "a11y_poll_end") } + /// Plural format key: "%#@COUNT@" + internal static func a11yPollsPercentOfTotal(_ p1: Int) -> String { + return L10n.tr("Localizable", "a11y_polls_percent_of_total", p1) + } + /// This is the winning answer + internal static var a11yPollsWinningAnswer: String { return L10n.tr("Localizable", "a11y_polls_winning_answer") } /// React with %1$@ internal static func a11yReactWith(_ p1: Any) -> String { return L10n.tr("Localizable", "a11y_react_with", String(describing: p1)) @@ -314,6 +320,8 @@ internal enum L10n { internal static var bannerSetUpRecoverySubmit: String { return L10n.tr("Localizable", "banner_set_up_recovery_submit") } /// Set up recovery to protect your account internal static var bannerSetUpRecoveryTitle: String { return L10n.tr("Localizable", "banner_set_up_recovery_title") } + /// Element Call does not support using Bluetooth audio devices in this Android version. Please select a different audio device. + internal static var callInvalidAudioDeviceBluetoothDevicesDisabled: String { return L10n.tr("Localizable", "call_invalid_audio_device_bluetooth_devices_disabled") } /// About internal static var commonAbout: String { return L10n.tr("Localizable", "common_about") } /// Acceptable use policy @@ -322,6 +330,8 @@ internal enum L10n { internal static var commonAddingCaption: String { return L10n.tr("Localizable", "common_adding_caption") } /// Advanced settings internal static var commonAdvancedSettings: String { return L10n.tr("Localizable", "common_advanced_settings") } + /// an image + internal static var commonAnImage: String { return L10n.tr("Localizable", "common_an_image") } /// Analytics internal static var commonAnalytics: String { return L10n.tr("Localizable", "common_analytics") } /// Appearance @@ -556,6 +566,8 @@ internal enum L10n { internal static var commonSendingFailed: String { return L10n.tr("Localizable", "common_sending_failed") } /// Sent internal static var commonSent: String { return L10n.tr("Localizable", "common_sent") } + /// . + internal static var commonSentenceDelimiter: String { return L10n.tr("Localizable", "common_sentence_delimiter") } /// Server not supported internal static var commonServerNotSupported: String { return L10n.tr("Localizable", "common_server_not_supported") } /// Server URL @@ -1315,10 +1327,26 @@ internal enum L10n { internal static var screenCreatePollCancelConfirmationContentIos: String { return L10n.tr("Localizable", "screen_create_poll_cancel_confirmation_content_ios") } /// Cancel Poll internal static var screenCreatePollCancelConfirmationTitleIos: String { return L10n.tr("Localizable", "screen_create_poll_cancel_confirmation_title_ios") } + /// Delete option %1$@ + internal static func screenCreatePollDeleteOptionA11y(_ p1: Any) -> String { + return L10n.tr("Localizable", "screen_create_poll_delete_option_a11y", String(describing: p1)) + } + /// %1$@: %2$@ + internal static func screenCreatePollOptionAccessibilityLabel(_ p1: Any, _ p2: Any) -> String { + return L10n.tr("Localizable", "screen_create_poll_option_accessibility_label", String(describing: p1), String(describing: p2)) + } + /// Options + internal static var screenCreatePollOptionsSectionTitle: String { return L10n.tr("Localizable", "screen_create_poll_options_section_title") } /// Question or topic internal static var screenCreatePollQuestionDesc: String { return L10n.tr("Localizable", "screen_create_poll_question_desc") } /// What is the poll about? internal static var screenCreatePollQuestionHint: String { return L10n.tr("Localizable", "screen_create_poll_question_hint") } + /// Remove %1$@ + internal static func screenCreatePollRemoveAccessibilityLabel(_ p1: Any) -> String { + return L10n.tr("Localizable", "screen_create_poll_remove_accessibility_label", String(describing: p1)) + } + /// Settings + internal static var screenCreatePollSettingsSectionTitle: String { return L10n.tr("Localizable", "screen_create_poll_settings_section_title") } /// Create Poll internal static var screenCreatePollTitle: String { return L10n.tr("Localizable", "screen_create_poll_title") } /// New room @@ -2302,7 +2330,7 @@ internal enum L10n { } /// View internal static var screenRoomSingleKnockRequestViewButtonTitle: String { return L10n.tr("Localizable", "screen_room_single_knock_request_view_button_title") } - /// Add emoji + /// Add a reaction internal static var screenRoomTimelineAddReaction: String { return L10n.tr("Localizable", "screen_room_timeline_add_reaction") } /// This is the beginning of %1$@. internal static func screenRoomTimelineBeginningOfRoom(_ p1: Any) -> String { @@ -2318,6 +2346,18 @@ internal enum L10n { internal static var screenRoomTimelineMessageCopied: String { return L10n.tr("Localizable", "screen_room_timeline_message_copied") } /// You do not have permission to post to this room internal static var screenRoomTimelineNoPermissionToPost: String { return L10n.tr("Localizable", "screen_room_timeline_no_permission_to_post") } + /// Plural format key: "%#@COUNT@" + internal static func screenRoomTimelineReactionA11y(_ p1: Int) -> String { + return L10n.tr("Localizable", "screen_room_timeline_reaction_a11y", p1) + } + /// Plural format key: "%#@COUNT@" + internal static func screenRoomTimelineReactionIncludingYouA11y(_ p1: Int) -> String { + return L10n.tr("Localizable", "screen_room_timeline_reaction_including_you_a11y", p1) + } + /// You reacted with %1$@ + internal static func screenRoomTimelineReactionYouA11y(_ p1: Any) -> String { + return L10n.tr("Localizable", "screen_room_timeline_reaction_you_a11y", String(describing: p1)) + } /// Show less internal static var screenRoomTimelineReactionsShowLess: String { return L10n.tr("Localizable", "screen_room_timeline_reactions_show_less") } /// Show more diff --git a/ElementX/Sources/Screens/CreatePollScreen/View/PollFormScreen.swift b/ElementX/Sources/Screens/CreatePollScreen/View/PollFormScreen.swift index 5369b53f8..2056d39b2 100644 --- a/ElementX/Sources/Screens/CreatePollScreen/View/PollFormScreen.swift +++ b/ElementX/Sources/Screens/CreatePollScreen/View/PollFormScreen.swift @@ -91,6 +91,9 @@ struct PollFormScreen: View { }) .accessibilityIdentifier(A11yIdentifiers.pollFormScreen.addOption) } + } header: { + Text(L10n.screenCreatePollOptionsSectionTitle) + .compoundListSectionHeader() } // Disables animations when the text view resizes for multiline .animation(.noAnimation, value: UUID()) @@ -106,6 +109,9 @@ struct PollFormScreen: View { ListRow(label: .plain(title: L10n.screenCreatePollAnonymousDesc), kind: .toggle($context.isUndisclosed)) .accessibilityIdentifier(A11yIdentifiers.pollFormScreen.pollKind) + } header: { + Text(L10n.screenCreatePollSettingsSectionTitle) + .compoundListSectionHeader() } } @@ -168,13 +174,17 @@ private struct PollFormOptionRow: View { } .disabled(!canDeleteItem) .buttonStyle(.compound(.textLink)) - .accessibilityLabel(L10n.actionRemove) + .accessibilityLabel(L10n.screenCreatePollRemoveAccessibilityLabel(L10n.screenCreatePollOptionAccessibilityLabel(placeholder, text))) } TextField(text: $text, axis: .vertical) { Text(placeholder) .compoundTextFieldPlaceholder() } + // For some reason the placeholder is always read by voice over even if I disable or override the label, so if the text is empty we use an empy accessibility label + .accessibilityLabel(text.isEmpty ? "" : L10n.screenCreatePollOptionAccessibilityLabel(placeholder, text)) + // Allows the move action voice over to give priority to this field over the remove button + .accessibilitySortPriority(1) .tint(.compound.iconAccentTertiary) .alignmentGuide(.listRowSeparatorLeading) { _ in 0 } } diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPad-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPad-en-GB.png index 85c988c80..8aff96102 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPad-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPad-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ccafda1521bc9a2620fb3698b0f743fa90c91b7b83b8fb6559f5862e1acbf46e -size 121014 +oid sha256:a8b3c7bef372d17793e3418e76af0b4532079cbf2ddb405abfcb9861a4a943f6 +size 126606 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPad-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPad-pseudo.png index 7fd3ffd2b..2d01e1240 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPad-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPad-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1e6b25c989524f3a1e89f2c85e8e0038c26cff7861b5f7858b7d76adbcf92a07 -size 126701 +oid sha256:cb9d706b66b2c63784e434b86f93e60e005e27965a4caff8ff1bbae1dcbe0e14 +size 132825 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPhone-16-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPhone-16-en-GB.png index ccd3c6ee0..6b7e55aa1 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPhone-16-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPhone-16-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f0daee86253e12e036200de2891879f544e36910ebea901618d56bbe7149cc5 -size 73283 +oid sha256:75edde867bdf7993b76f0d42527c30bbee6e860752ccc3cc6eb697658105c7db +size 76334 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPhone-16-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPhone-16-pseudo.png index 6cd747664..48c0cf777 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPhone-16-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.Edit-iPhone-16-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3f72d6f9c708cc71a40ed5018f6648e9215966148881f9b38412b3d63f4dfb5 -size 83465 +oid sha256:b336a45136ad087539f5cd48160fc73f5ba2bdd8ec32893d2ba0eabac22052f9 +size 88052 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPad-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPad-en-GB.png index 3c4c6c3d8..54ac2420c 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPad-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPad-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4491fd198f3b9bd21cbb07f466ada9cba753975eef4db7c4e0f229484f0eb038 -size 122633 +oid sha256:5cad299415956ed436e1640bc4483c9c68df7e4896cc6504c7da900b6e36692f +size 128852 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPad-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPad-pseudo.png index 982e497b0..c0b180c86 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPad-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPad-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:39bc16d2356c9c28d54a7f221ff31caefb6d7d1c51f8b1243421a7d0f5754f6c -size 133043 +oid sha256:a861bddb7bb7ff66e915c81d264f12c708a967426f72867afe6902d7c4456ead +size 139457 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPhone-16-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPhone-16-en-GB.png index 7f7f0df22..00d35a1d1 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPhone-16-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPhone-16-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ad3439570aa4cb816db2a33b4a9726fb22a910d0eef4ab6124a2e307f169db56 -size 72046 +oid sha256:21b97b5d0852b1dbe372304b5375fbcb0e036c8c5f8279464919248498899621 +size 77230 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPhone-16-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPhone-16-pseudo.png index 37a444ada..87c721f2e 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPhone-16-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/pollFormScreen.New-iPhone-16-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3c166c83623fbda8e11afa3009601ee0decaa2fa80f514b84a38c619ee0fa05 -size 88135 +oid sha256:d2f11cdd4e134b5450d4afd34257b4c55ab10a39620e35caa8530f927393b1aa +size 93688