From 07c8e4e68e234127015422c4c55ad6a87797a2df Mon Sep 17 00:00:00 2001 From: "DUY Tran Nhat (SAE-KIDS)" Date: Tue, 13 Oct 2026 17:13:29 +0700 Subject: [PATCH] docs(i18n): document Vietnamese localization Co-authored-by: Cursor --- docs/localization-parity.md | 35 +++++++++--------- docs/localization-vi.md | 74 +++++++++++++++++++++++++++++++++++++ docs/localization.md | 12 ++++-- 3 files changed, 100 insertions(+), 21 deletions(-) create mode 100644 docs/localization-vi.md diff --git a/docs/localization-parity.md b/docs/localization-parity.md index 18aae618a..cb6bad495 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -1,12 +1,12 @@ # 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 +> **Last reviewed:** 2026-10-13 · **Last updated:** 2026-10-13 · **Change:** minor (Vietnamese shipped; denominator remeasured) · **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-.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)). +[ru](localization-ru.md), [vi](localization-vi.md)). ## The target @@ -18,12 +18,12 @@ go beyond the target. ## How the numbers are measured -**Measured** (a Python count over `crates/ui-egui/locales/*.json`, 2026-10-10): +**Measured** (a Python count over `crates/ui-egui/locales/*.json`, 2026-10-13): -- The denominator is every message any catalog knows: the union of the plain catalogs' keys (2,074 +- The denominator is every message any catalog knows: the union of the plain catalogs' keys (2,222 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. + lines) plus the 249 messages of the formats catalogs (`*-formats.json`: text with runtime values and + date patterns), 2,471 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 @@ -45,26 +45,26 @@ that is promising but is not recorded as review, so the column says `no (communi | # | 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 | +| 1 | English | `en` | 2,471 / 2,471 (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` | 2,223 / 2,471 (90%) | 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 | 5–9 h | +| 3 | Spanish | `es` | 2,209 / 2,471 (89%) | as zh-hans | Latin | no (community edits) | partial | 5–9 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 | +| 6 | French | `fr` | 2,113 / 2,471 (85%) | as zh-hans | Latin | no (community edits) | partial | 5–9 h | +| 7 | Portuguese (Brazil) | `pt-br` | 2,106 / 2,471 (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 | +| 9 | Japanese | `ja` | 2,097 / 2,471 (85%) | 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,210 / 2,471 (89%) | 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 | +| 12 | Vietnamese | `vi` | 2,471 / 2,471 (100% key coverage of current union; intentional English like `ISO`/`OK` kept) | menus, panels, dialogs, presets, profiles, dates, formats; lower-layer errors English | Latin with stacked diacritics (Inter) | no (community contribution) | **full** (current localizable surface) | 0 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 | +| Traditional Chinese (Taiwan) | `zh-hant` | 2,095 / 2,471 (85%) | 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` | 2,373 / 2,471 (96%) | Cyrillic (Inter) | no (community edits) | partial | 2–4 h | +| Ukrainian | `uk` | 2,379 / 2,471 (96%) | Cyrillic (Inter) | no (community edits) | partial (lower-layer errors English) | 1–3 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 @@ -89,4 +89,5 @@ Target languages LightCraft lacks: Italian, Korean, Dutch, Polish, Swedish, Norw | Date | Change | Summary | |---|---|---| +| 2026-10-13 | minor | Remeasured denominator (2,222 plain + 249 formats = 2,471); Vietnamese shipped at full current localizable coverage | | 2026-10-10 | major | Created: per-language counts measured from the catalogs, the twelve key languages, script support, estimates | diff --git a/docs/localization-vi.md b/docs/localization-vi.md new file mode 100644 index 000000000..23eed342a --- /dev/null +++ b/docs/localization-vi.md @@ -0,0 +1,74 @@ +# LightCraft bằng tiếng Việt + +Chọn **Chỉnh sửa → Ngôn ngữ → Tiếng Việt** hoặc **Cài đặt → Chung → Ngôn ngữ**. +Lựa chọn áp dụng ngay và được lưu cho lần mở sau (`language: "vi"` trong `ui.json`). + +Các tag locale hệ thống sau cũng chọn tiếng Việt: `vi`, `vi-VN`, `vi_VN`, `vi_VN.UTF-8`. + +## Phạm vi + +Catalog tiếng Việt phủ **toàn bộ** bề mặt localization hiện tại của LightCraft +(đo 2026-10-13: union plain **2 222** + formats **249** = **2 471** thông điệp): + +- `crates/ui-egui/locales/vi.json` — thông điệp plain / nhãn hiển thị (2 222 khóa) +- `crates/ui-egui/locales/vi-formats.json` — thông điệp có giá trị runtime và mẫu ngày (249 khóa) + +Điều này là **100% bề mặt localizable/runtime hiện tại**, không phải “mọi chuỗi tiếng Anh +trong toàn bộ repository”. Lỗi kỹ thuật từ crate tầng dưới vẫn có thể là tiếng Anh, giống +các ngôn ngữ khác. + +## Quy ước thuật ngữ + +| English | Vietnamese | +|---|---| +| File / Folder | Tệp / Thư mục | +| Library / Album / Smart Album | Thư viện / Album / Album thông minh | +| Import / Export | Nhập / Xuất | +| Exposure / Contrast | Phơi sáng / Tương phản | +| Highlights / Shadows / Whites / Blacks | Vùng sáng / Vùng tối / Vùng trắng / Vùng đen | +| White Balance / Temperature / Tint | Cân bằng trắng / Nhiệt độ / Tint | +| Vibrance / Saturation | Độ rực rỡ / Độ bão hòa | +| Texture / Clarity / Dehaze / Grain / Vignette | Kết cấu / Độ rõ / Khử sương mù / Hạt / Tối góc | +| Tone Curve | Đường cong tông màu | +| Sharpening / Noise Reduction / Denoise | Làm nét / Giảm nhiễu / Khử nhiễu | +| Mask / Brush / Gradient | Mặt nạ / Cọ / Chuyển sắc | +| Preset / Profile / History / Version | Thiết lập sẵn / Hồ sơ / Lịch sử / Phiên bản | +| Appearance (giao diện) | Giao diện | +| Subject (AI) | Chủ thể | +| Candidate / the Select | Ảnh ứng viên / Ảnh được chọn | +| Flag / Picked / Rejected / Unflagged | Gắn cờ / Đã chọn / Đã loại / Không gắn cờ | + +Tên sản phẩm và chuẩn giữ nguyên khi là định danh: LightCraft, ArtCraft, GitHub, Discord, +JPEG, PNG, TIFF, WebP, AVIF, HEIF, HEIC, RAW, DNG, RGB, HDR, ICC, EXIF, XMP, GPU, MCP, SAM, ISO, OK. + +Tên album / preset / profile do người dùng tạo, tên tệp, command ID và metadata nhập tay +không được dịch. + +## Ngày và số lượng + +- Ngày đầy đủ: `{weekday}, {day}/{month}/{year}` (ví dụ `Chủ Nhật, 20/9/2026`) +- Tháng/năm: `Tháng {month} năm {year}` +- Thứ viết tắt trên date picker: T2…T7, CN +- Thông điệp đếm dùng dạng trung tính (`22 ảnh`), không tạo số ít/số nhiều nhân tạo như tiếng Anh + +## Font + +Tiếng Việt dùng Inter (Latin + dấu). Không cần craft-fonts CJK. Kiểm tra glyph trong +`vietnamese_panels_dialogs_and_diacritics_paint_with_bundled_fonts`. + +## Kiểm tra + +```sh +cargo test -p lightcraft-ui-egui i18n::tests -- --nocapture +LIGHTCRAFT_LANGUAGE=vi lightcraft-cli snapshot --demo -o vi.png --size 1600x1000 +LIGHTCRAFT_LANGUAGE=vi lightcraft-cli snapshot --demo -o vi-narrow.png --size 1280x800 +``` + +Các test tiếng Việt bắt buộc phủ catalog union, nhãn lệnh/control/Settings/Smart Album, +đổi ngôn ngữ, lưu `vi`, formats, ngày, dữ liệu người dùng, và glyph dấu. + +## Nguồn dịch (clean-room) + +Dịch từ chuỗi tiếng Anh nguồn của LightCraft. PhotoCraft / VectorCraft / PDFCraft chỉ dùng +làm bộ nhớ thuật ngữ khi cùng nguồn tiếng Anh và cùng ngữ cảnh UI. Không dùng gói ngôn ngữ +Adobe Lightroom hay tài nguyên độc quyền. diff --git a/docs/localization.md b/docs/localization.md index 715b871af..7f40c32fa 100644 --- a/docs/localization.md +++ b/docs/localization.md @@ -2,10 +2,13 @@ The interface ships in the language it is written in (English) plus every language in the table in `crates/ui-egui/src/i18n.rs`. Today that is English, Simplified Chinese (`zh-hans`), Traditional -Chinese (`zh-hant`, Taiwan), Japanese (`ja`), Brazilian Portuguese (`pt-br`), Spanish (`es`), German (`de`), Russian (`ru`) and French (`fr`). This file is the reference for **adding or maintaining a language**; the per-language notes -are in [`localization-zh-hans.md`](localization-zh-hans.md), [`localization-zh-hant.md`](localization-zh-hant.md), -[`localization-ja.md`](localization-ja.md), [`localization-pt-br.md`](localization-pt-br.md), [`localization-es.md`](localization-es.md), -[`localization-de.md`](localization-de.md) and [`localization-ru.md`](localization-ru.md). +Chinese (`zh-hant`, Taiwan), Japanese (`ja`), Brazilian Portuguese (`pt-br`), Spanish (`es`), German (`de`), +Russian (`ru`), French (`fr`), Ukrainian (`uk`) and Vietnamese (`vi`). This file is the reference for +**adding or maintaining a language**; the per-language notes are in +[`localization-zh-hans.md`](localization-zh-hans.md), [`localization-zh-hant.md`](localization-zh-hant.md), +[`localization-ja.md`](localization-ja.md), [`localization-pt-br.md`](localization-pt-br.md), +[`localization-es.md`](localization-es.md), [`localization-de.md`](localization-de.md), +[`localization-ru.md`](localization-ru.md) and [`localization-vi.md`](localization-vi.md). ## Adding a language @@ -30,6 +33,7 @@ are in [`localization-zh-hans.md`](localization-zh-hans.md), [`localization-zh-h De, "de", "Deutsch", "Latn", include_str!("../locales/de.json"); Ru, "ru", "Русский", "Cyrl", include_str!("../locales/ru.json"); Uk, "uk", "Українська", "Cyrl", include_str!("../locales/uk.json"); + Vi, "vi", "Tiếng Việt", "Latn", include_str!("../locales/vi.json"); } ```