mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-14 19:27:01 -04:00
Progress docs per craftrules standards/progress-docs.md: target-app parity, gaps, roadmap with alpha gate, readiness by audience (full / mainstream / essentials) with Opus 5.5 hours, model-by-model RAW coverage against Adobe's camera list (docs/raw/), and format, hardware, UI and localization parity docs. Co-Authored-By: Claude Opus 5.5 <[email protected]>
93 lines
6.6 KiB
Markdown
93 lines
6.6 KiB
Markdown
# Localization parity
|
||
|
||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first per-language measurement from the catalogs) · **Target:** Adobe Lightroom Classic 15.5 / Lightroom 9.6
|
||
|
||
How far each interface language is from `full`. How to add or maintain a language is in
|
||
[localization.md](localization.md); per-language notes are in `localization-<code>.md`
|
||
([zh-hans](localization-zh-hans.md), [zh-hant](localization-zh-hant.md), [ja](localization-ja.md),
|
||
[pt-br](localization-pt-br.md), [es](localization-es.md), [de](localization-de.md),
|
||
[ru](localization-ru.md)).
|
||
|
||
## The target
|
||
|
||
Lightroom 9.6 (installed on the owner's Mac) ships 16 interface languages, listed from its bundle's
|
||
`.lproj` folder names: English, German, Spanish, French, Italian, Japanese, Korean, Norwegian Bokmål,
|
||
Dutch, Polish, Portuguese (Brazil), Russian, Swedish, Thai, Simplified Chinese and Traditional
|
||
Chinese. It does **not** ship Hindi, Arabic, Indonesian or Vietnamese, so for those LightCraft would
|
||
go beyond the target.
|
||
|
||
## How the numbers are measured
|
||
|
||
**Measured** (a Python count over `crates/ui-egui/locales/*.json`, 2026-10-10):
|
||
|
||
- The denominator is every message any catalog knows: the union of the plain catalogs' keys (2,074
|
||
English source strings: menus, commands, controls, panels, dialogs, tooltips, presets, What's New
|
||
lines) plus the 230 messages of the formats catalogs (`*-formats.json`: text with runtime values and
|
||
date patterns), 2,304 messages in all.
|
||
- A message counts as translated when the catalog has a non-empty value that differs from the English
|
||
key. Some identical values are correct (`ISO`, `OK` in German), so the figure slightly understates
|
||
coverage; on the other hand, strings that never reach a catalog (technical errors raised in lower
|
||
crates, some `format!` text outside `tr_format!`) are not in the denominator at all. That is why no
|
||
language is `full` even at 99%.
|
||
- The UI has 563 distinct `tr("…")` literals and 198 `tr_format!` messages in `crates/ui-egui` and
|
||
`apps/`; command, control, menu and preset labels reach the catalogs through `display_label`.
|
||
|
||
Script support is checked against the code: `language_table!` in `crates/ui-egui/src/i18n.rs` lists
|
||
scripts `Latn`, `Cyrl`, `Hans`, `Hant`, `Jpan` only. The UI is egui, which has no bidirectional layout
|
||
and no complex-script shaping, so Arabic (RTL, joining) and Devanagari (conjuncts, reordering) cannot
|
||
render correctly today.
|
||
|
||
Native-speaker review: no catalog has had a formal review. Several catalogs have edits from community
|
||
contributors whose commits only touch that language (ja, zh-hans, zh-hant, fr, de, ru, uk, pt-br);
|
||
that is promising but is not recorded as review, so the column says `no (community edits)`.
|
||
|
||
## The twelve key languages
|
||
|
||
| # | Language | Code | UI strings translated | Dialogs / tooltips / help | Script support | Native review | Status | To `full` |
|
||
|---|---|---|---:|---|---|---|---|---:|
|
||
| 1 | English | `en` | 2,304 / 2,304 (100%, source) | all; Help ▸ What's New and the shortcut sheet; no full user manual | Latin (Inter) | n/a | **full** | 0 h |
|
||
| 2 | Simplified Chinese | `zh-hans` | 1,994 / 2,304 (87%) | menus, panels, dialogs, presets, profiles, dates; lower-layer errors English | Hans via craft-fonts (Noto Sans CJK SC); IME through winit; no vertical text in UI (not in target either) | no (community edits) | partial | 6–10 h |
|
||
| 3 | Spanish | `es` | 1,972 / 2,304 (86%) | as zh-hans | Latin | no (community edits) | partial | 6–10 h |
|
||
| 4 | Hindi | `hi` | 0 (0%) | none | **Devanagari shaping missing** (egui has no complex shaping) | no | none (target: not shipped) | 50–90 h (shaping 25–50 h, shared with Arabic) |
|
||
| 5 | Arabic | `ar` | 0 (0%) | none | **RTL layout and Arabic shaping missing** | no | none (target: not shipped) | 60–110 h (RTL mirroring 30–50 h + shaping, shared with Hindi) |
|
||
| 6 | French | `fr` | 2,021 / 2,304 (88%) | as zh-hans | Latin | no (community edits) | partial | 5–9 h |
|
||
| 7 | Portuguese (Brazil) | `pt-br` | 1,966 / 2,304 (85%) | as zh-hans | Latin | no (community edits) | partial | 6–10 h |
|
||
| 8 | Indonesian | `id` | 0 (0%) | none | Latin (Inter covers it) | no | none (target: not shipped) | 10–16 h |
|
||
| 9 | Japanese | `ja` | 1,995 / 2,304 (87%) | as zh-hans; vertical export watermarks | Jpan via craft-fonts (BIZ UDPGothic / UDMincho); IME through winit | no (community edits) | partial | 6–10 h |
|
||
| 10 | German | `de` | 2,104 / 2,304 (91%) | as zh-hans; What's New translated line by line | Latin | no (community edits) | partial | 4–8 h |
|
||
| 11 | Korean | `ko` | 0 (0%) | none | **no Korean (Hangul) face**: needs a non-Adobe OFL face in craft-fonts (Noto CJK is allowed only for Chinese) | no | none | 14–22 h |
|
||
| 12 | Vietnamese | `vi` | 0 (0%) | none | Latin with stacked diacritics (Inter covers it; check combining marks) | no | none (target: not shipped) | 10–16 h |
|
||
|
||
## Other languages LightCraft ships (3)
|
||
|
||
| Language | Code | UI strings translated | Script | Native review | Status | To `full` |
|
||
|---|---|---:|---|---|---|---:|
|
||
| Traditional Chinese (Taiwan) | `zh-hant` | 1,993 / 2,304 (87%) | Hant; uses the Simplified Chinese face until craft-fonts has a TC face | no (community edits) | partial | 8–14 h (incl. the font) |
|
||
| Russian | `ru` | 1,704 / 2,304 (74%) | Cyrillic (Inter) | no (community edits) | partial | 8–12 h |
|
||
| Ukrainian | `uk` | 2,287 / 2,304 (99%) | Cyrillic (Inter) | no (community edits) | partial (lower-layer errors English) | 2–4 h |
|
||
|
||
Target languages LightCraft lacks: Italian, Korean, Dutch, Polish, Swedish, Norwegian Bokmål, Thai
|
||
(Thai needs shaping and line breaking without spaces). Each Latin-script one is ~10–16 h; Thai
|
||
~20–35 h on top of the shaping work.
|
||
|
||
## Shared work before any language is `full` (counted once, ~20–35 h)
|
||
|
||
- Route lower-layer error messages (catalog, raw, codecs, engine) through translatable message ids
|
||
instead of English `format!` strings (~12–20 h).
|
||
- A check in `cargo xtask ci` that every user-visible literal reaches a catalog (~4–8 h).
|
||
- A user manual / help pages beyond What's New and the shortcut sheet (Lightroom links to online
|
||
help; ~4–8 h for a translatable in-app help index).
|
||
- Native-speaker review passes (human; cannot be done by agents).
|
||
|
||
## Totals
|
||
|
||
- Bring the 9 shipped non-English catalogs to `full`: ~55–90 h (incl. the shared work).
|
||
- Add the 5 missing key languages: ~145–255 h, most of it RTL and complex shaping in egui.
|
||
- Reach the target's 16 languages: + ~60–100 h (Italian, Dutch, Polish, Swedish, Norwegian, Thai).
|
||
|
||
## Revision history
|
||
|
||
| Date | Change | Summary |
|
||
|---|---|---|
|
||
| 2026-10-10 | major | Created: per-language counts measured from the catalogs, the twelve key languages, script support, estimates |
|