diff --git a/ATTRIBUTION.toml b/ATTRIBUTION.toml index 73f725955..fafd03248 100644 --- a/ATTRIBUTION.toml +++ b/ATTRIBUTION.toml @@ -7,7 +7,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Greek UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "9976cffa76284284c79e3270dcffac1c393148e8c0ee7113d5793fedcbb698ec" +sha256 = "7d1ae0d63cff95e85eea863831791c0a967a908e4062ab220ff2f3b0b77aee96" # ATTRIBUTION.toml: one entry per asset (AGENTS.md §1). The source of truth for provenance and licences. # ATTRIBUTION.md is generated from this file: `cargo xtask assets --write`. Checked by `cargo xtask assets` (part of `xtask ci`). @@ -30,7 +30,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Simplified Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "4597a7131ac94a4893e1f84b6585b4f63d54551795c7c17af1f0c7b60178cd38" +sha256 = "3d558b2d0ed089b1f554d9aa8d66c56a5e91f8f3ceb33031dc68bc8d511d4eb6" [[asset]] path = "crates/ui-egui/src/i18n/zh-hant.tsv" @@ -41,7 +41,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Traditional Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "47af30988b5776a138033de15549df77e198cfe1cc2285e37f94d0af872b259d" +sha256 = "4857aa037856ff8e2ba82dea4b630f42c611d6817c9677bf2c6a8133c57927f8" [[asset]] path = "crates/ui-egui/src/i18n/cs.tsv" @@ -52,7 +52,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Czech UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "faee91b7cb2cee41b831779ad6309952d399b83709007b336ca116a506525dec" +sha256 = "074d09497b6407d978f3ffd05cac81d52d1ddfe6c4ce8b0f564a00a203ec4579" [[asset]] path = "crates/ui-egui/src/i18n/pt-br.tsv" @@ -63,7 +63,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Brazilian Portuguese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "13bd6b4176147feafd9b1ddff71aa75778c1e01119537ce5e36f6da3284c89b1" +sha256 = "69c2fb412e7b5a7ef5ab9740ba9b29ba4e9509668623c7eef298d8cc06ad1068" [[asset]] path = "crates/ui-egui/src/i18n/es.tsv" @@ -74,7 +74,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Spanish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "897fbcf310a56be8b8d5b2b23dfe2c45d4f3c565792c2d28b58161c435d4aa5c" +sha256 = "9b32ef11741bca8b79d51daacfda0690ea0ec829bb2691d9b60543ccff2ccede" [[asset]] path = "crates/ui-egui/src/i18n/fr.tsv" @@ -85,7 +85,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "French UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "c593532d581c2bae30f0c03be3261256fcae4b703ab154a2cb5e9026247874bd" +sha256 = "b6a451c484551d270b5efc42d91984d16fcc5d7c09930cc5a5339d430a7b96f9" [[asset]] path = "crates/ui-egui/src/i18n/de.tsv" @@ -96,7 +96,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "German UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "a724e544044561df9880a68a924dc2225716095c995ebbe93420e0ddd599835a" +sha256 = "28521cc75735a14a7b44f02d67a46ae54821f9f19e8d352513213ffcf529d7ee" [[asset]] path = "crates/ui-egui/src/i18n/te.tsv" @@ -107,7 +107,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Telugu UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "e92ba4c24b2183d90f007f3d50ef1d90ae10e82aea4d45b8f838967cf7db1bde" +sha256 = "db0205e928f498b0674fb84c604b45c7c83d23f170ee98c8d8a807c56422eb3d" [[asset]] path = "crates/ui-egui/src/i18n/it.tsv" @@ -118,7 +118,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Italian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "e1b873432f3bcd2ccadfbdf90b912e47af8d733062d4d34bd0d338f05b57c6c2" +sha256 = "817fce18112db6084a03405d58ae110ed90d7fddc014b6c0af10a5e79ef4d906" [[asset]] path = "crates/ui-egui/src/i18n/pl.tsv" @@ -129,7 +129,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Polish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "7ebdede05e7d63b127232e5e3ebb36220a529f12ad73badbfd2c155ecafb31b6" +sha256 = "e9b507a72ac306bac9c3b6f4bb3917064b811fe60eb0041cda0b26349d469e95" [[asset]] path = "crates/ui-egui/src/i18n/ru.tsv" @@ -140,7 +140,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Russian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "66897289a489e2b65052d9fb21238e882c6d9cf6652d346b072f0e837367ec23" +sha256 = "c400f2e8bd7cd0a49ac31c2c4fd4a2fab1a50a539e0a68ebba4cc028427e0fbb" [[asset]] path = "crates/ui-egui/src/i18n/hu.tsv" @@ -151,7 +151,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Hungarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "a946a8756b80dbb0505b07dbfe0c01ae4260deab6d3b0beb37b43552eef03536" +sha256 = "c76086602063239d59fd8e54b2ea282dae1b22f7118437e4358ce3c35cc8f435" [[asset]] path = "crates/ui-egui/src/i18n/bg.tsv" @@ -162,7 +162,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Bulgarian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "0deac0ca8e57642d7d43971fc94d151e500d5234ba0f221a25a0b3754150fef0" +sha256 = "3222d3448ac0d8020dfe5d8a0b3c5e3b6d93a26c54105f996de056569bfa64f4" [[asset]] path = "crates/ui-egui/src/i18n/kk.tsv" @@ -173,7 +173,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Kazakh UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "67aac3be3f312649900310dfdafcdd8233b463e0366185bfe13d97f30eca4df8" +sha256 = "48480d411ecd9923a1c5ceae5ca8925a5a2eb660cdacd08df77054ce3a014db8" [[asset]] path = "crates/ui-egui/src/i18n/ja.tsv" @@ -184,7 +184,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Japanese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "d2131a65c052b25b72c796bcc235de88c3d662814f015de666a5eb112889944f" +sha256 = "3e09f5942b85f677b0cf8b3b326a2ca1896eae205c1c86c283891148f1b2dca4" [[asset]] path = "crates/ui-egui/src/i18n/uk.tsv" @@ -195,7 +195,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Ukrainian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "320cb208f7e61750480c96e95b3bebe4000efb4bf5218668c3c8d7d630369ec2" +sha256 = "d28704a4803f764ffa52f308332636c9846832c4cf3a22093b9c1253afe512e6" [[asset]] path = "crates/ui-egui/src/i18n/ar.tsv" @@ -206,7 +206,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Arabic UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "b32f085ffd99fd92e7e2457c44aa51bd7a0831734008fa46c542f4691fa4cb30" +sha256 = "a5f8e4e269f3ee2f466ed8bf2e2bb629fd0e79f149f0a536d7f64c26919b07b4" [[asset]] path = "crates/ui-egui/src/i18n/tr.tsv" @@ -217,7 +217,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Turkish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "9ec9155f36d5b5e36ef1b27646ee72dc625cde0e6ba07c54d633d6aaabe45c8f" +sha256 = "7be55c126ff56daf887ef1faf5bce8e0630dcc791adf5a57d772f28a3060aca7" [[asset]] path = "crates/ui-egui/src/i18n/lt.tsv" @@ -228,7 +228,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Lithuanian UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "93039a5d4f5b78e29cb6f0212fec4c705fc9a47bc2d89dcf6b00de07d505a608" +sha256 = "137d522b0b8746519a8d2cfaad3908d4fa3e4fd80eb6a1233a4c693d4492e7aa" [[asset]] @@ -240,7 +240,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Vietnamese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "4cc6a7220f27ce4fcf9787f56d763b6e2aa4e29a682111fd8ab21dac5689f99e" +sha256 = "5a14dc07d02b4b5ca6c5e06cfe80f459d195791bf42f0f2a75a73fc8292f57b1" [[asset]] path = "assets/icons/accessibility.svg" @@ -3363,7 +3363,7 @@ licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" usage = "Slovene UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs" -sha256 = "39b64b099db9a6d4d54d1a67f2923dbce0baea9ade737eb8925db8a1faf66ac3" +sha256 = "ddaec4954dd6b46e089ae31da9c012d10a03da33ee138b07793e869f3813d5c3" [[asset]] path = "vendor/vello_common/assets/probe.png" diff --git a/crates/automation/src/a11y.rs b/crates/automation/src/a11y.rs index 28b75ca78..90d308ea9 100644 --- a/crates/automation/src/a11y.rs +++ b/crates/automation/src/a11y.rs @@ -286,6 +286,14 @@ impl Automation { Ok(report_json(&r)) } + /// Report only untagged page content, annotations, and AcroForm widgets. + pub(crate) fn a11y_find_untagged(&self, a: &Args) -> Result { + let pages = a.opt_ints("pages")?.map(|_| self.pages(a, "pages")).transpose()?; + let rules = [Rule::TaggedContent, Rule::TaggedAnnotations, Rule::TaggedFormFields].into_iter().collect(); + let report = self.doc(a)?.accessibility_check(&Options { rules, pages }).ok_or_else(|| failed("the document can't be read for checking"))?; + Ok(report_json(&report)) + } + pub(crate) fn a11y_report(&self, a: &Args) -> Result { let o = self.a11y_options(a)?; let doc = self.doc(a)?; diff --git a/crates/automation/src/lib.rs b/crates/automation/src/lib.rs index c83a3b43b..b32c22bce 100644 --- a/crates/automation/src/lib.rs +++ b/crates/automation/src/lib.rs @@ -763,6 +763,7 @@ impl Automation { "comment_set_status" => self.comment_set_status(&a)?, "sign_list" => self.sign_list(&a)?, "accessibility_check" => self.a11y_check(&a)?, + "accessibility_find_untagged" => self.a11y_find_untagged(&a)?, "accessibility_autotag_preview" => self.accessibility_autotag_preview(&a)?, "accessibility_autotag_apply" => self.accessibility_autotag_apply(&a)?, "accessibility_autotag_form_fields" => self.accessibility_autotag_form_fields(&a)?, diff --git a/crates/automation/src/tools.rs b/crates/automation/src/tools.rs index 540e99f1a..f2bb9611d 100644 --- a/crates/automation/src/tools.rs +++ b/crates/automation/src/tools.rs @@ -944,6 +944,10 @@ pub fn tools() -> Vec { }), &["doc"], )), + t("accessibility_find_untagged", "Find untagged content", "Find untagged painted page content, annotations, and form widgets. This focused check does not modify the PDF or claim that its other accessibility rules pass.") + .ro() + .cmd("a11y.find_untagged") + .with(schema(json!({ "doc": doc(), "pages": pages("to search (default: all)") }), &["doc"])), t("accessibility_report", "Accessibility report", "Run the full check and write the accessibility report (HTML) to path; returns the results too. Takes the same options as accessibility_check.") .destructive() .cmd("a11y.report") diff --git a/crates/automation/tests/automation.rs b/crates/automation/tests/automation.rs index e513f09e7..58f4a5272 100644 --- a/crates/automation/tests/automation.rs +++ b/crates/automation/tests/automation.rs @@ -6387,6 +6387,26 @@ fn absolute_gotor_consent_does_not_bypass_validation_or_passwords() { assert_eq!(opened["destination_applied"], true); } +#[test] +fn finding_untagged_content_limits_results_to_content_annotations_and_widgets() { + let dir = workdir("find-untagged"); + std::fs::write(dir.join("field.pdf"), form_pdf("name")).unwrap(); + let mut a = auto(&dir); + let doc = ok(&mut a, "doc_open", json!({ "path": "field.pdf" }))["doc"].as_u64().unwrap(); + let found = ok(&mut a, "accessibility_find_untagged", json!({ "doc": doc })); + let active: Vec<&str> = found["results"] + .as_array() + .unwrap() + .iter() + .filter(|result| result["status"] != "skipped") + .map(|result| result["rule"].as_str().unwrap()) + .collect(); + assert_eq!(active, ["tagged-content", "tagged-annotations", "tagged-form-fields"]); + let fields = found["results"].as_array().unwrap().iter().find(|result| result["rule"] == "tagged-form-fields").unwrap(); + assert_eq!(fields["status"], "failed"); + assert_eq!(fields["findings"][0]["page"], 1); +} + #[test] fn a_missing_path_under_the_root_names_where_it_was_looked_for() { // #1890: a script written from another working directory repeats the root's folder in its diff --git a/crates/engine/src/catalog.rs b/crates/engine/src/catalog.rs index d56112498..b46d88acf 100644 --- a/crates/engine/src/catalog.rs +++ b/crates/engine/src/catalog.rs @@ -475,6 +475,7 @@ pub static TOOL_GROUPS: &[ToolGroup] = &[ item("Tag form fields", "tag", "a11y.autotag_fields", Ready), item("Change reading options", "book-open", "a11y.reading_options", Ready), item("Check for accessibility", "accessibility", "a11y.check", Ready), + item("Find untagged content", "search", "a11y.find_untagged", Ready), item("Open accessibility report", "file-text", "a11y.report", Ready), item("Add alternate text", "image", "a11y.alt_text", Ready), item("Tags panel", "tag", "a11y.tags", Ready), diff --git a/crates/engine/src/commands.rs b/crates/engine/src/commands.rs index 9766edd9f..b28758e24 100644 --- a/crates/engine/src/commands.rs +++ b/crates/engine/src/commands.rs @@ -332,6 +332,7 @@ pub const COMMANDS: &[CommandSpec] = &[ c("ocr.enhance_camera", "Enhance camera image", None, None, Modification, "camera"), c("ocr.recognize_batch", "Recognize text in multiple files…", None, None, Nothing, "files"), c("a11y.check", "Check for accessibility…", None, None, Document, "accessibility"), + c("a11y.find_untagged", "Find untagged content", None, None, Document, "search"), c("a11y.autotag", "Automatically tag PDF", None, None, Document, "tag"), c("a11y.report", "Open accessibility report", None, None, Document, "file-text"), c("a11y.reading_options", "Change reading options…", None, None, Document, "book-open"), diff --git a/crates/ui-egui/src/a11y_ui.rs b/crates/ui-egui/src/a11y_ui.rs index b700536b9..2130c927a 100644 --- a/crates/ui-egui/src/a11y_ui.rs +++ b/crates/ui-egui/src/a11y_ui.rs @@ -343,6 +343,27 @@ pub(crate) fn panel(ui: &mut egui::Ui, t: &Tokens, state: &mut A11yState, doc: D } impl PdfCraftApp { + /// Prepare for accessibility ▸ Find untagged content. + pub(crate) fn find_untagged_content(&mut self) { + let Some((_, id)) = self.active_ids() else { return }; + let Some(doc) = self.session.get(id) else { return }; + let options = Options { rules: [Rule::TaggedContent, Rule::TaggedAnnotations, Rule::TaggedFormFields].into_iter().collect(), pages: None }; + let Some(report) = doc.accessibility_check(&options) else { + self.notify_tr("This document can't be checked: it couldn't be read for editing"); + return; + }; + let failed = report.count(Status::Failed); + self.a11y.previous = None; + self.a11y.options = Some(options); + self.a11y.report = Some((id, report)); + self.right = Some(RightPanel::Accessibility); + self.notify(if failed == 0 { + tl!("No untagged content was found.").to_string() + } else { + crate::i18n::fmt(tl!("Found {n} untagged content problems."), &[("n", &failed.to_string())]) + }); + } + /// Check for accessibility: the options first, unless they are turned off. pub(crate) fn start_accessibility_check(&mut self) { if self.a11y_options.show_dialog { diff --git a/crates/ui-egui/src/commands.rs b/crates/ui-egui/src/commands.rs index f21c8c309..c46d93d62 100644 --- a/crates/ui-egui/src/commands.rs +++ b/crates/ui-egui/src/commands.rs @@ -395,6 +395,7 @@ impl PdfCraftApp { "export.image" => self.dialog = Some(Dialog::Export(crate::export_ui::ExportKind::Image)), "export.text" => self.dialog = Some(Dialog::Export(crate::export_ui::ExportKind::Text)), "a11y.check" => self.start_accessibility_check(), + "a11y.find_untagged" => self.find_untagged_content(), "ocr.recognize" => self.dialog = Some(Dialog::RecognizeText), "tools.js_console" => self.dialog = Some(Dialog::JsConsole), "tools.document_js" => { diff --git a/crates/ui-egui/src/i18n/ar.tsv b/crates/ui-egui/src/i18n/ar.tsv index 4ced5c54f..ccb7bda43 100644 --- a/crates/ui-egui/src/i18n/ar.tsv +++ b/crates/ui-egui/src/i18n/ar.tsv @@ -2394,6 +2394,9 @@ animation effects Off معطّلة This document is trying to open a local file: يحاول هذا المستند فتح ملف محلي: Move tag earlier نقل العلامة للأعلى Move tag later نقل العلامة للأسفل + Find untagged content العثور على محتوى غير مُعلَّم + No untagged content was found. لم يتم العثور على محتوى غير معلَّم. + Found {n} untagged content problems. تم العثور على {n} مشكلة في محتوى غير معلَّم. Tag form fields وضع علامات على حقول النموذج Mark as artifact وضع علامة كعنصر زخرفي Remove this leaf tag from reading order and mark its direct content as an artifact أزل هذه العلامة من ترتيب القراءة وضع علامة على محتواها المباشر كعنصر زخرفي diff --git a/crates/ui-egui/src/i18n/bg.tsv b/crates/ui-egui/src/i18n/bg.tsv index 2a91b69c7..2c2c67d3f 100644 --- a/crates/ui-egui/src/i18n/bg.tsv +++ b/crates/ui-egui/src/i18n/bg.tsv @@ -2336,6 +2336,9 @@ animation effects Off Изключени This document is trying to open a local file: Този документ се опитва да отвори локален файл: Move tag earlier Преместване на етикета по-рано Move tag later Преместване на етикета по-късно + Find untagged content Намиране на немаркирано съдържание + No untagged content was found. Не е намерено немаркирано съдържание. + Found {n} untagged content problems. Открити са {n} проблема с немаркирано съдържание. Tag form fields Маркиране на полетата на формуляра Mark as artifact Маркиране като артефакт Remove this leaf tag from reading order and mark its direct content as an artifact Премахнете този листов етикет от реда на четене и маркирайте прякото му съдържание като артефакт diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index ad8bacb30..36aed74ab 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -2447,6 +2447,9 @@ animation effects Off Vypnuto This document is trying to open a local file: Tento dokument se pokouší otevřít místní soubor: Move tag earlier Přesunout značku dříve Move tag later Přesunout značku později + Find untagged content Najít neoznačený obsah + No untagged content was found. Nebyl nalezen žádný neoznačený obsah. + Found {n} untagged content problems. Nalezeno problémů s neoznačeným obsahem: {n}. Tag form fields Označit pole formuláře Mark as artifact Označit jako artefakt Remove this leaf tag from reading order and mark its direct content as an artifact Odeberte tuto značku listu z pořadí čtení a označte její přímý obsah jako artefakt diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index fb841e220..748e514b1 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -2374,6 +2374,9 @@ animation effects Off Aus This document is trying to open a local file: Dieses Dokument versucht, eine lokale Datei zu öffnen: Move tag earlier Tag früher verschieben Move tag later Tag später verschieben + Find untagged content Nicht markierten Inhalt suchen + No untagged content was found. Es wurde kein unmarkierter Inhalt gefunden. + Found {n} untagged content problems. {n} Probleme mit unmarkiertem Inhalt gefunden. Tag form fields Formularfelder taggen Mark as artifact Als Artefakt markieren Remove this leaf tag from reading order and mark its direct content as an artifact Dieses Blatt-Tag aus der Lesereihenfolge entfernen und seinen direkten Inhalt als Artefakt markieren diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index 88db08b5f..ff654f311 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -2383,6 +2383,9 @@ animation effects Off Ανενεργά This document is trying to open a local file: Αυτό το έγγραφο προσπαθεί να ανοίξει ένα τοπικό αρχείο: Move tag earlier Μετακίνηση ετικέτας νωρίτερα Move tag later Μετακίνηση ετικέτας αργότερα + Find untagged content Εύρεση μη επισημασμένου περιεχομένου + No untagged content was found. Δεν βρέθηκε μη επισημασμένο περιεχόμενο. + Found {n} untagged content problems. Βρέθηκαν {n} προβλήματα μη επισημασμένου περιεχομένου. Tag form fields Επισήμανση πεδίων φόρμας Mark as artifact Σήμανση ως τεχνούργημα Remove this leaf tag from reading order and mark its direct content as an artifact Αφαιρέστε αυτήν την ετικέτα φύλλου από τη σειρά ανάγνωσης και σημειώστε το άμεσο περιεχόμενό της ως τεχνούργημα diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index 393d48252..602dd2316 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -2513,6 +2513,9 @@ animation effects Off Desactivados This document is trying to open a local file: Este documento intenta abrir un archivo local: Move tag earlier Mover etiqueta antes Move tag later Mover etiqueta después + Find untagged content Buscar contenido sin etiquetar + No untagged content was found. No se encontró contenido sin etiquetar. + Found {n} untagged content problems. Se encontraron {n} problemas de contenido sin etiquetar. Tag form fields Etiquetar campos de formulario Mark as artifact Marcar como artefacto Remove this leaf tag from reading order and mark its direct content as an artifact Quite esta etiqueta hoja del orden de lectura y marque su contenido directo como artefacto diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index 627af91c6..bbead473b 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -2373,6 +2373,9 @@ animation effects Off Désactivés This document is trying to open a local file: Ce document tente d’ouvrir un fichier local : Move tag earlier Déplacer la balise plus tôt Move tag later Déplacer la balise plus tard + Find untagged content Rechercher le contenu non balisé + No untagged content was found. Aucun contenu non balisé n’a été trouvé. + Found {n} untagged content problems. {n} problèmes de contenu non balisé trouvés. Tag form fields Baliser les champs de formulaire Mark as artifact Marquer comme artefact Remove this leaf tag from reading order and mark its direct content as an artifact Retirez cette balise feuille de l’ordre de lecture et marquez son contenu direct comme artefact diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index 0bb1af4fc..5ac50c8e7 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -2372,6 +2372,9 @@ animation effects Off Ki This document is trying to open a local file: Ez a dokumentum egy helyi fájlt próbál megnyitni: Move tag earlier Címke korábbra helyezése Move tag later Címke későbbre helyezése + Find untagged content Címkézetlen tartalom keresése + No untagged content was found. Nem található címkézetlen tartalom. + Found {n} untagged content problems. {n} címkézetlen tartalmi probléma található. Tag form fields Űrlapmezők címkézése Mark as artifact Megjelölés műtárgyként Remove this leaf tag from reading order and mark its direct content as an artifact Távolítsa el ezt a levélcímkét az olvasási sorrendből, és jelölje meg a közvetlen tartalmát műtárgyként diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index 244bec46f..513759743 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -2382,6 +2382,9 @@ animation effects Off Disattivati This document is trying to open a local file: Questo documento sta tentando di aprire un file locale: Move tag earlier Sposta tag prima Move tag later Sposta tag dopo + Find untagged content Trova contenuto senza tag + No untagged content was found. Non è stato trovato contenuto senza tag. + Found {n} untagged content problems. Trovati {n} problemi di contenuto senza tag. Tag form fields Assegna tag ai campi del modulo Mark as artifact Segna come artefatto Remove this leaf tag from reading order and mark its direct content as an artifact Rimuovi questo tag foglia dall'ordine di lettura e segna il suo contenuto diretto come artefatto diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index c86f3b779..2392d4b25 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -2373,6 +2373,9 @@ animation effects Off オフ This document is trying to open a local file: この文書はローカルファイルを開こうとしています: Move tag earlier タグを前へ移動 Move tag later タグを後へ移動 + Find untagged content タグなしのコンテンツを検索 + No untagged content was found. タグなしのコンテンツは見つかりませんでした。 + Found {n} untagged content problems. タグなしのコンテンツの問題が {n} 件見つかりました。 Tag form fields フォームフィールドにタグを付ける Mark as artifact アーティファクトとしてマーク Remove this leaf tag from reading order and mark its direct content as an artifact このリーフタグを読み上げ順序から削除し、その直接のコンテンツをアーティファクトとしてマークします diff --git a/crates/ui-egui/src/i18n/kk.tsv b/crates/ui-egui/src/i18n/kk.tsv index 7dc74422c..2a0fc7461 100644 --- a/crates/ui-egui/src/i18n/kk.tsv +++ b/crates/ui-egui/src/i18n/kk.tsv @@ -2371,6 +2371,9 @@ animation effects Off Өшірулі This document is trying to open a local file: Бұл құжат жергілікті файлды ашуға әрекеттеніп жатыр: Move tag earlier Тегті ертерек жылжыту Move tag later Тегті кейінірек жылжыту + Find untagged content Тегтелмеген мазмұнды табу + No untagged content was found. Тегтелмеген мазмұн табылмады. + Found {n} untagged content problems. Тегтелмеген мазмұнға қатысты {n} мәселе табылды. Tag form fields Пішін өрістерін тегтеу Mark as artifact Артефакт ретінде белгілеу Remove this leaf tag from reading order and mark its direct content as an artifact Осы жапырақ тегін оқу ретінен алып тастап, оның тікелей мазмұнын артефакт ретінде белгілеңіз diff --git a/crates/ui-egui/src/i18n/lt.tsv b/crates/ui-egui/src/i18n/lt.tsv index 4ff1061b1..29d6b9ed5 100644 --- a/crates/ui-egui/src/i18n/lt.tsv +++ b/crates/ui-egui/src/i18n/lt.tsv @@ -2617,6 +2617,9 @@ key Space Tarpas This document is trying to open a local file: Šis dokumentas bando atverti vietinį failą: Move tag earlier Perkelti žymą anksčiau Move tag later Perkelti žymą vėliau + Find untagged content Rasti nepažymėtą turinį + No untagged content was found. Nepažymėto turinio nerasta. + Found {n} untagged content problems. Rasta nepažymėto turinio problemų: {n}. Tag form fields Žymėti formos laukus Mark as artifact Pažymėti kaip artefaktą Remove this leaf tag from reading order and mark its direct content as an artifact Pašalinkite šią lapo žymą iš skaitymo tvarkos ir pažymėkite jos tiesioginį turinį kaip artefaktą diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index 92a7a6d77..0010dffa2 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -2353,6 +2353,9 @@ animation effects Off Wyłączone This document is trying to open a local file: Ten dokument próbuje otworzyć plik lokalny: Move tag earlier Przenieś znacznik wcześniej Move tag later Przenieś znacznik później + Find untagged content Znajdź nieoznaczoną zawartość + No untagged content was found. Nie znaleziono nieoznaczonej zawartości. + Found {n} untagged content problems. Znaleziono problemów z nieoznaczoną zawartością: {n}. Tag form fields Oznacz pola formularza Mark as artifact Oznacz jako artefakt Remove this leaf tag from reading order and mark its direct content as an artifact Usuń ten znacznik liścia z kolejności odczytu i oznacz jego bezpośrednią zawartość jako artefakt diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 60d2a8ef4..8f7695a04 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -2387,6 +2387,9 @@ animation effects Off Desativados This document is trying to open a local file: Este documento está tentando abrir um arquivo local: Move tag earlier Mover tag para antes Move tag later Mover tag para depois + Find untagged content Encontrar conteúdo sem marcação + No untagged content was found. Nenhum conteúdo sem marcação foi encontrado. + Found {n} untagged content problems. Foram encontrados {n} problemas de conteúdo sem marcação. Tag form fields Marcar campos de formulário Mark as artifact Marcar como artefato Remove this leaf tag from reading order and mark its direct content as an artifact Remova esta tag folha da ordem de leitura e marque seu conteúdo direto como artefato diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 16486a256..8d14595be 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -2286,6 +2286,9 @@ animation effects Off Выкл This document is trying to open a local file: Этот документ пытается открыть локальный файл: Move tag earlier Переместить тег раньше Move tag later Переместить тег позже + Find untagged content Найти нетегированный контент + No untagged content was found. Нетегированный контент не найден. + Found {n} untagged content problems. Найдено проблем с нетегированным контентом: {n}. Tag form fields Пометить поля формы Mark as artifact Пометить как артефакт Remove this leaf tag from reading order and mark its direct content as an artifact Удалите этот конечный тег из порядка чтения и пометьте его непосредственное содержимое как артефакт diff --git a/crates/ui-egui/src/i18n/sl.tsv b/crates/ui-egui/src/i18n/sl.tsv index cb4bda4e2..6c33abc66 100644 --- a/crates/ui-egui/src/i18n/sl.tsv +++ b/crates/ui-egui/src/i18n/sl.tsv @@ -2378,6 +2378,9 @@ animation effects Off Izklopljeni This document is trying to open a local file: Ta dokument poskuša odpreti lokalno datoteko: Move tag earlier Premakni oznako prej Move tag later Premakni oznako pozneje + Find untagged content Poišči neoznačeno vsebino + No untagged content was found. Neoznačene vsebine ni bilo mogoče najti. + Found {n} untagged content problems. Najdenih je {n} težav z neoznačeno vsebino. Tag form fields Označi polja obrazca Mark as artifact Označi kot artefakt Remove this leaf tag from reading order and mark its direct content as an artifact Odstranite to listno oznako iz vrstnega reda branja in označite njeno neposredno vsebino kot artefakt diff --git a/crates/ui-egui/src/i18n/te.tsv b/crates/ui-egui/src/i18n/te.tsv index bf4b5c26c..9431eb122 100644 --- a/crates/ui-egui/src/i18n/te.tsv +++ b/crates/ui-egui/src/i18n/te.tsv @@ -2286,6 +2286,9 @@ animation effects Off ఆఫ్ This document is trying to open a local file: ఈ పత్రం ఒక స్థానిక ఫైల్‌ను తెరవడానికి ప్రయత్నిస్తోంది: Move tag earlier ట్యాగ్‌ను ముందుకు తరలించు Move tag later ట్యాగ్‌ను వెనుకకు తరలించు + Find untagged content ట్యాగ్ చేయని కంటెంట్‌ను కనుగొను + No untagged content was found. ట్యాగ్ చేయని కంటెంట్ కనుగొనబడలేదు. + Found {n} untagged content problems. ట్యాగ్ చేయని కంటెంట్‌లో {n} సమస్యలు కనుగొనబడ్డాయి. Tag form fields ఫారమ్ ఫీల్డ్‌లకు ట్యాగ్‌లు జోడించు Mark as artifact ఆర్టిఫాక్ట్‌గా గుర్తించు Remove this leaf tag from reading order and mark its direct content as an artifact ఈ లీఫ్ ట్యాగ్‌ను పఠన క్రమం నుంచి తీసివేసి, దాని ప్రత్యక్ష కంటెంట్‌ను ఆర్టిఫాక్ట్‌గా గుర్తించండి diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index 3a54aa0c9..863bf28e3 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -2369,6 +2369,9 @@ animation effects Off Kapalı This document is trying to open a local file: Bu belge yerel bir dosya açmaya çalışıyor: Move tag earlier Etiketi daha erken taşı Move tag later Etiketi daha geç taşı + Find untagged content Etiketlenmemiş içeriği bul + No untagged content was found. Etiketlenmemiş içerik bulunamadı. + Found {n} untagged content problems. {n} etiketlenmemiş içerik sorunu bulundu. Tag form fields Form alanlarını etiketle Mark as artifact Yapıt olarak işaretle Remove this leaf tag from reading order and mark its direct content as an artifact Bu yaprak etiketini okuma sırasından kaldırın ve doğrudan içeriğini yapıt olarak işaretleyin diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index bbf142029..9b893f0bf 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -2395,6 +2395,9 @@ animation effects Off Вимкнено This document is trying to open a local file: Цей документ намагається відкрити локальний файл: Move tag earlier Перемістити тег раніше Move tag later Перемістити тег пізніше + Find untagged content Знайти нетегований вміст + No untagged content was found. Нетегованого вмісту не знайдено. + Found {n} untagged content problems. Знайдено проблем із нетегованим вмістом: {n}. Tag form fields Позначити поля форми Mark as artifact Позначити як артефакт Remove this leaf tag from reading order and mark its direct content as an artifact Вилучіть цей кінцевий тег із порядку читання та позначте його безпосередній вміст як артефакт diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index e3778fb43..ded03716c 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -2602,3 +2602,6 @@ key Space Space Restore Khôi phục Use system title bar Dùng thanh tiêu đề hệ thống Show a basic title bar for the window buttons instead of the tab strip. GNOME doesn't draw title bars for apps, so this one doesn't follow its theme. Hiện thanh tiêu đề đơn giản cho các nút cửa sổ thay vì dải tab. GNOME không vẽ thanh tiêu đề cho ứng dụng, nên thanh này không theo chủ đề của nó. + Find untagged content Tìm nội dung chưa được gắn thẻ + No untagged content was found. Không tìm thấy nội dung nào chưa được gắn thẻ. + Found {n} untagged content problems. Đã tìm thấy {n} vấn đề về nội dung chưa được gắn thẻ. diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index 978c319ea..65c78c4a2 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -2337,6 +2337,9 @@ animation effects Off 关 This document is trying to open a local file: 此文档正尝试打开本地文件: Move tag earlier 将标签前移 Move tag later 将标签后移 + Find untagged content 查找未标记的内容 + No untagged content was found. 未找到未标记的内容。 + Found {n} untagged content problems. 发现 {n} 个未标记内容问题。 Tag form fields 标记表单字段 Mark as artifact 标记为工件 Remove this leaf tag from reading order and mark its direct content as an artifact 从阅读顺序中移除此叶标签,并将其直接内容标记为工件 diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 3620b394e..38e65dcc4 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -2249,6 +2249,9 @@ animation effects Off 關 This document is trying to open a local file: 此文件正嘗試開啟本機檔案: Move tag earlier 將標記前移 Move tag later 將標記後移 + Find untagged content 尋找未標記的內容 + No untagged content was found. 找不到未標記的內容。 + Found {n} untagged content problems. 發現 {n} 個未標記內容問題。 Tag form fields 標記表單欄位 Mark as artifact 標記為成品 Remove this leaf tag from reading order and mark its direct content as an artifact 從閱讀順序中移除此葉標記,並將其直接內容標記為成品 diff --git a/crates/ui-egui/tests/accessibility.rs b/crates/ui-egui/tests/accessibility.rs index 484bc52c6..a37098be8 100644 --- a/crates/ui-egui/tests/accessibility.rs +++ b/crates/ui-egui/tests/accessibility.rs @@ -416,3 +416,20 @@ fn checker_finding_opens_its_structure_tag() { h.run_steps(2); assert_eq!(h.state().right, Some(RightPanel::Accessibility), "an unfinished tag edit is preserved"); } + +#[test] +fn finding_untagged_content_shows_the_focused_accessibility_results() { + let mut h = Harness::builder().with_size(egui::vec2(1400.0, 900.0)).build_eframe(move |_cc| { + let mut app = PdfCraftApp::new(); + app.set_option("language", "en").unwrap(); + app.open_bytes("notes.pdf", None, FIXTURE.to_vec()).unwrap(); + app + }); + h.run_steps(3); + assert!(h.state_mut().execute("a11y.find_untagged")); + h.run_steps(2); + assert_eq!(h.state().right, Some(RightPanel::Accessibility)); + let report = &h.state().a11y.report.as_ref().unwrap().1; + let active: Vec = report.results.iter().filter(|result| result.status != Status::Skipped).map(|result| result.rule).collect(); + assert_eq!(active, [Rule::TaggedContent, Rule::TaggedAnnotations, Rule::TaggedFormFields]); +} diff --git a/parity/acrobat-features.toml b/parity/acrobat-features.toml index e98ab7db1..779c81f87 100644 --- a/parity/acrobat-features.toml +++ b/parity/acrobat-features.toml @@ -8996,11 +8996,11 @@ title = "Find unmarked content, comments and links" area = "M" tier = "P2" milestone = "M12" -status = "planned" -commands = [] -tools = [] -evidence = [] -notes = "" +status = "partial" +commands = ["a11y.find_untagged"] +tools = ["accessibility_find_untagged"] +evidence = ["crates/automation/tests/automation.rs::finding_untagged_content_limits_results_to_content_annotations_and_widgets", "crates/ui-egui/tests/accessibility.rs::finding_untagged_content_shows_the_focused_accessibility_results"] +notes = "Lists findings for untagged painted page content, non-widget annotations and form widgets, optionally on selected pages. It reuses the checker and does not identify untagged table structure, links already represented by an annotation, or structure-tree elements that lack content." [[feature]] id = "a11y.table-editor"