From 89f0fa2bd5783a8395db45bbff483fb72cccdd6c Mon Sep 17 00:00:00 2001 From: kcobelli-pixel Date: Thu, 15 Oct 2026 08:54:32 +0200 Subject: [PATCH] M14: Italian catalog: complete the missing entries (#2320) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * M14: Italian catalog: complete the missing entries it.tsv lacked 265 keys that the other catalogs carry. The 201 the code looks up are added in one dated section at the end of the catalog: the sentences the accessibility checker, preflight, signature validation and page-range parser word (their WORDINGS), the certificate rows and calendar weekday and month labels (their tl_ctx contexts), digital-ID, docking and print messages, and five plurals (one|other). Italian now has 2,528 entries. The new rows follow the wording the catalog already uses: history labels say "Modifica ..." like "Change {key}", and the Creator and Producer keys that label fills in say "Applicazione" and "Produttore PDF", as the Document Properties dialog names those fields. The Optimize PDF summary says "eliminato" like its Discard options, the checker and preflight sentences say "ha rilevato" and "Viene usato", the trust messages say "nel tuo elenco di certificati attendibili", the password and certificate rows say "non corrispondono" and "rilasciato" like the existing "The passwords don't match." and "Issued by" rows, and the print hint quotes the "Disattivato" option as the dialog shows it. The other 64 are left out because no non-test code looks them up: - 10 tooltip texts with a fixed macOS shortcut ("Zoom in (⌘+)"); the code fills the shortcut in through "{key}" rows Italian already has; - 9 older wordings the code no longer uses: the five Combine folder messages, "Save (M4)", " on page {label}", the owner-only security message and the old "Text recognition isn't installed" message (the code now says "its model files are missing"); - 45 generic labels and plurals only the Lithuanian catalog has. The code says "{n} file|{n} files" as two plain strings, "1 file" and "{n} files", which Italian has; "{n} comment|..." and "{n} result|..." are used nowhere. The entries are AI-assisted translations written from the meaning of the English (clean-room; no proprietary localisation consulted), and keep their placeholders and trailing ellipsis. The catalog's SHA-256 in ATTRIBUTION.toml is updated by hand, as the other catalog changes do. localization-parity.md, the ROADMAP progress log, the M14 rows of docs/roadmap.md and docs/localization.md record the new count, and parity/acrobat-features.toml now says Italian translates the engine's sentences too. Co-Authored-By: Claude Opus 5.5 * Refresh catalog hashes after merging main --------- Co-authored-by: kcobelli-pixel <257471167+kcobelli-pixel@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 Co-authored-by: Brandon Thomas --- ATTRIBUTION.toml | 2 +- ROADMAP.md | 2 + crates/ui-egui/src/i18n/it.tsv | 203 +++++++++++++++++++++++++++++++++ docs/localization-parity.md | 7 +- docs/localization.md | 2 + docs/roadmap.md | 6 +- parity/acrobat-features.toml | 2 + 7 files changed, 220 insertions(+), 4 deletions(-) diff --git a/ATTRIBUTION.toml b/ATTRIBUTION.toml index 22809761e4..153aba8917 100644 --- a/ATTRIBUTION.toml +++ b/ATTRIBUTION.toml @@ -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 = "8480ff4eb35c39d799036e7c4adfb3a8b3da71d8b9cf6540c22d0f62972149c2" +sha256 = "73244fda2e227dc1d0b2362d6e7de726a0aa07d93e6fb87bb18a69c7b7829fc4" [[asset]] path = "crates/ui-egui/src/i18n/pl.tsv" diff --git a/ROADMAP.md b/ROADMAP.md index d2ab2637b1..edc432304a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,6 +2,7 @@ **Stage: alpha** · next: beta, ~25% (ready for real work 50% → 75%) and ~400–700 h away +> **Last reviewed:** 2026-10-13 · **Last updated:** 2026-10-14 · **Change:** minor (M14: the Italian catalog has every entry the other catalogs had and the code looks up; estimates unchanged) · **Target:** Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) > **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (M3 #2080 candidate: explicit search jumps join per-tab history; rail and control-channel Back/Forward; estimates unchanged) > **Last reviewed:** 2026-10-13 · **Last updated:** 2026-10-13 · **Change:** minor (M4 #1910: Organize Pages opens on the current page; estimates unchanged) · **Target:** Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) > **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (M3 candidate: coordinate control clicks keep press/release together on slow frames and preserve text multi-click selection; estimates unchanged) · **Target:** Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) @@ -157,6 +158,7 @@ Ranked; detail and the full milestone table in [docs/roadmap.md](docs/roadmap.md ## Progress log - **2026-10-13 (G14, Vietnamese localization):** Added Vietnamese (`vi`, Tiếng Việt) as an interface and date language with a 2,591-entry catalog (`plural_none`) covering 100% of the current localizable key union (plus `theme`/`Appearance`). Locale tags `vi` / `vi-VN` / `vi_VN.UTF-8` resolve; calendar months use numeric `Tháng 1`…`12` / `tháng 1`…`12`. Native-speaker community review recorded. The twelve-language localization mean moves from ≈59% to ≈68%; weighted readiness ≈49% → ≈50%. Status stays `partial`: engine/OS details, document contents, filenames, CLI/MCP and external help stay outside the catalog by design. +- **2026-10-14 (M14, Italian catalog):** Italian gains the 201 entries the other catalogs had and the code looks up: the sentences the accessibility checker, preflight, signature validation and page-range parser word, certificate and calendar labels, digital-ID dialog messages and five plurals. It now has 2,528 entries. 64 keys other catalogs carry but no code looks up (tooltip texts with a fixed shortcut, older wordings, generic labels only Lithuanian has) were left out. AI-assisted, written from the meaning of the English; native review welcome. Estimates unchanged. - **2026-10-15 (M3, #2166 part 1):** Save asks before writing over a version of the file the document did not come from (something else wrote it since the open or the last save), with Save as… to keep it, and the changed-on-disk notice says what Reload and Save each do; a file that is open already comes to the front instead of opening twice; a running instance's autosaves are locked, so a second instance neither offers nor discards them. Part 2 (every writer checked and atomic) is #2182. - **2026-10-14 (M1, #2166):** No PDF leaves the engine unchecked and no writer truncates: new files from Combine, Extract, Split and Create, signed, timestamped and LTV-embedded files and the OCR batch output reopen with their pages before anyone writes them, as saves already did; the desktop app, the automation tools (with or without `--root`) and the CLI's edit, combine, extract and split all write through the one staging-file writer in `pdfcraft-platform`, so a failed write or `--out` naming the input never leaves a half-written file. Special files such as `/dev/stdout` are still written as given. - **2026-10-14 (M3 #2080 candidate):** Existing per-tab page history gains explicit search jumps, rail buttons and control-channel commands. Continuous scrolling and automatic search refresh stay outside history; page-level restoration and estimates unchanged. diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index ff9da64464..748fd5a743 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -2420,3 +2420,206 @@ animation effects Off Disattivati Make properties default Imposta proprietà come predefinite Pages selected Pagine selezionate Page properties Proprietà pagina + +# Entries the other catalogs had and Italian lacked (2026-10-14) + Tools Strumenti + Inspector Ispettore +calendar date January gennaio +calendar date February febbraio +calendar date March marzo +calendar date April aprile +calendar date May maggio +calendar date June giugno +calendar date July luglio +calendar date August agosto +calendar date September settembre +calendar date October ottobre +calendar date November novembre +calendar date December dicembre + Creator Applicazione + Producer Produttore PDF + A font isn't embedded Un carattere non è incorporato + A {} action isn't allowed Un'azione {} non è consentita + A {} annotation has additional actions Un'annotazione {} ha azioni aggiuntive + A {} annotation has no appearance stream Un'annotazione {} non ha un flusso di aspetto + A {} annotation isn't set to print, or is hidden Un'annotazione {} non è impostata per la stampa oppure è nascosta + Accessibility Report Rapporto di accessibilità + CRL Signing Firma CRL + Certificate Signing Firma di certificati + Change Author Modifica autore + Change Keywords Modifica parole chiave + Change Subject Modifica oggetto + Change Title Modifica titolo + Choose a digital ID. Scegli un ID digitale. + Create links Crea collegamenti + Cut and stack needs Two-sided: Off. Print single-sided sheets. Taglia e impila richiede Fronte-retro: Disattivato. Stampa fogli solo fronte. + Data Encipherment Cifratura dei dati + Decipher Only Solo decifratura + Detailed Report Rapporto dettagliato + DeviceCMYK is used, but the PDF/A output intent isn't a CMYK profile Viene usato DeviceCMYK, ma l'output intent PDF/A non è un profilo CMYK + DeviceRGB is used, but the PDF/A output intent isn't an RGB profile Viene usato DeviceRGB, ma l'output intent PDF/A non è un profilo RGB + Digital Signature Firma digitale + Encipher Only Solo cifratura + English Inglese + Enter a URL Inserisci un URL + Enter a name. Inserisci un nome. + Enter a page number Inserisci un numero di pagina + Enter the field names Inserisci i nomi dei campi + Field "{}" on page {p} has no description (tooltip) Il campo "{}" a pagina {p} non ha una descrizione comando + Filename Nome file + Flatten Fill & Sign Appiattisci Compila e firma + Font (unnamed) on page {p} doesn't map its characters to Unicode Il carattere (senza nome) a pagina {p} non associa i propri glifi a Unicode + Font {} on page {p} doesn't map its characters to Unicode Il carattere {} a pagina {p} non associa i propri glifi a Unicode + Form field on page {p} isn't tagged Il campo modulo a pagina {p} non ha tag + H{n} follows an H{d}; headings should not skip levels H{n} segue un H{d}; i titoli non dovrebbero saltare livelli + Key Agreement Accordo di chiavi + Key Encipherment Cifratura delle chiavi + No document language is set Nessuna lingua impostata per il documento + No page has text: the document appears to be images of pages Nessuna pagina contiene testo: il documento sembra composto da immagini delle pagine + Non-Repudiation Non ripudio + Page {p} doesn't tab in structure order La pagina {p} non segue l'ordine della struttura con il tasto Tab + Page {p}: {n} untagged content item Pagina {p}: {n} elemento di contenuto senza tag + Page {p}: {n} untagged content items Pagina {p}: {n} elementi di contenuto senza tag + Page {} has additional actions La pagina {} ha azioni aggiuntive + Panel layout could not be restored: {error} Impossibile ripristinare la disposizione dei pannelli: {error} + Panel move was not applied: {error} Lo spostamento del pannello non è stato applicato: {error} + PdfCraft can't check this signature yet: {}. PdfCraft non può ancora verificare questa firma: {}. + Rendering… Rendering in corso… + Report created Rapporto creato + Rev. {rev}: Certified by an unknown signer Rev. {rev}: certificata da un firmatario sconosciuto + Rev. {rev}: Certified by {name} Rev. {rev}: certificata da {name} + Rev. {rev}: Signed by an unknown signer Rev. {rev}: firmata da un firmatario sconosciuto + Rev. {rev}: Signed by {name} Rev. {rev}: firmata da {name} + Rule Name Nome regola + Save as {level} Salva come {level} + Signature is invalid La firma non è valida + Signature is valid La firma è valida + Signature validity is unknown La validità della firma è sconosciuta + Signing time is from the clock on the signer's computer. L'ora della firma proviene dall'orologio del computer del firmatario. + Still rendering — this page is unusually complex… Rendering ancora in corso: questa pagina è insolitamente complessa… + The ECDSA signature is not in canonical DER (trailing bytes, padding or a missing sign byte); it was read anyway. La firma ECDSA non è in DER canonico (byte in coda, riempimento o byte di segno mancante); è stata letta comunque. + The ECDSA signature is the raw r and s values instead of a DER sequence; it was read anyway. La firma ECDSA contiene i valori r e s grezzi invece di una sequenza DER; è stata letta comunque. + The RSA signature value does not have the length of the key's modulus (leading zero bytes dropped or added); it was read anyway. Il valore della firma RSA non ha la lunghezza del modulo della chiave (byte zero iniziali rimossi o aggiunti); è stato letto comunque. + The RSA signature's DigestInfo has no NULL parameter (older signers write it so); it was read anyway. Il DigestInfo della firma RSA non ha il parametro NULL (alcuni firmatari meno recenti lo scrivono così); è stato letto comunque. + The certificate of {} does not allow this many CA certificates below it (path length), so it is not used to vouch for {}. Il certificato di {} non consente così tanti certificati CA sotto di sé (lunghezza del percorso), quindi non viene usato per garantire {}. + The certificate of {} is not a CA certificate that may issue certificates, so it is not used to vouch for {}. Il certificato di {} non è un certificato CA autorizzato a emettere certificati, quindi non viene usato per garantire {}. + The certificate of {} was not valid at the time of signing, so it is not used to vouch for {}. Il certificato di {} non era valido al momento della firma, quindi non viene usato per garantire {}. + The checker found problems which may prevent the document from being fully accessible. Il controllo ha rilevato problemi che potrebbero impedire al documento di essere pienamente accessibile. + The document has been altered or corrupted since the signature was applied. Il documento è stato alterato o danneggiato dopo l'applicazione della firma. + The document has been altered or corrupted since the timestamp was applied. Il documento è stato alterato o danneggiato dopo l'applicazione della marca temporale. + The document has been altered since this signature was applied in ways it does not permit ({}). Dopo l'applicazione di questa firma il documento è stato alterato in modi che essa non consente ({}). + The document has been altered since this timestamp was applied in ways it does not permit ({}). Dopo l'applicazione di questa marca temporale il documento è stato alterato in modi che essa non consente ({}). + The document has been modified since this signature was applied, but the changes are permitted ({}). Il documento è stato modificato dopo l'applicazione di questa firma, ma le modifiche sono consentite ({}). + The document has been modified since this timestamp was applied, but the changes are permitted ({}). Il documento è stato modificato dopo l'applicazione di questa marca temporale, ma le modifiche sono consentite ({}). + The document has no tags (structure tree) Il documento non ha tag (albero della struttura) + The document has no title Il documento non ha un titolo + The document isn't marked as tagged (MarkInfo Marked) Il documento non è contrassegnato come dotato di tag (MarkInfo Marked) + The document isn't tagged, so none of its content is Il documento non ha tag, quindi nessuno dei suoi contenuti ne ha + The document's embedded revocation information shows that the signer's certificate has not been revoked. Le informazioni di revoca incorporate nel documento indicano che il certificato del firmatario non è stato revocato. + The embedded timestamp token is valid and its authority is trusted; trusted time is {}. Il token della marca temporale incorporata è valido e la sua autorità è attendibile; l'ora attendibile è {}. + The font {} isn't embedded Il carattere {} non è incorporato + The metadata doesn't identify the file as {} I metadati non identificano il file come {} + The password is incorrect. La password non è corretta. + The password must have at least 6 characters. La password deve contenere almeno 6 caratteri. + The passwords do not match. Le password non corrispondono. + The security settings don't allow screen readers to read the text Le impostazioni di sicurezza non consentono ai lettori di schermo di leggere il testo + The signature algorithm and the SignerInfo's digest algorithm name different hashes; the signature was made with the SignerInfo's. L'algoritmo di firma e l'algoritmo di digest del SignerInfo indicano hash diversi; la firma è stata creata con quello del SignerInfo. + The signature carries an unverified timestamp ({}): the timestamp authority is not in your list of trusted certificates, so the signing time claimed by the signer is used instead. La firma contiene una marca temporale non verificata ({}): l'autorità di marcatura temporale non è nel tuo elenco di certificati attendibili, quindi viene usata l'ora di firma dichiarata dal firmatario. + The signature contents are not hexadecimal. Il contenuto della firma non è esadecimale. + The signature could not be checked ({}). Impossibile controllare la firma ({}). + The signature could not be read ({}). Impossibile leggere la firma ({}). + The signature could not be verified ({}). Impossibile verificare la firma ({}). + The signature has no valid byte range. La firma non ha un intervallo di byte valido. + The signature includes an embedded timestamp. La firma include una marca temporale incorporata. + The signature is BER-encoded (indefinite lengths) rather than DER; it was read leniently. La firma è codificata in BER (lunghezze indefinite) anziché in DER; è stata letta in modo tollerante. + The signature uses the legacy adbe.x509.rsa_sha1 format. La firma usa il formato obsoleto adbe.x509.rsa_sha1. + The signature value does not match the signer's certificate: the signature is corrupt. Il valore della firma non corrisponde al certificato del firmatario: la firma è danneggiata. + The signature's byte range does not exclude exactly its contents. L'intervallo di byte della firma non esclude esattamente il suo contenuto. + The signature's byte range does not match the file. L'intervallo di byte della firma non corrisponde al file. + The signature's timestamp token could not be verified ({}). Impossibile verificare il token della marca temporale della firma ({}). + The signature's timestamp token does not cover the signature value. Il token della marca temporale della firma non copre il valore della firma. + The signed content is a constructed (segmented) OCTET STRING, as BER allows; it was read anyway. Il contenuto firmato è una OCTET STRING costruita (segmentata), come consentito da BER; è stato letto comunque. + The signer's certificate does not allow digital signatures (its key usage has neither digital signature nor non-repudiation). Il certificato del firmatario non consente firme digitali (il suo utilizzo chiave non include né firma digitale né non ripudio). + The signer's certificate has been revoked ({}). Il certificato del firmatario è stato revocato ({}). + The signer's certificate has critical extensions PdfCraft does not recognize ({}). Il certificato del firmatario ha estensioni critiche che PdfCraft non riconosce ({}). + The signer's certificate is not in the signature. Il certificato del firmatario non è presente nella firma. + The signer's certificate is not issued for signing documents (its extended key usage has no document-signing purpose). Il certificato del firmatario non è emesso per firmare documenti (il suo utilizzo chiave esteso non prevede la firma di documenti). + The signer's certificate was not valid at the time of signing. Il certificato del firmatario non era valido al momento della firma. + The signer's identity is unknown because it has not been included in your list of trusted certificates and none of its parent certificates are trusted certificates. L'identità del firmatario è sconosciuta perché non è stata inclusa nel tuo elenco di certificati attendibili e nessuno dei suoi certificati padre è attendibile. + The signer's identity is valid. L'identità del firmatario è valida. + The timestamp authority's certificate was not valid at the time of timestamping. Il certificato dell'autorità di marcatura temporale non era valido al momento della marcatura. + The timestamp contents are not hexadecimal. Il contenuto della marca temporale non è esadecimale. + The timestamp has no valid byte range. La marca temporale non ha un intervallo di byte valido. + The timestamp token could not be read ({}). Impossibile leggere il token della marca temporale ({}). + The timestamp token is valid and its authority is trusted. Il token della marca temporale è valido e la sua autorità è attendibile. + The timestamp token is valid, but the timestamp authority is not in your list of trusted certificates. Il token della marca temporale è valido, ma l'autorità di marcatura temporale non è nel tuo elenco di certificati attendibili. + The timestamp's byte range does not exclude exactly its contents. L'intervallo di byte della marca temporale non esclude esattamente il suo contenuto. + The timestamp's byte range does not match the file. L'intervallo di byte della marca temporale non corrisponde al file. + The window shows the file name, not the title (Initial View > Show) La finestra mostra il nome del file, non il titolo (Vista iniziale > Mostra) + There is no folder to save the digital ID in. Non c'è una cartella in cui salvare l'ID digitale. + This document has not been modified since this signature was applied. Il documento non è stato modificato dopo l'applicazione di questa firma. + This document has not been modified since this timestamp was applied. Il documento non è stato modificato dopo l'applicazione di questa marca temporale. + This signature uses RIPEMD-160, a legacy 160-bit hash algorithm that is no longer recommended for signatures. It still validates, but it should not be relied on. Questa firma usa RIPEMD-160, un algoritmo di hash a 160 bit obsoleto e non più consigliato per le firme. Risulta ancora valida, ma non andrebbe considerata affidabile. + This signature uses SHA-1, a weak hash algorithm: collisions in it have been demonstrated. It still validates because many documents signed years ago use it, but it should not be relied on. Questa firma usa SHA-1, un algoritmo di hash debole per cui sono state dimostrate collisioni. Risulta ancora valida perché molti documenti firmati anni fa lo usano, ma non andrebbe considerata affidabile. + Unsigned signature field Campo firma non firmato + Unsigned signature field: {name} Campo firma non firmato: {name} + alternate text hides an annotation inside it il testo alternativo nasconde un'annotazione al suo interno + alternate text on an element with no page content testo alternativo su un elemento senza contenuto di pagina + comments commenti + document security store archivio di sicurezza del documento + document structure struttura del documento + form fill compilazione moduli + its alternate text is inside another element's and will never be read il suo testo alternativo si trova dentro quello di un altro elemento e non verrà mai letto + links collegamenti + metadata metadati + no alternate text nessun testo alternativo + no header cells (TH) nessuna cella di intestazione (TH) + no summary nessun riepilogo + not in a TR non in un TR + not in a Table, THead, TBody or TFoot non in un Table, THead, TBody o TFoot + not in an L (list) non in un L (elenco) + not in an LI (list item) non in un LI (voce di elenco) + other changes altre modifiche + page content contenuto della pagina + page {n} is out of range (1–{count}) la pagina {n} è fuori intervallo (1–{count}) + pages added or removed pagine aggiunte o rimosse + rows have between {min} and {max} columns le righe hanno da {min} a {max} colonne + the first heading is an H{n}; headings should not skip levels il primo titolo è un H{n}; i titoli non dovrebbero saltare livelli + the signed version could not be read impossibile leggere la versione firmata + {n} pages and no bookmarks {n} pagine e nessun segnalibro + {page} is not a page number or label {page} non è un numero o un'etichetta di pagina + {ty} element on page {p}: {what} Elemento {ty} a pagina {p}: {what} + {ty} element: {what} Elemento {ty}: {what} + {who}, certificate issued by an unknown issuer. {who}, certificato rilasciato da un'autorità sconosciuta. + {who}, certificate issued by {issuer}. {who}, certificato rilasciato da {issuer}. + {} annotation on page {p} isn't tagged L'annotazione {} a pagina {p} non ha tag + {} annotations aren't allowed Le annotazioni {} non sono consentite + … and {n} more … e altri {n} +@plural Delete {n} field|Delete {n} fields Elimina {n} campo|Elimina {n} campi +@plural {n} byte|{n} bytes {n} byte|{n} byte +@plural {n} image optimized|{n} images optimized {n} immagine ottimizzata|{n} immagini ottimizzate +@plural {n} item discarded|{n} items discarded {n} elemento eliminato|{n} elementi eliminati +@plural {n} pixel|{n} pixels {n} pixel|{n} pixel +calendar weekday Su Do +calendar weekday Mo Lu +calendar weekday Tu Ma +calendar weekday We Me +calendar weekday Th Gi +calendar weekday Fr Ve +calendar weekday Sa Sa +certificate Issued to Rilasciato a +certificate Issued by Rilasciato da +certificate Valid from Valido dal +certificate Valid to Valido fino al +certificate Intended usage Uso previsto +certificate Version Versione +certificate Serial number Numero di serie +certificate Issuer Autorità emittente +certificate Validity starts Inizio validità +certificate Validity ends Fine validità +certificate Public key Chiave pubblica +certificate Basic constraints Vincoli di base +certificate Key usage Utilizzo chiave +certificate Self-signed Autofirmato +certificate SHA-1 digest Impronta SHA-1 +certificate SHA-256 digest Impronta SHA-256 diff --git a/docs/localization-parity.md b/docs/localization-parity.md index d4a9a166c4..995293af3d 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,6 +1,7 @@ # Localization parity > **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (Vietnamese 100% of current key union; native-speaker community review; twelve-language mean ≈68%) · **Target:** Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) +> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-14 · **Change:** minor (Italian count after completing its catalog) · **Target:** Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) Per-language status of PdfCraft's interface against Acrobat Pro's. How translations work and how to add a language: [localization.md](localization.md). Summary in [ROADMAP.md](../ROADMAP.md). @@ -62,7 +63,7 @@ none has translated help. Vietnamese's **To `full`** hours are therefore residua | Telugu | `te` | 2,058 (96.0%) | partial (the release-pinned craft-fonts has no Telugu face yet) | no | | Hungarian | `hu` | 2,126 (99.2%) | partial | yes | | Ukrainian | `uk` | 2,142 (100%) | partial | yes | -| Italian | `it` | 2,130 (99.4%) | partial | yes | +| Italian | `it` | 2,528 entries (every key of the other catalogs that the code looks up) | partial | yes | | Kazakh | `kk` | 2,327 entries | partial | no | | Polish | `pl` | 2,287 entries | partial | yes | | Slovenian | `sl` | 2,324 entries | partial | no | @@ -73,11 +74,15 @@ none has translated help. Vietnamese's **To `full`** hours are therefore residua **14 other languages** ship (22 catalogs plus English = **23** interface languages in Preferences). The entry counts without percentages were measured on 2026-10-12–13; they are not percentages of the older 2,143-key snapshot above. Their presence does not imply a detailed linguistic or runtime review. Acrobat languages PdfCraft lacks: Danish, Dutch, Finnish, Norwegian, Swedish, Hebrew. Vietnamese is shipped here but not by Acrobat. +**14 other languages** ship (21 catalogs plus English, 22 interface languages in Preferences). +The entry counts without percentages were measured on 2026-10-12 (Italian on 2026-10-14); they are not percentages of the older 2,143-key snapshot above. Their presence does not imply a detailed linguistic or runtime review. +Acrobat languages PdfCraft lacks: Danish, Dutch, Finnish, Norwegian, Swedish, Hebrew. ## Revision history | Date | Change | Summary | |---|---|---| | 2026-10-13 | minor | Vietnamese (`vi`) catalog: 2,591 entries (100% of current key union + `theme`/`Appearance`); twelve-language mean ≈ 68%; native-speaker community review; registered with `plural_none` | +| 2026-10-14 | minor | Italian: 2,528 entries after adding the 201 keys the other catalogs had and the code looks up | | 2026-10-12 | minor | Added current counts for Kazakh, Polish, Slovenian, Greek, Turkish and Lithuanian; retained existing language assessments and the original percentage snapshot | | 2026-10-10 | major | Created. Catalog counts measured from `crates/ui-egui/src/i18n/*.tsv` against the 2,143-key union; Acrobat's localizations from its bundle's `.lproj` and Sequences folder names | diff --git a/docs/localization.md b/docs/localization.md index ac0868f34e..657e2eb247 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -15,6 +15,8 @@ The control channel exposes the setting through `ui.set`: The value is `auto` or a language code (`en`, `ja`, `zh-hans`, `zh-hant`, `cs`, `pt-br`, `de`, `es`, `fr`, `ru`, `kk`, `bg`, `te`, `hu`, `uk`, `it`, `ar`, `pl`, `sl`, `el`, `tr`, `lt` or `vi`), in any case. `ui.state` reports `language` as written in the preferences (`auto`, `en`, `ja`, `zh-hans`, `zh-hant`, `cs`, `pt-br`, `de`, `es`, `fr`, `ru`, `kk`, `bg`, `te`, `hu`, `uk`, `it`, `ar`, `pl`, `sl`, `el`, `tr`, `lt` or `vi`). Unknown values return an error without changing the current setting. Preferences saved before this setting existed follow the system language. Dialogs, panels, menus, notices and history labels go through the catalog (`tl!`). Most shipped catalogs (Japanese, Chinese, Russian, Bulgarian, German, Spanish, French, Telugu, Hungarian, Ukrainian, Italian, Brazilian Portuguese, Arabic, Slovenian, Kazakh, Polish, Greek, Turkish, Lithuanian, Vietnamese and others) cover the current localizable surface (about 2,000–2,600 entries each); Czech still covers mainly the menus. Untranslated labels use English. Error details that come from the engine or the operating system are shown as they are, inside a translated frame ("操作「…」に失敗しました: …"). The command palette matches the translated label, the English label and the command id. Vertical Japanese PDF rendering is an existing viewer feature; this change does not add vertical text editing. Document contents, filenames, CLI/MCP/control protocol strings and external help stay outside the catalog. Per-language coverage, script support and what each language still needs are in [localization-parity.md](localization-parity.md). +Dialogs, panels, menus, notices and history labels go through the catalog (`tl!`). Japanese, Traditional Chinese, Simplified Chinese, Russian, Bulgarian, German, Spanish, French, Telugu, Hungarian, Ukrainian, Brazilian Portuguese and Arabic translate them (about 2,000–2,140 entries each), and Italian has 2,528 entries; Czech and Turkish cover the menus so far. Untranslated labels use English. Error details that come from the engine or the operating system are shown as they are, inside a translated frame ("操作「…」に失敗しました: …"). The command palette matches the translated label, the English label and the command id. Vertical Japanese PDF rendering is an existing viewer feature; this change does not add vertical text editing. Per-language coverage, script support and what each language still needs are in [localization-parity.md](localization-parity.md). +Dialogs, panels, menus, notices and history labels go through the catalog (`tl!`). Japanese, Traditional Chinese, Simplified Chinese, Russian, Bulgarian, German, Spanish, French, Telugu, Hungarian, Ukrainian, Brazilian Portuguese, Arabic and Slovenian translate them (about 2,000–2,190 entries each), and Italian has 2,528 entries; Czech covers the menus so far. Untranslated labels use English. Error details that come from the engine or the operating system are shown as they are, inside a translated frame ("操作「…」に失敗しました: …"). The command palette matches the translated label, the English label and the command id. Vertical Japanese PDF rendering is an existing viewer feature; this change does not add vertical text editing. Per-language coverage, script support and what each language still needs are in [localization-parity.md](localization-parity.md). Whole sentences that the layers below word — what the accessibility checker found, what the PDF/A verifier reports, what a signature's details say, what is wrong with the pages to print, what an edit is called in the history — are translated too, because those layers hand the sentence over apart from the document's own words. See [Sentences the engine words](#sentences-the-engine-words). diff --git a/docs/roadmap.md b/docs/roadmap.md index 1ec9c10e12..bf9eab373b 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -1,5 +1,6 @@ # PdfCraft roadmap: milestones and what's next +> **Last reviewed:** 2026-10-13 · **Last updated:** 2026-10-14 · **Change:** minor (M14: the Italian catalog has every entry the other catalogs had and the code looks up, 2,528 entries; estimates unchanged) · **Target:** Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) > **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-13 · **Change:** minor (M2/M6: spot-colour images convert once per pixel value; widget placement and the Fields panel scale with the field count; estimates unchanged) · **Target:** Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) > **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (M3 candidate: coordinate control clicks on slow frames and coalesced text selection; estimates unchanged) · **Target:** Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) > **Last reviewed:** 2026-10-14 · **Last updated:** 2026-10-14 · **Change:** minor (M3 #2080 candidate: explicit search jumps join per-tab history; rail and control-channel Back/Forward; estimates unchanged) @@ -130,9 +131,9 @@ total matches the parity estimate. | M13 | Automation (MCP, Action Wizard, CLI) + AI providers | 60–120 | 45% | 25–45 | Done: MCP resources (document info, text, page images); headless tool table (123 tools incl. signing, optimizing, initial view, links, stamps, data exchange, comment review, forms authoring and scripts, redaction, sanitize, print, add content), opt-in MCP server over stdio, CLI `run`/`tools` (closed stdout pipes exit cleanly), UI control channel with drag. Missing: Action Wizard, AI providers
Done since: CLI run and MCP reject missing, empty, repeated and option-valued --root arguments before any tool/script execution or MCP initialization. A single-hyphen directory name remains valid; synthetic CLI regressions preserve a would-be overwritten file. `text_find` also caps the per-page match ranges it materializes at the remaining result limit plus one continuation match. CLI robustness scans visit each directory once through overlapping roots and symlink aliases. | | M12 | Accessibility, compare, measure, search, XFA | 200–380 | 30% | 90–160 | Done: new `a11y` crate with the Accessibility Checker (all 32 rules, report, Fix/Skip/Explain, options dialog and results panel, agent tools). Locatable figure, annotation and form findings highlight their page bounds.
Done since: 2D distance, perimeter and area measurements with persistent viewport calibration, snapping, live information and CSV export; a bounded text-only auto-tag proposal tool; text-only Apply writes marked content, paragraph tags and a parent tree, then opens the Tags panel for review. Missing: mixed-content and field autotag, heading/list/table/figure classification, Order/Content panels, Reading Order tool, compare, geospatial/3D measurement, search index, XFA | | M13 | Automation (MCP, Action Wizard, CLI) + AI providers | 60–120 | 45% | 25–45 | Done: MCP resources (document info, text, page images); headless tool table (123 tools incl. signing, optimizing, initial view, links, stamps, data exchange, comment review, forms authoring and scripts, redaction, sanitize, print, add content), opt-in MCP server over stdio, CLI `run`/`tools` (closed stdout pipes exit cleanly), UI control channel with drag. Missing: Action Wizard, AI providers
Done since: CLI run and MCP reject missing, empty, repeated and option-valued --root arguments before any tool/script execution or MCP initialization. A single-hyphen directory name remains valid; synthetic CLI regressions preserve a would-be overwritten file. `text_find` also caps the per-page match ranges it materializes at the remaining result limit plus one continuation match. | -| M14 | 1.0 polish: performance, localization, installers | 120–250 | 15% | 80–150 | Done: PhotoCraft's translation system (`i18n/`: TSV catalogs, `tl!`, command-id and plural entries, system-language detection, strict catalog tests); every dialog, panel and notice goes through `tl!`. Catalogs of ≈ 2,000–2,140 entries for Japanese, Simplified and Traditional Chinese, Russian, Bulgarian, German, Spanish, French, Telugu, Hungarian, Ukrainian, Italian, Brazilian Portuguese and Arabic (logical-order catalog put into display order; layout not yet mirrored); Czech covers the menus. Signed and notarized macOS builds, signed Windows installers (x64, x86, ARM64), AppImage, deb, rpm, Flatpak and FreeBSD packages. #307 (bounded large-PDF memory): shared resource indexes and parser metadata, lazy inspection, bounded caches; a 9,156-page file inspects in ≈ 1.8 s at ≈ 500 MiB instead of exceeding 10 GiB. Edits let go of the previous working file before writing the next (a 1 GiB file peaks at two copies while editing, not three; gap 13). Shortcut display uses localized modifier/key names across menus, toolbar, palette, Help and tooltips (#496). Lithuanian adds a 2,578-entry catalog and date names, reviewed by a native-speaking contributor. Validated candidate (macOS raster probe; Windows runtime unverified): the Windows policy changes only embedded JetBrains Mono; horizontal alpha-edge energy per ink improves 2.78%, 3.87% and 1.59% at 100%, 125% and 150%, and is down 0.79% at 200%. Inter is pixel-identical; layout hashes, glyph coverage and the 8 MiB atlas are unchanged. Timing and RSS ranges overlap, with no improvement claimed. Estimates unchanged. Missing: a right-to-left layout, a Chinese UI face in releases, Hindi/Indonesian/Korean/Vietnamese, file-backed input and global memory budgets, performance budgets, keyboard-only operation | +| M14 | 1.0 polish: performance, localization, installers | 120–250 | 15% | 80–150 | Done: PhotoCraft's translation system (`i18n/`: TSV catalogs, `tl!`, command-id and plural entries, system-language detection, strict catalog tests); every dialog, panel and notice goes through `tl!`. Catalogs of ≈ 2,000–2,140 entries for Japanese, Simplified and Traditional Chinese, Russian, Bulgarian, German, Spanish, French, Telugu, Hungarian, Ukrainian, Brazilian Portuguese and Arabic (logical-order catalog put into display order; layout not yet mirrored); Czech covers the menus. Italian has 2,528 entries: every key of the other catalogs that the code looks up. Signed and notarized macOS builds, signed Windows installers (x64, x86, ARM64), AppImage, deb, rpm, Flatpak and FreeBSD packages. #307 (bounded large-PDF memory): shared resource indexes and parser metadata, lazy inspection, bounded caches; a 9,156-page file inspects in ≈ 1.8 s at ≈ 500 MiB instead of exceeding 10 GiB. Edits let go of the previous working file before writing the next (a 1 GiB file peaks at two copies while editing, not three; gap 13). Shortcut display uses localized modifier/key names across menus, toolbar, palette, Help and tooltips (#496). Lithuanian adds a 2,578-entry catalog and date names, reviewed by a native-speaking contributor. Validated candidate (macOS raster probe; Windows runtime unverified): the Windows policy changes only embedded JetBrains Mono; horizontal alpha-edge energy per ink improves 2.78%, 3.87% and 1.59% at 100%, 125% and 150%, and is down 0.79% at 200%. Inter is pixel-identical; layout hashes, glyph coverage and the 8 MiB atlas are unchanged. Timing and RSS ranges overlap, with no improvement claimed. Estimates unchanged. Missing: a right-to-left layout, a Chinese UI face in releases, Hindi/Indonesian/Korean/Vietnamese, file-backed input and global memory budgets, performance budgets, keyboard-only operation | | M13 | Automation (MCP, Action Wizard, CLI) + AI providers | 60–120 | 45% | 25–45 | Done: MCP resources (document info, text, page images); headless tool table (123 tools incl. signing, optimizing, initial view, links, stamps, data exchange, comment review, forms authoring and scripts, redaction, sanitize, print, add content), opt-in MCP server over stdio, CLI `run`/`tools` (closed stdout pipes exit cleanly), UI control channel with drag. Missing: Action Wizard, AI providers | -| M14 | 1.0 polish: performance, localization, installers | 120–250 | 15% | 80–150 | Done: PhotoCraft's translation system (`i18n/`: TSV catalogs, `tl!`, command-id and plural entries, system-language detection, strict catalog tests); every dialog, panel and notice goes through `tl!`. Catalogs of ≈ 2,000–2,140 entries for Japanese, Simplified and Traditional Chinese, Russian, Bulgarian, German, Spanish, French, Telugu, Hungarian, Ukrainian, Italian, Brazilian Portuguese and Arabic (logical-order catalog put into display order; layout not yet mirrored); Czech covers the menus. Signed and notarized macOS builds, signed Windows installers (x64, x86, ARM64), AppImage, deb, rpm, Flatpak and FreeBSD packages. #307 (bounded large-PDF memory): shared resource indexes and parser metadata, lazy inspection, bounded caches; a 9,156-page file inspects in ≈ 1.8 s at ≈ 500 MiB instead of exceeding 10 GiB. Edits let go of the previous working file before writing the next (a 1 GiB file peaks at two copies while editing, not three; gap 13). Shortcut display uses localized modifier/key names across menus, toolbar, palette, Help and tooltips (#496). Traditional Chinese accessibility statuses, rule semantics and Taiwan form/table terms have catalog regressions. Missing: a right-to-left layout, a Chinese UI face in releases, Hindi/Indonesian/Korean/Vietnamese, file-backed input and global memory budgets, performance budgets, keyboard-only operation | +| M14 | 1.0 polish: performance, localization, installers | 120–250 | 15% | 80–150 | Done: PhotoCraft's translation system (`i18n/`: TSV catalogs, `tl!`, command-id and plural entries, system-language detection, strict catalog tests); every dialog, panel and notice goes through `tl!`. Catalogs of ≈ 2,000–2,140 entries for Japanese, Simplified and Traditional Chinese, Russian, Bulgarian, German, Spanish, French, Telugu, Hungarian, Ukrainian, Brazilian Portuguese and Arabic (logical-order catalog put into display order; layout not yet mirrored); Czech covers the menus. Italian has 2,528 entries: every key of the other catalogs that the code looks up. Signed and notarized macOS builds, signed Windows installers (x64, x86, ARM64), AppImage, deb, rpm, Flatpak and FreeBSD packages. #307 (bounded large-PDF memory): shared resource indexes and parser metadata, lazy inspection, bounded caches; a 9,156-page file inspects in ≈ 1.8 s at ≈ 500 MiB instead of exceeding 10 GiB. Edits let go of the previous working file before writing the next (a 1 GiB file peaks at two copies while editing, not three; gap 13). Shortcut display uses localized modifier/key names across menus, toolbar, palette, Help and tooltips (#496). Traditional Chinese accessibility statuses, rule semantics and Taiwan form/table terms have catalog regressions. Missing: a right-to-left layout, a Chinese UI face in releases, Hindi/Indonesian/Korean/Vietnamese, file-backed input and global memory budgets, performance budgets, keyboard-only operation | | | **Total** | **2,085–3,840** | **≈ 49% ready** | **≈ 770–1,400** | Area view of the same work: [target-app-parity.md](target-app-parity.md#by-feature-area) | ## Upcoming milestones, ranked @@ -176,6 +177,7 @@ M2 (renderer), M7 (content editing), M10 (OCR and Office), M11 (Preflight and st | Date | Change | Summary | |---|---|---| +| 2026-10-14 | minor | M14: Italian catalog completed (2,528 entries) and dropped from the ≈ 2,000–2,140-entry group; estimates unchanged | | 2026-10-12 | minor | M4 #1310 #1311 #1312: undo back to the opened file is clean, Revert returns to the last saved file, and the next save keeps that revision. Estimates unchanged. | | 2026-10-14 | minor | M5: reconciled PR #1457 with upstream main, preserving comment submission shortcuts and upstream roadmap progress. Estimates unchanged. | | 2026-10-13 | minor | M2/M6: images with at most 16 bits of samples a pixel (8-bit Separation/DeviceN, 1-4-bit gray or indexed) convert once per pixel value (hayro-interpret patch 28), so spot-colour form backgrounds draw in milliseconds instead of seconds; widgets without `/P` are placed in one pass; the Fields panel no longer searches the form per row and draws only the rows in view. Estimates unchanged. | diff --git a/parity/acrobat-features.toml b/parity/acrobat-features.toml index 206a9ae416..69fd3b0b95 100644 --- a/parity/acrobat-features.toml +++ b/parity/acrobat-features.toml @@ -9953,6 +9953,8 @@ commands = ["app.preferences"] tools = [] evidence = ["crates/ui-egui/src/commands.rs::localized_shortcut_labels_follow_language_and_platform", "crates/ui-egui/src/i18n/mod.rs::keyboard_key_names_have_a_separate_context_and_english_fallback", "crates/ui-egui/tests/commands.rs::localized_shortcuts_update_immediately_and_keep_command_ids_and_key_bindings", "crates/ui-egui/src/i18n/mod.rs::windows_display_language_resolves_chinese_scripts", "crates/ui-egui/src/i18n/mod.rs::neutral_locale_does_not_override_display_language", "crates/ui-egui/src/i18n/mod.rs::windows_display_language_query_returns_a_locale_tag", "crates/ui-egui/src/i18n/mod.rs::language_persists_and_invalid_input_keeps_current_language", "crates/ui-egui/src/i18n/mod.rs::bundled_catalogs_are_consistent", "crates/ui-egui/src/i18n/mod.rs::arabic_is_registered_and_persists", "crates/ui-egui/src/i18n/mod.rs::arabic_lookups_are_in_display_order", "crates/ui-egui/src/i18n/mod.rs::arabic_plurals_follow_the_six_cldr_forms", "crates/ui-egui/src/i18n/mod.rs::arabic_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::arabic_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::arabic_labels_have_glyphs", "crates/ui-egui/src/bidi.rs::rtl_labels_keep_placeholders_whole", "crates/ui-egui/src/i18n/mod.rs::japanese_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::simplified_chinese_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::simplified_chinese_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::simplified_chinese_history_and_diagnostics_preserve_user_values", "crates/ui-egui/tests/control.rs::simplified_chinese_signature_prompts_and_errors_keep_document_state", "crates/ui-egui/tests/control.rs::language_switch_preserves_document_and_command_ids", "crates/ui-egui/tests/control.rs::japanese_controls_and_search_keep_command_ids", "crates/ui-egui/tests/control.rs::japanese_dialogs_errors_and_custom_action_names", "crates/ui-egui/src/i18n/mod.rs::french_is_registered", "crates/ui-egui/src/i18n/mod.rs::french_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::french_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::french_history_and_diagnostics_preserve_user_values", "crates/ui-egui/src/i18n/mod.rs::german_certificate_subject_has_a_distinct_context", "crates/ui-egui/src/widgets.rs::search_placeholder_never_overlaps_the_shortcut", "crates/ui-egui/src/home.rs::translated_card_description_leaves_room_for_the_action", "crates/ui-egui/tests/control.rs::german_preferences_and_search_keep_command_ids", "crates/ui-egui/src/i18n/mod.rs::telugu_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::telugu_labels_have_glyphs", "crates/ui-egui/src/i18n/mod.rs::hungarian_is_registered", "crates/ui-egui/src/i18n/mod.rs::hungarian_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::hungarian_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::hungarian_history_and_diagnostics_preserve_user_values", "crates/ui-egui/src/i18n/mod.rs::ukrainian_is_registered_and_persists", "crates/ui-egui/src/i18n/mod.rs::ukrainian_integer_plurals_cover_teens_and_large_counts", "crates/ui-egui/src/i18n/mod.rs::ukrainian_calendar_uses_month_case_for_dates", "crates/ui-egui/src/i18n/mod.rs::ukrainian_catalog_does_not_leave_english_ui_text", "crates/ui-egui/src/i18n/mod.rs::ukrainian_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::ukrainian_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::ukrainian_history_and_diagnostics_preserve_user_values", "crates/ui-egui/src/i18n/mod.rs::spanish_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::spanish_covers_what_the_engine_says", "crates/ui-egui/src/i18n/mod.rs::spanish_keeps_the_holes_in_what_the_engine_says", "crates/print/src/tests.rs::wordings_are_said"] notes = "Shortcut modifiers and key names use a dedicated catalog context across toolbar, menus, palette, Help and tooltips, with English fallback and macOS symbols preserved. Preferences switches Auto (system language)/English/Japanese/Simplified Chinese/Traditional Chinese/Czech/Brazilian Portuguese/German/Spanish/French/Telugu/Hungarian/Ukrainian/Italian/Arabic and persists; ui.set language auto|en|ja|zh-hans|zh-hant|cs|pt-br|de|es|fr|te|hu|uk|it|ar and ui.state expose it. TSV catalogs per language (same system as PhotoCraft); every dialog, panel and notice goes through tl!. Japanese, Traditional Chinese, Simplified Chinese, German, Spanish, French and Hungarian cover commands, dialogs, panels, shortcuts and history labels; Czech and Brazilian Portuguese the menus. French locales (fr, fr_FR, fr_CA, fr_BE) select the French catalog, German locales (de, de_DE, de_AT, de_CH) the German one, Hungarian locales (hu, hu_HU) the Hungarian one. German search hints reserve shortcut space, Home cards bound translated text, certificate Subject has its own context, and inserted tool names keep their capitalization. The sentences the layers below word for themselves (accessibility findings and the saved report, PDF/A problems, signature details, page-range mistakes, edit labels) are handed over apart from the document's own values and go through the catalog too, through said(&i18n::words); Spanish translates them and the other catalogs fall back to English. OS error details, and faults rather than mistakes, stay as they are. Auto detects the Windows display language after explicitly named supported locale overrides; neutral C/POSIX launcher locales are skipped on Windows, with Chinese script/region mapping and English fallback. Arabic (ar and every ar-* locale) covers commands, dialogs and panels with the six CLDR plural forms; its labels are put into display order when the catalog loads, because egui joins Arabic letters but lays words out left to right. Missing: a right-to-left layout (Arabic labels sit in the left-to-right layout, a wrapped Arabic paragraph breaks at the wrong end, and text typed into a field is not reordered), Czech and Brazilian Portuguese dialogs, Chinese and Telugu font delivery in releases (the pinned craft-fonts revision has an Arabic face; its Noto Sans CJK SC is never embedded, AGENTS.md §1.1), the engine's sentences in the other catalogs, a full localization audit." +evidence = ["crates/ui-egui/src/commands.rs::localized_shortcut_labels_follow_language_and_platform", "crates/ui-egui/src/i18n/mod.rs::keyboard_key_names_have_a_separate_context_and_english_fallback", "crates/ui-egui/tests/commands.rs::localized_shortcuts_update_immediately_and_keep_command_ids_and_key_bindings", "crates/ui-egui/src/i18n/mod.rs::windows_display_language_resolves_chinese_scripts", "crates/ui-egui/src/i18n/mod.rs::neutral_locale_does_not_override_display_language", "crates/ui-egui/src/i18n/mod.rs::windows_display_language_query_returns_a_locale_tag", "crates/ui-egui/src/i18n/mod.rs::language_persists_and_invalid_input_keeps_current_language", "crates/ui-egui/src/i18n/mod.rs::bundled_catalogs_are_consistent", "crates/ui-egui/src/i18n/mod.rs::arabic_is_registered_and_persists", "crates/ui-egui/src/i18n/mod.rs::arabic_lookups_are_in_display_order", "crates/ui-egui/src/i18n/mod.rs::arabic_plurals_follow_the_six_cldr_forms", "crates/ui-egui/src/i18n/mod.rs::arabic_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::arabic_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::arabic_labels_have_glyphs", "crates/ui-egui/src/bidi.rs::rtl_labels_keep_placeholders_whole", "crates/ui-egui/src/i18n/mod.rs::japanese_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::simplified_chinese_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::simplified_chinese_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::simplified_chinese_history_and_diagnostics_preserve_user_values", "crates/ui-egui/tests/control.rs::simplified_chinese_signature_prompts_and_errors_keep_document_state", "crates/ui-egui/tests/control.rs::language_switch_preserves_document_and_command_ids", "crates/ui-egui/tests/control.rs::japanese_controls_and_search_keep_command_ids", "crates/ui-egui/tests/control.rs::japanese_dialogs_errors_and_custom_action_names", "crates/ui-egui/src/i18n/mod.rs::french_is_registered", "crates/ui-egui/src/i18n/mod.rs::french_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::french_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::french_history_and_diagnostics_preserve_user_values", "crates/ui-egui/src/i18n/mod.rs::german_certificate_subject_has_a_distinct_context", "crates/ui-egui/src/widgets.rs::search_placeholder_never_overlaps_the_shortcut", "crates/ui-egui/src/home.rs::translated_card_description_leaves_room_for_the_action", "crates/ui-egui/tests/control.rs::german_preferences_and_search_keep_command_ids", "crates/ui-egui/src/i18n/mod.rs::telugu_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::telugu_labels_have_glyphs", "crates/ui-egui/src/i18n/mod.rs::hungarian_is_registered", "crates/ui-egui/src/i18n/mod.rs::hungarian_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::hungarian_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::hungarian_history_and_diagnostics_preserve_user_values", "crates/ui-egui/src/i18n/mod.rs::ukrainian_is_registered_and_persists", "crates/ui-egui/src/i18n/mod.rs::ukrainian_integer_plurals_cover_teens_and_large_counts", "crates/ui-egui/src/i18n/mod.rs::ukrainian_calendar_uses_month_case_for_dates", "crates/ui-egui/src/i18n/mod.rs::ukrainian_catalog_does_not_leave_english_ui_text", "crates/ui-egui/src/i18n/mod.rs::ukrainian_covers_commands_and_catalogue", "crates/ui-egui/src/i18n/mod.rs::ukrainian_covers_ui_literals", "crates/ui-egui/src/i18n/mod.rs::ukrainian_history_and_diagnostics_preserve_user_values", "crates/ui-egui/src/i18n/mod.rs::spanish_covers_what_the_engine_says", "crates/ui-egui/src/i18n/mod.rs::spanish_keeps_the_holes_in_what_the_engine_says", "crates/print/src/tests.rs::wordings_are_said"] +notes = "Shortcut modifiers and key names use a dedicated catalog context across toolbar, menus, palette, Help and tooltips, with English fallback and macOS symbols preserved. Preferences switches Auto (system language)/English/Japanese/Simplified Chinese/Traditional Chinese/Czech/Brazilian Portuguese/German/Spanish/French/Telugu/Hungarian/Ukrainian/Italian/Arabic and persists; ui.set language auto|en|ja|zh-hans|zh-hant|cs|pt-br|de|es|fr|te|hu|uk|it|ar and ui.state expose it. TSV catalogs per language (same system as PhotoCraft); every dialog, panel and notice goes through tl!. Japanese, Traditional Chinese, Simplified Chinese, German, Spanish, French and Hungarian cover commands, dialogs, panels, shortcuts and history labels; Czech and Brazilian Portuguese the menus. French locales (fr, fr_FR, fr_CA, fr_BE) select the French catalog, German locales (de, de_DE, de_AT, de_CH) the German one, Hungarian locales (hu, hu_HU) the Hungarian one. German search hints reserve shortcut space, Home cards bound translated text, certificate Subject has its own context, and inserted tool names keep their capitalization. The sentences the layers below word for themselves (accessibility findings and the saved report, PDF/A problems, signature details, page-range mistakes, edit labels) are handed over apart from the document's own values and go through the catalog too, through said(&i18n::words); Spanish and Italian translate them and the other catalogs fall back to English. OS error details, and faults rather than mistakes, stay as they are. Auto detects the Windows display language after explicitly named supported locale overrides; neutral C/POSIX launcher locales are skipped on Windows, with Chinese script/region mapping and English fallback. Arabic (ar and every ar-* locale) covers commands, dialogs and panels with the six CLDR plural forms; its labels are put into display order when the catalog loads, because egui joins Arabic letters but lays words out left to right. Missing: a right-to-left layout (Arabic labels sit in the left-to-right layout, a wrapped Arabic paragraph breaks at the wrong end, and text typed into a field is not reordered), Czech and Brazilian Portuguese dialogs, Chinese and Telugu font delivery in releases (the pinned craft-fonts revision has an Arabic face; its Noto Sans CJK SC is never embedded, AGENTS.md §1.1), the engine's sentences in the other catalogs, a full localization audit." [[feature]] id = "misc.prefs-reading"