From b98bc85cf1431c2172365b0b44d3c679b9d83c76 Mon Sep 17 00:00:00 2001 From: Toni Sevener Date: Mon, 29 Jan 2024 19:52:51 -0600 Subject: [PATCH 1/4] Add some voice over improvements - input accessory views - find and replace view - reading themes popover --- .../WKEditorToolbarExpandingView.swift | 36 ++- .../WKFindAndReplaceView.swift | 49 ++-- .../WKFindAndReplaceViewModel.swift | 2 + .../WKEditorToolbarHighlightView.swift | 16 +- .../Input Views/WKEditorInputView.swift | 16 +- .../WKSourceEditorLocalizedStrings.swift | 242 +++++++++--------- .../WKSourceEditorViewController.swift | 7 +- .../ComponentsTests/WKSourceEditorTests.swift | 1 - WMF Framework/CommonStrings.swift | 144 ++++++----- Wikipedia/Code/PageEditorViewController.swift | 117 +++++---- .../ReadingThemesControlsViewController.swift | 1 + .../en.lproj/Localizable.strings | 118 ++++----- .../qqq.lproj/Localizable.strings | 120 +++++---- .../br.lproj/Localizable.strings | Bin 88752 -> 87432 bytes .../da.lproj/Localizable.strings | Bin 109978 -> 107850 bytes .../en.lproj/Localizable.strings | Bin 446962 -> 446736 bytes .../he.lproj/Localizable.strings | Bin 482500 -> 465730 bytes .../hi.lproj/Localizable.strings | Bin 183452 -> 182758 bytes .../ia.lproj/Localizable.strings | Bin 219066 -> 209632 bytes .../it.lproj/Localizable.strings | Bin 122322 -> 117688 bytes .../ja.lproj/Localizable.strings | Bin 308350 -> 304646 bytes .../lb.lproj/Localizable.strings | Bin 117542 -> 114824 bytes .../mk.lproj/Localizable.strings | Bin 611916 -> 590100 bytes .../pt.lproj/Localizable.strings | Bin 239712 -> 229456 bytes .../ru.lproj/Localizable.strings | Bin 559376 -> 559200 bytes .../sl.lproj/Localizable.strings | Bin 226956 -> 217298 bytes .../sr-EC.lproj/Localizable.strings | Bin 527174 -> 521174 bytes .../sv.lproj/Localizable.strings | Bin 227014 -> 217378 bytes .../tr.lproj/Localizable.strings | Bin 250888 -> 240230 bytes .../zh-hans.lproj/Localizable.strings | Bin 210614 -> 210280 bytes .../zh-hant.lproj/Localizable.strings | Bin 276708 -> 266136 bytes .../UITestHelperViewController.swift | 116 +++++---- 32 files changed, 499 insertions(+), 486 deletions(-) diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Expanding/WKEditorToolbarExpandingView.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Expanding/WKEditorToolbarExpandingView.swift index 79d64bd89b3..771feb15678 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Expanding/WKEditorToolbarExpandingView.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Expanding/WKEditorToolbarExpandingView.swift @@ -84,68 +84,69 @@ class WKEditorToolbarExpandingView: WKEditorToolbarView { expandButton.isAccessibilityElement = false expandButton.setImage(WKSFSymbolIcon.for(symbol: .chevronRightCircle), for: .normal) expandButton.addTarget(self, action: #selector(tappedExpand), for: .touchUpInside) - expandButton.isAccessibilityElement = false updateExpandButtonVisibility() formatTextButton.setImage(WKSFSymbolIcon.for(symbol: .textFormat)) formatTextButton.addTarget(self, action: #selector(tappedFormatText), for: .touchUpInside) formatTextButton.accessibilityIdentifier = WKSourceEditorAccessibilityIdentifiers.current?.formatTextButton - formatTextButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonFormatText + formatTextButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarOpenTextFormatMenuButtonAccessibility referenceButton.setImage(WKSFSymbolIcon.for(symbol: .quoteOpening)) referenceButton.addTarget(self, action: #selector(tappedReference), for: .touchUpInside) - referenceButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonCitation + referenceButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarReferenceButtonAccessibility linkButton.setImage(WKSFSymbolIcon.for(symbol: .link)) linkButton.addTarget(self, action: #selector(tappedLink), for: .touchUpInside) - linkButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonLink + linkButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarLinkButtonAccessibility templateButton.setImage(WKSFSymbolIcon.for(symbol: .curlybraces)) templateButton.addTarget(self, action: #selector(tappedTemplate), for: .touchUpInside) - templateButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonTemplate + templateButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarTemplateButtonAccessibility imageButton.setImage(WKSFSymbolIcon.for(symbol: .photo)) imageButton.addTarget(self, action: #selector(tappedMedia), for: .touchUpInside) - imageButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonMedia + imageButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarImageButtonAccessibility findInPageButton.setImage(WKSFSymbolIcon.for(symbol: .docTextMagnifyingGlass)) findInPageButton.addTarget(self, action: #selector(tappedFindInPage), for: .touchUpInside) findInPageButton.accessibilityIdentifier = WKSourceEditorAccessibilityIdentifiers.current?.findButton - findInPageButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonFind + findInPageButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarFindButtonAccessibility unorderedListButton.setImage(WKSFSymbolIcon.for(symbol: .listBullet)) unorderedListButton.addTarget(self, action: #selector(tappedUnorderedList), for: .touchUpInside) - unorderedListButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonListUnordered + unorderedListButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarListUnorderedButtonAccessibility orderedListButton.setImage(WKSFSymbolIcon.for(symbol: .listNumber)) orderedListButton.addTarget(self, action: #selector(tappedOrderedList), for: .touchUpInside) - orderedListButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonListOrdered + orderedListButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarListOrderedButtonAccessibility decreaseIndentionButton.setImage(WKSFSymbolIcon.for(symbol: .decreaseIndent)) decreaseIndentionButton.addTarget(self, action: #selector(tappedDecreaseIndentation), for: .touchUpInside) - decreaseIndentionButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonDecreaseIndent + decreaseIndentionButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarIndentDecreaseButtonAccessibility decreaseIndentionButton.isEnabled = false increaseIndentionButton.setImage(WKSFSymbolIcon.for(symbol: .increaseIndent)) increaseIndentionButton.addTarget(self, action: #selector(tappedIncreaseIndentation), for: .touchUpInside) - increaseIndentionButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonInceaseIndent + increaseIndentionButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarIndentIncreaseButtonAccessibility increaseIndentionButton.isEnabled = false cursorUpButton.setImage(WKSFSymbolIcon.for(symbol: .chevronUp)) cursorUpButton.addTarget(self, action: #selector(tappedCursorUp), for: .touchUpInside) - cursorUpButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonCursorUp + cursorUpButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarCursorUpButtonAccessibility cursorDownButton.setImage(WKSFSymbolIcon.for(symbol: .chevronDown)) cursorDownButton.addTarget(self, action: #selector(tappedCursorDown), for: .touchUpInside) - cursorDownButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonCursorDown + cursorDownButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarCursorDownButtonAccessibility cursorLeftButton.setImage(WKSFSymbolIcon.for(symbol: .chevronBackward)) cursorLeftButton.addTarget(self, action: #selector(tappedCursorLeft), for: .touchUpInside) - cursorLeftButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonCursorLeft + cursorLeftButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarCursorPreviousButtonAccessibility cursorRightButton.setImage(WKSFSymbolIcon.for(symbol: .chevronForward)) cursorRightButton.addTarget(self, action: #selector(tappedCursorRight), for: .touchUpInside) - cursorRightButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonCursorRight + cursorRightButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarCursorNextButtonAccessibility + + accessibilityElements = [formatTextButton as Any, referenceButton as Any, linkButton as Any, templateButton as Any, imageButton as Any, findInPageButton as Any, unorderedListButton as Any, orderedListButton as Any, decreaseIndentionButton as Any, increaseIndentionButton as Any, cursorUpButton as Any, cursorDownButton as Any, cursorLeftButton as Any, cursorRightButton as Any] NotificationCenter.default.addObserver(self, selector: #selector(updateButtonSelectionState(_:)), name: Notification.WKSourceEditorSelectionState, object: nil) } @@ -187,8 +188,6 @@ class WKEditorToolbarExpandingView: WKEditorToolbarView { } else { increaseIndentionButton.isEnabled = false } - - cursorRightButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonCursorRight } // MARK: - Button Actions @@ -233,9 +232,6 @@ class WKEditorToolbarExpandingView: WKEditorToolbarView { @objc private func tappedFormatText() { delegate?.toolbarExpandingViewDidTapFormatText(toolbarView: self) } - - @objc private func tappedFormatHeading() { - } @objc private func tappedReference() { delegate?.toolbarExpandingViewDidTapReference(toolbarView: self, isSelected: referenceButton.isSelected) diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Find and Replace/WKFindAndReplaceView.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Find and Replace/WKFindAndReplaceView.swift index fd4d876635b..bf89cbe5210 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Find and Replace/WKFindAndReplaceView.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Find and Replace/WKFindAndReplaceView.swift @@ -58,19 +58,20 @@ class WKFindAndReplaceView: WKComponentView { maximumContentSizeCategory = .accessibilityLarge closeButton.setImage(WKSFSymbolIcon.for(symbol: .close), for: .normal) - closeButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelFindButtonClose + closeButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.findCloseButtonAccessibility previousButton.setImage(WKSFSymbolIcon.for(symbol: .chevronUp), for: .normal) - previousButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelFindButtonPrevious + previousButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.findPreviousButtonAccessibility previousButton.imageView?.contentMode = .center nextButton.setImage(WKSFSymbolIcon.for(symbol: .chevronDown), for: .normal) - nextButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelFindButtonNext + nextButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.findNextButtonAccessibility nextButton.imageView?.contentMode = .center replaceButton.setImage(WKIcon.replace, for: .normal) - replaceButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceButtonPerformFormat, WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceTypeSingle) + replaceButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.replaceButtonAccessibilityFormat, WKSourceEditorLocalizedStrings.current.replaceTypeSingleAccessibility) + replaceButton.imageView?.contentMode = .center replaceSwitchButton.setImage(WKSFSymbolIcon.for(symbol: .ellipsis), for: .normal) - replaceSwitchButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceButtonSwitchFormat, WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceTypeSingle) + replaceSwitchButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.replaceTypeButtonAccessibilityFormat, WKSourceEditorLocalizedStrings.current.replaceTypeSingleAccessibility) replaceSwitchButton.imageView?.contentMode = .center replaceSwitchButton.showsMenuAsPrimaryAction = true @@ -82,22 +83,22 @@ class WKFindAndReplaceView: WKComponentView { pencilImageView.contentMode = .center findClearButton.setImage(WKSFSymbolIcon.for(symbol: .multiplyCircleFill), for: .normal) - findClearButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelFindButtonClear + findClearButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.findClearButtonAccessibility findClearButton.imageView?.contentMode = .center replaceClearButton.setImage(WKSFSymbolIcon.for(symbol: .multiplyCircleFill), for: .normal) - replaceClearButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceButtonClear + replaceClearButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.replaceClearButtonAccessibility replaceClearButton.imageView?.contentMode = .center findTextField.adjustsFontForContentSizeCategory = true findTextField.font = WKFont.for(.caption1, compatibleWith: appEnvironment.traitCollection) - findTextField.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelFindTextField + findTextField.accessibilityLabel = WKSourceEditorLocalizedStrings.current.findTextFieldAccessibility findTextField.autocorrectionType = .yes findTextField.spellCheckingType = .yes findTextField.delegate = self replaceTextField.adjustsFontForContentSizeCategory = true replaceTextField.font = WKFont.for(.caption1, compatibleWith: appEnvironment.traitCollection) - replaceTextField.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceTextField + replaceTextField.accessibilityLabel = WKSourceEditorLocalizedStrings.current.replaceTextFieldAccessibility replaceTextField.autocorrectionType = .yes replaceTextField.spellCheckingType = .yes replaceTextField.delegate = self @@ -107,12 +108,12 @@ class WKFindAndReplaceView: WKComponentView { replaceTypeLabel.adjustsFontForContentSizeCategory = true replaceTypeLabel.font = WKFont.for(.caption1, compatibleWith: appEnvironment.traitCollection) - replaceTypeLabel.text = WKSourceEditorLocalizedStrings.current.findReplaceTypeSingle + replaceTypeLabel.text = WKSourceEditorLocalizedStrings.current.replaceTypeSingle replaceTypeLabel.isAccessibilityElement = false replacePlaceholderLabel.adjustsFontForContentSizeCategory = true replacePlaceholderLabel.font = WKFont.for(.caption1, compatibleWith: appEnvironment.traitCollection) - replacePlaceholderLabel.text = WKSourceEditorLocalizedStrings.current.findReplaceWith + replacePlaceholderLabel.text = WKSourceEditorLocalizedStrings.current.replaceTextfieldPlaceholder replacePlaceholderLabel.isAccessibilityElement = false updateColors() @@ -136,6 +137,12 @@ class WKFindAndReplaceView: WKComponentView { } else { currentMatchInfoLabel.text = nil } + + if let currentMatchInfoAccessibility = viewModel.currentMatchInfoAccessibility { + currentMatchInfoLabel.accessibilityLabel = currentMatchInfoAccessibility + } else { + currentMatchInfoLabel.accessibilityLabel = currentMatchInfoLabel.text + } nextButton.isEnabled = viewModel.nextPrevButtonsAreEnabled previousButton.isEnabled = viewModel.nextPrevButtonsAreEnabled @@ -286,19 +293,25 @@ class WKFindAndReplaceView: WKComponentView { } private func replaceSwitchButtonMenu() -> UIMenu { - let replace = UIAction(title: WKSourceEditorLocalizedStrings.current.findReplaceTypeSingle) { [weak self] _ in + let replace = UIAction(title: WKSourceEditorLocalizedStrings.current.replaceTypeSingle) { [weak self] _ in self?.replaceType = .single - self?.replaceTypeLabel.text = WKSourceEditorLocalizedStrings.current.findReplaceTypeSingle - self?.replaceSwitchButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceButtonSwitchFormat, WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceTypeSingle) + self?.replaceTypeLabel.text = WKSourceEditorLocalizedStrings.current.replaceTypeSingle + + self?.replaceButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.replaceButtonAccessibilityFormat, WKSourceEditorLocalizedStrings.current.replaceTypeSingleAccessibility) + + self?.replaceSwitchButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.replaceTypeButtonAccessibilityFormat, WKSourceEditorLocalizedStrings.current.replaceTypeSingleAccessibility) } - let replaceAll = UIAction(title: WKSourceEditorLocalizedStrings.current.findReplaceTypeAll) { [weak self] _ in + let replaceAll = UIAction(title: WKSourceEditorLocalizedStrings.current.replaceTypeAll) { [weak self] _ in self?.replaceType = .all - self?.replaceTypeLabel.text = WKSourceEditorLocalizedStrings.current.findReplaceTypeAll - self?.replaceSwitchButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceButtonSwitchFormat, WKSourceEditorLocalizedStrings.current.accessibilityLabelReplaceTypeAll) + self?.replaceTypeLabel.text = WKSourceEditorLocalizedStrings.current.replaceTypeAll + + self?.replaceButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.replaceButtonAccessibilityFormat, WKSourceEditorLocalizedStrings.current.replaceTypeAll) + + self?.replaceSwitchButton.accessibilityLabel = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.replaceTypeButtonAccessibilityFormat, WKSourceEditorLocalizedStrings.current.replaceTypeAllAccessibility) } - return UIMenu(title: WKSourceEditorLocalizedStrings.current.findReplaceTypeMenuTitle, children: [replace, replaceAll]) + return UIMenu(title: WKSourceEditorLocalizedStrings.current.findAndReplaceTitle, children: [replace, replaceAll]) } } diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Find and Replace/WKFindAndReplaceViewModel.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Find and Replace/WKFindAndReplaceViewModel.swift index 2a2bda35bfd..68d9c494d1c 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Find and Replace/WKFindAndReplaceViewModel.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Find and Replace/WKFindAndReplaceViewModel.swift @@ -8,6 +8,7 @@ struct WKFindAndReplaceViewModel { } var currentMatchInfo: String? + var currentMatchInfoAccessibility: String? var matchCount: Int = 0 var nextPrevButtonsAreEnabled: Bool = false var replaceButtonIsEnabled: Bool = false @@ -16,6 +17,7 @@ struct WKFindAndReplaceViewModel { mutating func reset() { currentMatchInfo = nil + currentMatchInfoAccessibility = nil nextPrevButtonsAreEnabled = false } } diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Highlight/WKEditorToolbarHighlightView.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Highlight/WKEditorToolbarHighlightView.swift index 69d26511737..a8a500b7921 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Highlight/WKEditorToolbarHighlightView.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Highlight/WKEditorToolbarHighlightView.swift @@ -28,35 +28,37 @@ class WKEditorToolbarHighlightView: WKEditorToolbarView { override func awakeFromNib() { super.awakeFromNib() - accessibilityElements = buttons + [showMoreButton as Any] + stackView.isLayoutMarginsRelativeArrangement = true stackView.layoutMargins = UIEdgeInsets(top: 5, left: 0, bottom: 5, right: 0) boldButton.setImage(WKSFSymbolIcon.for(symbol: .bold)) boldButton.addTarget(self, action: #selector(tappedBold), for: .touchUpInside) - boldButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.accessibilityLabelButtonBold + boldButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.toolbarBoldButtonAccessibility italicsButton.setImage(WKSFSymbolIcon.for(symbol: .italic)) italicsButton.addTarget(self, action: #selector(tappedItalics), for: .touchUpInside) - italicsButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.accessibilityLabelButtonItalics + italicsButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.toolbarItalicsButtonAccessibility referenceButton.setImage(WKSFSymbolIcon.for(symbol: .quoteOpening)) referenceButton.addTarget(self, action: #selector(tappedReference), for: .touchUpInside) - referenceButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.accessibilityLabelButtonCitation + referenceButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.toolbarReferenceButtonAccessibility linkButton.setImage(WKSFSymbolIcon.for(symbol: .link)) linkButton.addTarget(self, action: #selector(tappedLink), for: .touchUpInside) - linkButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.accessibilityLabelButtonLink + linkButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.toolbarLinkButtonAccessibility templateButton.setImage(WKSFSymbolIcon.for(symbol: .curlybraces)) templateButton.addTarget(self, action: #selector(tappedTemplate), for: .touchUpInside) - templateButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.accessibilityLabelButtonTemplate + templateButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.toolbarTemplateButtonAccessibility showMoreButton.setImage(WKSFSymbolIcon.for(symbol: .plusCircleFill), for: .normal) showMoreButton.addTarget(self, action: #selector(tappedShowMore), for: .touchUpInside) showMoreButton.accessibilityIdentifier = WKSourceEditorAccessibilityIdentifiers.current?.showMoreButton - showMoreButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.accessibilityLabelButtonShowMore + showMoreButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current?.toolbarOpenTextFormatMenuButtonAccessibility NotificationCenter.default.addObserver(self, selector: #selector(updateButtonSelectionState(_:)), name: Notification.WKSourceEditorSelectionState, object: nil) + + accessibilityElements = [boldButton as Any, italicsButton as Any, referenceButton as Any, linkButton as Any, templateButton as Any, showMoreButton as Any] } // MARK: - Notifications diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorInputView.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorInputView.swift index 85f80be61fe..32b8d2250cf 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorInputView.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorInputView.swift @@ -35,12 +35,12 @@ class WKEditorInputView: WKComponentView { var title: String { switch self { - case .paragraph: return WKSourceEditorLocalizedStrings.current.inputViewParagraph - case .heading: return WKSourceEditorLocalizedStrings.current.inputViewHeading - case .subheading1: return WKSourceEditorLocalizedStrings.current.inputViewSubheading1 - case .subheading2: return WKSourceEditorLocalizedStrings.current.inputViewSubheading2 - case .subheading3: return WKSourceEditorLocalizedStrings.current.inputViewSubheading3 - case .subheading4: return WKSourceEditorLocalizedStrings.current.inputViewSubheading4 + case .paragraph: return WKSourceEditorLocalizedStrings.current.keyboardParagraph + case .heading: return WKSourceEditorLocalizedStrings.current.keyboardHeading + case .subheading1: return WKSourceEditorLocalizedStrings.current.keyboardSubheading1 + case .subheading2: return WKSourceEditorLocalizedStrings.current.keyboardSubheading2 + case .subheading3: return WKSourceEditorLocalizedStrings.current.keyboardSubheading3 + case .subheading4: return WKSourceEditorLocalizedStrings.current.keyboardSubheading4 } } @@ -69,7 +69,7 @@ class WKEditorInputView: WKComponentView { label.translatesAutoresizingMaskIntoConstraints = false label.adjustsFontForContentSizeCategory = true label.font = WKFont.for(.boldTitle3, compatibleWith: appEnvironment.traitCollection) - label.text = WKSourceEditorLocalizedStrings.current.inputViewTextFormatting + label.text = WKSourceEditorLocalizedStrings.current.keyboardTextFormattingTitle label.setContentHuggingPriority(.defaultLow, for: .horizontal) return label }() @@ -80,7 +80,7 @@ class WKEditorInputView: WKComponentView { setCloseButtonImage(button: button) button.addTarget(self, action: #selector(close(_:)), for: .touchUpInside) button.accessibilityIdentifier = WKSourceEditorAccessibilityIdentifiers.current?.closeButton - button.accessibilityLabel = WKSourceEditorLocalizedStrings.current.accessibilityLabelButtonCloseMainInputView + button.accessibilityLabel = WKSourceEditorLocalizedStrings.current.keyboardCloseTextFormatMenuButtonAccessibility button.setContentHuggingPriority(.required, for: .horizontal) return button }() diff --git a/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorLocalizedStrings.swift b/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorLocalizedStrings.swift index a6c9b79e387..d38d24888c2 100644 --- a/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorLocalizedStrings.swift +++ b/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorLocalizedStrings.swift @@ -3,132 +3,124 @@ import Foundation public struct WKSourceEditorLocalizedStrings { static var current: WKSourceEditorLocalizedStrings! - let inputViewTextFormatting: String - let inputViewStyle: String - let inputViewClearFormatting: String - let inputViewParagraph: String - let inputViewHeading: String - let inputViewSubheading1: String - let inputViewSubheading2: String - let inputViewSubheading3: String - let inputViewSubheading4: String - let findReplaceTypeSingle: String - let findReplaceTypeAll: String - let findReplaceWith: String - let findReplaceTypeMenuTitle: String + // visible strings + let keyboardTextFormattingTitle: String + let keyboardParagraph: String + let keyboardHeading: String + let keyboardSubheading1: String + let keyboardSubheading2: String + let keyboardSubheading3: String + let keyboardSubheading4: String + let findAndReplaceTitle: String + let replaceTypeSingle: String + let replaceTypeAll: String + let replaceTextfieldPlaceholder: String + let replaceTypeContextMenuTitle: String - let accessibilityLabelButtonFormatText: String - let accessibilityLabelButtonCitation: String - let accessibilityLabelButtonCitationSelected: String - let accessibilityLabelButtonLink: String - let accessibilityLabelButtonLinkSelected: String - let accessibilityLabelButtonTemplate: String - let accessibilityLabelButtonTemplateSelected: String - let accessibilityLabelButtonMedia: String - let accessibilityLabelButtonFind: String - let accessibilityLabelButtonListUnordered: String - let accessibilityLabelButtonListUnorderedSelected: String - let accessibilityLabelButtonListOrdered: String - let accessibilityLabelButtonListOrderedSelected: String - let accessibilityLabelButtonInceaseIndent: String - let accessibilityLabelButtonDecreaseIndent: String - let accessibilityLabelButtonCursorUp: String - let accessibilityLabelButtonCursorDown: String - let accessibilityLabelButtonCursorLeft: String - let accessibilityLabelButtonCursorRight: String + // Voice Over strings + let toolbarOpenTextFormatMenuButtonAccessibility: String + let toolbarReferenceButtonAccessibility: String + let toolbarLinkButtonAccessibility: String + let toolbarTemplateButtonAccessibility: String + let toolbarImageButtonAccessibility: String + let toolbarFindButtonAccessibility: String + let toolbarListUnorderedButtonAccessibility: String + let toolbarListOrderedButtonAccessibility: String + let toolbarIndentIncreaseButtonAccessibility: String + let toolbarIndentDecreaseButtonAccessibility: String + let toolbarCursorUpButtonAccessibility: String + let toolbarCursorDownButtonAccessibility: String + let toolbarCursorPreviousButtonAccessibility: String + let toolbarCursorNextButtonAccessibility: String + let toolbarBoldButtonAccessibility: String + let toolbarItalicsButtonAccessibility: String + + let keyboardCloseTextFormatMenuButtonAccessibility: String + let keyboardBoldButtonAccessibility: String + let keyboardItalicsButtonAccessibility: String + let keyboardUnderlineButtonAccessibility: String + let keyboardStrikethroughButtonAccessibility: String + let keyboardReferenceButtonAccessibility: String + let keyboardLinkButtonAccessibility: String + let keyboardListUnorderedButtonAccessibility: String + let keyboardListOrderedButtonAccessibility: String + let keyboardIndentIncreaseButtonAccessibility: String + let keyboardIndentDecreaseButtonAccessibility: String + let keyboardSuperscriptButtonAccessibility: String + let keyboardSubscriptButtonAccessibility: String + let keyboardTemplateButtonAccessibility: String + let keyboardCommentButtonAccessibility: String - let accessibilityLabelButtonBold: String - let accessibilityLabelButtonBoldSelected: String - let accessibilityLabelButtonItalics: String - let accessibilityLabelButtonItalicsSelected: String - let accessibilityLabelButtonShowMore: String - - let accessibilityLabelButtonComment: String - let accessibilityLabelButtonCommentSelected: String - let accessibilityLabelButtonSuperscript: String - let accessibilityLabelButtonSuperscriptSelected: String - let accessibilityLabelButtonSubscript: String - let accessibilityLabelButtonSubscriptSelected: String - let accessibilityLabelButtonUnderline: String - let accessibilityLabelButtonUnderlineSelected: String - let accessibilityLabelButtonStrikethrough: String - let accessibilityLabelButtonStrikethroughSelected: String - - let accessibilityLabelButtonCloseMainInputView: String - let accessibilityLabelButtonCloseHeaderSelectInputView: String - - let accessibilityLabelFindTextField: String - let accessibilityLabelFindButtonClear: String - let accessibilityLabelFindButtonClose: String - let accessibilityLabelFindButtonNext: String - let accessibilityLabelFindButtonPrevious: String - let accessibilityLabelReplaceTextField: String - let accessibilityLabelReplaceButtonClear: String - let accessibilityLabelReplaceButtonPerformFormat: String - let accessibilityLabelReplaceButtonSwitchFormat: String - let accessibilityLabelReplaceTypeSingle: String - let accessibilityLabelReplaceTypeAll: String - - public init(inputViewTextFormatting: String, inputViewStyle: String, inputViewClearFormatting: String, inputViewParagraph: String, inputViewHeading: String, inputViewSubheading1: String, inputViewSubheading2: String, inputViewSubheading3: String, inputViewSubheading4: String, findReplaceTypeSingle: String, findReplaceTypeAll: String, findReplaceWith: String, findReplaceTypeMenuTitle: String, accessibilityLabelButtonFormatText: String, accessibilityLabelButtonCitation: String, accessibilityLabelButtonCitationSelected: String, accessibilityLabelButtonLink: String, accessibilityLabelButtonLinkSelected: String, accessibilityLabelButtonTemplate: String, accessibilityLabelButtonTemplateSelected: String, accessibilityLabelButtonMedia: String, accessibilityLabelButtonFind: String, accessibilityLabelButtonListUnordered: String, accessibilityLabelButtonListUnorderedSelected: String, accessibilityLabelButtonListOrdered: String, accessibilityLabelButtonListOrderedSelected: String, accessibilityLabelButtonInceaseIndent: String, accessibilityLabelButtonDecreaseIndent: String, accessibilityLabelButtonCursorUp: String, accessibilityLabelButtonCursorDown: String, accessibilityLabelButtonCursorLeft: String, accessibilityLabelButtonCursorRight: String, accessibilityLabelButtonBold: String, accessibilityLabelButtonBoldSelected: String, accessibilityLabelButtonItalics: String, accessibilityLabelButtonItalicsSelected: String, accessibilityLabelButtonShowMore: String, accessibilityLabelButtonComment: String, accessibilityLabelButtonCommentSelected: String, accessibilityLabelButtonSuperscript: String, accessibilityLabelButtonSuperscriptSelected: String, accessibilityLabelButtonSubscript: String, accessibilityLabelButtonSubscriptSelected: String, accessibilityLabelButtonUnderline: String, accessibilityLabelButtonUnderlineSelected: String, accessibilityLabelButtonStrikethrough: String, accessibilityLabelButtonStrikethroughSelected: String, accessibilityLabelButtonCloseMainInputView: String, accessibilityLabelButtonCloseHeaderSelectInputView: String, accessibilityLabelFindTextField: String, accessibilityLabelFindButtonClear: String, accessibilityLabelFindButtonClose: String, accessibilityLabelFindButtonNext: String, accessibilityLabelFindButtonPrevious: String, accessibilityLabelReplaceTextField: String, accessibilityLabelReplaceButtonClear: String, accessibilityLabelReplaceButtonPerformFormat: String, accessibilityLabelReplaceButtonSwitchFormat: String, accessibilityLabelReplaceTypeSingle: String, accessibilityLabelReplaceTypeAll: String) { - self.inputViewTextFormatting = inputViewTextFormatting - self.inputViewStyle = inputViewStyle - self.inputViewClearFormatting = inputViewClearFormatting - self.inputViewParagraph = inputViewParagraph - self.inputViewHeading = inputViewHeading - self.inputViewSubheading1 = inputViewSubheading1 - self.inputViewSubheading2 = inputViewSubheading2 - self.inputViewSubheading3 = inputViewSubheading3 - self.inputViewSubheading4 = inputViewSubheading4 - self.findReplaceTypeSingle = findReplaceTypeSingle - self.findReplaceTypeAll = findReplaceTypeAll - self.findReplaceWith = findReplaceWith - self.findReplaceTypeMenuTitle = findReplaceTypeMenuTitle - self.accessibilityLabelButtonFormatText = accessibilityLabelButtonFormatText - self.accessibilityLabelButtonCitation = accessibilityLabelButtonCitation - self.accessibilityLabelButtonCitationSelected = accessibilityLabelButtonCitationSelected - self.accessibilityLabelButtonLink = accessibilityLabelButtonLink - self.accessibilityLabelButtonLinkSelected = accessibilityLabelButtonLinkSelected - self.accessibilityLabelButtonTemplate = accessibilityLabelButtonTemplate - self.accessibilityLabelButtonTemplateSelected = accessibilityLabelButtonTemplateSelected - self.accessibilityLabelButtonMedia = accessibilityLabelButtonMedia - self.accessibilityLabelButtonFind = accessibilityLabelButtonFind - self.accessibilityLabelButtonListUnordered = accessibilityLabelButtonListUnordered - self.accessibilityLabelButtonListUnorderedSelected = accessibilityLabelButtonListUnorderedSelected - self.accessibilityLabelButtonListOrdered = accessibilityLabelButtonListOrdered - self.accessibilityLabelButtonListOrderedSelected = accessibilityLabelButtonListOrderedSelected - self.accessibilityLabelButtonInceaseIndent = accessibilityLabelButtonInceaseIndent - self.accessibilityLabelButtonDecreaseIndent = accessibilityLabelButtonDecreaseIndent - self.accessibilityLabelButtonCursorUp = accessibilityLabelButtonCursorUp - self.accessibilityLabelButtonCursorDown = accessibilityLabelButtonCursorDown - self.accessibilityLabelButtonCursorLeft = accessibilityLabelButtonCursorLeft - self.accessibilityLabelButtonCursorRight = accessibilityLabelButtonCursorRight - self.accessibilityLabelButtonBold = accessibilityLabelButtonBold - self.accessibilityLabelButtonBoldSelected = accessibilityLabelButtonBoldSelected - self.accessibilityLabelButtonItalics = accessibilityLabelButtonItalics - self.accessibilityLabelButtonItalicsSelected = accessibilityLabelButtonItalicsSelected - self.accessibilityLabelButtonShowMore = accessibilityLabelButtonShowMore - self.accessibilityLabelButtonComment = accessibilityLabelButtonComment - self.accessibilityLabelButtonCommentSelected = accessibilityLabelButtonCommentSelected - self.accessibilityLabelButtonSuperscript = accessibilityLabelButtonSuperscript - self.accessibilityLabelButtonSuperscriptSelected = accessibilityLabelButtonSuperscriptSelected - self.accessibilityLabelButtonSubscript = accessibilityLabelButtonSubscript - self.accessibilityLabelButtonSubscriptSelected = accessibilityLabelButtonSubscriptSelected - self.accessibilityLabelButtonUnderline = accessibilityLabelButtonUnderline - self.accessibilityLabelButtonUnderlineSelected = accessibilityLabelButtonUnderlineSelected - self.accessibilityLabelButtonStrikethrough = accessibilityLabelButtonStrikethrough - self.accessibilityLabelButtonStrikethroughSelected = accessibilityLabelButtonStrikethroughSelected - self.accessibilityLabelButtonCloseMainInputView = accessibilityLabelButtonCloseMainInputView - self.accessibilityLabelButtonCloseHeaderSelectInputView = accessibilityLabelButtonCloseHeaderSelectInputView - self.accessibilityLabelFindTextField = accessibilityLabelFindTextField - self.accessibilityLabelFindButtonClear = accessibilityLabelFindButtonClear - self.accessibilityLabelFindButtonClose = accessibilityLabelFindButtonClose - self.accessibilityLabelFindButtonNext = accessibilityLabelFindButtonNext - self.accessibilityLabelFindButtonPrevious = accessibilityLabelFindButtonPrevious - self.accessibilityLabelReplaceTextField = accessibilityLabelReplaceTextField - self.accessibilityLabelReplaceButtonClear = accessibilityLabelReplaceButtonClear - self.accessibilityLabelReplaceButtonPerformFormat = accessibilityLabelReplaceButtonPerformFormat - self.accessibilityLabelReplaceButtonSwitchFormat = accessibilityLabelReplaceButtonSwitchFormat - self.accessibilityLabelReplaceTypeSingle = accessibilityLabelReplaceTypeSingle - self.accessibilityLabelReplaceTypeAll = accessibilityLabelReplaceTypeAll + let findTextFieldAccessibility: String + let findClearButtonAccessibility: String + let findCurrentMatchInfoFormatAccessibility: String + let findCurrentMatchInfoZeroResultsAccessibility: String + let findCloseButtonAccessibility: String + let findNextButtonAccessibility: String + let findPreviousButtonAccessibility: String + let replaceTextFieldAccessibility: String + let replaceClearButtonAccessibility: String + let replaceButtonAccessibilityFormat: String + let replaceTypeButtonAccessibilityFormat: String + let replaceTypeSingleAccessibility: String + let replaceTypeAllAccessibility: String + + public init(keyboardTextFormattingTitle: String, keyboardParagraph: String, keyboardHeading: String, keyboardSubheading1: String, keyboardSubheading2: String, keyboardSubheading3: String, keyboardSubheading4: String, findAndReplaceTitle: String, replaceTypeSingle: String, replaceTypeAll: String, replaceTextfieldPlaceholder: String, replaceTypeContextMenuTitle: String, toolbarOpenTextFormatMenuButtonAccessibility: String, toolbarReferenceButtonAccessibility: String, toolbarLinkButtonAccessibility: String, toolbarTemplateButtonAccessibility: String, toolbarImageButtonAccessibility: String, toolbarFindButtonAccessibility: String, toolbarListUnorderedButtonAccessibility: String, toolbarListOrderedButtonAccessibility: String, toolbarIndentIncreaseButtonAccessibility: String, toolbarIndentDecreaseButtonAccessibility: String, toolbarCursorUpButtonAccessibility: String, toolbarCursorDownButtonAccessibility: String, toolbarCursorPreviousButtonAccessibility: String, toolbarCursorNextButtonAccessibility: String, toolbarBoldButtonAccessibility: String, toolbarItalicsButtonAccessibility: String, keyboardCloseTextFormatMenuButtonAccessibility: String, keyboardBoldButtonAccessibility: String, keyboardItalicsButtonAccessibility: String, keyboardUnderlineButtonAccessibility: String, keyboardStrikethroughButtonAccessibility: String, keyboardReferenceButtonAccessibility: String, keyboardLinkButtonAccessibility: String, keyboardListUnorderedButtonAccessibility: String, keyboardListOrderedButtonAccessibility: String, keyboardIndentIncreaseButtonAccessibility: String, keyboardIndentDecreaseButtonAccessibility: String, keyboardSuperscriptButtonAccessibility: String, keyboardSubscriptButtonAccessibility: String, keyboardTemplateButtonAccessibility: String, keyboardCommentButtonAccessibility: String, findTextFieldAccessibility: String, findClearButtonAccessibility: String, findCurrentMatchInfoFormatAccessibility: String, findCurrentMatchInfoZeroResultsAccessibility: String, findCloseButtonAccessibility: String, findNextButtonAccessibility: String, findPreviousButtonAccessibility: String, replaceTextFieldAccessibility: String, replaceClearButtonAccessibility: String, replaceButtonAccessibilityFormat: String, replaceTypeButtonAccessibilityFormat: String, replaceTypeSingleAccessibility: String, replaceTypeAllAccessibility: String) { + self.keyboardTextFormattingTitle = keyboardTextFormattingTitle + self.keyboardParagraph = keyboardParagraph + self.keyboardHeading = keyboardHeading + self.keyboardSubheading1 = keyboardSubheading1 + self.keyboardSubheading2 = keyboardSubheading2 + self.keyboardSubheading3 = keyboardSubheading3 + self.keyboardSubheading4 = keyboardSubheading4 + self.findAndReplaceTitle = findAndReplaceTitle + self.replaceTypeSingle = replaceTypeSingle + self.replaceTypeAll = replaceTypeAll + self.replaceTextfieldPlaceholder = replaceTextfieldPlaceholder + self.replaceTypeContextMenuTitle = replaceTypeContextMenuTitle + self.toolbarOpenTextFormatMenuButtonAccessibility = toolbarOpenTextFormatMenuButtonAccessibility + self.toolbarReferenceButtonAccessibility = toolbarReferenceButtonAccessibility + self.toolbarLinkButtonAccessibility = toolbarLinkButtonAccessibility + self.toolbarTemplateButtonAccessibility = toolbarTemplateButtonAccessibility + self.toolbarImageButtonAccessibility = toolbarImageButtonAccessibility + self.toolbarFindButtonAccessibility = toolbarFindButtonAccessibility + self.toolbarListUnorderedButtonAccessibility = toolbarListUnorderedButtonAccessibility + self.toolbarListOrderedButtonAccessibility = toolbarListOrderedButtonAccessibility + self.toolbarIndentIncreaseButtonAccessibility = toolbarIndentIncreaseButtonAccessibility + self.toolbarIndentDecreaseButtonAccessibility = toolbarIndentDecreaseButtonAccessibility + self.toolbarCursorUpButtonAccessibility = toolbarCursorUpButtonAccessibility + self.toolbarCursorDownButtonAccessibility = toolbarCursorDownButtonAccessibility + self.toolbarCursorPreviousButtonAccessibility = toolbarCursorPreviousButtonAccessibility + self.toolbarCursorNextButtonAccessibility = toolbarCursorNextButtonAccessibility + self.toolbarBoldButtonAccessibility = toolbarBoldButtonAccessibility + self.toolbarItalicsButtonAccessibility = toolbarItalicsButtonAccessibility + self.keyboardCloseTextFormatMenuButtonAccessibility = keyboardCloseTextFormatMenuButtonAccessibility + self.keyboardBoldButtonAccessibility = keyboardBoldButtonAccessibility + self.keyboardItalicsButtonAccessibility = keyboardItalicsButtonAccessibility + self.keyboardUnderlineButtonAccessibility = keyboardUnderlineButtonAccessibility + self.keyboardStrikethroughButtonAccessibility = keyboardStrikethroughButtonAccessibility + self.keyboardReferenceButtonAccessibility = keyboardReferenceButtonAccessibility + self.keyboardLinkButtonAccessibility = keyboardLinkButtonAccessibility + self.keyboardListUnorderedButtonAccessibility = keyboardListUnorderedButtonAccessibility + self.keyboardListOrderedButtonAccessibility = keyboardListOrderedButtonAccessibility + self.keyboardIndentIncreaseButtonAccessibility = keyboardIndentIncreaseButtonAccessibility + self.keyboardIndentDecreaseButtonAccessibility = keyboardIndentDecreaseButtonAccessibility + self.keyboardSuperscriptButtonAccessibility = keyboardSuperscriptButtonAccessibility + self.keyboardSubscriptButtonAccessibility = keyboardSubscriptButtonAccessibility + self.keyboardTemplateButtonAccessibility = keyboardTemplateButtonAccessibility + self.keyboardCommentButtonAccessibility = keyboardCommentButtonAccessibility + self.findTextFieldAccessibility = findTextFieldAccessibility + self.findClearButtonAccessibility = findClearButtonAccessibility + self.findCurrentMatchInfoFormatAccessibility = findCurrentMatchInfoFormatAccessibility + self.findCurrentMatchInfoZeroResultsAccessibility = findCurrentMatchInfoZeroResultsAccessibility + self.findCloseButtonAccessibility = findCloseButtonAccessibility + self.findNextButtonAccessibility = findNextButtonAccessibility + self.findPreviousButtonAccessibility = findPreviousButtonAccessibility + self.replaceTextFieldAccessibility = replaceTextFieldAccessibility + self.replaceClearButtonAccessibility = replaceClearButtonAccessibility + self.replaceButtonAccessibilityFormat = replaceButtonAccessibilityFormat + self.replaceTypeButtonAccessibilityFormat = replaceTypeButtonAccessibilityFormat + self.replaceTypeSingleAccessibility = replaceTypeSingleAccessibility + self.replaceTypeAllAccessibility = replaceTypeAllAccessibility } } diff --git a/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorViewController.swift b/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorViewController.swift index c794aef101b..729016ac286 100644 --- a/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorViewController.swift +++ b/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorViewController.swift @@ -347,11 +347,16 @@ private extension WKSourceEditorViewController { } if findFormatter.selectedMatchIndex != NSNotFound { - viewModel.currentMatchInfo = "\(findFormatter.selectedMatchIndex + 1) / \(findFormatter.matchCount)" + let selectedMatch = findFormatter.selectedMatchIndex + 1 + let totalMatchCount = findFormatter.matchCount + viewModel.currentMatchInfo = "\(selectedMatch) / \(totalMatchCount)" + viewModel.currentMatchInfoAccessibility = String.localizedStringWithFormat(WKSourceEditorLocalizedStrings.current.findCurrentMatchInfoFormatAccessibility, "\(totalMatchCount)", "\(selectedMatch)") } else if findFormatter.matchCount == 0 { viewModel.currentMatchInfo = "0 / 0" + viewModel.currentMatchInfoAccessibility = WKSourceEditorLocalizedStrings.current.findCurrentMatchInfoZeroResultsAccessibility } else { viewModel.currentMatchInfo = nil + viewModel.currentMatchInfoAccessibility = nil } viewModel.nextPrevButtonsAreEnabled = findFormatter.matchCount > 0 diff --git a/Components/Tests/ComponentsTests/WKSourceEditorTests.swift b/Components/Tests/ComponentsTests/WKSourceEditorTests.swift index 3b73b7a27d9..4b09c1dbf29 100644 --- a/Components/Tests/ComponentsTests/WKSourceEditorTests.swift +++ b/Components/Tests/ComponentsTests/WKSourceEditorTests.swift @@ -63,7 +63,6 @@ extension WKSourceEditorLocalizedStrings { static var emptyTestStrings: WKSourceEditorLocalizedStrings { return WKSourceEditorLocalizedStrings( inputViewTextFormatting: "", - inputViewStyle: "", inputViewClearFormatting: "", inputViewParagraph: "", inputViewHeading: "", diff --git a/WMF Framework/CommonStrings.swift b/WMF Framework/CommonStrings.swift index 54504dea82e..a6e1bedf5f9 100644 --- a/WMF Framework/CommonStrings.swift +++ b/WMF Framework/CommonStrings.swift @@ -532,73 +532,91 @@ public class CommonStrings: NSObject { // Native page editor - public static let textFormatting = WMFLocalizedString("source-editor-text-formatting", value: "Text Formatting", comment: "Label for text formatting section on the page editor") - public static let style = WMFLocalizedString("source-editor-style", value: "Style", comment: "Label for style formatting section on the page editor ") - public static let clearFormatting = WMFLocalizedString("source-editor-clear-formatting", value: "Clear formatting", comment: "Label for clear formatting on the page editor") - public static let paragraph = WMFLocalizedString("source-editor-paragraph", value: "Paragraph", comment: "Label for paragraph formatting button on the page editor") - public static let heading = WMFLocalizedString("source-editor-heading", value: "Heading", comment: "Label for heading formatting button on section editor") - public static let subheading1 = WMFLocalizedString("source-editor-subheading1", value: "Subheading 1", comment: "Label for subheading 1 formatting button on the page editor") - public static let subheading2 = WMFLocalizedString("source-editor-subheading2", value: "Subheading 2", comment: "Label for subheading 2 formatting button on the page editor") - public static let subheading3 = WMFLocalizedString("source-editor-subheading3", value: "Subheading 3", comment: "Label for subheading 3 formatting button on the page editor") - public static let subheading4 = WMFLocalizedString("source-editor-subheading4", value: "Subheading 4", comment: "Label for subheading 4 formatting button on the page editor") - public static let findAndReplaceSingle = WMFLocalizedString("source-editor-find-replace-single", value: "Replace", comment: "Label for replace single string button on page editor") - public static let findAndReplaceAll = WMFLocalizedString("source-editor-find-replace-all", value: "Replace all", comment: "Label for replace all ocurrences of a string on the page editor") - public static let replaceWith = WMFLocalizedString("source-editor-find-replace-with", value: "Replace with...", comment: "Lable for replace with string button on page editor") - public static let accessibilityLabelButtonFormatText = WMFLocalizedString("source-editor-accessibility-label-format-text", value: "Show text formatting menu", comment: "Accessibility label for text formatting menu button on the page editor") - public static let accessibilityLabelButtonCitation = WMFLocalizedString("source-editor-accessibility-label-citation", value: "Add reference syntax", comment: "Accessibility label for add reference syntax button on the page editor") - public static let accessibilityLabelButtonCitationSelected = WMFLocalizedString("source-editor-accessibility-label-citation-selected", value: "Remove reference syntax", comment: "Accessibility label for remove reference syntax button on the page editor") - public static let accessibilityLabelButtonLink = WMFLocalizedString("source-editor-accessibility-label-link", value: "Add link syntax", comment: "Accessibility label for the add link syntax button on the page editor") - public static let accessibilityLabelButtonLinkSelected = WMFLocalizedString("source-editor-accessibility-label-link-selected", value: "Remove link syntax", comment: "Accessibility label for the remove link syntax button on the page editor") - public static let accessibilityLabelButtonTemplate = WMFLocalizedString("source-editor-accessibility-label-template", value: "Add template syntax", comment: "Accessibility label for the add template syntax button on the page editor") - public static let accessibilityLabelButtonTemplateSelected = WMFLocalizedString("source-editor-accessibility-label-template-selected", value: "Remove template syntax", comment: "Accessibility label for the remove template syntax button on the page editor") - public static let accessibilityLabelButtonMedia = WMFLocalizedString("source-editor-accessibility-label-media", value: "Insert media", comment: "Accessibility label for the insert media syntax button on the page editor") - public static let accessibilityLabelButtonFind = WMFLocalizedString("source-editor-accessibility-label-find", value: "Find in page", comment: "Accessibility label for the find in page button on the page editor") - public static let accessibilityLabelButtonListUnordered = WMFLocalizedString("source-editor-accessibility-label-unordered", value: "Make current line unordered list", comment: "Accessibility label for make unordered list button on the page editor") - public static let accessibilityLabelButtonListUnorderedSelected = WMFLocalizedString("source-editor-accessibility-label-unordered-selected", value: "Remove unordered list from current line", comment: "Accessibility label for remove unordered list button on the page editor") - public static let accessibilityLabelButtonListOrdered = WMFLocalizedString("source-editor-accessibility-label-ordered", value: "Make current line ordered list", comment: "Accessibility label for make ordered list button on the page editor") - public static let accessibilityLabelButtonListOrderedSelected = WMFLocalizedString("source-editor-accessibility-label-ordered-selected", value: "Remove ordered list from current line", comment: "accessibility label for remove ordered list button on the page editor") - public static let accessibilityLabelButtonIncreaseIndent = WMFLocalizedString("source-editor-accessibility-label-indent-increase", value: "Increase indent depth", comment: "Accessibility label for the increase indent button on the page editor") - public static let accessibilityLabelButtonDecreaseIndent = WMFLocalizedString("source-editor-accessibility-label-indent-decrease", value: "Decrease indent depth", comment: "Accessibility label for the decrease indent button on the page editor") - public static let accessibilityLabelButtonCursorUp = WMFLocalizedString("source-editor-accessibility-label-cursor-up", value: "Move cursor up", comment: "Accessibility label for the move cursor up button on the page editor") - public static let accessibilityLabelButtonCursorDown = WMFLocalizedString("source-editor-accessibility-label-cursor-down", value: "Move cursor down", comment: "Accessibility label for the move cursor down button on the page editor") - public static let accessibilityLabelButtonCursorLeft = WMFLocalizedString("source-editor-accessibility-label-cursor-left", value: "Move cursor left", comment: "Accessibility label for the move cursor left button the page editor") - public static let accessibilityLabelButtonCursorRight = WMFLocalizedString("source-editor-accessibility-label-cursor-right", value: "Move cursor right", comment: "Accessibility label for the move cursor right on the page editor") - public static let accessibilityLabelButtonBold = WMFLocalizedString("source-editor-accessibility-label-bold", value: "Add bold formatting", comment: "Accessibility label for the bold button on the page editor") - public static let accessibilityLabelButtonBoldSelected = WMFLocalizedString("source-editor-accessibility-label-bold-selected", value: "Remove bold formatting", comment: "Accessibility label for the selected bold button on the page editor") - public static let accessibilityLabelButtonItalics = WMFLocalizedString("source-editor-accessibility-label-italics", value: "Add italic formatting", comment: "Accessibility label for the italics button on the page editor") - public static let accessibilityLabelButtonItalicsSelected = WMFLocalizedString("source-editor-accessibility-label-italics-selected", value: "Remove italic formatting", comment: "Accessibility label for the selected italics button on the page editor") - public static let accessibilityLabelButtonClearFormatting = WMFLocalizedString("source-editor-accessibility-label-clear-formatting", value: "Clear formatting", comment: "Accessibility label for the clear formatting button on the page editor") - public static let accessibilityLabelButtonShowMore = WMFLocalizedString("source-editor-accessibility-label-format-text-show-more", value: "Show text formatting menu", comment: "Accessibility label for the show more button on the page editor") - public static let accessibilityLabelButtonComment = WMFLocalizedString("source-editor-accessibility-label-comment", value: "Add comment syntax", comment: "Accessibility label for the add comment button on the page editor") - public static let accessibilityLabelButtonCommentSelected = WMFLocalizedString("source-editor-accessibility-label-comment-selected", value: "Remove comment syntax", comment: "Accessibility label for the selected comment button on the page editor") - public static let accessibilityLabelButtonSuperscript = WMFLocalizedString("source-editor-accessibility-label-superscript", value: "Add superscript formatting", comment: "Accessibility label for the superscript button on the page editor") - public static let accessibilityLabelButtonSuperscriptSelected = WMFLocalizedString("source-editor-accessibility-label-superscript-selected", value: "Remove superscript formatting", comment: "Accessibility string for the selected superscript button on the page editor") - public static let accessibilityLabelButtonSubscript = WMFLocalizedString("source-editor-accessibility-label-subscript", value: "Add subscript formatting", comment: "Accessibility label for the subscript button on the page editor") - public static let accessibilityLabelButtonSubscriptSelected = WMFLocalizedString("source-editor-accessibility-label-subscript-selected", value: "Remove subscript formatting", comment: "Accessibility label for the selected subscript button on the page editor") - public static let accessibilityLabelButtonUnderline = WMFLocalizedString("source-editor-accessibility-label-underline", value: "Add underline", comment: "Accessibility label for the underline button on the page editor") - public static let accessibilityLabelButtonUnderlineSelected = WMFLocalizedString("source-editor-accessibility-label-underline-selected", value: "Remove underline", comment: "Accessibility label for the selected underline button on the page editor") - public static let accessibilityLabelButtonStrikethrough = WMFLocalizedString("source-editor-accessibility-label-strikethrough", value: "Add strikethrough", comment: "Accessibility label for the strikethrough button on the page editor") - public static let accessibilityLabelButtonStrikethroughSelected = WMFLocalizedString("source-editor-accessibility-label-strikethrough-selected", value: "Remove strikethrough", comment: "Accessibility label for the selected strikethrough button on the page editor") - public static let accessibilityLabelButtonCloseMainInputView = WMFLocalizedString("source-editor-accessibility-label-close-main-input", value: "Close text formatting menu", comment: "Accessibility label for the close formatting menu button on the page editor") - public static let accessibilityLabelButtonCloseHeaderSelectInputView = WMFLocalizedString("source-editor-accessibility-label-close-header-select", value: "Close text style menu", comment: "Accessibility label for the close text style menu button on the page editor") - public static let accessibilityLabelFindTextField = WMFLocalizedString("source-editor-accessibility-label-find-text-field", value: "Find", comment: "Accessibility label for the find text field on the page editor") - public static let accessibilityLabelFindButtonClear = WMFLocalizedString("source-editor-accessibility-label-find-button-clear", value: "Clear find", comment: "Accessibility label for the clear find button on the page editor") - public static let accessibilityLabelFindButtonClose = WMFLocalizedString("source-editor-accessibility-label-find-button-close", value: "Close find", comment: "Accessibility label for the close find button on the page editor") - public static let accessibilityLabelFindButtonNext = WMFLocalizedString("source-editor-accessibility-label-find-button-next", value: "Next find result", comment: "Accessibility label for the find next result on the page editor") - public static let accessibilityLabelFindButtonPrevious = WMFLocalizedString("source-editor-accessibility-label-find-button-prev", value: "Previous find result", comment: "Accessibility label for the find previous result button on the page editor") - public static let accessibilityLabelReplaceTextField = WMFLocalizedString("source-editor-accessibility-label-replace-text-field", value: "Replace", comment: "Accessibility label for the replace text field on the page editor") - public static let accessibilityLabelReplaceButtonClear = WMFLocalizedString("source-editor-accessibility-label-replace-button-clear", value: "Clear replace", comment: "Accessibility label for the clear replace field button on the page editor") - public static let accessibilityLabelReplaceButtonPerformFormat = WMFLocalizedString("source-editor-accessibility-label-replace-button-perform-format", value: "Perform replace operation. Replace type is set to %@", comment: "Accessibility label for the perform replace button on the page editor, %@ is replaced by text to replace") // TODO get replaced text correctly - public static let accessibilityLabelReplaceButtonSwitchFormat = WMFLocalizedString("source-editor-accessibility-label-replace-button-switch-format", value: "Switch replace type. Currently set to %@. Select to change.", comment: "Accessibility label for switch format button on page editor, %@ is replaced by text to replace")// TODO get replaced text correctly - public static let accessibilityLabelReplaceTypeSingle = WMFLocalizedString("source-editor-accessibility-label-replace-type-single", value: "Replace single instance", comment: "Accessibility label for replace single instance button on the page editor") - public static let accessibilityLabelReplaceTypeAll = WMFLocalizedString("source-editor-accessibility-label-replace-type-all", value: "Replace all instances", comment: "Accessibility label for the replace all instances button on the page editor") + public static let editorKeyboardTextFormattingTitle = WMFLocalizedString("editor-keyboard-text-formatting-title", value: "Text Formatting", comment: "Title of text formatting keyboard view on the editor.") - public static let editContextMenuTitle = WMFLocalizedString("edit-menu-item", value: "Edit", comment: "Button label for 'Edit' context menu item") + public static let editorKeyboardParagraphButton = WMFLocalizedString("editor-keyboard-paragraph-button", value: "Paragraph", comment: "Paragraph button label in the text formatting keyboard view on the editor.") + public static let editorKeyboardHeadingButton = WMFLocalizedString("editor-keyboard-heading-button", value: "Heading", comment: "Heading button label in the text formatting keyboard view on the editor.") + public static let editorKeyboardSubheading1Button = WMFLocalizedString("editor-keyboard-subheading1-button", value: "Subheading 1", comment: "Subheading1 button label in the text formatting keyboard view on the editor.") + public static let editorKeyboardSubheading2Button = WMFLocalizedString("editor-keyboard-subheading2-button", value: "Subheading 2", comment: "Subheading2 button label in the text formatting keyboard view on the editor.") + public static let editorKeyboardSubheading3Button = WMFLocalizedString("editor-keyboard-subheading3-button", value: "Subheading 3", comment: "Subheading3 button label in the text formatting keyboard view on the editor.") + public static let editorKeyboardSubheading4Button = WMFLocalizedString("editor-keyboard-subheading4-button", value: "Subheading 4", comment: "Subheading4 button label in the text formatting keyboard view on the editor.") + + public static let editorReplaceTypeSingle = WMFLocalizedString("editor-replace-type-single", value: "Replace", comment: "Label indicating which replace type the user has set in the find and replace view on the editor. This type replaces a single instance of the find text.") + public static let editorReplaceTypeAll = WMFLocalizedString("editor-replace-type-all", value: "Replace all", comment: "Label indicating which replace type the user has set in the find and replace view on the editor. This type replaces all instances of the find text.") + public static let editorReplaceTextfieldPlaceholder = WMFLocalizedString("editor-replace-textfield-placeholder", value: "Replace with...", comment: "Placeholder label displayed when the replace textfield in the editor's find and replace view is empty.") + + public static let editorToolbarButtonOpenTextFormatMenuAccessiblityLabel = WMFLocalizedString("editor-toolbar-open-text-format-menu-accessibility", value: "Open text formatting menu", comment: "Accessibility label for text format toolbar button on the editor. This button opens the keyboard text formatting menu.") + + public static let editorToolbarButtonReferenceAccessiblityLabel = WMFLocalizedString("editor-toolbar-reference-accessibility", value: "Reference text formatting", comment: "Accessibility label for reference toolbar button on the editor.") + public static let editorKeyboardButtonReferenceAccessiblityLabel = WMFLocalizedString("editor-keyboard-reference-accessibility", value: "Reference", comment: "Accessibility label for reference keyboard button on the editor.") - public static let editSource = WMFLocalizedString("source-editor-edit-source", value: "Edit source", comment: "Title for menu option to edit the source of a page.") + public static let editorToolbarButtonLinkAccessiblityLabel = WMFLocalizedString("editor-toolbar-link-accessibility", value: "Link text formatting", comment: "Accessibility label for link toolbar button on the editor.") + public static let editorKeyboardButtonLinkAccessiblityLabel = WMFLocalizedString("editor-keyboard-link-accessibility", value: "Link", comment: "Accessibility label for link keyboard button on the editor.") - public static let editPublishedToastTitle = WMFLocalizedString("source-editor-edit-published", value: "Your edit was published.", comment: "Title for alert informing that the user's new edit was successfully published.") + public static let editorToolbarButtonTemplateAccessiblityLabel = WMFLocalizedString("editor-toolbar-template-accessibility", value: "Template text formatting", comment: "Accessibility label for template toolbar button on the editor.") + public static let editorKeyboardButtonTemplateAccessiblityLabel = WMFLocalizedString("editor-keyboard-template-accessibility", value: "Template", comment: "Accessibility label for template keyboard button on the editor.") + public static let editorToolbarButtonImageAccessiblityLabel = WMFLocalizedString("editor-toolbar-image-accessibility", value: "Image text formatting", comment: "Accessibility label for image toolbar button on the editor.") + + public static let editorToolbarButtonFindAccessiblityLabel = WMFLocalizedString("editor-toolbar-find-accessibility", value: "Find in page", comment: "Accessibility label for find toolbar button on the editor. This button opens the find in page view.") + + public static let editorToolbarButtonListUnorderedAccessiblityLabel = WMFLocalizedString("editor-toolbar-list-unordered-accessibility", value: "Unordered list text formatting", comment: "Accessibility label for unordered list toolbar button on the editor.") + public static let editorKeyboardButtonListUnorderedAccessiblityLabel = WMFLocalizedString("editor-keyboard-list-unordered-accessibility", value: "Unordered list", comment: "Accessibility label for unordered list keyboard button on the editor.") + + public static let editorToolbarButtonListOrderedAccessiblityLabel = WMFLocalizedString("editor-toolbar-list-ordered-accessibility", value: "Ordered list text formatting", comment: "Accessibility label for ordered list toolbar button on the editor.") + public static let editorKeyboardButtonListOrderedAccessiblityLabel = WMFLocalizedString("editor-keyboard-list-ordered-accessibility", value: "Ordered list", comment: "Accessibility label for ordered list keyboard button on the editor.") + + public static let editorToolbarButtonIndentIncreaseAccessiblityLabel = WMFLocalizedString("editor-toolbar-indent-increase-accessibility", value: "Increase indent text formatting", comment: "Accessibility label for increase indent toolbar button on the editor.") + public static let editorKeyboardButtonIndentIncreaseAccessiblityLabel = WMFLocalizedString("editor-keyboard-indent-increase-accessibility", value: "Increase indent", comment: "Accessibility label for increase indent keyboard button on the editor.") + + public static let editorToolbarButtonIndentDecreaseAccessiblityLabel = WMFLocalizedString("editor-toolbar-indent-decrease-accessibility", value: "Decrease indent text formatting", comment: "Accessibility label for decrease indent toolbar button on the editor.") + public static let editorKeyboardButtonIndentDecreaseAccessiblityLabel = WMFLocalizedString("editor-keyboard-indent-decrease-accessibility", value: "Decrease indent", comment: "Accessibility label for decrease indent keyboard button on the editor.") + + public static let editorToolbarButtonCursorUpAccessiblityLabel = WMFLocalizedString("editor-toolbar-cursor-up-accessibility", value: "Move cursor up to previous line.", comment: "Accessibility label for move cursor up button on the editor. This button moves the cursor up to the previous line.") + public static let editorToolbarButtonCursorDownAccessiblityLabel = WMFLocalizedString("editor-toolbar-cursor-down-accessibility", value: "Move cursor down to next line.", comment: "Accessibility label for move cursor down button on the editor. This button moves the cursor down to the next line.") + public static let editorToolbarButtonCursorPreviousAccessiblityLabel = WMFLocalizedString("editor-toolbar-cursor-previous-accessibility", value: "Move cursor to previous character.", comment: "Accessibility label for move cursor down button on the editor. This button moves the cursor to the previous character.") + public static let editorToolbarButtonCursorNextAccessiblityLabel = WMFLocalizedString("editor-toolbar-cursor-next-accessibility", value: "Move cursor to next character.", comment: "Accessibility label for move cursor next button on the editor. This button moves the cursor to the next character.") + + public static let editorToolbarButtonBoldAccessiblityLabel = WMFLocalizedString("editor-toolbar-bold-accessibility", value: "Bold text formatting", comment: "Accessibility label for bold toolbar button on the editor.") + public static let editorKeyboardButtonBoldAccessiblityLabel = WMFLocalizedString("editor-keyboard-bold-accessibility", value: "Bold", comment: "Accessibility label for bold keyboard button on the editor.") + + public static let editorToolbarButtonItalicsAccessiblityLabel = WMFLocalizedString("editor-toolbar-italics-accessibility", value: "Italics text formatting", comment: "Accessibility label for italics toolbar button on the editor.") + public static let editorKeyboardButtonItalicsAccessiblityLabel = WMFLocalizedString("editor-keyboard-italics-accessibility", value: "Italics", comment: "Accessibility label for italics keyboard button on the editor.") + + public static let editorKeyboardButtonCommentAccessiblityLabel = WMFLocalizedString("editor-keyboard-comment-accessibility", value: "Comment", comment: "Accessibility label for comment keyboard button on the editor.") + + public static let editorKeyboardButtonSuperscriptAccessiblityLabel = WMFLocalizedString("editor-keyboard-superscript-accessibility", value: "Superscript", comment: "Accessibility label for superscript keyboard button on the editor.") + + public static let editorKeyboardButtonSubscriptAccessiblityLabel = WMFLocalizedString("editor-keyboard-subscript-accessibility", value: "Subscript", comment: "Accessibility label for subscript keyboard button on the editor.") + + public static let editorKeyboardButtonUnderlineAccessiblityLabel = WMFLocalizedString("editor-keyboard-underline-accessibility", value: "Underline", comment: "Accessibility label for underline keyboard button on the editor.") + + public static let editorKeyboardButtonStrikethroughAccessiblityLabel = WMFLocalizedString("editor-keyboard-strikethrough-accessibility", value: "Strikethrough", comment: "Accessibility label for strikethrough keyboard button on the editor.") + + public static let editorKeyboardButtonCloseTextFormatMenuAccessiblityLabel = WMFLocalizedString("editor-keyboard-close-text-format-menu-accessibility", value: "Close text formatting menu", comment: "Accessibility label for close keyboard button on the editor. This button closes the keyboard text formatting menu.") + + public static let editorFindTextFieldAccessibilityLabel = WMFLocalizedString("editor-find-textfield-accessibility", value: "Find", comment: "Accessibility label for the find textfield on the editor") + public static let editorFindClearButtonAccessibilityLabel = WMFLocalizedString("editor-find-clear-button-accessibility", value: "Clear find", comment: "Accessibility label for the clear find button on the editor. This button clears the text in the find textfield.") + public static let editorFindCurrentMatchInfoFormatAccessibilityLabel = WMFLocalizedString("editor-find-current-match-info-accessibility", value: "%1$@ total matches found. Highlighted match number %2$@", comment: "Accessibility text for the match results informational label. %1$@ is replaced by the total number of matches found. %2$@ is replaced by which number match is currently highlighted.") + public static let editorFindCurrentMatchInfoZeroResultsAccessibilityLabel = WMFLocalizedString("editor-find-current-match-info-zero-results-accessibility", value: "No matches found", comment: "Accessibility text for zero match results informational label.") + public static let editorFindCloseButtonAccessibilityLabel = WMFLocalizedString("editor-find-close-button-accessibility", value: "Close find", comment: "Accessibility label for the close find button on the editor. This button clears out find results and closes the find in page view.") + public static let editorFindNextButtonAccessibilityLabel = WMFLocalizedString("editor-find-next-button-accessibility", value: "Next find result", comment: "Accessibility label for the find next result on the editor. This button highlights the next find result in the editor text.") + public static let editorFindPreviousButtonAccessibilityLabel = WMFLocalizedString("editor-find-previous-button-accessibility", value: "Previous find result", comment: "Accessibility label for the find previous result on the editor. This button highlights the previous find result in the editor text.") + public static let editorReplaceTextFieldAccessibilityLabel = WMFLocalizedString("editor-replace-textfield-accessibility", value: "Replace", comment: "Accessibility label for the replace textfield on the editor") + public static let editorReplaceClearButtonAccessibilityLabel = WMFLocalizedString("editor-replace-clear-button-accessibility", value: "Clear replace", comment: "Accessibility label for the clear replace button on the editor. This button clears the text in the replace textfield.") + + public static let editorReplaceButtonFormatAccessibilityLabel = WMFLocalizedString("editor-replace-button-format-accessibility", value: "Perform replace operation. Replace type is set to %1$@.", comment: "Accessibility label for the replace button on the editor. %1$@ is replaced by the replace type the user has set (single instance or all instances).") + + public static let editorReplaceTypeButtonFormatAccessibilityLabel = WMFLocalizedString("editor-replace-type-button-accessibility", value: "Switch replace type. Currently set to %1$@. Select to change.", comment: "Accessibility label for the replace type button on the editor. %1$@ is replaced by the replace type the user has set (single instance or all instances).") + + public static let editorReplaceTypeSingleAccessibility = WMFLocalizedString("editor-replace-type-single-accessibility", value: "Replace single instance", comment: "Accessibility text for the replace single instance type on the editor.") + public static let editorReplaceTypeAllAccessibility = WMFLocalizedString("editor-replace-type-all-accessibility", value: "Replace all instances", comment: "Accessibility text for the replace all instances type on the editor.") + + public static let editContextMenuTitle = WMFLocalizedString("edit-menu-item", value: "Edit", comment: "Button label for 'Edit' context menu item") + + public static let editSource = WMFLocalizedString("editor-edit-source", value: "Edit source", comment: "Title for menu option to edit the source of a page.") + + public static let editPublishedToastTitle = WMFLocalizedString("editor-edit-published", value: "Your edit was published.", comment: "Title for alert informing that the user's new edit was successfully published.") } // Language variant strings diff --git a/Wikipedia/Code/PageEditorViewController.swift b/Wikipedia/Code/PageEditorViewController.swift index 42049cfdbaf..13adcbe18e9 100644 --- a/Wikipedia/Code/PageEditorViewController.swift +++ b/Wikipedia/Code/PageEditorViewController.swift @@ -123,65 +123,64 @@ final class PageEditorViewController: UIViewController { } private func addChildEditor(wikitext: String) { - let localizedStrings = WKSourceEditorLocalizedStrings(inputViewTextFormatting: CommonStrings.textFormatting, - inputViewStyle: CommonStrings.style, - inputViewClearFormatting: CommonStrings.clearFormatting, - inputViewParagraph: CommonStrings.paragraph, - inputViewHeading: CommonStrings.heading, - inputViewSubheading1: CommonStrings.subheading1, - inputViewSubheading2: CommonStrings.subheading2, - inputViewSubheading3: CommonStrings.subheading3, - inputViewSubheading4: CommonStrings.subheading4, - findReplaceTypeSingle: CommonStrings.findAndReplaceSingle, - findReplaceTypeAll: CommonStrings.findAndReplaceAll, - findReplaceWith: CommonStrings.replaceWith, findReplaceTypeMenuTitle: CommonStrings.findReplaceHeader, - accessibilityLabelButtonFormatText: CommonStrings.accessibilityLabelButtonFormatText, - accessibilityLabelButtonCitation: CommonStrings.accessibilityLabelButtonCitation, - accessibilityLabelButtonCitationSelected: CommonStrings.accessibilityLabelButtonCitationSelected, - accessibilityLabelButtonLink: CommonStrings.accessibilityLabelButtonBold, - accessibilityLabelButtonLinkSelected: CommonStrings.accessibilityLabelButtonLinkSelected, - accessibilityLabelButtonTemplate: CommonStrings.accessibilityLabelButtonTemplate, - accessibilityLabelButtonTemplateSelected: CommonStrings.accessibilityLabelButtonTemplateSelected, - accessibilityLabelButtonMedia: CommonStrings.accessibilityLabelButtonMedia, - accessibilityLabelButtonFind: CommonStrings.accessibilityLabelButtonFind, - accessibilityLabelButtonListUnordered: CommonStrings.accessibilityLabelButtonListUnordered, - accessibilityLabelButtonListUnorderedSelected: CommonStrings.accessibilityLabelButtonListUnorderedSelected, - accessibilityLabelButtonListOrdered: CommonStrings.accessibilityLabelButtonListOrdered, - accessibilityLabelButtonListOrderedSelected: CommonStrings.accessibilityLabelButtonListOrderedSelected, - accessibilityLabelButtonInceaseIndent: CommonStrings.accessibilityLabelButtonIncreaseIndent, - accessibilityLabelButtonDecreaseIndent: CommonStrings.accessibilityLabelButtonDecreaseIndent, - accessibilityLabelButtonCursorUp: CommonStrings.accessibilityLabelButtonCursorUp, - accessibilityLabelButtonCursorDown: CommonStrings.accessibilityLabelButtonCursorDown, - accessibilityLabelButtonCursorLeft: CommonStrings.accessibilityLabelButtonCursorLeft, - accessibilityLabelButtonCursorRight: CommonStrings.accessibilityLabelButtonCursorRight, - accessibilityLabelButtonBold: CommonStrings.accessibilityLabelButtonBold, - accessibilityLabelButtonBoldSelected: CommonStrings.accessibilityLabelButtonBoldSelected, - accessibilityLabelButtonItalics: CommonStrings.accessibilityLabelButtonItalics, - accessibilityLabelButtonItalicsSelected: CommonStrings.accessibilityLabelButtonItalicsSelected, - accessibilityLabelButtonShowMore: CommonStrings.accessibilityLabelButtonShowMore, - accessibilityLabelButtonComment: CommonStrings.accessibilityLabelButtonComment, - accessibilityLabelButtonCommentSelected: CommonStrings.accessibilityLabelButtonCommentSelected, - accessibilityLabelButtonSuperscript: CommonStrings.accessibilityLabelButtonSuperscript, - accessibilityLabelButtonSuperscriptSelected: CommonStrings.accessibilityLabelButtonSuperscriptSelected, - accessibilityLabelButtonSubscript: CommonStrings.accessibilityLabelButtonSubscript, - accessibilityLabelButtonSubscriptSelected: CommonStrings.accessibilityLabelButtonSubscriptSelected, - accessibilityLabelButtonUnderline: CommonStrings.accessibilityLabelButtonUnderline, - accessibilityLabelButtonUnderlineSelected: CommonStrings.accessibilityLabelButtonUnderlineSelected, - accessibilityLabelButtonStrikethrough: CommonStrings.accessibilityLabelButtonStrikethrough, - accessibilityLabelButtonStrikethroughSelected: CommonStrings.accessibilityLabelButtonStrikethroughSelected, - accessibilityLabelButtonCloseMainInputView: CommonStrings.accessibilityLabelButtonCloseMainInputView, - accessibilityLabelButtonCloseHeaderSelectInputView: CommonStrings.accessibilityLabelButtonCloseHeaderSelectInputView, - accessibilityLabelFindTextField: CommonStrings.accessibilityLabelButtonFind, - accessibilityLabelFindButtonClear: CommonStrings.accessibilityLabelButtonClearFormatting, - accessibilityLabelFindButtonClose: CommonStrings.accessibilityLabelFindButtonClose, - accessibilityLabelFindButtonNext: CommonStrings.accessibilityLabelFindButtonNext, - accessibilityLabelFindButtonPrevious: CommonStrings.accessibilityLabelFindButtonPrevious, - accessibilityLabelReplaceTextField: CommonStrings.accessibilityLabelReplaceTextField, - accessibilityLabelReplaceButtonClear: CommonStrings.accessibilityLabelReplaceButtonClear, - accessibilityLabelReplaceButtonPerformFormat: CommonStrings.accessibilityLabelReplaceButtonPerformFormat, - accessibilityLabelReplaceButtonSwitchFormat: CommonStrings.accessibilityLabelReplaceButtonSwitchFormat, - accessibilityLabelReplaceTypeSingle: CommonStrings.accessibilityLabelReplaceTypeSingle, - accessibilityLabelReplaceTypeAll: CommonStrings.accessibilityLabelReplaceTypeAll) + let localizedStrings = WKSourceEditorLocalizedStrings( + keyboardTextFormattingTitle: CommonStrings.editorKeyboardTextFormattingTitle, + keyboardParagraph: CommonStrings.editorKeyboardParagraphButton, + keyboardHeading: CommonStrings.editorKeyboardHeadingButton, + keyboardSubheading1: CommonStrings.editorKeyboardSubheading1Button, + keyboardSubheading2: CommonStrings.editorKeyboardSubheading2Button, + keyboardSubheading3: CommonStrings.editorKeyboardSubheading3Button, + keyboardSubheading4: CommonStrings.editorKeyboardSubheading4Button, + findAndReplaceTitle: CommonStrings.findReplaceHeader, + replaceTypeSingle: CommonStrings.editorReplaceTypeSingle, + replaceTypeAll: CommonStrings.editorReplaceTypeAll, + replaceTextfieldPlaceholder: CommonStrings.editorReplaceTextfieldPlaceholder, + replaceTypeContextMenuTitle: CommonStrings.findReplaceHeader, + toolbarOpenTextFormatMenuButtonAccessibility: CommonStrings.editorToolbarButtonOpenTextFormatMenuAccessiblityLabel, + toolbarReferenceButtonAccessibility: CommonStrings.editorToolbarButtonReferenceAccessiblityLabel, + toolbarLinkButtonAccessibility: CommonStrings.editorToolbarButtonLinkAccessiblityLabel, + toolbarTemplateButtonAccessibility: CommonStrings.editorToolbarButtonTemplateAccessiblityLabel, + toolbarImageButtonAccessibility: CommonStrings.editorToolbarButtonImageAccessiblityLabel, + toolbarFindButtonAccessibility: CommonStrings.editorToolbarButtonFindAccessiblityLabel, + toolbarListUnorderedButtonAccessibility: CommonStrings.editorToolbarButtonListUnorderedAccessiblityLabel, + toolbarListOrderedButtonAccessibility: CommonStrings.editorToolbarButtonListOrderedAccessiblityLabel, + toolbarIndentIncreaseButtonAccessibility: CommonStrings.editorToolbarButtonIndentIncreaseAccessiblityLabel, + toolbarIndentDecreaseButtonAccessibility: CommonStrings.editorToolbarButtonIndentDecreaseAccessiblityLabel, + toolbarCursorUpButtonAccessibility: CommonStrings.editorToolbarButtonCursorUpAccessiblityLabel, + toolbarCursorDownButtonAccessibility: CommonStrings.editorToolbarButtonCursorDownAccessiblityLabel, + toolbarCursorPreviousButtonAccessibility: CommonStrings.editorToolbarButtonCursorPreviousAccessiblityLabel, + toolbarCursorNextButtonAccessibility: CommonStrings.editorToolbarButtonCursorNextAccessiblityLabel, + toolbarBoldButtonAccessibility: CommonStrings.editorToolbarButtonBoldAccessiblityLabel, + toolbarItalicsButtonAccessibility: CommonStrings.editorToolbarButtonItalicsAccessiblityLabel, + keyboardCloseTextFormatMenuButtonAccessibility: CommonStrings.editorKeyboardButtonCloseTextFormatMenuAccessiblityLabel, + keyboardBoldButtonAccessibility: CommonStrings.editorKeyboardButtonBoldAccessiblityLabel, + keyboardItalicsButtonAccessibility: CommonStrings.editorKeyboardButtonItalicsAccessiblityLabel, + keyboardUnderlineButtonAccessibility: CommonStrings.editorKeyboardButtonUnderlineAccessiblityLabel, + keyboardStrikethroughButtonAccessibility: CommonStrings.editorKeyboardButtonStrikethroughAccessiblityLabel, + keyboardReferenceButtonAccessibility: CommonStrings.editorKeyboardButtonReferenceAccessiblityLabel, + keyboardLinkButtonAccessibility: CommonStrings.editorKeyboardButtonLinkAccessiblityLabel, + keyboardListUnorderedButtonAccessibility: CommonStrings.editorKeyboardButtonListUnorderedAccessiblityLabel, + keyboardListOrderedButtonAccessibility: CommonStrings.editorKeyboardButtonListOrderedAccessiblityLabel, + keyboardIndentIncreaseButtonAccessibility: CommonStrings.editorKeyboardButtonIndentIncreaseAccessiblityLabel, + keyboardIndentDecreaseButtonAccessibility: CommonStrings.editorKeyboardButtonIndentDecreaseAccessiblityLabel, + keyboardSuperscriptButtonAccessibility: CommonStrings.editorKeyboardButtonSuperscriptAccessiblityLabel, + keyboardSubscriptButtonAccessibility: CommonStrings.editorKeyboardButtonSubscriptAccessiblityLabel, + keyboardTemplateButtonAccessibility: CommonStrings.editorKeyboardButtonTemplateAccessiblityLabel, + keyboardCommentButtonAccessibility: CommonStrings.editorKeyboardButtonCommentAccessiblityLabel, + findTextFieldAccessibility: CommonStrings.editorFindTextFieldAccessibilityLabel, + findClearButtonAccessibility: CommonStrings.editorFindClearButtonAccessibilityLabel, + findCurrentMatchInfoFormatAccessibility: CommonStrings.editorFindCurrentMatchInfoFormatAccessibilityLabel, + findCurrentMatchInfoZeroResultsAccessibility: CommonStrings.editorFindCurrentMatchInfoZeroResultsAccessibilityLabel, + findCloseButtonAccessibility: CommonStrings.editorFindCloseButtonAccessibilityLabel, + findNextButtonAccessibility: CommonStrings.editorFindNextButtonAccessibilityLabel, + findPreviousButtonAccessibility: CommonStrings.editorFindPreviousButtonAccessibilityLabel, + replaceTextFieldAccessibility: CommonStrings.editorReplaceTextFieldAccessibilityLabel, + replaceClearButtonAccessibility: CommonStrings.editorReplaceClearButtonAccessibilityLabel, + replaceButtonAccessibilityFormat: CommonStrings.editorReplaceButtonFormatAccessibilityLabel, + replaceTypeButtonAccessibilityFormat: CommonStrings.editorReplaceTypeButtonFormatAccessibilityLabel, + replaceTypeSingleAccessibility: CommonStrings.editorReplaceTypeSingleAccessibility, + replaceTypeAllAccessibility: CommonStrings.editorReplaceTypeAllAccessibility) + let isSyntaxHighlightingEnabled = UserDefaults.standard.wmf_IsSyntaxHighlightingEnabled let textAlignment = MWKLanguageLinkController.isLanguageRTL(forContentLanguageCode: pageURL.wmf_contentLanguageCode) ? NSTextAlignment.right : NSTextAlignment.left diff --git a/Wikipedia/Code/ReadingThemesControlsViewController.swift b/Wikipedia/Code/ReadingThemesControlsViewController.swift index 80b1310b5d6..ae2fc16b4c2 100644 --- a/Wikipedia/Code/ReadingThemesControlsViewController.swift +++ b/Wikipedia/Code/ReadingThemesControlsViewController.swift @@ -72,6 +72,7 @@ class ReadingThemesControlsViewController: UIViewController { } brightnessSlider.value = Float(UIScreen.main.brightness) + slider.accessibilityLabel = WMFLocalizedString("reading-themes-controls-accessibility-text-size-slider", value: "Text size slider", comment: "Accessibility label for the text size slider in the Reading Themes Controls popover") brightnessSlider.accessibilityLabel = WMFLocalizedString("reading-themes-controls-accessibility-brightness-slider", value: "Brightness slider", comment: "Accessibility label for the brightness slider in the Reading Themes Controls popover") lightThemeButton.accessibilityLabel = WMFLocalizedString("reading-themes-controls-accessibility-light-theme-button", value: "Light theme", comment: "Accessibility label for the light theme button in the Reading Themes Controls popover") sepiaThemeButton.accessibilityLabel = WMFLocalizedString("reading-themes-controls-accessibility-sepia-theme-button", value: "Sepia theme", comment: "Accessibility label for the sepia theme button in the Reading Themes Controls popover") diff --git a/Wikipedia/Localizations/en.lproj/Localizable.strings b/Wikipedia/Localizations/en.lproj/Localizable.strings index da65be00367..59a40463e47 100644 --- a/Wikipedia/Localizations/en.lproj/Localizable.strings +++ b/Wikipedia/Localizations/en.lproj/Localizable.strings @@ -338,9 +338,65 @@ "editing-welcome-impartial-tone-title" = "Write in an impartial tone"; "editing-welcome-set-knowledge-free-subtitle" = "In order to give everyone access to the world’s knowledge, we need you to participate in its creation by reading, editing, and contributing to the topics that matter most to you."; "editing-welcome-set-knowledge-free-title" = "Set knowledge free"; +"editor-edit-published" = "Your edit was published."; +"editor-edit-source" = "Edit source"; "editor-exit-confirmation-body" = "Are you sure you want to leave editing mode without publishing first?"; "editor-exit-confirmation-message" = "Are you sure you want to discard this edit?"; "editor-exit-confirmation-title" = "Dismiss the editing mode?"; +"editor-find-clear-button-accessibility" = "Clear find"; +"editor-find-close-button-accessibility" = "Close find"; +"editor-find-current-match-info-accessibility" = "$1 total matches found. Highlighted match number $2"; +"editor-find-current-match-info-zero-results-accessibility" = "No matches found"; +"editor-find-next-button-accessibility" = "Next find result"; +"editor-find-previous-button-accessibility" = "Previous find result"; +"editor-find-textfield-accessibility" = "Find"; +"editor-keyboard-bold-accessibility" = "Bold"; +"editor-keyboard-close-text-format-menu-accessibility" = "Close text formatting menu"; +"editor-keyboard-comment-accessibility" = "Comment"; +"editor-keyboard-heading-button" = "Heading"; +"editor-keyboard-indent-decrease-accessibility" = "Decrease indent"; +"editor-keyboard-indent-increase-accessibility" = "Increase indent"; +"editor-keyboard-italics-accessibility" = "Italics"; +"editor-keyboard-link-accessibility" = "Link"; +"editor-keyboard-list-ordered-accessibility" = "Ordered list"; +"editor-keyboard-list-unordered-accessibility" = "Unordered list"; +"editor-keyboard-paragraph-button" = "Paragraph"; +"editor-keyboard-reference-accessibility" = "Reference"; +"editor-keyboard-strikethrough-accessibility" = "Strikethrough"; +"editor-keyboard-subheading1-button" = "Subheading 1"; +"editor-keyboard-subheading2-button" = "Subheading 2"; +"editor-keyboard-subheading3-button" = "Subheading 3"; +"editor-keyboard-subheading4-button" = "Subheading 4"; +"editor-keyboard-subscript-accessibility" = "Subscript"; +"editor-keyboard-superscript-accessibility" = "Superscript"; +"editor-keyboard-template-accessibility" = "Template"; +"editor-keyboard-text-formatting-title" = "Text Formatting"; +"editor-keyboard-underline-accessibility" = "Underline"; +"editor-replace-button-format-accessibility" = "Perform replace operation. Replace type is set to $1."; +"editor-replace-clear-button-accessibility" = "Clear replace"; +"editor-replace-textfield-accessibility" = "Replace"; +"editor-replace-textfield-placeholder" = "Replace with..."; +"editor-replace-type-all" = "Replace all"; +"editor-replace-type-all-accessibility" = "Replace all instances"; +"editor-replace-type-button-accessibility" = "Switch replace type. Currently set to $1. Select to change."; +"editor-replace-type-single" = "Replace"; +"editor-replace-type-single-accessibility" = "Replace single instance"; +"editor-toolbar-bold-accessibility" = "Bold text formatting"; +"editor-toolbar-cursor-down-accessibility" = "Move cursor down to next line."; +"editor-toolbar-cursor-next-accessibility" = "Move cursor to next character."; +"editor-toolbar-cursor-previous-accessibility" = "Move cursor to previous character."; +"editor-toolbar-cursor-up-accessibility" = "Move cursor up to previous line."; +"editor-toolbar-find-accessibility" = "Find in page"; +"editor-toolbar-image-accessibility" = "Image text formatting"; +"editor-toolbar-indent-decrease-accessibility" = "Decrease indent text formatting"; +"editor-toolbar-indent-increase-accessibility" = "Increase indent text formatting"; +"editor-toolbar-italics-accessibility" = "Italics text formatting"; +"editor-toolbar-link-accessibility" = "Link text formatting"; +"editor-toolbar-list-ordered-accessibility" = "Ordered list text formatting"; +"editor-toolbar-list-unordered-accessibility" = "Unordered list text formatting"; +"editor-toolbar-open-text-format-menu-accessibility" = "Open text formatting menu"; +"editor-toolbar-reference-accessibility" = "Reference text formatting"; +"editor-toolbar-template-accessibility" = "Template text formatting"; "empty-diff-compare-title" = "No differences between revisions"; "empty-diff-single-title" = "No viewable changes made"; "empty-insert-media-title" = "Select a file from Wikimedia Commons"; @@ -1001,68 +1057,6 @@ "share-social-mention-format" = "“$1” via Wikipedia: $2"; "sort-by-recently-added-action" = "Recently added"; "sort-by-title-action" = "Title"; -"source-editor-accessibility-label-bold" = "Add bold formatting"; -"source-editor-accessibility-label-bold-selected" = "Remove bold formatting"; -"source-editor-accessibility-label-citation" = "Add reference syntax"; -"source-editor-accessibility-label-citation-selected" = "Remove reference syntax"; -"source-editor-accessibility-label-clear-formatting" = "Clear formatting"; -"source-editor-accessibility-label-close-header-select" = "Close text style menu"; -"source-editor-accessibility-label-close-main-input" = "Close text formatting menu"; -"source-editor-accessibility-label-comment" = "Add comment syntax"; -"source-editor-accessibility-label-comment-selected" = "Remove comment syntax"; -"source-editor-accessibility-label-cursor-down" = "Move cursor down"; -"source-editor-accessibility-label-cursor-left" = "Move cursor left"; -"source-editor-accessibility-label-cursor-right" = "Move cursor right"; -"source-editor-accessibility-label-cursor-up" = "Move cursor up"; -"source-editor-accessibility-label-find" = "Find in page"; -"source-editor-accessibility-label-find-button-clear" = "Clear find"; -"source-editor-accessibility-label-find-button-close" = "Close find"; -"source-editor-accessibility-label-find-button-next" = "Next find result"; -"source-editor-accessibility-label-find-button-prev" = "Previous find result"; -"source-editor-accessibility-label-find-text-field" = "Find"; -"source-editor-accessibility-label-format-text" = "Show text formatting menu"; -"source-editor-accessibility-label-format-text-show-more" = "Show text formatting menu"; -"source-editor-accessibility-label-indent-decrease" = "Decrease indent depth"; -"source-editor-accessibility-label-indent-increase" = "Increase indent depth"; -"source-editor-accessibility-label-italics" = "Add italic formatting"; -"source-editor-accessibility-label-italics-selected" = "Remove italic formatting"; -"source-editor-accessibility-label-link" = "Add link syntax"; -"source-editor-accessibility-label-link-selected" = "Remove link syntax"; -"source-editor-accessibility-label-media" = "Insert media"; -"source-editor-accessibility-label-ordered" = "Make current line ordered list"; -"source-editor-accessibility-label-ordered-selected" = "Remove ordered list from current line"; -"source-editor-accessibility-label-replace-button-clear" = "Clear replace"; -"source-editor-accessibility-label-replace-button-perform-format" = "Perform replace operation. Replace type is set to $1"; -"source-editor-accessibility-label-replace-button-switch-format" = "Switch replace type. Currently set to $1. Select to change."; -"source-editor-accessibility-label-replace-text-field" = "Replace"; -"source-editor-accessibility-label-replace-type-all" = "Replace all instances"; -"source-editor-accessibility-label-replace-type-single" = "Replace single instance"; -"source-editor-accessibility-label-strikethrough" = "Add strikethrough"; -"source-editor-accessibility-label-strikethrough-selected" = "Remove strikethrough"; -"source-editor-accessibility-label-subscript" = "Add subscript formatting"; -"source-editor-accessibility-label-subscript-selected" = "Remove subscript formatting"; -"source-editor-accessibility-label-superscript" = "Add superscript formatting"; -"source-editor-accessibility-label-superscript-selected" = "Remove superscript formatting"; -"source-editor-accessibility-label-template" = "Add template syntax"; -"source-editor-accessibility-label-template-selected" = "Remove template syntax"; -"source-editor-accessibility-label-underline" = "Add underline"; -"source-editor-accessibility-label-underline-selected" = "Remove underline"; -"source-editor-accessibility-label-unordered" = "Make current line unordered list"; -"source-editor-accessibility-label-unordered-selected" = "Remove unordered list from current line"; -"source-editor-clear-formatting" = "Clear formatting"; -"source-editor-edit-published" = "Your edit was published."; -"source-editor-edit-source" = "Edit source"; -"source-editor-find-replace-all" = "Replace all"; -"source-editor-find-replace-single" = "Replace"; -"source-editor-find-replace-with" = "Replace with..."; -"source-editor-heading" = "Heading"; -"source-editor-paragraph" = "Paragraph"; -"source-editor-style" = "Style"; -"source-editor-subheading1" = "Subheading 1"; -"source-editor-subheading2" = "Subheading 2"; -"source-editor-subheading3" = "Subheading 3"; -"source-editor-subheading4" = "Subheading 4"; -"source-editor-text-formatting" = "Text Formatting"; "table-of-contents-button-label" = "Table of contents"; "table-of-contents-close-accessibility-hint" = "Close"; "table-of-contents-close-accessibility-label" = "Close Table of contents"; diff --git a/Wikipedia/Localizations/qqq.lproj/Localizable.strings b/Wikipedia/Localizations/qqq.lproj/Localizable.strings index 86411e8265c..fb24219f4a1 100644 --- a/Wikipedia/Localizations/qqq.lproj/Localizable.strings +++ b/Wikipedia/Localizations/qqq.lproj/Localizable.strings @@ -338,9 +338,65 @@ "editing-welcome-impartial-tone-title" = "Title for editing onboarding screen instructing users to use impartial tone when editing Wikipedia articles"; "editing-welcome-set-knowledge-free-subtitle" = "Title for editing onboarding screen encouraging users to participate in the creation of Wikipedia content"; "editing-welcome-set-knowledge-free-title" = "Title for editing onboarding screen encouraging users to participate in the creation of Wikipedia content"; +"editor-edit-published" = "Title for alert informing that the user's new edit was successfully published."; +"editor-edit-source" = "Title for menu option to edit the source of a page."; "editor-exit-confirmation-body" = "Body text of editing mode confirmation alert. Presented to the user when they they are about to be navigated away from the editor flow."; "editor-exit-confirmation-message" = "Message text of editing mode confirmation alert. Presented to the user when they they are about to be navigated away from the editor flow."; "editor-exit-confirmation-title" = "Title text of editing mode confirmation alert. Presented to the user when they they are about to be navigated away from the editor flow."; +"editor-find-clear-button-accessibility" = "Accessibility label for the clear find button on the editor. This button clears the text in the find textfield."; +"editor-find-close-button-accessibility" = "Accessibility label for the close find button on the editor. This button clears out find results and closes the find in page view."; +"editor-find-current-match-info-accessibility" = "Accessibility text for the match results informational label. $1 is replaced by the total number of matches found. $2 is replaced by which number match is currently highlighted."; +"editor-find-current-match-info-zero-results-accessibility" = "Accessibility text for zero match results informational label."; +"editor-find-next-button-accessibility" = "Accessibility label for the find next result on the editor. This button highlights the next find result in the editor text."; +"editor-find-previous-button-accessibility" = "Accessibility label for the find previous result on the editor. This button highlights the previous find result in the editor text."; +"editor-find-textfield-accessibility" = "Accessibility label for the find textfield on the editor"; +"editor-keyboard-bold-accessibility" = "Accessibility label for bold keyboard button on the editor."; +"editor-keyboard-close-text-format-menu-accessibility" = "Accessibility label for close keyboard button on the editor. This button closes the keyboard text formatting menu."; +"editor-keyboard-comment-accessibility" = "Accessibility label for comment keyboard button on the editor."; +"editor-keyboard-heading-button" = "Heading button label in the text formatting keyboard view on the editor."; +"editor-keyboard-indent-decrease-accessibility" = "Accessibility label for decrease indent keyboard button on the editor."; +"editor-keyboard-indent-increase-accessibility" = "Accessibility label for increase indent keyboard button on the editor."; +"editor-keyboard-italics-accessibility" = "Accessibility label for italics keyboard button on the editor."; +"editor-keyboard-link-accessibility" = "Accessibility label for link keyboard button on the editor."; +"editor-keyboard-list-ordered-accessibility" = "Accessibility label for ordered list keyboard button on the editor."; +"editor-keyboard-list-unordered-accessibility" = "Accessibility label for unordered list keyboard button on the editor."; +"editor-keyboard-paragraph-button" = "Paragraph button label in the text formatting keyboard view on the editor."; +"editor-keyboard-reference-accessibility" = "Accessibility label for reference keyboard button on the editor."; +"editor-keyboard-strikethrough-accessibility" = "Accessibility label for strikethrough keyboard button on the editor."; +"editor-keyboard-subheading1-button" = "Subheading1 button label in the text formatting keyboard view on the editor."; +"editor-keyboard-subheading2-button" = "Subheading2 button label in the text formatting keyboard view on the editor."; +"editor-keyboard-subheading3-button" = "Subheading3 button label in the text formatting keyboard view on the editor."; +"editor-keyboard-subheading4-button" = "Subheading4 button label in the text formatting keyboard view on the editor."; +"editor-keyboard-subscript-accessibility" = "Accessibility label for subscript keyboard button on the editor."; +"editor-keyboard-superscript-accessibility" = "Accessibility label for superscript keyboard button on the editor."; +"editor-keyboard-template-accessibility" = "Accessibility label for template keyboard button on the editor."; +"editor-keyboard-text-formatting-title" = "Title of text formatting keyboard view on the editor."; +"editor-keyboard-underline-accessibility" = "Accessibility label for underline keyboard button on the editor."; +"editor-replace-button-format-accessibility" = "Accessibility label for the replace button on the editor. $1 is replaced by the replace type the user has set (single instance or all instances)."; +"editor-replace-clear-button-accessibility" = "Accessibility label for the clear replace button on the editor. This button clears the text in the replace textfield."; +"editor-replace-textfield-accessibility" = "Accessibility label for the replace textfield on the editor"; +"editor-replace-textfield-placeholder" = "Placeholder label displayed when the replace textfield in the editor's find and replace view is empty."; +"editor-replace-type-all" = "Label indicating which replace type the user has set in the find and replace view on the editor. This type replaces all instances of the find text."; +"editor-replace-type-all-accessibility" = "Accessibility text for the replace all instances type on the editor."; +"editor-replace-type-button-accessibility" = "Accessibility label for the replace type button on the editor. $1 is replaced by the replace type the user has set (single instance or all instances)."; +"editor-replace-type-single" = "Label indicating which replace type the user has set in the find and replace view on the editor. This type replaces a single instance of the find text."; +"editor-replace-type-single-accessibility" = "Accessibility text for the replace single instance type on the editor."; +"editor-toolbar-bold-accessibility" = "Accessibility label for bold toolbar button on the editor."; +"editor-toolbar-cursor-down-accessibility" = "Accessibility label for move cursor down button on the editor. This button moves the cursor down to the next line."; +"editor-toolbar-cursor-next-accessibility" = "Accessibility label for move cursor next button on the editor. This button moves the cursor to the next character."; +"editor-toolbar-cursor-previous-accessibility" = "Accessibility label for move cursor down button on the editor. This button moves the cursor to the previous character."; +"editor-toolbar-cursor-up-accessibility" = "Accessibility label for move cursor up button on the editor. This button moves the cursor up to the previous line."; +"editor-toolbar-find-accessibility" = "Accessibility label for find toolbar button on the editor. This button opens the find in page view."; +"editor-toolbar-image-accessibility" = "Accessibility label for image toolbar button on the editor."; +"editor-toolbar-indent-decrease-accessibility" = "Accessibility label for decrease indent toolbar button on the editor."; +"editor-toolbar-indent-increase-accessibility" = "Accessibility label for increase indent toolbar button on the editor."; +"editor-toolbar-italics-accessibility" = "Accessibility label for italics toolbar button on the editor."; +"editor-toolbar-link-accessibility" = "Accessibility label for link toolbar button on the editor."; +"editor-toolbar-list-ordered-accessibility" = "Accessibility label for ordered list toolbar button on the editor."; +"editor-toolbar-list-unordered-accessibility" = "Accessibility label for unordered list toolbar button on the editor."; +"editor-toolbar-open-text-format-menu-accessibility" = "Accessibility label for text format toolbar button on the editor. This button opens the keyboard text formatting menu."; +"editor-toolbar-reference-accessibility" = "Accessibility label for reference toolbar button on the editor."; +"editor-toolbar-template-accessibility" = "Accessibility label for template toolbar button on the editor."; "empty-diff-compare-title" = "Text for placeholder label visible when diff comparision between revisions is empty."; "empty-diff-single-title" = "Text for placeholder label visible when diff returned for single revision is empty."; "empty-insert-media-title" = "Text for placeholder label visible when no file was selected or uploaded"; @@ -893,7 +949,7 @@ "reading-themes-controls-accessibility-light-theme-button" = "Accessibility label for the light theme button in the Reading Themes Controls popover"; "reading-themes-controls-accessibility-sepia-theme-button" = "Accessibility label for the sepia theme button in the Reading Themes Controls popover"; "reading-themes-controls-accessibility-syntax-highlighting-switch" = "Accessibility text for the syntax highlighting toggle in the Reading Themes Controls popover"; -"reading-themes-controls-accessibility-text-size-slider" = "Accessibility label for the text size slider that adjusts article text size."; +"reading-themes-controls-accessibility-text-size-slider" = "Accessibility label for the text size slider in the Reading Themes Controls popover"; "reading-themes-controls-syntax-highlighting" = "Text for syntax highlighting label in the Reading Themes Controls popover"; "reference-section-button-accessibility-label" = "Voiceover label for the top button (that jumps to article's reference section) when viewing a reference's details"; "reference-title" = "Title shown above reference/citation popover. $1 is replaced with the reference link text - i.e. '[1]' {{Identical|Reference}}"; @@ -1001,68 +1057,6 @@ "share-social-mention-format" = "Share format string for social platforms with an @mention. $1 is replaced with the article title, $2 is replaced with the article URL."; "sort-by-recently-added-action" = "Title of the sort action that allows sorting items by date added."; "sort-by-title-action" = "Title of the sort action that allows sorting items by title."; -"source-editor-accessibility-label-bold" = "Accessibility label for the bold button on the page editor"; -"source-editor-accessibility-label-bold-selected" = "Accessibility label for the selected bold button on the page editor"; -"source-editor-accessibility-label-citation" = "Accessibility label for add reference syntax button on the page editor"; -"source-editor-accessibility-label-citation-selected" = "Accessibility label for remove reference syntax button on the page editor"; -"source-editor-accessibility-label-clear-formatting" = "Accessibility label for the clear formatting button on the page editor"; -"source-editor-accessibility-label-close-header-select" = "Accessibility label for the close text style menu button on the page editor"; -"source-editor-accessibility-label-close-main-input" = "Accessibility label for the close formatting menu button on the page editor"; -"source-editor-accessibility-label-comment" = "Accessibility label for the add comment button on the page editor"; -"source-editor-accessibility-label-comment-selected" = "Accessibility label for the selected comment button on the page editor"; -"source-editor-accessibility-label-cursor-down" = "Accessibility label for the move cursor down button on the page editor"; -"source-editor-accessibility-label-cursor-left" = "Accessibility label for the move cursor left button the page editor"; -"source-editor-accessibility-label-cursor-right" = "Accessibility label for the move cursor right on the page editor"; -"source-editor-accessibility-label-cursor-up" = "Accessibility label for the move cursor up button on the page editor"; -"source-editor-accessibility-label-find" = "Accessibility label for the find in page button on the page editor"; -"source-editor-accessibility-label-find-button-clear" = "Accessibility label for the clear find button on the page editor"; -"source-editor-accessibility-label-find-button-close" = "Accessibility label for the close find button on the page editor"; -"source-editor-accessibility-label-find-button-next" = "Accessibility label for the find next result on the page editor"; -"source-editor-accessibility-label-find-button-prev" = "Accessibility label for the find previous result button on the page editor"; -"source-editor-accessibility-label-find-text-field" = "Accessibility label for the find text field on the page editor"; -"source-editor-accessibility-label-format-text" = "Accessibility label for text formatting menu button on the page editor"; -"source-editor-accessibility-label-format-text-show-more" = "Accessibility label for the show more button on the page editor"; -"source-editor-accessibility-label-indent-decrease" = "Accessibility label for the decrease indent button on the page editor"; -"source-editor-accessibility-label-indent-increase" = "Accessibility label for the increase indent button on the page editor"; -"source-editor-accessibility-label-italics" = "Accessibility label for the italics button on the page editor"; -"source-editor-accessibility-label-italics-selected" = "Accessibility label for the selected italics button on the page editor"; -"source-editor-accessibility-label-link" = "Accessibility label for the add link syntax button on the page editor"; -"source-editor-accessibility-label-link-selected" = "Accessibility label for the remove link syntax button on the page editor"; -"source-editor-accessibility-label-media" = "Accessibility label for the insert media syntax button on the page editor"; -"source-editor-accessibility-label-ordered" = "Accessibility label for make ordered list button on the page editor"; -"source-editor-accessibility-label-ordered-selected" = "accessibility label for remove ordered list button on the page editor"; -"source-editor-accessibility-label-replace-button-clear" = "Accessibility label for the clear replace field button on the page editor"; -"source-editor-accessibility-label-replace-button-perform-format" = "Accessibility label for the perform replace button on the page editor, $1 is replaced by text to replace"; -"source-editor-accessibility-label-replace-button-switch-format" = "Accessibility label for switch format button on page editor, $1 is replaced by text to replace"; -"source-editor-accessibility-label-replace-text-field" = "Accessibility label for the replace text field on the page editor"; -"source-editor-accessibility-label-replace-type-all" = "Accessibility label for the replace all instances button on the page editor"; -"source-editor-accessibility-label-replace-type-single" = "Accessibility label for replace single instance button on the page editor"; -"source-editor-accessibility-label-strikethrough" = "Accessibility label for the strikethrough button on the page editor"; -"source-editor-accessibility-label-strikethrough-selected" = "Accessibility label for the selected strikethrough button on the page editor"; -"source-editor-accessibility-label-subscript" = "Accessibility label for the subscript button on the page editor"; -"source-editor-accessibility-label-subscript-selected" = "Accessibility label for the selected subscript button on the page editor"; -"source-editor-accessibility-label-superscript" = "Accessibility label for the superscript button on the page editor"; -"source-editor-accessibility-label-superscript-selected" = "Accessibility string for the selected superscript button on the page editor"; -"source-editor-accessibility-label-template" = "Accessibility label for the add template syntax button on the page editor"; -"source-editor-accessibility-label-template-selected" = "Accessibility label for the remove template syntax button on the page editor"; -"source-editor-accessibility-label-underline" = "Accessibility label for the underline button on the page editor"; -"source-editor-accessibility-label-underline-selected" = "Accessibility label for the selected underline button on the page editor"; -"source-editor-accessibility-label-unordered" = "Accessibility label for make unordered list button on the page editor"; -"source-editor-accessibility-label-unordered-selected" = "Accessibility label for remove unordered list button on the page editor"; -"source-editor-clear-formatting" = "Label for clear formatting on the page editor"; -"source-editor-edit-published" = "Title for alert informing that the user's new edit was successfully published."; -"source-editor-edit-source" = "Title for menu option to edit the source of a page."; -"source-editor-find-replace-all" = "Label for replace all ocurrences of a string on the page editor"; -"source-editor-find-replace-single" = "Label for replace single string button on page editor"; -"source-editor-find-replace-with" = "Lable for replace with string button on page editor"; -"source-editor-heading" = "Label for heading formatting button on section editor"; -"source-editor-paragraph" = "Label for paragraph formatting button on the page editor"; -"source-editor-style" = "Label for style formatting section on the page editor"; -"source-editor-subheading1" = "Label for subheading 1 formatting button on the page editor"; -"source-editor-subheading2" = "Label for subheading 2 formatting button on the page editor"; -"source-editor-subheading3" = "Label for subheading 3 formatting button on the page editor"; -"source-editor-subheading4" = "Label for subheading 4 formatting button on the page editor"; -"source-editor-text-formatting" = "Label for text formatting section on the page editor"; "table-of-contents-button-label" = "Accessibility label for the Table of Contents button {{Identical|Table of contents}}"; "table-of-contents-close-accessibility-hint" = "Accessibility hint for closing table of contents {{Identical|Close}}"; "table-of-contents-close-accessibility-label" = "Accessibility label for closing table of contents"; diff --git a/Wikipedia/iOS Native Localizations/br.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/br.lproj/Localizable.strings index afa92c1cb56e0eedeeb7c981b81dede42bacf300..f178ed975d16365f56517b2bc719cb83b3d130bf 100644 GIT binary patch delta 258 zcmV+d0sa24wFQW)1+XMCldQZXv&J%(1e2OD5R=|FK9j!i5R*Wo2$N1ZqLZ4bIFnR3 z;%+6WG{ zlmXfolOXL7lR%>gm+V6UBDW?P0SF3{?1U@zZ%6ba74kiIo8IyWz6q8^)D!1Z40p1pqZ1xzF&T|U4 IHdg_91N44pEdT%j delta 873 zcmeBJ&AMSL>jo7g$zq0lhEj$ihGd3R23;UdVaQ}C0g4q({+Ovb`N16)=}d+^pr|fT zG?k$ONa`}A0o9~31{9y{mk@;!MrM&rrv}cpyveVlqbFPK z7n&S#C~ESnQ+$&j988-mB__A|!l7fFx;UH$j4@qc5GDfYL}0*y$O49p$saj{8IvYA z3W`pyN#>dyr^_*2K!8zY^SLt>2KZx|QFr=!Nk&O-2~gnBGauD8LcMo+N&_VhKG@3`Z@*1u*o%IJlh)-83QD7 u`)IPDlJw+`8iC1PSt64QthKiDSu@@fBj^Srup5jf*A{7S=L=%2Vg>+6P4xEw diff --git a/Wikipedia/iOS Native Localizations/da.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/da.lproj/Localizable.strings index ef95df0bb476beff06081de1d5d9dbfff1e2425e..4bf789c93929d0a840fa7aa9ea4c61ed3310b08c 100644 GIT binary patch delta 269 zcmV+o0rLKu+Xl+Y2C(i$lWejIvxY`e6O(%C8k4>W6qE3O2$Sv#4wJxIoRdJ|46_Ve zY$dZ4f+`c2YKj34v-Fj!B9p3rGM8!@0V=a#xyTKZieV6wfVCX6_{VTClM2NYlRC>5 zlRo)clWH^)liuYTlYsk%mzpyHOta+qf&rJl6#)*DN>~uHHvC8dmmH%3CYSsQ0Unbq zP6(qg{x*~P)E<+rFEE$NCjnHqW;Fp=50gr!4!2T80eUQ#Ty_Bxm%bGN4wH&B3YWZc z0a}q-B9jV-6qEcw43}_c0SuRbasd*PN@ohUAaem;1(#Z+0Svbwc>!)AlPEAulaPuO Tw~U(s0uPhS#}Ky!s{xh*upn#! delta 1313 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 diff --git a/Wikipedia/iOS Native Localizations/he.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/he.lproj/Localizable.strings index 6042a49ca5b8387a93b3a620ba36291ed3024703..69884159da37fbfaddc7a61fcf7304bff427adb0 100644 GIT binary patch delta 1206 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 delta 4462 zcma)A4^R~M6~5o^P7aRsT#n^9juVdq384p`NYye-LZGpfv5E#$W7QsVC?=p3&S(jf zK~2zPkf?9uIhG(gW13NiShr!P#1gcQL#e|MN1K!wgPk@plw@>b%kteoCmVJI`y87gpAAzOt*|KV2XHFaTk2lJwTgbUDU%Eqq}j6V6TDXlu6 zfj{xGpW|vPbE5Dq7w{jqcq+6X5wUSGv!Q>8CE-pR6XXk);VJr=!qS5_bCB}dVhG{~ z8+kl5o9)>A28)E2)1rJv6ix9uK$9~GRu#b}Pz1A@;HgkUfNQ8gL1b^TL~Ls2`EcNx zAYYc2Pu0)JtcIjo;?-mp2W=?=*7PwuT)*qWj1Rb1_IrlR`Vpq85!BwOJ*tHz-^O7> zI!nc*E!>3-n|LJpqm2&eJt4}^XJka`2cvY>s+f>n;;~UGSha_>7~`W_UH+>bon_oA zAI{Eo>BmW!kQ7y@mZGjRR1(l%rL$Rh`!(i($^wUcb5W{J=hf+oe>hZtaBij)wLlB! z@pQO1=zxM}R^Wh%IU!Jb0blVL-Eiue7A*cVv&i|&ngsoHC%`t>Xrucg9{idY%IC`N zh8e1;Ov4&Vsmc(5Jt?zrw3AENaFplC_tw2F#ZSTn!ICtiQy(1co+(i)$LNTsf5&6t?=y?_Z^D7a zECQq^5tnyzFCO>{6XD)IKOQJ$0z}?&Kr=4K+q;+>HXQRnduu<|$FKr9ZGV5lBQgj@kUX$olG}QexEu96I!HArbfdM;iO~48R4P@Pu$@WG~P7H zE8krdX0Gr|G?OrCl)J!fF+qM$7WAh$@O&J1;=mhRl0W*xewM7$3L;$4@N0a(gfNW; zxCQFpTN$o((RC`jhzUe2YF~0ldx~#4gLp909m@*!(tbU9Ia`iughEi(@&h8*K4;QjX92S^Y z|E8ER$tR>iLcEcr?0@>HE&zCfvkU5XS-TopKYxU=nH?IN*~;l{?87iJrqYAJ-1i{6KIXF@ zkOUigNPJEE$u(b{L090*#KAbS5_QnJzO6?ZPz+-586P`f9jf8PtSt1%6^3Y9umiut#0Tj zmXw9>Flm~8F!Z#M6pd@Ifc^cnFT8P)IPwdg3*8kNxOy!Yl>@)Z`y7l`IX=NWNf~Ll<}%CI|IpZn%?`CjH9Ak@%X>)#t~W9dcKniMD2`8?T-)Ke-1+XS`sgh8$1T zBBrX91>Hxu2iM+Z>G1k`2l(z-pk|%`3!Zd?uOtFbJw>jxaVd*H-vOM(mn1Z}k}MnD-SeTlXBQc8ian4YRgc zCY(-+#S0s`9gYVD5ND`|jcmyOR8V%$=aMj~!YpyI>EL}yQcnV@O5cxptwp~z#ApmP~tfkT_9oZY3o6hBE&|qn!3ll23u~U^4cOjCZZNlr9=y+S2USMuTET7MdgAFLIhZg7nhUy? zMkk%ux2G$)TX~O;5mk-K|4WoqFCO!k&`gdLlCV;467)t{v8tMS?fnfuA7;N1L&gq> zaJ4EfszQ^1@^QyPQtUF83Z3&JT5Fk0>F(fNj4JDe^E)Ha+rg_acMJC@dk^!TAL#db zGT|Oy>te7x>4dy}B94B|B&B75w}la1Rly~!Y~ulihAtvbKL@0B?jmYrX{9I}!ca&$wTyzs5^Bj9#)SRiAS!g9AmPa(RS{VZ0UTZ#gM&HT`JcD`>r; z!*P~MW94?L@l=>YovOug+GeK!>Y5wxyi=g#V7lh88n-&|i5R1R-LG;B3fabsi5_~h z&es6+aO@0LAeCR7tOQ#Dpk(Q84XglcQYkWe}g8LL>RkMjK& D`i#rSf{d)_58%8FMZVDjt-XjE9KeL0zajnLI)$VvHD?haf~`7i%n= z{RThsFa)Q93<>_~U-U9kB&Lj-ryd@I5Jbg8L`1lC`5r!(&*xj*t=#6yWP+?-uXv69 zY7ul~d=!7Bi;TZf6RzHvjRV8z6kUBiH5^RCOFy1`;XL3L@iD84%?O%=5t*@(wWNv{ z(bNr!zuaQ;6I9Ai7D48lpdpLR-yR60+-;q@$Z zI-gHb_?t?x`4RfvQzz0Nnw%Vb3Qf!{|ElKxS+t7rjYNPh4|K73Vcjm9H~W#f^S_k3 z`YL3>39r4}=8@UEFu~DdG|I$1gh0xkTdv(l5wtL>^7td@Qgx$Ebv{Uck?p4@jD#87!qS|P4iw} zZ~LA5-E+S0doiAK>w3=VlO+-M8heBFv3<&4_og)k*^w0wC1Nf{l?=V zDCCJ#;N-~z(86nKKt`p}dUbqyow!ngO1tzdR|?Y}J^1?cdK^9B7U2He=EIRUt#~q2 zteunkMSmr-IRBB0-wT0k5G>^*C%}ONF|(#@-XsY&A!MP-x(rH0Po=~ASwD;7-DDB| z@Re1J{LFSJTN_Dj9bjRMPgnDiDX79( zyQG=7HQFl#U=|^&Z}T0ypkieX*t6$LF=3Sca;!9|5r^s9H{D>?8eaM(SBxxCQyS=H zVdh&_3+>N(nIECFkcW>@yOmm7UNA+>N8Nk}Tbs(YhRzSO#g*+U)iX3`oVJff5T+4y zVXIb#i$6PXeza1%7dV?GE|QuAeiyM}^HFJO2FKq83)b(yfmQ2mq@htQx&Mk?T!lut ztOS1d8a%0u9Ud`dM061C@G5gW&70kzV0*R~2afgQ!14i;7$X%b+yYy*wq8M-#G9i);deT@53#D?ivVYU2~ zd?>?2jTvV*S@a7QXag}himM3urGxJK$S*3CNf_xTaKI^6bNY z2hMn$_`!A=uk148w-b_HBZEbhnO85{vDe|`w@Sdl6B0=JP8ZCJ5R|gi)1{2{Q}`c_ z+3|L)o;N#Si$0*jRJHibprSfaf^$iS!PW>|SL|(?8<-C;|TsQX}p~A-|oH%yhP=s4=8H9Fo zdM3uJl#*pRC-Aqra`I9of5A;!r;u{#pCin9#P}RT;-niqGi=9&IxEiHEal@Jbf&H6 z+$}|W0xloel`E&HeYyEJmjGl|2I2$fc-jF*eiZS)NoJ~7j z0%tb8^!y>h*yC8)WB0vYml}r}!HrO~4(c(tWnyF` zj&_~m)oHj3QqBOKWBZU9#?VuQzwxWRFL6!#b^jD*mdFiFZsNALHxV)k0 zfb?_om~`^Unv%VAwFH5qNofJP+Xk;rNl%Q-Q83uPm#J=y?)dnvOxcxG+YdDqo{%1@ wXj5af*C49MYE@?#S~K{wT|EFj>dMROZK_w`$*jh?PL)cMoq<}mvZ@dM0V;}zssI20 delta 1555 zcmai!UuaWT9LLW;yK9=oYm8~^E?HW&y0(coV(a#>E^CX3R99*r)Q7ZM+alT-n^@S` zAQ_z-og1Y;=ue!)Dn&sgMk~FFS~4amY)D~yD&ib;Z6>1>6;_I=m6SwuHd#_UW}P$ zE^y`v_dxQBI&!fncF+1c_meKXbeg^e{Xg0yn4RNJ{O%j7VB9Md zbaZhIZ#GcPh?mgg4r}mIKRF~7_?R5TTS2i78>^@nlP8!4$14>W{YAqvjXR8DojwX# zliu{3O71mzZFnOnR--=2LpZ;l2B7|w4;sI0#rS49un(vWeM3Sq9vz|Qs;s%o{UjBGKjGVk%&R`4YRge&Y2&T6REF$Kmt9Y%A6?b>8L z|FVAtfkff=fsY0|sOx-YnDts;E%eJSwv#RrA%`$AKv$uDo7FGoF=vI#oD{cJ@=D{c z_1v95J&Q!LH%HIqeC=yovod30eh)pnrN%SIxDB;1KMN;st2n-uyNq-T&n~eZ9&0A( zLP-ZV$ZY03hfJT~K~fEumwjlc9bBjQyjN!b-D>8*bUWXKvr!3e?&M0VHC&2%RJL@# zRHr-FFic#aD;D2*ql$EpAgRK{2XrM|tZ^BUJG`gP8ktLo+;RV1D#^M3St=7YT0B}P z8sD}C!%&k3kDGQZ#QvY2u~M{Ehz!~qXc_jDi*B4R5O!nCFB%x6#+}B43h^t=scv|5 z(G$z_jx0)vSrl`ZN6kIfDb;BwrNl?xm#35j;fH5MVE;RSiVC*BlaOcxvmk5c9Fv?mBD1uJ;2f9QYXK0mPNw=Dld3Hw zv+BgI7?Toazu>l~b?05kTlg@V-lW^k-lYChWw~mDY7y*;YWgwSuYyk+jOostzBa_@r6qC@; VDz{Lp0YDpbU6zXWhw+cL`ny| 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 Rsr;Yy)g&tuw$GUb{sTGgq0j&T delta 4521 zcmb7I4Qx}_6@KSFCv_ZS9LG40V~pd1fiw=r@zRibG=z{sl#R5dtj#h;$Pa1$@Qg_r zLewDE(yUO%r5q`XQnaE16OEuoeP~4yttdi)(sU|_A)rae7)pU=RIn+{(w+C5Ca^Wn zOqMM_=iT$p-}jyGq&H&d>opwi)TFN!)(Go_kWeku3Lbjb2rmj@`YpsaTV_x5&{Yfl zR!g5@`n!BpO?TG{Rl-`K7Jt7An(=yxXyEpQ_i&(_#EH+!KJr~%CLI1Z(HPFpHr}?u@b>$UJJcF7*+)lU56UeCks+8~k{r5oSkEZL7@4 znBWlk=D{-`Lk1S7h?I@%T1o#GbF28#nx& z;`8k*#e&H&9k1sxH@Cf0z>h6+^1UCpqTTyUzr9tyuJG!`@|2xD+MeQolmeb zw9TXHc2nk}?|;-PPJBd$b({uPu!{X}5x%^qs9i=fwK$X{IxwgKP4uUyid7g#HjhPa zFyoiGq8-m(fxo}|7*~|L(II#AsVrBD>=WhhZRXzwa^r&WJHPbXsS};uf{KO#c7!RHCri_8lX20 zMq=eYxtZB<@E{~&*&y@t{Fye1TGEjG5DD|e66V9IN|r9=7lVF*dYl-FQiI9d&l3-1 z^FDnX!pD_iy8l|PXd5eOfM4AeLzuMnH?RWKAE?Yhrhsrlhm*cy5iIecOC@Cctm{tJPTTPK(Trl)Zg+Hr@_VhGpAzZ(g!8h)6;_WVGmU{jI zdyMKvQavOtT9jUs=Z-85YwlyF+y5jL7`)6}=tP#yJ2hFnYk`p)pUp!1^AyU(0oWJE z%~4&aNEtlireQLi&dPY;f==3Y3)7ys{^;?8tXAW~o z<$AUO_PY!WsAk0eeUn%bMiz^v{r<`9A;d-ZO_q;^x5?a!EY_gz&$s{@tL$>@?vY(t z#&me%7L~U?o6W+&WpH8n70^rfvX~w4^d^=koyulq|8J7VM;kTJV#!p%Dgnz3G$l3b zz5H5%6$=7v6F)SQ#>W$^MmiQ?U5}{;krG2+vk;^KQY9l1=iY@MQly?m z;;=MntxO7yoJ8rpb)sHc@hkSZej;kY?~cOMjD_UX zDnd`C@SNbKSFP~4GVAJvHTaLPm@aP)B#WQYNEMq{NwRvd#EHtxzEK^szif4CLp-*(N-69fEkYkG6`oql9eNU)ha0>alWruWc-& zh5Tr*1JAw+Hf+B`2Fe|h>@7I?M=_Z!yfT@46G&~49yYqm~<#dECRgj7md<!u6aJrMjOt0^zoe+tYN1|HUdJC3bxAD*F7M3ln-=0k0_n+NpI$sV8&-8P<7)7QVF7M3ln-=2sUGvqUrG88c+Go&);0&xmMCPN8B{$$2^@{=bt z@(AlPqya_pfa1D9@l=KihLY*)t2h*=3q-OTO*e>Q=9<3X6_e3)fgBdD>F0JaicB}i UVG(POd&&yLY}@0WvNJ6P0FcEcP5=M^ diff --git a/Wikipedia/iOS Native Localizations/sl.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/sl.lproj/Localizable.strings index afed6e62702810bf8b44f170df38f625168df76c..b32ee2b8e4633495262f9f31627e8b9358ba28e5 100644 GIT binary patch delta 1128 zcmXw&e@NVQ7{_^@&sTT*`t|(ocDmb54>{~~*Ja0zPFL3v%Vb@0h)JQ98*3O{B3Eo{ z95S@I(cCii5grn8&ZHlQ-K4MVVh5!vhb`^M1YG z&!xXI=dWZA*C|~44wjNNJ;0H$u#z)voX0{?U>r~HQF!bwIJxmTp|Mgb3fM9WR;rw{ zbNnrl&J!P^#dw$zPiLP*-N4-*g>!vEHP-huWzy0Gotv{nuHpB5w1ZuR!osVA;2_te zZZs8_TX>1VYMdxp*vFB2a2Q*!)+w|#YNO`c4)WC0Qlhqxd#BM!JvFNw%LdhOzj4@V zIAh*)p8E#_6u+hNN|o8qeLp{&o$o@vaqaw>y}VQgI^DZ+h>`8TF{Cy#)G{aK*W!>HXz|G8S(-dfC~yM>$9TNKVefQr#DR}b4q zXylrIlM-iDY6soem{096qRUg6tZBk#G~cdN|3hYtfSo7ypo6qLi_!RCEk`;u7*N=E z8Emp+7mO6r^ps6*9EACuk4eZt8CXLUYkWaYw}2PO`;yMSI-zp-90WP!N1a!LBE)5_ z@EcVu>JOP8myEZ=SAr^Dvvcz@D3m&H;regEA=@s&G|->r z4(acLsa=%3>5wCX@C9yAMO89*R`ubKg&B=XC>Y6rWHiuIF&_d2?W}4{h?nB8+8mq5(oQQR$(WYUh>D zP?H5~5Jl;{3yWFXO*#BG=o**r#1OllMsH`aTgFt30QXKp4l5<-;t36Ncq9XVp=bRz zxu#)sFV(*6<>o3>c*cX#u23}?NCtm?Z>_hSrkMcaLPa{2TSoZ zMHX!|bIQ-%CD_Gl^=8JyX+oDXrP#Zl6D{bI{r33c?Q#;G=};6NK5b5n=;N?ilrU!nrQ_ZW^3^iTGJ*>xz80lzFuq)^ zlTxn+a?VH2R`UAcc&yC>CswvH2~Clr9;Iy2&P$F+!E>2KdQFqrBE^Y&uR?sZk^rTu z4Y>UbOjKg!{nrxlo{pJ$f z#=tx=K{M{hM^_o*QKO6Regn^qjIFjMsKM>CMJsjVlTzJ`LdVcV(A=vZj(J)XEx@iewN(1Lb-GCxT!WdV>*}$!gw)l z7MR6(f*(`e;tPDzW+NZ`LMz|Yrm-r=P$~kH3cpZ0HWexOHJL?2D!Ao9J!FEm6Dom9 z!(fW3BfMx3Dpj(n;oIGbFE17p04)>N)3b;l1gFqM-)iW;TA^CK?iX_C>N2`ZY5B4z z+@YMRCT@B6Pd4m%3nKXXXbEr320eCViIRN30aAb$#F?<`!64@az!jM>$_;f^F29mw04kHd85n67TLe$aUwS zH&)w`aid@bbH89#?w+Vup+wIA3et_*r(+aZrm(CckG;I?MJo>InUU+QRa(+>Wa6G6 z!SMIpFdkRlf-uk#H%fkyGF&Ir;ZO2lzT9yO+5wyHz+Z8jj{3Lg4rz|-9}+5h{|P1G z^#&ifsKZqjwzPc)rE<{7O0-ijB9g|?&I7r$>O@Es7_jpc5&H)wB79>5Q9zH5_}>%5 z?(?nh=gEdxwr8C7qaM%pL!P7VX_gN-*ks^0{chZy%--Xd+!9_*VjJ-KZZOFOL&?9V3dN!NvRyW1_MV3PwJpUh{cwb?g2R)r8Mgo2XFw8a&RHtZ?{C(rqx zo-e;L8(S@4!DD}f1bND0c2gr(Jo`(Q#BaT%;}AT{BA8< z#P1ea4OU(IZn2#t2su?{k3z>+$a!VT3Hxu~8^nG~jQZSzEF ztXVr6ek3My-#2!7+fLRLW|@gyr!asz$f}IOD`k*~o+Xfu`ERjla>2)JD2zafdazIO zv$ptg%2uf?SLLJj$Srj+ojU?)@~y+{BS3=%Enz^GjO+Iym6=a7Al%Uo=Hc%ZZ zpvzmlV_S8yi7?+5F9ehrD zNJTxyyI(SKpQ2rPvp*Ss&cr43qQEG3MTnV<-zzf9t)eJFsJ*|^iFsl0j93`Q$p8>dn*)gzl!in@=DNbLBKtf?dGjSr+v6TiK00uHP^$(Pi|A|UT(NarQHmOzK OK~PgF_dTYb=KUXeZ#-WB diff --git a/Wikipedia/iOS Native Localizations/sr-EC.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/sr-EC.lproj/Localizable.strings index fb889ed00f4bfb97277d6af931b4fcfda16c5a2f..7678b51c705a5afe6dae49bc88bdebbad4672ccd 100644 GIT binary patch delta 475 zcmW-cK}b_^9LM?p-~YWQ&)4fUHhEgCg(>o)d_+NvwZ^CpF=T{?l2toM2M;wuB1Fax zI;k$=%Y8vS2o}bY7(DP76t+_hnP4DF868#-j3N(`WhJc+-{a@=;rpr(TKjykG-D(6 zkelAEBe^(UJd#6R{AM+P>LqS?M!pz_eOg$avDDj)m5*x3d;0bhLwZWIdGl*E4lS%| z-t@-1qlIp993?P~V$E#lB!(IDBY9cU$%wOD4ECTf5gB16dN#_oB-DrbVVI-rF~Smy z(U-gI_IdPga36xL!la2eEVcii-J%;`*#U;+8A&7O8|$<&6Ht9_Zq=d_ZG0#|w!;T2 z2#;}t(m(mmyt{iYNIg%aAA2!yMOgG;PMVhf-=M3{r3)Rf_Hhf9?MBM^u2{${v#6W? zr4?Q(O%$w2iz*V`vPM&NDKg>q{n06t71!J0Oe%haI=MynX2rrGcf4-n!+j}%Q`@Wy znGUJnjlI{AyTf&CjtB!Q*BYJi---!mT^WG0N7hl+RGp#~k>jq`+k$LWRgYJ;?A<)L;rxof(|QhrLjmbY55c~*&xm1}Zi K3YBYWzUwa(ezkr8 delta 2016 zcma)7eQZ-z9DVoR_tA9E^7d7_t>Eiq6B|0pK$JO2Aw&rQQ*enPl5N14VE8E8_z(#c zB-4asDcr3`V<3wXltr*mvZoutqJWwq>4Yo>Ar_E`30aCEDrnGKBse20qsa zUccf zsUG*f(UpztBmW`GJ)1puRU{##smE_#eucd9-lRE&X;9^l99X$t4q`(m^Ex_MxhJA93ivq0@eAgR}BQW z5gU?6iGj$6Y8#K#i7!5NoK-KATThO>@1X@`?rxfoWV5Q0NmzY_`4BozixJzU6d-ko z6)TmJDNVBGR*`*yl3_41w?&;>F45Ly+#@aJ)7&1U+DSD}Z8UKBD`w;m=Q8G#R^ZrS zI*O;ebPU$2P9)1TH&V|N2g1Fi0-?Q{9k(`+1nhqi9X*>#g6|n)TIXITXBmQ9h?kp} zomNkntbHzL2t!PpqUEEtL3JZ|ljd>%b_e{MnZC2fh4f0|LTHBAUh-$+Mra;&@nEDJ z#%gM_{9lqyC7vNj{|4i(kDGZcW8zo%Ttl34 zXsGOn^a&n`8E%-{v}y!)D+a=IG~EjQNZxzmAuc#^*b7eNoB? zu0aaXbcLCG@P-}6eCCLLtO{zAiHwg5gu|+SAnxc>avpjvGY0}^Wn%_B|=ro0xMQdH=K9~?v=xGue3bZXzuCo<019l9mQ_%Uf2wJL)6!X9c zLC~+(pz{ymoXBXc0I`c=pG)_#c7~(N*k~*G4*Pw?oseVwM$K*c_p^$!ETitUq9V>O zg-~Z#wsYexr`7T;tFk?W#tHY+$V9@hZ-wI}TEJg; z+hy&H$lado&_h}t7ZS86Izf%XTu$sfd`d@Pu54hc$trhLl;XQh%xfJzB%f#2WJ~TM zNCrg;W8HEqx^$L@_AA2l>StOpPk!#~NRe`$STlwPdL2m5)0|f4r}Ca>ADA)BeqU|n zskGNx`J3F`k%fHzkd=!4ERoiWf4}QjH4lsdGA4RNadQ8QqG-#7ox`(b6Nw|5j@AY8 zIBxE7A(3Pu95|(HMC=*46y`2LKJpFKt#q5Bmk#TQgMGA&8|^OmThy_*wwKtreVk$G p2Nhd!7P6?gNhhOzhCGvpX8V!6No(%4{F}i(MLen%?9*Du{tf*mUjG09 diff --git a/Wikipedia/iOS Native Localizations/sv.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/sv.lproj/Localizable.strings index f9340e9f4ee5d07db8cf3d8047a4d559e16c6bd7..3d2294b780a3bf57c6f71def137b8b9777c49524 100644 GIT binary patch delta 1128 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 Cv(l;n diff --git a/Wikipedia/iOS Native Localizations/tr.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/tr.lproj/Localizable.strings index 3e00c7e04d68f64ee8ebe7f0c5ee1ce13ce718f4..335ba90d85fc52604a22bbc36b0024d07a2b7e81 100644 GIT binary patch delta 1139 zcmXYxZ%kWN7{>Fyr!CFR?d4LNuHHbcl}uJ^(=kFwZHhr9NRU+G)J1|FnQYl`VPr$r zAVV~hEo31a<;4w?n#>8fV6*EuWa)>RY|Ao`@lQwiFl(Fy(I{Dn8X(SF^!qvIdEV#w zy{Bh5cX>fccA2?!%+G^4VZQpQ%&ROZE|s|``8mjXUrx1|v@@()AGO6S)H}vheZsL~ zqR??B>Ajjamo@|z>dn3$E7k5{)`2h4#S^otKE0<+qSXK@`h!TuO{4wHr6(FH&6JvC z4u1VWH+?jW9$wRQos2z~gxyJ@|DgaP2dhwvJ$gf3JsV>}BTD`>r+=P{&@d>mBn6Mys{VO`d!( z=}UK4%vr&Fee~W6Y%B7WOe2MM86J*$9QxXiZC0urH+)z8n#$$Z_GisH^})?SiEBS; zls*U!F=hdeCaydVQ8P(H%r5Rd34i+e;dwhHZZMfz1|UFZHE__(DJF}Ry)YnA!)d07 ztr*l)&{QM(c;8j0Si1p6cm*;hYR=87O&V&WNmznx;3eWW0n#HR0Vra65>#fqpm4Qb zrl<;5(Q*geMw7chqP_(<$HTIhR0+HkzYFbj(E=_}_8t5KJpPnKk#%%@p)7(|%x%IU zMz@y@3lnb`e!DjzN}Y`TpG|lJ3W3rAL$m53JkPQ<@!owNN`GP;4y2g@N(e0?!Eh*# zX58Q-j}7d+tjx~Oza)zfoOlznm5TL8u_=#wA7c)Rfnmn)$8H;ipTRlrNJ`SQn@m4&v-7WPU!zDVqWX!YHir%N`as)LolfWV?RsR7IksQI_ zZNgZC3YpT~+sMkI=mwfBRP?T4G57#uiq_E%N!Q+ zn9W7cwi=<1&tfwBkb|U3bW=RYdZ?@3xM^c<(LRsszU+RA$U}U!fR3I32an1M<^O_q zYJMA4(Nw_3&9wR)^OLlbb@KQbuW%N!TfoD^UNO3p_3!4Zr!*1V#}?W4`toL6y7Y3ECy>2kpHOm(M1q$e>&;S4c delta 4478 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 diff --git a/Wikipedia/iOS Native Localizations/zh-hans.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/zh-hans.lproj/Localizable.strings index 90ca93a8295aaef0df807088de89753da4ed8015..abab3e0d0892d30ad5142e5d0fd5c3a54e12df5e 100644 GIT binary patch delta 46 zcmV+}0MY-p?F{JZ46yQllRirpvvh!3A(u{60T7d5cM^j@qPIYz0o=5c3f2y{yjKGH E-u;~weE*Ab zk~sBEZWPphU4}HE6H*y+rWf)v3r`o&U=*6Zz?G3}x?c_>&-T19 HreF5}EfP9L diff --git a/Wikipedia/iOS Native Localizations/zh-hant.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/zh-hant.lproj/Localizable.strings index d78e10e82aced7b66d82e4496b76862042a442ad..991047c854c7a8e26735e87b9d7bbaca13839ac1 100644 GIT binary patch delta 1097 zcmX|>e@NVA9LIS+&-YF}zkU7gJoI+E+;zJ|u22(mXB^9*Vu>7wtcc6xk~wU1aWS2jf=%CGIQB|{>}t`R0FB4#E*%N@sl{UJ_VUlaQC;oQiyi|DrC4V!gvG{hv zg4Q~6pxem`L}{!MllRGkn=g`2c+NRR=F}|=end_&9Lu1U$Y!jzM|7l`$z%9>KFz|N z&v^w_Ys`z$-k1x?AhSdNhG|$hMViomtwi}{u8P&CRAYOjqX-R6q>JdxQ49phBi7f7 z5#CFhk^HHiVQiVHVs_?zq%U(n!Y9lI%YU{$VT`9YxJX{IAy#h+dxEC@E!L4*Q`iW~YV_|kXI_%6LO}j0*=$+y& zL=Tcfw)t4XEmJQrmlg4Gvdf9XZ1Nd2`IREX?Bs%el-x4b$+}gj#Y~gO&$G~BOgXq; zM(0=$6HA7U%wENY!~zS8aq)4 z)FJAwIptaleV>QY4ho_46Xr+FXXKU9P8wilOLla7nF76w4vlQaiHS(AT}Hd8Z~uR) z7#yUC3=YvnwtG&T=TE~rL{&0%h0bd7<*zBg#FuRv`V2aY^#s{*ahx{b|AM<^OINk)Z>;uhd*VC%Qi*U8d^!rTr!=FK$$GyDWK!Pg!s?$#&RzFxSb4(RiDA z<=PoOWrn`Ry|O>fuU5hJF>_()4O60Yf^YKwS5yYR<-;!F7sYU&rfhW2^Lp6w$&0by w_~=e5a(R(Av7LWFuFUf^iQYm@hL*U$c88iO%b!%X^LBB^auuJfsZy-$Um7r(LI3~& delta 4587 zcma)Ae@vA38NcuMdmP8{dY*8=d7S47N*n^7a%GfSL~V^zreK_Dh*LnIh=?~({4u46 zv5u&b(?{>Ij4AXFHFlxMRo{&nt8KFpY@HfLtXT|eEHMm`qH}17?s;FtX*yq*3xp8f z=Y4*BKA-3FaP+w4_79fU!H}pb-A3JJU8QcVu2`2$Uq!lgx=pz8uRJ+CnSQLGUli*q z@Pm(76h16tW(@2R7JTp#n*(`K5|kPGFezRnV*WL5hUtbh=salycaMX&2>p)24tBRVGOqG^X232ak8*~L~k)x%0vEV454DQor*eaqi=PmmftWVwtvga!TIw%@ftD5y_6jMd~PiIYM37DwlNoMnrp$lE5a5$ zP~_J_)sHGHqDr?wZIW8ybX?fQ9pEmjMt?YkzUbo7pfB&o$6efo2a@?z@cL}P*WU>a zmKRwxl6|oOp#Fe_#k3L|EOaaVBD&X2Y5 zNAU|O^KxuHD}I8D-WML|AF@K0*@+|J!W3Noq1PVs3ixAg2a62kGXwMBvUkKx;nI1a zdBr4j&ER_QePay{9Pe<(zT#;G7dXSrV?(wmc!Pg*M`G(!5eI2qS`B%T&alS)jLpgb zp~JmMqmx*1ni*i~CsrIZ(MY_t%z{pt8^E|v!uCY!W={znxO+`-^+F!(JtpCk z3}(Z|dY%CGOBun$&rdMSyU4PFhc6kYXb8i-x5X69FmW?_zZ5owgbqwx&mw{?-}MTO zG+!LJiujHALm7(#Z$~sXnTg3N&iDRVID>7yUV}!Y$Yi45W*To5k+G6`>?KwoJS(OI z)`@IIv+U4RYDD+PTngsgb?_+~gQ6Ilblc#}+Nh8M-E3VdUP~YrW@Iu6N1BBMyYE%L zcFv(y3X^s3Ch&mU@a8Xtsco>|s8K|iq8-X(>($huX~>3#C&Cl#A9h8&9+;_P zz)V$uDZ9d1X}HGF>bFp*KWnkTxodVDImzwV?c!GXTr~4LG?FAmDN%(^(cw+d{N6;& zGBP{nXNtx0!c=D08WTNC@TUirI@e3*S0r;mr)d9OiC#_8QG8geovuwJ%7$-iwlJR+ncJ}yB|xCN$uV8faP+y!~V4*9|t z%*a5hGh^$0+UJMYF&E|(Gb{LhXT^bTZh}?&Es)h?l6$^ntF`6|e1Q`WpA}A}K0EAK zkbpTUBs}vw*>a8Y#`uo~OIRch7LmZ;+`}^Qe7%T3=L~L;FJ5JL81{v6CtA)cCZ>gv zG=%9T%sJ1@@=zx`7ozMikNo%RtU5;HT`|e(Lh%yx3P>Xq=R_>md2zxDF;Q_Nf!_)< zmUhvueH>D>GO3O?rTW^!8T}*FF#qWJLidw)RG#D~hP)F5sD1mdhe!Um*`ne(grW z)^KJ(#|i?u+n_g~a}AZ(u#YdstX(`$BTL#!s%xSKDGH|Qbz1`WKuSs?wibybtl7=e z@WLKia)Z-(wA`_a=Q9|-oF@0}=GkVA(Bq$VUKKaGV@4&C5LPFr0Z(V7Kh%LEyaSTV z7Tj@|@504(!U5giB;epX+zIEq-15-?|LP5mmyn6tL@(Gt8d?su4`W90&o^)n`UZKD zT=zBa)7r{3CDoSGRW%w(A?X>rh(%Ys7_}(S-nATDvrOoVC!NiC*9BMZM9Y?Le!=`o z)u>;`;;}VGn4oo`5i$#m%E2Mi!LfauMlqOE!-`&Vt&m-72HQU+w9FxX`#!YEw}yC$ zmRMuYBg$JLvpP$q6L7jl!mE$?Zs@y0+aN%qlJ|(05q+ZNvd8=jEg_@+Y<_lgRzCAD z#m{%09i44-X?maX9z1`Qn=tJut-kgy>!JHun6ZWhP^uzd<&P119Ly9eh;zXK8EsChy$3~frr~g7O z?!bI*!Nz|vo7_|{zSB};BvrTKsRUsjQ$6qVs~5aUM!5w!Y7-~h+z(^mPE*>J{5&bMYrWMk+@hRp4w4$xNwQiKE-E2cfT2Z@A3pW zVuUW9G{RS8q#b{57|MO_Bn!Tt7aQ Q!11DitF7acV2)(|4^6y7;s5{u diff --git a/WikipediaUITests/UITestHelperViewController.swift b/WikipediaUITests/UITestHelperViewController.swift index 56a24384bf1..2f9f182aae8 100644 --- a/WikipediaUITests/UITestHelperViewController.swift +++ b/WikipediaUITests/UITestHelperViewController.swift @@ -40,65 +40,63 @@ public class UITestHelperViewController: WKCanvasViewController { @objc func tappedSourceEditor() { - let localizedStrings = WKSourceEditorLocalizedStrings(inputViewTextFormatting: CommonStrings.textFormatting, - inputViewStyle: CommonStrings.style, - inputViewClearFormatting: CommonStrings.clearFormatting, - inputViewParagraph: CommonStrings.paragraph, - inputViewHeading: CommonStrings.heading, - inputViewSubheading1: CommonStrings.subheading1, - inputViewSubheading2: CommonStrings.subheading2, - inputViewSubheading3: CommonStrings.subheading3, - inputViewSubheading4: CommonStrings.subheading4, - findReplaceTypeSingle: CommonStrings.findAndReplaceSingle, - findReplaceTypeAll: CommonStrings.findAndReplaceAll, - findReplaceWith: CommonStrings.replaceWith, findReplaceTypeMenuTitle: CommonStrings.findReplaceHeader, - accessibilityLabelButtonFormatText: CommonStrings.accessibilityLabelButtonFormatText, - accessibilityLabelButtonCitation: CommonStrings.accessibilityLabelButtonCitation, - accessibilityLabelButtonCitationSelected: CommonStrings.accessibilityLabelButtonCitationSelected, - accessibilityLabelButtonLink: CommonStrings.accessibilityLabelButtonBold, - accessibilityLabelButtonLinkSelected: CommonStrings.accessibilityLabelButtonLinkSelected, - accessibilityLabelButtonTemplate: CommonStrings.accessibilityLabelButtonTemplate, - accessibilityLabelButtonTemplateSelected: CommonStrings.accessibilityLabelButtonTemplateSelected, - accessibilityLabelButtonMedia: CommonStrings.accessibilityLabelButtonMedia, - accessibilityLabelButtonFind: CommonStrings.accessibilityLabelButtonFind, - accessibilityLabelButtonListUnordered: CommonStrings.accessibilityLabelButtonListUnordered, - accessibilityLabelButtonListUnorderedSelected: CommonStrings.accessibilityLabelButtonListUnorderedSelected, - accessibilityLabelButtonListOrdered: CommonStrings.accessibilityLabelButtonListOrdered, - accessibilityLabelButtonListOrderedSelected: CommonStrings.accessibilityLabelButtonListOrderedSelected, - accessibilityLabelButtonInceaseIndent: CommonStrings.accessibilityLabelButtonIncreaseIndent, - accessibilityLabelButtonDecreaseIndent: CommonStrings.accessibilityLabelButtonDecreaseIndent, - accessibilityLabelButtonCursorUp: CommonStrings.accessibilityLabelButtonCursorUp, - accessibilityLabelButtonCursorDown: CommonStrings.accessibilityLabelButtonCursorDown, - accessibilityLabelButtonCursorLeft: CommonStrings.accessibilityLabelButtonCursorLeft, - accessibilityLabelButtonCursorRight: CommonStrings.accessibilityLabelButtonCursorRight, - accessibilityLabelButtonBold: CommonStrings.accessibilityLabelButtonBold, - accessibilityLabelButtonBoldSelected: CommonStrings.accessibilityLabelButtonBoldSelected, - accessibilityLabelButtonItalics: CommonStrings.accessibilityLabelButtonItalics, - accessibilityLabelButtonItalicsSelected: CommonStrings.accessibilityLabelButtonItalicsSelected, - accessibilityLabelButtonShowMore: CommonStrings.accessibilityLabelButtonShowMore, - accessibilityLabelButtonComment: CommonStrings.accessibilityLabelButtonComment, - accessibilityLabelButtonCommentSelected: CommonStrings.accessibilityLabelButtonCommentSelected, - accessibilityLabelButtonSuperscript: CommonStrings.accessibilityLabelButtonSuperscript, - accessibilityLabelButtonSuperscriptSelected: CommonStrings.accessibilityLabelButtonSuperscriptSelected, - accessibilityLabelButtonSubscript: CommonStrings.accessibilityLabelButtonSubscript, - accessibilityLabelButtonSubscriptSelected: CommonStrings.accessibilityLabelButtonSubscriptSelected, - accessibilityLabelButtonUnderline: CommonStrings.accessibilityLabelButtonUnderline, - accessibilityLabelButtonUnderlineSelected: CommonStrings.accessibilityLabelButtonUnderlineSelected, - accessibilityLabelButtonStrikethrough: CommonStrings.accessibilityLabelButtonStrikethrough, - accessibilityLabelButtonStrikethroughSelected: CommonStrings.accessibilityLabelButtonStrikethroughSelected, - accessibilityLabelButtonCloseMainInputView: CommonStrings.accessibilityLabelButtonCloseMainInputView, - accessibilityLabelButtonCloseHeaderSelectInputView: CommonStrings.accessibilityLabelButtonCloseHeaderSelectInputView, - accessibilityLabelFindTextField: CommonStrings.accessibilityLabelButtonFind, - accessibilityLabelFindButtonClear: CommonStrings.accessibilityLabelButtonClearFormatting, - accessibilityLabelFindButtonClose: CommonStrings.accessibilityLabelFindButtonClose, - accessibilityLabelFindButtonNext: CommonStrings.accessibilityLabelFindButtonNext, - accessibilityLabelFindButtonPrevious: CommonStrings.accessibilityLabelFindButtonPrevious, - accessibilityLabelReplaceTextField: CommonStrings.accessibilityLabelReplaceTextField, - accessibilityLabelReplaceButtonClear: CommonStrings.accessibilityLabelReplaceButtonClear, - accessibilityLabelReplaceButtonPerformFormat: CommonStrings.accessibilityLabelReplaceButtonPerformFormat, - accessibilityLabelReplaceButtonSwitchFormat: CommonStrings.accessibilityLabelReplaceButtonSwitchFormat, - accessibilityLabelReplaceTypeSingle: CommonStrings.accessibilityLabelReplaceTypeSingle, - accessibilityLabelReplaceTypeAll: CommonStrings.accessibilityLabelReplaceTypeAll) + let localizedStrings = WKSourceEditorLocalizedStrings( + keyboardTextFormattingTitle: CommonStrings.editorKeyboardTextFormattingTitle, + keyboardParagraph: CommonStrings.editorKeyboardParagraphButton, + keyboardHeading: CommonStrings.editorKeyboardHeadingButton, + keyboardSubheading1: CommonStrings.editorKeyboardSubheading1Button, + keyboardSubheading2: CommonStrings.editorKeyboardSubheading2Button, + keyboardSubheading3: CommonStrings.editorKeyboardSubheading3Button, + keyboardSubheading4: CommonStrings.editorKeyboardSubheading4Button, + findAndReplaceTitle: CommonStrings.findReplaceHeader, + replaceTypeSingle: CommonStrings.editorReplaceTypeSingle, + replaceTypeAll: CommonStrings.editorReplaceTypeAll, + replaceTextfieldPlaceholder: CommonStrings.editorReplaceTextfieldPlaceholder, + replaceTypeContextMenuTitle: CommonStrings.findReplaceHeader, + toolbarOpenTextFormatMenuButtonAccessibility: CommonStrings.editorToolbarButtonOpenTextFormatMenuAccessiblityLabel, + toolbarReferenceButtonAccessibility: CommonStrings.editorToolbarButtonReferenceAccessiblityLabel, + toolbarLinkButtonAccessibility: CommonStrings.editorToolbarButtonLinkAccessiblityLabel, + toolbarTemplateButtonAccessibility: CommonStrings.editorToolbarButtonTemplateAccessiblityLabel, + toolbarImageButtonAccessibility: CommonStrings.editorToolbarButtonImageAccessiblityLabel, + toolbarFindButtonAccessibility: CommonStrings.editorToolbarButtonFindAccessiblityLabel, + toolbarListUnorderedButtonAccessibility: CommonStrings.editorToolbarButtonListUnorderedAccessiblityLabel, + toolbarListOrderedButtonAccessibility: CommonStrings.editorToolbarButtonListOrderedAccessiblityLabel, + toolbarIndentIncreaseButtonAccessibility: CommonStrings.editorToolbarButtonIndentIncreaseAccessiblityLabel, + toolbarIndentDecreaseButtonAccessibility: CommonStrings.editorToolbarButtonIndentDecreaseAccessiblityLabel, + toolbarCursorUpButtonAccessibility: CommonStrings.editorToolbarButtonCursorUpAccessiblityLabel, + toolbarCursorDownButtonAccessibility: CommonStrings.editorToolbarButtonCursorDownAccessiblityLabel, + toolbarCursorPreviousButtonAccessibility: CommonStrings.editorToolbarButtonCursorNextAccessiblityLabel, + toolbarCursorNextButtonAccessibility: CommonStrings.editorToolbarButtonCursorPreviousAccessiblityLabel, + toolbarBoldButtonAccessibility: CommonStrings.editorToolbarButtonBoldAccessiblityLabel, + toolbarItalicsButtonAccessibility: CommonStrings.editorToolbarButtonItalicsAccessiblityLabel, + keyboardCloseTextFormatMenuButtonAccessibility: CommonStrings.editorKeyboardButtonCloseTextFormatMenuAccessiblityLabel, + keyboardBoldButtonAccessibility: CommonStrings.editorKeyboardButtonBoldAccessiblityLabel, + keyboardItalicsButtonAccessibility: CommonStrings.editorKeyboardButtonItalicsAccessiblityLabel, + keyboardUnderlineButtonAccessibility: CommonStrings.editorKeyboardButtonUnderlineAccessiblityLabel, + keyboardStrikethroughButtonAccessibility: CommonStrings.editorKeyboardButtonStrikethroughAccessiblityLabel, + keyboardReferenceButtonAccessibility: CommonStrings.editorKeyboardButtonReferenceAccessiblityLabel, + keyboardLinkButtonAccessibility: CommonStrings.editorKeyboardButtonLinkAccessiblityLabel, + keyboardListUnorderedButtonAccessibility: CommonStrings.editorKeyboardButtonListUnorderedAccessiblityLabel, + keyboardListOrderedButtonAccessibility: CommonStrings.editorKeyboardButtonListOrderedAccessiblityLabel, + keyboardIndentIncreaseButtonAccessibility: CommonStrings.editorKeyboardButtonIndentIncreaseAccessiblityLabel, + keyboardIndentDecreaseButtonAccessibility: CommonStrings.editorKeyboardButtonIndentDecreaseAccessiblityLabel, + keyboardSuperscriptButtonAccessibility: CommonStrings.editorKeyboardButtonSuperscriptAccessiblityLabel, + keyboardSubscriptButtonAccessibility: CommonStrings.editorKeyboardButtonSubscriptAccessiblityLabel, + keyboardTemplateButtonAccessibility: CommonStrings.editorKeyboardButtonTemplateAccessiblityLabel, + keyboardCommentButtonAccessibility: CommonStrings.editorKeyboardButtonCommentAccessiblityLabel, + findTextFieldAccessibility: CommonStrings.editorFindTextFieldAccessibilityLabel, + findClearButtonAccessibility: CommonStrings.editorFindClearButtonAccessibilityLabel, + findCurrentMatchInfoFormatAccessibility: CommonStrings.editorFindCurrentMatchInfoFormatAccessibilityLabel, + findCurrentMatchInfoZeroResultsAccessibility: CommonStrings.editorFindCurrentMatchInfoZeroResultsAccessibilityLabel, + findCloseButtonAccessibility: CommonStrings.editorFindCloseButtonAccessibilityLabel, + findNextButtonAccessibility: CommonStrings.editorFindNextButtonAccessibilityLabel, + findPreviousButtonAccessibility: CommonStrings.editorFindPreviousButtonAccessibilityLabel, + replaceTextFieldAccessibility: CommonStrings.editorReplaceTextFieldAccessibilityLabel, + replaceClearButtonAccessibility: CommonStrings.editorReplaceClearButtonAccessibilityLabel, + replaceButtonAccessibilityFormat: CommonStrings.editorReplaceButtonFormatAccessibilityLabel, + replaceTypeButtonAccessibilityFormat: CommonStrings.editorReplaceTypeButtonFormatAccessibilityLabel, + replaceTypeSingleAccessibility: CommonStrings.editorReplaceTypeSingleAccessibility, + replaceTypeAllAccessibility: CommonStrings.editorReplaceTypeAllAccessibility) let accessibilityId = WKSourceEditorAccessibilityIdentifiers( textView: SourceEditorAccessibilityIdentifiers.textView.rawValue, From 51e27307140e7a9deb9a2eb0be5483ef80af7429 Mon Sep 17 00:00:00 2001 From: Toni Sevener Date: Mon, 29 Jan 2024 21:23:18 -0600 Subject: [PATCH 2/4] Fix VoiceOver expand menu bug --- .../WKEditorToolbarExpandingView.swift | 20 +++++++++++++++--- .../WKSourceEditorLocalizedStrings.swift | 4 +++- WMF Framework/CommonStrings.swift | 2 ++ Wikipedia/Code/PageEditorViewController.swift | 3 ++- .../en.lproj/Localizable.strings | 1 + .../qqq.lproj/Localizable.strings | 1 + .../en.lproj/Localizable.strings | Bin 446736 -> 447156 bytes .../UITestHelperViewController.swift | 1 + 8 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Expanding/WKEditorToolbarExpandingView.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Expanding/WKEditorToolbarExpandingView.swift index 771feb15678..b4ebce3079d 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Expanding/WKEditorToolbarExpandingView.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Accessory Views/Expanding/WKEditorToolbarExpandingView.swift @@ -81,9 +81,9 @@ class WKEditorToolbarExpandingView: WKEditorToolbarView { stackView.addArrangedSubview(primaryContainerView) } - expandButton.isAccessibilityElement = false expandButton.setImage(WKSFSymbolIcon.for(symbol: .chevronRightCircle), for: .normal) expandButton.addTarget(self, action: #selector(tappedExpand), for: .touchUpInside) + expandButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarExpandButtonAccessibility updateExpandButtonVisibility() formatTextButton.setImage(WKSFSymbolIcon.for(symbol: .textFormat)) @@ -146,8 +146,6 @@ class WKEditorToolbarExpandingView: WKEditorToolbarView { cursorRightButton.addTarget(self, action: #selector(tappedCursorRight), for: .touchUpInside) cursorRightButton.accessibilityLabel = WKSourceEditorLocalizedStrings.current.toolbarCursorNextButtonAccessibility - accessibilityElements = [formatTextButton as Any, referenceButton as Any, linkButton as Any, templateButton as Any, imageButton as Any, findInPageButton as Any, unorderedListButton as Any, orderedListButton as Any, decreaseIndentionButton as Any, increaseIndentionButton as Any, cursorUpButton as Any, cursorDownButton as Any, cursorLeftButton as Any, cursorRightButton as Any] - NotificationCenter.default.addObserver(self, selector: #selector(updateButtonSelectionState(_:)), name: Notification.WKSourceEditorSelectionState, object: nil) } @@ -224,6 +222,9 @@ class WKEditorToolbarExpandingView: WKEditorToolbarView { let buttonAnimator = UIViewPropertyAnimator(duration: 0.4, dampingRatio: 0.7, animations: buttonTransform) let scrollViewAnimator = UIViewPropertyAnimator(duration: 0.2, curve: .easeInOut, animations: scrollViewContentOffsetChange) + scrollViewAnimator.addCompletion { [weak self] _ in + self?.updateExpandButtonVisibility() + } buttonAnimator.startAnimation() scrollViewAnimator.startAnimation() @@ -289,6 +290,19 @@ class WKEditorToolbarExpandingView: WKEditorToolbarView { private func updateExpandButtonVisibility() { expandButton.isHidden = traitCollection.horizontalSizeClass == .regular + + if expandButton.isHidden { + accessibilityElements = [formatTextButton as Any, referenceButton as Any, linkButton as Any, templateButton as Any, imageButton as Any, findInPageButton as Any, unorderedListButton as Any, orderedListButton as Any, decreaseIndentionButton as Any, increaseIndentionButton as Any, cursorUpButton as Any, cursorDownButton as Any, cursorLeftButton as Any, cursorRightButton as Any] + UIAccessibility.post(notification: .screenChanged, argument: formatTextButton) + } else { + if scrollView.contentOffset.x == 0 { + accessibilityElements = [formatTextButton as Any, referenceButton as Any, linkButton as Any, templateButton as Any, imageButton as Any, findInPageButton as Any, expandButton as Any] + UIAccessibility.post(notification: .screenChanged, argument: formatTextButton) + } else { + accessibilityElements = [unorderedListButton as Any, orderedListButton as Any, decreaseIndentionButton as Any, increaseIndentionButton as Any, cursorUpButton as Any, cursorDownButton as Any, cursorLeftButton as Any, cursorRightButton as Any, expandButton as Any] + UIAccessibility.post(notification: .screenChanged, argument: unorderedListButton) + } + } } } diff --git a/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorLocalizedStrings.swift b/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorLocalizedStrings.swift index d38d24888c2..b6d9f67237a 100644 --- a/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorLocalizedStrings.swift +++ b/Components/Sources/Components/Components/Editors/Source Editor/WKSourceEditorLocalizedStrings.swift @@ -24,6 +24,7 @@ public struct WKSourceEditorLocalizedStrings { let toolbarTemplateButtonAccessibility: String let toolbarImageButtonAccessibility: String let toolbarFindButtonAccessibility: String + let toolbarExpandButtonAccessibility: String let toolbarListUnorderedButtonAccessibility: String let toolbarListOrderedButtonAccessibility: String let toolbarIndentIncreaseButtonAccessibility: String @@ -65,7 +66,7 @@ public struct WKSourceEditorLocalizedStrings { let replaceTypeSingleAccessibility: String let replaceTypeAllAccessibility: String - public init(keyboardTextFormattingTitle: String, keyboardParagraph: String, keyboardHeading: String, keyboardSubheading1: String, keyboardSubheading2: String, keyboardSubheading3: String, keyboardSubheading4: String, findAndReplaceTitle: String, replaceTypeSingle: String, replaceTypeAll: String, replaceTextfieldPlaceholder: String, replaceTypeContextMenuTitle: String, toolbarOpenTextFormatMenuButtonAccessibility: String, toolbarReferenceButtonAccessibility: String, toolbarLinkButtonAccessibility: String, toolbarTemplateButtonAccessibility: String, toolbarImageButtonAccessibility: String, toolbarFindButtonAccessibility: String, toolbarListUnorderedButtonAccessibility: String, toolbarListOrderedButtonAccessibility: String, toolbarIndentIncreaseButtonAccessibility: String, toolbarIndentDecreaseButtonAccessibility: String, toolbarCursorUpButtonAccessibility: String, toolbarCursorDownButtonAccessibility: String, toolbarCursorPreviousButtonAccessibility: String, toolbarCursorNextButtonAccessibility: String, toolbarBoldButtonAccessibility: String, toolbarItalicsButtonAccessibility: String, keyboardCloseTextFormatMenuButtonAccessibility: String, keyboardBoldButtonAccessibility: String, keyboardItalicsButtonAccessibility: String, keyboardUnderlineButtonAccessibility: String, keyboardStrikethroughButtonAccessibility: String, keyboardReferenceButtonAccessibility: String, keyboardLinkButtonAccessibility: String, keyboardListUnorderedButtonAccessibility: String, keyboardListOrderedButtonAccessibility: String, keyboardIndentIncreaseButtonAccessibility: String, keyboardIndentDecreaseButtonAccessibility: String, keyboardSuperscriptButtonAccessibility: String, keyboardSubscriptButtonAccessibility: String, keyboardTemplateButtonAccessibility: String, keyboardCommentButtonAccessibility: String, findTextFieldAccessibility: String, findClearButtonAccessibility: String, findCurrentMatchInfoFormatAccessibility: String, findCurrentMatchInfoZeroResultsAccessibility: String, findCloseButtonAccessibility: String, findNextButtonAccessibility: String, findPreviousButtonAccessibility: String, replaceTextFieldAccessibility: String, replaceClearButtonAccessibility: String, replaceButtonAccessibilityFormat: String, replaceTypeButtonAccessibilityFormat: String, replaceTypeSingleAccessibility: String, replaceTypeAllAccessibility: String) { + public init(keyboardTextFormattingTitle: String, keyboardParagraph: String, keyboardHeading: String, keyboardSubheading1: String, keyboardSubheading2: String, keyboardSubheading3: String, keyboardSubheading4: String, findAndReplaceTitle: String, replaceTypeSingle: String, replaceTypeAll: String, replaceTextfieldPlaceholder: String, replaceTypeContextMenuTitle: String, toolbarOpenTextFormatMenuButtonAccessibility: String, toolbarReferenceButtonAccessibility: String, toolbarLinkButtonAccessibility: String, toolbarTemplateButtonAccessibility: String, toolbarImageButtonAccessibility: String, toolbarFindButtonAccessibility: String, toolbarExpandButtonAccessibility: String, toolbarListUnorderedButtonAccessibility: String, toolbarListOrderedButtonAccessibility: String, toolbarIndentIncreaseButtonAccessibility: String, toolbarIndentDecreaseButtonAccessibility: String, toolbarCursorUpButtonAccessibility: String, toolbarCursorDownButtonAccessibility: String, toolbarCursorPreviousButtonAccessibility: String, toolbarCursorNextButtonAccessibility: String, toolbarBoldButtonAccessibility: String, toolbarItalicsButtonAccessibility: String, keyboardCloseTextFormatMenuButtonAccessibility: String, keyboardBoldButtonAccessibility: String, keyboardItalicsButtonAccessibility: String, keyboardUnderlineButtonAccessibility: String, keyboardStrikethroughButtonAccessibility: String, keyboardReferenceButtonAccessibility: String, keyboardLinkButtonAccessibility: String, keyboardListUnorderedButtonAccessibility: String, keyboardListOrderedButtonAccessibility: String, keyboardIndentIncreaseButtonAccessibility: String, keyboardIndentDecreaseButtonAccessibility: String, keyboardSuperscriptButtonAccessibility: String, keyboardSubscriptButtonAccessibility: String, keyboardTemplateButtonAccessibility: String, keyboardCommentButtonAccessibility: String, findTextFieldAccessibility: String, findClearButtonAccessibility: String, findCurrentMatchInfoFormatAccessibility: String, findCurrentMatchInfoZeroResultsAccessibility: String, findCloseButtonAccessibility: String, findNextButtonAccessibility: String, findPreviousButtonAccessibility: String, replaceTextFieldAccessibility: String, replaceClearButtonAccessibility: String, replaceButtonAccessibilityFormat: String, replaceTypeButtonAccessibilityFormat: String, replaceTypeSingleAccessibility: String, replaceTypeAllAccessibility: String) { self.keyboardTextFormattingTitle = keyboardTextFormattingTitle self.keyboardParagraph = keyboardParagraph self.keyboardHeading = keyboardHeading @@ -84,6 +85,7 @@ public struct WKSourceEditorLocalizedStrings { self.toolbarTemplateButtonAccessibility = toolbarTemplateButtonAccessibility self.toolbarImageButtonAccessibility = toolbarImageButtonAccessibility self.toolbarFindButtonAccessibility = toolbarFindButtonAccessibility + self.toolbarExpandButtonAccessibility = toolbarExpandButtonAccessibility self.toolbarListUnorderedButtonAccessibility = toolbarListUnorderedButtonAccessibility self.toolbarListOrderedButtonAccessibility = toolbarListOrderedButtonAccessibility self.toolbarIndentIncreaseButtonAccessibility = toolbarIndentIncreaseButtonAccessibility diff --git a/WMF Framework/CommonStrings.swift b/WMF Framework/CommonStrings.swift index a6e1bedf5f9..91ad2250590 100644 --- a/WMF Framework/CommonStrings.swift +++ b/WMF Framework/CommonStrings.swift @@ -560,6 +560,8 @@ public class CommonStrings: NSObject { public static let editorToolbarButtonFindAccessiblityLabel = WMFLocalizedString("editor-toolbar-find-accessibility", value: "Find in page", comment: "Accessibility label for find toolbar button on the editor. This button opens the find in page view.") + public static let editorToolbarShowMoreOptionsButtonAccessiblityLabel = WMFLocalizedString("editor-toolbar-show-more-accessibility", value: "Show more formatting options", comment: "Accessibility label for expand button on the formatting toolbar in editor. This button reveals more formatting toolbar buttons.") + public static let editorToolbarButtonListUnorderedAccessiblityLabel = WMFLocalizedString("editor-toolbar-list-unordered-accessibility", value: "Unordered list text formatting", comment: "Accessibility label for unordered list toolbar button on the editor.") public static let editorKeyboardButtonListUnorderedAccessiblityLabel = WMFLocalizedString("editor-keyboard-list-unordered-accessibility", value: "Unordered list", comment: "Accessibility label for unordered list keyboard button on the editor.") diff --git a/Wikipedia/Code/PageEditorViewController.swift b/Wikipedia/Code/PageEditorViewController.swift index 13adcbe18e9..5225890323a 100644 --- a/Wikipedia/Code/PageEditorViewController.swift +++ b/Wikipedia/Code/PageEditorViewController.swift @@ -141,7 +141,8 @@ final class PageEditorViewController: UIViewController { toolbarLinkButtonAccessibility: CommonStrings.editorToolbarButtonLinkAccessiblityLabel, toolbarTemplateButtonAccessibility: CommonStrings.editorToolbarButtonTemplateAccessiblityLabel, toolbarImageButtonAccessibility: CommonStrings.editorToolbarButtonImageAccessiblityLabel, - toolbarFindButtonAccessibility: CommonStrings.editorToolbarButtonFindAccessiblityLabel, + toolbarFindButtonAccessibility: CommonStrings.editorToolbarButtonFindAccessiblityLabel, + toolbarExpandButtonAccessibility: CommonStrings.editorToolbarShowMoreOptionsButtonAccessiblityLabel, toolbarListUnorderedButtonAccessibility: CommonStrings.editorToolbarButtonListUnorderedAccessiblityLabel, toolbarListOrderedButtonAccessibility: CommonStrings.editorToolbarButtonListOrderedAccessiblityLabel, toolbarIndentIncreaseButtonAccessibility: CommonStrings.editorToolbarButtonIndentIncreaseAccessiblityLabel, diff --git a/Wikipedia/Localizations/en.lproj/Localizable.strings b/Wikipedia/Localizations/en.lproj/Localizable.strings index 59a40463e47..756ef5c26e8 100644 --- a/Wikipedia/Localizations/en.lproj/Localizable.strings +++ b/Wikipedia/Localizations/en.lproj/Localizable.strings @@ -396,6 +396,7 @@ "editor-toolbar-list-unordered-accessibility" = "Unordered list text formatting"; "editor-toolbar-open-text-format-menu-accessibility" = "Open text formatting menu"; "editor-toolbar-reference-accessibility" = "Reference text formatting"; +"editor-toolbar-show-more-accessibility" = "Show more formatting options"; "editor-toolbar-template-accessibility" = "Template text formatting"; "empty-diff-compare-title" = "No differences between revisions"; "empty-diff-single-title" = "No viewable changes made"; diff --git a/Wikipedia/Localizations/qqq.lproj/Localizable.strings b/Wikipedia/Localizations/qqq.lproj/Localizable.strings index fb24219f4a1..3f71a381d11 100644 --- a/Wikipedia/Localizations/qqq.lproj/Localizable.strings +++ b/Wikipedia/Localizations/qqq.lproj/Localizable.strings @@ -396,6 +396,7 @@ "editor-toolbar-list-unordered-accessibility" = "Accessibility label for unordered list toolbar button on the editor."; "editor-toolbar-open-text-format-menu-accessibility" = "Accessibility label for text format toolbar button on the editor. This button opens the keyboard text formatting menu."; "editor-toolbar-reference-accessibility" = "Accessibility label for reference toolbar button on the editor."; +"editor-toolbar-show-more-accessibility" = "Accessibility label for expand button on the formatting toolbar in editor. This button reveals more formatting toolbar buttons."; "editor-toolbar-template-accessibility" = "Accessibility label for template toolbar button on the editor."; "empty-diff-compare-title" = "Text for placeholder label visible when diff comparision between revisions is empty."; "empty-diff-single-title" = "Text for placeholder label visible when diff returned for single revision is empty."; diff --git a/Wikipedia/iOS Native Localizations/en.lproj/Localizable.strings b/Wikipedia/iOS Native Localizations/en.lproj/Localizable.strings index e9b51c3f3c5b27fa110b1f4eb50d20d73f8395e8..ddd6f053e8d8f6991744972363e50b2773e04093 100644 GIT binary patch delta 173 zcmbQRNP5ds>4q(gyWX&-GE^`WOh4$xDn5O}E=IoTBAtw4!X*s(K$ydj#E{5P#Gt^C z$&few;R8l(;Ub1qhB6>d1WFbIC2|?^r#n`%3Qt$)WaOHjB*Z2&U2Fq0-}HHR80Gkj z88U#Tlr!jplra=d|G0}$bNU-s7Ln;5m8?8qEt7Ao;hB73uE6vMCm5aD&%9v-VkRJF O24a@&XWp>7JOKbW13PyB delta 38 qcmdn8RC>Z9>4q(gyWUI}ILRo~Uhs|)h?#(x8Hic77rbM2c>(}i91;Kk diff --git a/WikipediaUITests/UITestHelperViewController.swift b/WikipediaUITests/UITestHelperViewController.swift index 2f9f182aae8..8f3a4d1b5a9 100644 --- a/WikipediaUITests/UITestHelperViewController.swift +++ b/WikipediaUITests/UITestHelperViewController.swift @@ -59,6 +59,7 @@ public class UITestHelperViewController: WKCanvasViewController { toolbarTemplateButtonAccessibility: CommonStrings.editorToolbarButtonTemplateAccessiblityLabel, toolbarImageButtonAccessibility: CommonStrings.editorToolbarButtonImageAccessiblityLabel, toolbarFindButtonAccessibility: CommonStrings.editorToolbarButtonFindAccessiblityLabel, + toolbarExpandButtonAccessibility: CommonStrings.editorToolbarShowMoreOptionsButtonAccessiblityLabel, toolbarListUnorderedButtonAccessibility: CommonStrings.editorToolbarButtonListUnorderedAccessiblityLabel, toolbarListOrderedButtonAccessibility: CommonStrings.editorToolbarButtonListOrderedAccessiblityLabel, toolbarIndentIncreaseButtonAccessibility: CommonStrings.editorToolbarButtonIndentIncreaseAccessiblityLabel, From 93a3a9cedd259fbfbdbeeb4136f6d2eb1575df4a Mon Sep 17 00:00:00 2001 From: Toni Sevener Date: Mon, 29 Jan 2024 21:52:10 -0600 Subject: [PATCH 3/4] Add VoiceOver labels to new input view --- .../WKEditorHeaderSelectButton.swift | 18 ++--- .../WKEditorHeaderSelectScrollView.swift | 10 +-- .../Input Views/WKEditorInputView.swift | 73 ++++++++----------- .../Input Views/WKEditorMultiButton.swift | 24 +++--- 4 files changed, 57 insertions(+), 68 deletions(-) diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorHeaderSelectButton.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorHeaderSelectButton.swift index b46a1ae4df4..ee0833a9703 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorHeaderSelectButton.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorHeaderSelectButton.swift @@ -5,14 +5,14 @@ final class WKEditorHeaderSelectButton: WKComponentView { // MARK: - Nested Types - struct Configuration { + struct ViewModel { let title: String let font: UIFont } // MARK: - Properties - let configuration: Configuration + let viewModel: ViewModel var tapAction: (() -> Void)? private var button: UIButton? @@ -27,8 +27,8 @@ final class WKEditorHeaderSelectButton: WKComponentView { // MARK: - Lifecycle - init(configuration: Configuration) { - self.configuration = configuration + init(viewModel: ViewModel) { + self.viewModel = viewModel super.init(frame: .zero) setup() } @@ -82,10 +82,10 @@ final class WKEditorHeaderSelectButton: WKComponentView { var buttonConfig = UIButton.Configuration.plain() var container = AttributeContainer() - container.font = configuration.font + container.font = viewModel.font container.foregroundColor = theme.text - buttonConfig.attributedTitle = AttributedString(configuration.title, attributes: container) + buttonConfig.attributedTitle = AttributedString(viewModel.title, attributes: container) buttonConfig.baseForegroundColor = theme.text buttonConfig.contentInsets = NSDirectionalEdgeInsets(top: 19, leading: 12, bottom: 19, trailing: 12) buttonConfig.background.cornerRadius = 10 @@ -94,7 +94,7 @@ final class WKEditorHeaderSelectButton: WKComponentView { } private func createButtonAction() -> UIAction { - return UIAction(title: configuration.title, handler: { [weak self] _ in + return UIAction(title: viewModel.title, handler: { [weak self] _ in self?.tapAction?() }) } @@ -104,10 +104,10 @@ final class WKEditorHeaderSelectButton: WKComponentView { buttonConfig?.background.backgroundColor = button.isSelected ? self.theme.link : self.theme.paperBackground var container = AttributeContainer() - container.font = self.configuration.font + container.font = viewModel.font container.foregroundColor = button.isSelected ? self.theme.paperBackground : self.theme.text - buttonConfig?.attributedTitle = AttributedString(self.configuration.title, attributes: container) + buttonConfig?.attributedTitle = AttributedString(viewModel.title, attributes: container) button.configuration = buttonConfig } diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorHeaderSelectScrollView.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorHeaderSelectScrollView.swift index 1df48927083..c8b97177d00 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorHeaderSelectScrollView.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorHeaderSelectScrollView.swift @@ -11,7 +11,7 @@ final class WKEditorHeaderSelectScrollView: WKComponentView { private weak var delegate: WKEditorHeaderSelectScrollViewDelegate? private var buttons: [WKEditorHeaderSelectButton] = [] - private let configurations: [WKEditorHeaderSelectButton.Configuration] + private let viewModels: [WKEditorHeaderSelectButton.ViewModel] private lazy var scrollView: UIScrollView = { let scrollView = UIScrollView() @@ -32,8 +32,8 @@ final class WKEditorHeaderSelectScrollView: WKComponentView { // MARK: - Lifecycle - init(configurations: [WKEditorHeaderSelectButton.Configuration], delegate: WKEditorHeaderSelectScrollViewDelegate?) { - self.configurations = configurations + init(viewModels: [WKEditorHeaderSelectButton.ViewModel], delegate: WKEditorHeaderSelectScrollViewDelegate?) { + self.viewModels = viewModels self.delegate = delegate super.init(frame: .zero) setup() @@ -90,8 +90,8 @@ final class WKEditorHeaderSelectScrollView: WKComponentView { var buttons: [WKEditorHeaderSelectButton] = [] - for configuration in configurations { - let button = WKEditorHeaderSelectButton(configuration: configuration) + for viewModel in viewModels { + let button = WKEditorHeaderSelectButton(viewModel: viewModel) button.translatesAutoresizingMaskIntoConstraints = false buttons.append(button) diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorInputView.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorInputView.swift index 32b8d2250cf..3a448683df1 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorInputView.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorInputView.swift @@ -71,6 +71,7 @@ class WKEditorInputView: WKComponentView { label.font = WKFont.for(.boldTitle3, compatibleWith: appEnvironment.traitCollection) label.text = WKSourceEditorLocalizedStrings.current.keyboardTextFormattingTitle label.setContentHuggingPriority(.defaultLow, for: .horizontal) + label.accessibilityTraits = [.header] return label }() @@ -109,16 +110,16 @@ class WKEditorInputView: WKComponentView { }() private lazy var headerSelectScrollView: WKEditorHeaderSelectScrollView = { - let configurations: [WKEditorHeaderSelectButton.Configuration] = headingButtonTypes.map { + let viewModels: [WKEditorHeaderSelectButton.ViewModel] = headingButtonTypes.map { let title = $0.title let font = $0.font(traitCollection: traitCollection) - let item = WKEditorHeaderSelectButton.Configuration(title: title, font: font) + let item = WKEditorHeaderSelectButton.ViewModel(title: title, font: font) return item } - let scrollingChoiceView = WKEditorHeaderSelectScrollView(configurations: configurations, delegate: self) + let scrollingChoiceView = WKEditorHeaderSelectScrollView(viewModels: viewModels, delegate: self) scrollingChoiceView.translatesAutoresizingMaskIntoConstraints = false return scrollingChoiceView }() @@ -161,84 +162,70 @@ class WKEditorInputView: WKComponentView { private lazy var multiButtonBoldItalic: WKEditorMultiButton = { - let configuration = WKEditorMultiButton.Configuration(icons: [ - WKSFSymbolIcon.for(symbol: .bold), - WKSFSymbolIcon.for(symbol: .italic) - ]) + let boldViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .bold), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardBoldButtonAccessibility) + let italicViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .italic), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardItalicsButtonAccessibility) - let button = WKEditorMultiButton(configuration: configuration, delegate: self) + let button = WKEditorMultiButton(viewModels: [boldViewModel, italicViewModel], delegate: self) button.translatesAutoresizingMaskIntoConstraints = false return button }() private lazy var multiButtonUnderlineStrikethrough: WKEditorMultiButton = { - let configuration = WKEditorMultiButton.Configuration(icons: [ - WKSFSymbolIcon.for(symbol: .underline), - WKSFSymbolIcon.for(symbol: .strikethrough) - ]) + let underlineViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .underline), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardUnderlineButtonAccessibility) + let strikethroughViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .strikethrough), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardStrikethroughButtonAccessibility) - let button = WKEditorMultiButton(configuration: configuration, delegate: self) + let button = WKEditorMultiButton(viewModels: [underlineViewModel, strikethroughViewModel], delegate: self) button.translatesAutoresizingMaskIntoConstraints = false return button }() private lazy var multiButtonReferenceLink: WKEditorMultiButton = { + + let referenceViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .quoteOpening), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardReferenceButtonAccessibility) + let linkViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .link), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardLinkButtonAccessibility) - let configuration = WKEditorMultiButton.Configuration(icons: [ - WKSFSymbolIcon.for(symbol: .quoteOpening), - WKSFSymbolIcon.for(symbol: .link) - ]) - - let button = WKEditorMultiButton(configuration: configuration, delegate: self) + let button = WKEditorMultiButton(viewModels: [referenceViewModel, linkViewModel], delegate: self) button.translatesAutoresizingMaskIntoConstraints = false return button }() private lazy var multiButtonBulletNumberList: WKEditorMultiButton = { + + let bulletViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .listBullet), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardListUnorderedButtonAccessibility) + let numberViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .listNumber), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardListOrderedButtonAccessibility) - let configuration = WKEditorMultiButton.Configuration(icons: [ - WKSFSymbolIcon.for(symbol: .listBullet), - WKSFSymbolIcon.for(symbol: .listNumber) - ]) - - let button = WKEditorMultiButton(configuration: configuration, delegate: self) + let button = WKEditorMultiButton(viewModels: [bulletViewModel, numberViewModel], delegate: self) button.translatesAutoresizingMaskIntoConstraints = false return button }() private lazy var multiButtonIndentIncreaseDecrease: WKEditorMultiButton = { + + let decreaseIndentViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .decreaseIndent), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardIndentDecreaseButtonAccessibility) + let increaseIndentViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .increaseIndent), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardIndentIncreaseButtonAccessibility) - let configuration = WKEditorMultiButton.Configuration(icons: [ - WKSFSymbolIcon.for(symbol: .decreaseIndent), - WKSFSymbolIcon.for(symbol: .increaseIndent) - ]) - - let button = WKEditorMultiButton(configuration: configuration, delegate: self) + let button = WKEditorMultiButton(viewModels: [decreaseIndentViewModel, increaseIndentViewModel], delegate: self) button.translatesAutoresizingMaskIntoConstraints = false return button }() private lazy var multiButtonSubscriptSuperscript: WKEditorMultiButton = { + + let superscriptViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .textFormatSuperscript), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardSuperscriptButtonAccessibility) + let subscriptViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .textFormatSubscript), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardSubscriptButtonAccessibility) - let configuration = WKEditorMultiButton.Configuration(icons: [ - WKSFSymbolIcon.for(symbol: .textFormatSuperscript), - WKSFSymbolIcon.for(symbol: .textFormatSubscript) - ]) - - let button = WKEditorMultiButton(configuration: configuration, delegate: self) + let button = WKEditorMultiButton(viewModels: [superscriptViewModel, subscriptViewModel], delegate: self) button.translatesAutoresizingMaskIntoConstraints = false return button }() private lazy var multiButtonTemplateComment: WKEditorMultiButton = { + + let templateViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .curlybraces), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardTemplateButtonAccessibility) + let commentViewModel = WKEditorMultiButton.ViewModel(icon: WKSFSymbolIcon.for(symbol: .exclamationMarkCircle), accessibilityLabel: WKSourceEditorLocalizedStrings.current.keyboardCommentButtonAccessibility) - let configuration = WKEditorMultiButton.Configuration(icons: [ - WKSFSymbolIcon.for(symbol: .curlybraces), - WKSFSymbolIcon.for(symbol: .exclamationMarkCircle) - ]) - - let button = WKEditorMultiButton(configuration: configuration, delegate: self) + let button = WKEditorMultiButton(viewModels: [templateViewModel, commentViewModel], delegate: self) button.translatesAutoresizingMaskIntoConstraints = false return button }() diff --git a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorMultiButton.swift b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorMultiButton.swift index 084b680fbd9..fe114a566db 100644 --- a/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorMultiButton.swift +++ b/Components/Sources/Components/Components/Editors/Common Views/Input Views/WKEditorMultiButton.swift @@ -9,13 +9,14 @@ final class WKEditorMultiButton: WKComponentView { // MARK: - Nested Types - struct Configuration { - let icons: [UIImage?] + struct ViewModel { + let icon: UIImage? + let accessibilityLabel: String } // MARK: - Properties - private let configuration: Configuration + private let viewModels: [ViewModel] private var buttons: [UIButton] = [] private weak var delegate: WKEditorMultiSelectButtonDelegate? @@ -31,8 +32,8 @@ final class WKEditorMultiButton: WKComponentView { // MARK: - Lifecycle - init(configuration: Configuration, delegate: WKEditorMultiSelectButtonDelegate) { - self.configuration = configuration + init(viewModels: [ViewModel], delegate: WKEditorMultiSelectButtonDelegate) { + self.viewModels = viewModels self.delegate = delegate super.init(frame: .zero) setup() @@ -62,8 +63,8 @@ final class WKEditorMultiButton: WKComponentView { override func appEnvironmentDidChange() { - for (icon, button) in zip(configuration.icons, buttons) { - let buttonConfig = createButtonConfig(image: icon) + for (viewModel, button) in zip(viewModels, buttons) { + let buttonConfig = createButtonConfig(image: viewModel.icon) button.configuration = buttonConfig button.configurationUpdateHandler = buttonConfigurationUpdateHandler(button:) } @@ -91,8 +92,8 @@ final class WKEditorMultiButton: WKComponentView { private func createAndAddButtonsToStackView() { var buttons: [UIButton] = [] - for (index, icon) in configuration.icons.enumerated() { - let button = createButton(icon: icon, tapAction: { [weak self] in + for (index, viewModel) in viewModels.enumerated() { + let button = createButton(viewModel: viewModel, tapAction: { [weak self] in guard let self else { return } @@ -130,13 +131,14 @@ final class WKEditorMultiButton: WKComponentView { button.configuration = buttonConfig } - private func createButton(icon: UIImage?, tapAction: @escaping () -> Void) -> UIButton { + private func createButton(viewModel: ViewModel, tapAction: @escaping () -> Void) -> UIButton { - let buttonConfig = createButtonConfig(image: icon) + let buttonConfig = createButtonConfig(image: viewModel.icon) let action = createButtonAction(action: tapAction) let button = UIButton(configuration: buttonConfig, primaryAction: action) button.configurationUpdateHandler = buttonConfigurationUpdateHandler(button:) button.translatesAutoresizingMaskIntoConstraints = false + button.accessibilityLabel = viewModel.accessibilityLabel return button } From d035bc14b3babb7190bbbc25fd2dfb4da868fbd3 Mon Sep 17 00:00:00 2001 From: Toni Sevener Date: Mon, 29 Jan 2024 22:07:05 -0600 Subject: [PATCH 4/4] Fix tests --- .../ComponentsTests/WKSourceEditorTests.swift | 117 +++++++++--------- 1 file changed, 57 insertions(+), 60 deletions(-) diff --git a/Components/Tests/ComponentsTests/WKSourceEditorTests.swift b/Components/Tests/ComponentsTests/WKSourceEditorTests.swift index 4b09c1dbf29..97ff1b4e3dc 100644 --- a/Components/Tests/ComponentsTests/WKSourceEditorTests.swift +++ b/Components/Tests/ComponentsTests/WKSourceEditorTests.swift @@ -61,66 +61,63 @@ extension WKSourceEditorTests: WKSourceEditorViewControllerDelegate { extension WKSourceEditorLocalizedStrings { static var emptyTestStrings: WKSourceEditorLocalizedStrings { - return WKSourceEditorLocalizedStrings( - inputViewTextFormatting: "", - inputViewClearFormatting: "", - inputViewParagraph: "", - inputViewHeading: "", - inputViewSubheading1: "", - inputViewSubheading2: "", - inputViewSubheading3: "", - inputViewSubheading4: "", - findReplaceTypeSingle: "", - findReplaceTypeAll: "", - findReplaceWith: "", - findReplaceTypeMenuTitle: "", - accessibilityLabelButtonFormatText: "", - accessibilityLabelButtonCitation: "", - accessibilityLabelButtonCitationSelected: "", - accessibilityLabelButtonLink: "", - accessibilityLabelButtonLinkSelected: "", - accessibilityLabelButtonTemplate: "", - accessibilityLabelButtonTemplateSelected: "", - accessibilityLabelButtonMedia: "", - accessibilityLabelButtonFind: "", - accessibilityLabelButtonListUnordered: "", - accessibilityLabelButtonListUnorderedSelected: "", - accessibilityLabelButtonListOrdered: "", - accessibilityLabelButtonListOrderedSelected: "", - accessibilityLabelButtonInceaseIndent: "", - accessibilityLabelButtonDecreaseIndent: "", - accessibilityLabelButtonCursorUp: "", - accessibilityLabelButtonCursorDown: "", - accessibilityLabelButtonCursorLeft: "", - accessibilityLabelButtonCursorRight: "", - accessibilityLabelButtonBold: "", - accessibilityLabelButtonBoldSelected: "", - accessibilityLabelButtonItalics: "", - accessibilityLabelButtonItalicsSelected: "", - accessibilityLabelButtonShowMore: "", - accessibilityLabelButtonComment: "", - accessibilityLabelButtonCommentSelected: "", - accessibilityLabelButtonSuperscript: "", - accessibilityLabelButtonSuperscriptSelected: "", - accessibilityLabelButtonSubscript: "", - accessibilityLabelButtonSubscriptSelected: "", - accessibilityLabelButtonUnderline: "", - accessibilityLabelButtonUnderlineSelected: "", - accessibilityLabelButtonStrikethrough: "", - accessibilityLabelButtonStrikethroughSelected: "", - accessibilityLabelButtonCloseMainInputView: "", - accessibilityLabelButtonCloseHeaderSelectInputView: "", - accessibilityLabelFindTextField: "", - accessibilityLabelFindButtonClear: "", - accessibilityLabelFindButtonClose: "", - accessibilityLabelFindButtonNext: "", - accessibilityLabelFindButtonPrevious: "", - accessibilityLabelReplaceTextField: "", - accessibilityLabelReplaceButtonClear: "", - accessibilityLabelReplaceButtonPerformFormat: "", - accessibilityLabelReplaceButtonSwitchFormat: "", - accessibilityLabelReplaceTypeSingle: "", - accessibilityLabelReplaceTypeAll: "" + return WKSourceEditorLocalizedStrings(keyboardTextFormattingTitle: "", + keyboardParagraph: "", + keyboardHeading: "", + keyboardSubheading1: "", + keyboardSubheading2: "", + keyboardSubheading3: "", + keyboardSubheading4: "", + findAndReplaceTitle: "", + replaceTypeSingle: "", + replaceTypeAll: "", + replaceTextfieldPlaceholder: "", + replaceTypeContextMenuTitle: "", + toolbarOpenTextFormatMenuButtonAccessibility: "", + toolbarReferenceButtonAccessibility: "", + toolbarLinkButtonAccessibility: "", + toolbarTemplateButtonAccessibility: "", + toolbarImageButtonAccessibility: "", + toolbarFindButtonAccessibility: "", + toolbarExpandButtonAccessibility: "", + toolbarListUnorderedButtonAccessibility: "", + toolbarListOrderedButtonAccessibility: "", + toolbarIndentIncreaseButtonAccessibility: "", + toolbarIndentDecreaseButtonAccessibility: "", + toolbarCursorUpButtonAccessibility: "", + toolbarCursorDownButtonAccessibility: "", + toolbarCursorPreviousButtonAccessibility: "", + toolbarCursorNextButtonAccessibility: "", + toolbarBoldButtonAccessibility: "", + toolbarItalicsButtonAccessibility: "", + keyboardCloseTextFormatMenuButtonAccessibility: "", + keyboardBoldButtonAccessibility: "", + keyboardItalicsButtonAccessibility: "", + keyboardUnderlineButtonAccessibility: "", + keyboardStrikethroughButtonAccessibility: "", + keyboardReferenceButtonAccessibility: "", + keyboardLinkButtonAccessibility: "", + keyboardListUnorderedButtonAccessibility: "", + keyboardListOrderedButtonAccessibility: "", + keyboardIndentIncreaseButtonAccessibility: "", + keyboardIndentDecreaseButtonAccessibility: "", + keyboardSuperscriptButtonAccessibility: "", + keyboardSubscriptButtonAccessibility: "", + keyboardTemplateButtonAccessibility: "", + keyboardCommentButtonAccessibility: "", + findTextFieldAccessibility: "", + findClearButtonAccessibility: "", + findCurrentMatchInfoFormatAccessibility: "", + findCurrentMatchInfoZeroResultsAccessibility: "", + findCloseButtonAccessibility: "", + findNextButtonAccessibility: "", + findPreviousButtonAccessibility: "", + replaceTextFieldAccessibility: "", + replaceClearButtonAccessibility: "", + replaceButtonAccessibilityFormat: "", + replaceTypeButtonAccessibilityFormat: "", + replaceTypeSingleAccessibility: "", + replaceTypeAllAccessibility: "" ) } }