mirror of
https://github.com/storytold/lightcraft.git
synced 2026-10-27 19:47:35 -06:00
docs(i18n): document Vietnamese localization
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
co-authored by
Cursor
parent
9e558917e8
commit
07c8e4e68e
+18
-17
@@ -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-<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)).
|
||||
[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 |
|
||||
|
||||
@@ -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.
|
||||
@@ -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");
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user