i18n: translate print, import and table controls

Route visible labels through the existing translation and RTL helpers.
Keep document commands, stored options and user-defined style names intact.
Update the localization status and roadmap progress log.
This commit is contained in:
Ikki Nishihara
2026-10-11 14:44:39 +09:00
parent 16a7365701
commit 8143cb2a7d
5 changed files with 23 additions and 7 deletions
+5 -1
View File
@@ -2,7 +2,7 @@
**Stage: pre-alpha** · next: alpha, ~0% and ~15–25 h away; beta ~28 points and ~420–750 h beyond that (the core-workflow gate, not the percentage: ready for real work is already ~47%)
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** minor (stage re-normalized to pre-alpha by the core-workflow gate; earlier today: major, full re-measure against InDesign 2026 21.6; restructured to the craftrules progress-docs standard) · **Target:** Adobe InDesign 2026
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-11 · **Change:** minor (Japanese print, import and table controls localized; readiness estimates unchanged) · **Target:** Adobe InDesign 2026
DesignCraft aims at full Adobe InDesign parity, and to be better: faster, open (documented JSON
format + IDML), scriptable by agents (MCP), and available on the web.
@@ -129,6 +129,9 @@ list) · [roadmap.md](docs/roadmap.md) (milestones, plan) · [parity-checklist.m
Newest first.
- **2026-10-11** · Japanese captions now cover print ranges, imported style handling and table
row/column movement, including row-height distribution. Existing translation and RTL helpers
handle the display; command IDs, stored option values and user-defined style names are unchanged.
- **2026-10-10 (UI.4–UI.5):** Panel tabs can move into other groups, split the dock, float, resize and return to their saved locations through shared docking transactions. Layouts persist in custom workspaces; UI and control commands share the same validated action path. Shared pane geometry and widget-state theme application retain all five palettes and local fonts. Split panes send keyboard input only to the focused canvas and scope contextual toolbar IDs per pane. No readiness percentage change.
- **2026-10-10** · Version 0.6.0; releases add a Linux riscv64 tar.gz (cross-compiled, CLI
smoke-tested under QEMU).
@@ -166,6 +169,7 @@ Newest first.
| Date | Change | Summary |
|---|---|---|
| 2026-10-11 | minor | Localized Japanese print, import and table controls; readiness estimates unchanged |
| 2026-10-10 | minor | Full number 42% → 47% (method aligned with the standard: plain weighted sum, no new evidence); readiness table with hours per audience |
| 2026-10-10 | minor | Headline adds mainstream practitioner (~42%) and essentials user (~54%); method in docs/target-app-parity.md |
| 2026-10-10 | minor | Stage alpha → pre-alpha under the new core-workflow gate: manual text threading is missing; alpha gate table added to docs/roadmap.md |
+4 -4
View File
@@ -295,11 +295,11 @@ fn print_dialog(app: &crate::DesignApp, ui: &mut egui::Ui, d: &mut Dialog) {
crate::rtl::label(ui, crate::i18n::tr(&app.ui.language, "Pages:"));
ui.vertical(|ui| {
let range = d.s("range");
if ui.radio(range == "all", "All").clicked() {
if ui.radio(range == "all", crate::rtl::widget(ui, crate::i18n::tr(&app.ui.language, "All"))).clicked() {
d.fields.insert("range".into(), json!("all"));
}
ui.horizontal(|ui| {
if ui.radio(range == "range", "Range:").clicked() {
if ui.radio(range == "range", crate::rtl::widget(ui, crate::i18n::tr(&app.ui.language, "Range:"))).clicked() {
d.fields.insert("range".into(), json!("range"));
}
text_field(ui, d, "pages", 120.0);
@@ -1503,7 +1503,7 @@ pub fn show(app: &mut DesignApp, ctx: &egui::Context) {
let cur = d.s("styleConflicts");
ui.horizontal(|ui| {
for (v, l) in [("useExisting", "Use Document Style Definition"), ("redefine", "Redefine Document Style"), ("autoRename", "Auto Rename")] {
if ui.radio(cur == v, l).clicked() {
if ui.radio(cur == v, crate::rtl::widget(ui, crate::i18n::tr(&app.ui.language, l))).clicked() {
d.fields.insert("styleConflicts".into(), json!(v));
}
}
@@ -1516,7 +1516,7 @@ pub fn show(app: &mut DesignApp, ctx: &egui::Context) {
for w in &imported {
ui.label(w);
let mapped = d.fields.get("map").and_then(|m| m.get(w)).and_then(Value::as_str).unwrap_or("").to_string();
let shown = if mapped.is_empty() { "(import)".to_string() } else { mapped.clone() };
let shown = if mapped.is_empty() { crate::i18n::tr(&app.ui.language, "(import)").to_string() } else { mapped.clone() };
egui::ComboBox::from_id_salt(("imp_map", w)).selected_text(crate::rtl::widget(ui, &shown)).width(170.0).show_ui(ui, |ui| {
if ui.selectable_label(mapped.is_empty(),crate::rtl::widget(ui, crate::i18n::tr(&app.ui.language, "(import)"))).clicked()
&& let Some(m) = d.fields.get_mut("map").and_then(Value::as_object_mut)
+6
View File
@@ -808,6 +808,9 @@ pub(super) const TABLE: &[(&str, &str)] = &[
(" Open sample magazine ", " サンプルマガジンを開く "),
("(Top Level)", "(最上位)"),
("(import)", "(読み込み)"),
("Use Document Style Definition", "ドキュメントのスタイル定義を使用"),
("Redefine Document Style", "ドキュメントのスタイルを再定義"),
("Auto Rename", "自動で名前を変更"),
("Anchored Object", "アンカー付きオブジェクト"),
("Apply Attributes (Eyedropper", "属性を適用 (スポイト"),
("Baseline Grid", "ベースライングリッド"),
@@ -1266,6 +1269,7 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Col ←", "列 ←"),
("Col →", "列 →"),
("Row ↑", "行 ↑"),
("Distribute Rows Evenly", "行の高さを揃える"),
("Row ↓", "行 ↓"),
("Hide Others", "他のレイヤーを隠す"),
("Lock Others", "他のレイヤーをロック"),
@@ -1397,8 +1401,10 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Record", "レコード"),
("Merge options", "結合オプション"),
("All records", "すべてのレコード"),
("All", "すべて"),
("One record", "1件のレコード"),
("Range", "範囲"),
("Range:", "範囲:"),
("Records per page", "ページあたりのレコード"),
("Single record", "単一レコード"),
("Multiple records", "複数レコード"),
+1 -1
View File
@@ -52,7 +52,7 @@ pub fn show(app: &mut DesignApp, ui: &mut egui::Ui) {
("Col ←", "table.moveColumn", c0, c0.saturating_sub(1), c0 > 0),
("Col →", "table.moveColumn", c0, c0 + 1, c0 + 1 < nc),
] {
if ui.add_enabled(ok, egui::Button::new(crate::rtl::widget(ui, label)).small()).clicked()
if ui.add_enabled(ok, egui::Button::new(crate::rtl::widget(ui, crate::i18n::tr(&app.ui.language, label))).small()).clicked()
&& let Err(e) = app.run(id, json!({"from": from, "to": to}))
{
app.status(format!("Table: {e}"));
+7 -1
View File
@@ -1,6 +1,6 @@
# Localization parity
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** major (first version; catalogs measured) · **Target:** Adobe InDesign 2026 (21.6)
> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-11 · **Change:** minor (Japanese print, import and table controls localized; catalog counts remain the 2026-10-10 measurement) · **Target:** Adobe InDesign 2026 (21.6)
Per-language status of the DesignCraft interface and of document typesetting in each script.
Script-specific typesetting detail: [cjk.md](cjk.md), [cjk-typography.md](cjk-typography.md),
@@ -43,6 +43,11 @@ come as Middle East editions with an English or French interface and right-to-le
Percentages are of the 1,724 measured strings. A language is `full` only when every user-visible
string is translated and its script renders and edits correctly; none but English is.
Japanese follow-up (2026-10-11): print ranges, imported style handling, the built-in `(import)`
caption, table row/column movement and row-height distribution now use the existing translation
catalog. Print, import options and an active table were rendered in Japanese and English with
craft-fonts. The language totals above retain their dated measurement; this is a targeted fix.
## Other shipped languages
| Language | Code | UI strings translated | Status |
@@ -77,4 +82,5 @@ locale shaping. See [typography-parity.md](typography-parity.md).
| Date | Change | Summary |
|---|---|---|
| 2026-10-11 | minor | Localized Japanese print, import and table controls; checked Japanese and English renders |
| 2026-10-10 | major | Created: catalogs measured (1,724 strings), the twelve key languages plus Italian and Ukrainian |