M12: find untagged accessibility content (#1463)

* M12: find untagged accessibility content

* i18n: translate untagged content checker (rebased)

* fix(i18n): refresh untagged content translation hashes

* fix(tests): restore full test modules for find-untagged content

* fix(i18n): preserve existing translations after rebase

* ci: rerun shared timeout test

* chore(deps): refresh rust for the advisory gate

Use the current lockfile, including the rustls security update, so the dependency check can run on this branch.

* Refresh catalog hashes after merging main

---------

Co-authored-by: Brandon Thomas <echelon@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Earl Co
2026-10-15 03:33:19 -04:00
committed by GitHub
co-authored by Brandon Thomas Claude Opus 5.5
parent afa50999ef
commit a6124bcdfe
33 changed files with 167 additions and 27 deletions
+22 -22
View File
@@ -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"
+8
View File
@@ -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<Value> {
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<Value> {
let o = self.a11y_options(a)?;
let doc = self.doc(a)?;
+1
View File
@@ -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)?,
+4
View File
@@ -944,6 +944,10 @@ pub fn tools() -> Vec<ToolDef> {
}),
&["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")
+20
View File
@@ -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
+1
View File
@@ -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),
+1
View File
@@ -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"),
+21
View File
@@ -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 {
+1
View File
@@ -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" => {
+3
View File
@@ -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 أزل هذه العلامة من ترتيب القراءة وضع علامة على محتواها المباشر كعنصر زخرفي
Can't render this file because it contains an unexpected character in line 6 and column 47.
+3
View File
@@ -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 Премахнете този листов етикет от реда на четене и маркирайте прякото му съдържание като артефакт
Can't render this file because it contains an unexpected character in line 8 and column 16.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 6 and column 47.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 6 and column 51.
+3
View File
@@ -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 Αφαιρέστε αυτήν την ετικέτα φύλλου από τη σειρά ανάγνωσης και σημειώστε το άμεσο περιεχόμενό της ως τεχνούργημα
Can't render this file because it contains an unexpected character in line 475 and column 9.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 6 and column 60.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 6 and column 39.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 7 and column 44.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 6 and column 47.
+3
View File
@@ -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 このリーフタグを読み上げ順序から削除し、その直接のコンテンツをアーティファクトとしてマークします
Can't render this file because it contains an unexpected character in line 6 and column 47.
+3
View File
@@ -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 Осы жапырақ тегін оқу ретінен алып тастап, оның тікелей мазмұнын артефакт ретінде белгілеңіз
Can't render this file because it contains an unexpected character in line 824 and column 9.
+3
View File
@@ -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ą
Can't render this file because it contains an unexpected character in line 401 and column 9.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 6 and column 47.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 9 and column 16.
+3
View File
@@ -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 Удалите этот конечный тег из порядка чтения и пометьте его непосредственное содержимое как артефакт
Can't render this file because it contains an unexpected character in line 9 and column 16.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 9 and column 16.
+3
View File
@@ -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 ఈ లీఫ్ ట్యాగ్‌ను పఠన క్రమం నుంచి తీసివేసి, దాని ప్రత్యక్ష కంటెంట్‌ను ఆర్టిఫాక్ట్‌గా గుర్తించండి
Can't render this file because it contains an unexpected character in line 13 and column 16.
+3
View File
@@ -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
Can't render this file because it contains an unexpected character in line 823 and column 9.
+3
View File
@@ -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 Вилучіть цей кінцевий тег із порядку читання та позначте його безпосередній вміст як артефакт
Can't render this file because it contains an unexpected character in line 6 and column 47.
+3
View File
@@ -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ẻ.
Can't render this file because it contains an unexpected character in line 487 and column 12.
+3
View File
@@ -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 从阅读顺序中移除此叶标签,并将其直接内容标记为工件
Can't render this file because it contains an unexpected character in line 9 and column 16.
+3
View File
@@ -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 從閱讀順序中移除此葉標記,並將其直接內容標記為成品
Can't render this file because it contains an unexpected character in line 9 and column 16.
+17
View File
@@ -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<Rule> = report.results.iter().filter(|result| result.status != Status::Skipped).map(|result| result.rule).collect();
assert_eq!(active, [Rule::TaggedContent, Rule::TaggedAnnotations, Rule::TaggedFormFields]);
}
+5 -5
View File
@@ -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"