diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index ba7a6c9ec..b30607f02 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -13,7 +13,7 @@ Every asset PdfCraft includes, bundles or uses to build its published material, | `crates/ui-egui/src/i18n/zh-hant.tsv` | Traditional Chinese (Taiwan) interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources | Traditional Chinese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs | | `crates/ui-egui/src/i18n/cs.tsv` | Czech interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources | Czech UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs | | `crates/ui-egui/src/i18n/pt-br.tsv` | Brazilian Portuguese interface translation catalog | André Cardoso (andrecards), PdfCraft contributors | MIT OR Apache-2.0 | Clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources: the ~1,826-entry gist posted in issue #288 (https://gist.github.com/andrecards/ac388c25fba17312ce83207f8b7b467e), completed and reviewed by PdfCraft contributors | Brazilian Portuguese UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs | -| `crates/ui-egui/src/i18n/es.tsv` | Spanish interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources | Spanish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs | +| `crates/ui-egui/src/i18n/es.tsv` | Spanish interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources; the 2026-10-20 coverage additions are AI-assisted and not separately native-reviewed | Spanish UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs | | `crates/ui-egui/src/i18n/fr.tsv` | French interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources | French UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs | | `crates/ui-egui/src/i18n/de.tsv` | German interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources | German UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs | | `crates/ui-egui/src/i18n/te.tsv` | Telugu interface translation catalog | PdfCraft contributors | MIT OR Apache-2.0 | Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources | Telugu UI strings, compiled in by crates/ui-egui/src/i18n/mod.rs | diff --git a/ATTRIBUTION.toml b/ATTRIBUTION.toml index 7e0af8d66..d7f08072f 100644 --- a/ATTRIBUTION.toml +++ b/ATTRIBUTION.toml @@ -69,7 +69,7 @@ sha256 = "af4b798c568cb1bb44ef23700e2d69c1e91c7cbb81e6fb565079a797cf02c878" path = "crates/ui-egui/src/i18n/es.tsv" title = "Spanish interface translation catalog" author = "PdfCraft contributors" -source = "Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources" +source = "Contributor-original: clean-room translations of PdfCraft's English UI labels, no proprietary localisation resources; the 2026-10-20 coverage additions are AI-assisted and not separately native-reviewed" licence = "MIT OR Apache-2.0" licence_file = "LICENSE-MIT" kind = "translation" diff --git a/ROADMAP.md b/ROADMAP.md index 4906b4dd3..ce966e593 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -133,14 +133,14 @@ What's strong and missing in each: [target-app-parity.md](docs/target-app-parity ## Languages -Twelve key languages (historical % snapshot vs 2,143 keys, except Vietnamese and Brazilian -Portuguese vs the current union). Detail and script notes: [localization-parity.md](docs/localization-parity.md). +Twelve key languages (historical % snapshot vs 2,143 keys, except Vietnamese, Brazilian +Portuguese and Spanish vs the current union). Detail and script notes: [localization-parity.md](docs/localization-parity.md). | Language | Code | Strings | Status | |---|---|---|---| | English | `en` | 100% | full | | Simplified Chinese | `zh-hans` | 97.4% | partial (no Hans UI face in releases, #826) | -| Spanish | `es` | 95.5% | partial | +| Spanish | `es` | 100% of current union | partial (dialogs / tooltips; no help) | | Hindi | `hi` | 0% | none | | Arabic | `ar` | 100% | partial (layout not mirrored) | | French | `fr` | 99.3% | partial | @@ -207,6 +207,7 @@ Ranked; detail and the full milestone table in [docs/roadmap.md](docs/roadmap.md - **2026-10-16 (M10, #1201 partial):** Lossless image export applies each component's Decode pair. Indexed values round and clip before palette lookup. Color-key masks keep raw samples. The existing 16-bit precision limit remains. JPEG and mask Decode, ICC transforms, and calibrated colors remain outside this fix. Estimates unchanged. - **2026-10-16 (M3, #2739):** Wrapped revision buttons stay above Binding in Document Properties. A synthetic regression checks control bounds and opens a saved revision at two viewport widths. Estimates unchanged. - **2026-10-19 (M7, tracked text):** Editable paragraphs and object labels distinguish repeated glyph tracking from word gaps in TJ arrays and separately positioned glyphs. Synthetic regressions cover character spacing, horizontal scaling, rotated baselines, larger word gaps, and rows of one-glyph words or cells (inferred tracking is capped at half an em, so `a b c` and digit or Y/N columns keep their spaces). Estimates unchanged. +- **2026-10-20 (M14, Spanish catalog gaps):** `es.tsv` gains the 143 `(context, English)` keys the other catalogs carried and it was missing, so Spanish covers the whole bundled key union like Lithuanian and Vietnamese: calendar months and weekdays, the `certificate` context, X.509 key usages, signature-revision and digital-ID lines, password validation, eight plural messages, the combine-from-folder strings, the rendering and stale-file notices and the shortcut-spelled tooltips. Counts in `localization-parity.md` re-measured against the current union (`vi` restated against it for the same reason). Status stays `partial`: no translated help, and OS details stay outside the catalog. Estimates unchanged. - **2026-10-16 (M14, localization):** Czech goes from menus-and-dialogs to the whole surface: 2,674 entries after adding the ~220 keys the other catalogs had -- the sentences the engine words (signature details, accessibility findings and report, PDF/A problems, pages to print, history labels), the date picker's weekday heads, the certificate viewer's fields and shared buttons. "Tag" is *tag* throughout (the Tags panel said *značky*, which is also a redaction mark), and "{n} tags" no longer reads "1 značek". Two new catalog tests. Estimates unchanged. - **2026-10-15 (M2, gap 12):** `cargo xtask text-oracle` scores reading order as well as word F1: the longest common subsequence of the two word sequences over the longer one. F1 is a bag of words and cannot see order at all -- measuring #2431, a change that moves text and nothing else, it called 26 of the 29 files whose output changed identical, where the order score separated 18 improvements from 6 regressions. Reports, does not gate; a disagreement with Poppler, not a verdict. Estimates unchanged. - **2026-10-15 (M2, #2305 follow-up):** WinAnsiEncoding 0xA0 and 0xAD and MacRomanEncoding 0xCA extract as the ordinary space and hyphen Annex D.2 names them, in the vendored hayro tables (patch 30) as well as `crates/fonts`, so search, copy and redaction see characters that were hidden behind U+00A0 and U+00AD. Across the pdf.js corpus the soft hyphens we extract fall 117 to 13 and the non-breaking spaces 30 to 26; the rest come from `/ToUnicode`. An explicit `/Differences` name keeps its glyph list value, as pdftotext does. Estimates unchanged. diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index 7c7b7c8d7..f1960046a 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -2621,3 +2621,176 @@ animation effects Off Desactivados # Historical snapshot notice bar (View signed version / View revision). You are viewing the signed version of “{from}” (revision {rev}). It is a snapshot: changes here won't affect the original. Estás viendo la versión firmada de «{from}» (revisión {rev}). Es una instantánea: los cambios aquí no afectarán al original. You are viewing revision {rev} of “{from}”. It is a snapshot: changes here won't affect the original. Estás viendo la revisión {rev} de «{from}». Es una instantánea: los cambios aquí no afectarán al original. + +# +# Keys the other catalogs carry that this one was missing, so Spanish covers the bundled key union +# the way Lithuanian and Vietnamese do (`lithuanian_covers_bundled_catalog_keys_including_dynamic_dialog_labels`). +# Same clean-room rule as the header: written from the plain meaning of the English label, reusing +# the vocabulary already in this file (ID digital, marcador, Acercar / alejar, Portapapeles). +# +# The date picker. +calendar date January enero +calendar date February febrero +calendar date March marzo +calendar date April abril +calendar date May mayo +calendar date June junio +calendar date July julio +calendar date August agosto +calendar date September septiembre +calendar date October octubre +calendar date November noviembre +calendar date December diciembre +calendar weekday Mo Lu +calendar weekday Tu Ma +calendar weekday We Mi +calendar weekday Th Ju +calendar weekday Fr Vi +calendar weekday Sa Sá +calendar weekday Su Do +# +# Certificate details, in their own context beside the plain labels. +certificate Issued to Emitido a +certificate Issued by Emitido por +certificate Issuer Emisor +certificate Serial number Número de serie +certificate Version Versión +certificate Public key Clave pública +certificate Key usage Uso de la clave +certificate Intended usage Uso previsto +certificate Basic constraints Restricciones básicas +certificate Self-signed Autofirmado +certificate Valid from Válido desde +certificate Valid to Válido hasta +certificate Validity starts La validez empieza +certificate Validity ends La validez termina +certificate SHA-1 digest Huella SHA-1 +certificate SHA-256 digest Huella SHA-256 +# +# What a certificate's key may be used for (X.509 key usage), as the details list them. + Digital Signature Firma digital + Non-Repudiation No repudio + Key Encipherment Cifrado de claves + Data Encipherment Cifrado de datos + Key Agreement Acuerdo de claves + Certificate Signing Firma de certificados + CRL Signing Firma de CRL + Encipher Only Solo cifrado + Decipher Only Solo descifrado +# +# Signatures, revisions and digital IDs. + {who}, certificate issued by {issuer}. {who}, certificado emitido por {issuer}. + {who}, certificate issued by an unknown issuer. {who}, certificado emitido por un emisor desconocido. + Rev. {rev}: Signed by {name} Rev. {rev}: Firmado por {name} + Rev. {rev}: Signed by an unknown signer Rev. {rev}: Firmado por un firmante desconocido + Rev. {rev}: Certified by {name} Rev. {rev}: Certificado por {name} + Rev. {rev}: Certified by an unknown signer Rev. {rev}: Certificado por un firmante desconocido + Unsigned signature field: {name} Campo de firma sin firmar: {name} + Choose a digital ID. Elige un ID digital. + There is no folder to save the digital ID in. No hay ninguna carpeta donde guardar el ID digital. +# +# Passwords. + The password is incorrect. La contraseña es incorrecta. + The password must have at least 6 characters. La contraseña debe tener al menos 6 caracteres. + The password must have at least 8 characters. La contraseña debe tener al menos 8 caracteres. + The passwords do not match. Las contraseñas no coinciden. + Only the document's owner can change its security (open it with the permissions password) Solo el propietario del documento puede cambiar su seguridad (ábrelo con la contraseña de permisos) +# +# Counts. +@plural {n} byte|{n} bytes {n} byte|{n} bytes +@plural {n} pixel|{n} pixels {n} píxel|{n} píxeles +@plural {n} file|{n} files {n} archivo|{n} archivos +@plural {n} comment|{n} comments {n} comentario|{n} comentarios +@plural {n} result|{n} results {n} resultado|{n} resultados +@plural {n} image optimized|{n} images optimized {n} imagen optimizada|{n} imágenes optimizadas +@plural {n} item discarded|{n} items discarded {n} elemento descartado|{n} elementos descartados +@plural Delete {n} field|Delete {n} fields Eliminar {n} campo|Eliminar {n} campos +# +# Combining PDFs from a folder. + Add the PDFs to combine Añade los PDF que vas a combinar + Drop PDFs or folders here, or choose them. Suelta aquí PDF o carpetas, o elígelos. + Every PDF in the folder Todos los PDF de la carpeta + Every PDF in the folder and the folders inside it Todos los PDF de la carpeta y de las carpetas que contiene + Added the first {n} PDFs in {folder} Se han añadido los primeros {n} PDF de {folder} + No PDFs found in {folder} No se ha encontrado ningún PDF en {folder} +# +# Panels, rendering and notices. + Panel layout could not be restored: {error} No se ha podido restaurar la disposición de los paneles: {error} + Panel move was not applied: {error} No se ha aplicado el movimiento del panel: {error} + Rendering… Renderizando… + Still rendering — this page is unusually complex… Sigue renderizando: esta página es excepcionalmente compleja… + Loading… Cargando… + This file changed on disk. Reload it to see the new version; your unsaved changes will be lost. Este archivo cambió en el disco. Recárgalo para ver la versión nueva; se perderán los cambios sin guardar. + Text recognition isn't installed: its models are missing (run `cargo xtask models`, or set PDFCRAFT_MODELS). El reconocimiento de texto no está instalado: faltan sus modelos (ejecuta `cargo xtask models` o define PDFCRAFT_MODELS). + Cut and stack needs Two-sided: Off. Print single-sided sheets. Cortar y apilar necesita «A doble cara: Desactivado». Imprime hojas a una cara. + Error Error + Warning Advertencia + Information Información + Success Correcto +# +# Asking for something, and choosing it. + Enter a name. Introduce un nombre. + Enter a page number Introduce un número de página + Enter a URL Introduce una URL + Enter the field names Introduce los nombres de los campos + Choose… Elegir… + Choose a file… Elegir un archivo… + Choose a folder… Elegir una carpeta… + Create folder Crear carpeta + Open folder Abrir carpeta + Save file Guardar archivo + Save changes? ¿Guardar los cambios? +# +# Settings and their values. + Theme Tema +theme Appearance Aspecto + System Sistema + English Inglés + Always Siempre + Never Nunca + Automatically Automáticamente + On Activado + Enabled Activado + Disabled Desactivado + Mouse wheel scroll speed Velocidad de desplazamiento de la rueda del ratón + Margins (in) Márgenes (pulg.) +# +# Labels and commands the catalogs name on their own. + Color Color + Font Fuente + Folder Carpeta + Comment Comentario + Comment and review Comentar y revisar + Creator Creador + Producer Productor + Organize Organizar + Import Importar + Move Mover + Duplicate Duplicar + Paste Pegar + Select all Seleccionar todo + Refresh Actualizar + Next Siguiente + Previous Anterior + of de + No results Sin resultados + Search results Resultados de la búsqueda + Copy to clipboard Copiar al portapapeles + Copied to clipboard Copiado al portapapeles + Help… Ayuda… + on page {label} en la página {label} + Page {n} Página {n} + Page {n} of {total} Página {n} de {total} +# +# Tooltips that spell their shortcut out. + Open a PDF (⌘O) Abrir un PDF (⌘O) + Print (⌘P) Imprimir (⌘P) + Document properties (⌘D) Propiedades del documento (⌘D) + New bookmark (⌘B) Nuevo marcador (⌘B) + Next (⌘G) Siguiente (⌘G) + Previous (⇧⌘G) Anterior (⇧⌘G) + Zoom in (⌘+) Acercar (⌘+) + Zoom out (⌘−) Alejar (⌘−) + Zoom in / out (also pinch or ⌘-scroll) Acercar / alejar (también con pellizco o ⌘ + desplazamiento) + Rotate view clockwise (⇧⌘+) Girar la vista a la derecha (⇧⌘+) + Save (M4) Guardar (M4) diff --git a/docs/localization-parity.md b/docs/localization-parity.md index f50de2830..13466d857 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,7 +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-21 · **Last updated:** 2026-10-21 · **Change:** minor (Brazilian Portuguese now covers the 2,674-key catalog union; twelve-language mean still rounds to ≈68%) · **Target:** Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) +> **Last reviewed:** 2026-10-21 · **Last updated:** 2026-10-21 · **Change:** minor (Brazilian Portuguese now covers the 2,674-key catalog union; twelve-language mean still rounds to ≈68%; Spanish 100% of the current key union) · **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). @@ -9,11 +9,16 @@ add a language: [localization.md](localization.md). Summary in [ROADMAP.md](../R ## How this was measured - **Strings translated** is measured: the catalogs in `crates/ui-egui/src/i18n/.tsv`, counted - as distinct `(context, English)` keys with a non-empty translation. The **current** denominator is - the union of keys across all catalogs (**2,674 distinct keys as of 2026-10-21**, including - language-specific context rows such as Vietnamese `theme`/`Appearance`). The twelve-language - percentage table below still quotes the **historical 2,143-key snapshot** from 2026-10-10 except - for Vietnamese and Brazilian Portuguese (measured against the current union). English is built in. + as distinct `(context, English)` keys with a non-empty translation. The denominator is the union of + keys across all catalogs, counting language-specific context rows such as `theme`/`Appearance`. + **That union is a moving target**: every change that adds a string widens it, so a count is only + comparable with others measured on the same date, and a catalog that reached 100% falls behind + without losing a single translation. Every figure here therefore carries its date. The current + union is **2,674** keys as of 2026-10-20, against the **2,143-key snapshot** of 2026-10-10; earlier + revisions quote the union of their own date (see the revision history), not this one. The + twelve-language percentage table below still quotes the 2026-10-10 snapshot for every language + except Spanish, Vietnamese, Lithuanian and Brazilian Portuguese, which are measured against the current union. English is + built in. - **Not counted:** error details from the engine and the operating system, which are shown in English inside a translated frame; there is no translated user documentation or help yet (Acrobat ships localized help). @@ -31,7 +36,7 @@ add a language: [localization.md](localization.md). Summary in [ROADMAP.md](../R |---|---|---|---|---|---|---|---|---| | English | `en` | built in (100%) | all; README and docs | Latin | yes | **full** | yes | 0 | | Simplified Chinese | `zh-hans` | 2,088 (97.4%) | dialogs and tooltips through `tl!`; no help | CJK text and IME work, but **release builds have no Hans face**: many characters show as boxes (#826, #688, #728, #758; Flatpak #689) | no | partial | yes | 6–12 | -| Spanish | `es` | 2,046 (95.5%) | dialogs and tooltips; no help | Latin | no | partial | yes | 2–4 | +| Spanish | `es` | 2,674 (100% of current key union) | dialogs and tooltips; no help | Latin | no | partial | yes | 2–4 | | Hindi | `hi` | 0 | none | Devanagari not tested (egui shapes Telugu conjuncts, so shaping is likely workable); no Devanagari face in craft-fonts | no | none | no | 10–18 | | Arabic | `ar` | 2,143 (100%) | dialogs and tooltips; no help | Letters joined and lines reordered at load, but **layout not mirrored**, wrapped lines break at the wrong end, typed text runs left to right (`localization.md` §Arabic) | no | partial | yes (Middle East edition) | 25–45 | | French | `fr` | 2,128 (99.3%) | dialogs and tooltips; no help | Latin | no | partial | yes | 1–2 | @@ -40,7 +45,7 @@ add a language: [localization.md](localization.md). Summary in [ROADMAP.md](../R | Japanese | `ja` | 2,123 (99.1%) | dialogs and tooltips; no help | BIZ UDPGothic from craft-fonts; IME patched on macOS, Windows, X11, Wayland; vertical text renders but can't be edited | no | partial | yes | 4–8 | | German | `de` | 2,128 (99.3%) | dialogs and tooltips; no help | Latin | community, in progress (#828: terminology, clipping) | partial | yes | 2–4 | | Korean | `ko` | 0 | none | Hangul IME patched (Microsoft and Apple Korean, `vendor/README.md` winit 3, 6, 9, 10); no Hangul UI face in craft-fonts | no | none | yes | 6–10 | -| Vietnamese | `vi` | 2,674 (100% of current union) | dialogs and tooltips; no help | Latin with stacked diacritics; bundled Inter covers them (fonts test) | community | partial | no | 2–4 | +| Vietnamese | `vi` | 2,674 (100% of current key union) | dialogs and tooltips; no help | Latin with stacked diacritics; bundled Inter covers them (fonts test) | community | partial | no | 2–4 | **Localization dimension ≈ 68%**: the mean over the twelve, counting a catalog's percentage but only 60% for Chinese and Arabic until their script problems are fixed, and 0 for Hindi, Indonesian and @@ -49,8 +54,8 @@ to bring all twelve to `full`, of which ≈ 35–60 h is engineering (Hans face, and the rest catalogs and fixes; native-speaker review needs humans. No language is `full` except English: every catalog leaves engine error details in English, and -none has translated help. Vietnamese's **To `full`** hours are therefore residual help/docs polish -(catalog and script work are already done), not missing UI strings. +none has translated help. The **To `full`** hours of Vietnamese and Spanish are therefore residual +help/docs polish (catalog and script work are already done), not missing UI strings. ## Other shipped languages @@ -69,7 +74,7 @@ none has translated help. Vietnamese's **To `full`** hours are therefore residua | Slovenian | `sl` | 2,324 entries | partial | no | | Greek | `el` | 2,341 entries | partial | no | | Turkish | `tr` | 2,313 entries | partial | yes | -| Lithuanian | `lt` | 2,585 entries | partial; community native-speaker review ([#1401](https://github.com/storytold/pdfcraft/pull/1401)) | no | +| Lithuanian | `lt` | 2,674 (100% of current key union) | partial; community native-speaker review ([#1401](https://github.com/storytold/pdfcraft/pull/1401)) | no | | Finnish | `fi` | 2,674 entries | partial; AI-assisted, native proofreading pending | yes | **15 other languages** ship (23 catalogs plus English = **24** interface languages in Preferences). @@ -81,6 +86,7 @@ Acrobat languages PdfCraft lacks: Danish, Dutch, Norwegian, Swedish, Hebrew. Vie | Date | Change | Summary | |---|---|---| | 2026-10-21 | minor | Brazilian Portuguese (`pt-br`) now covers all 2,674 distinct keys in the current catalog union; no help or engine/OS error-detail localization; twelve-language mean still rounds to ≈ 68% | +| 2026-10-20 | minor | Spanish: the 143 keys the other catalogs had and `es.tsv` was missing; `es` now covers the whole 2,674-key union, like `lt` and `vi`. Restated Lithuanian against the current union (its 2,585 was measured on 2026-10-13) and said plainly in *How this was measured* that the union moves, so counts only compare within a date | | 2026-10-16 | minor | Czech: 2,674 entries after adding the keys the other catalogs had (the engine's sentences, weekday heads, certificate fields, shared buttons) and unifying "tag" as *tag* (not *značka*, which is a redaction mark) | | 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 |