Merge PR #3603: M14: Spanish catalog covers the bundled key union

ATTRIBUTION.toml: kept main's sha; rehashed after all merges.
ROADMAP.md: summary names Vietnamese, Brazilian Portuguese and Spanish against the current union; both log lines.
docs/localization-parity.md: main's status line with the Spanish change added; the PR's denominator paragraph naming Brazilian Portuguese too; the PR's lt row plus main's fi row; revision rows newest first.
This commit is contained in:
aiongg
2026-10-22 01:49:15 +00:00
5 changed files with 196 additions and 16 deletions
+1 -1
View File
@@ -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 |
+1 -1
View File
@@ -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"
+4 -3
View File
@@ -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.
+173
View File
@@ -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)
Can't render this file because it contains an unexpected character in line 6 and column 60.
+17 -11
View File
@@ -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/<code>.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 |