diff --git a/crates/ui-egui/src/browser.rs b/crates/ui-egui/src/browser.rs index 55f55674..175703cf 100644 --- a/crates/ui-egui/src/browser.rs +++ b/crates/ui-egui/src/browser.rs @@ -19,6 +19,7 @@ use solidcraft_engine::doc::FeatureKind; use crate::context_menu::{Item, Target}; use crate::theme::Tokens; + use crate::{SolveApp, icons}; thread_local! { @@ -563,7 +564,7 @@ fn browser_panel(app: &mut SolveApp, ui: &mut egui::Ui, timeline_above: bool) { fn browser_contents(app: &mut SolveApp, ui: &mut egui::Ui, acts: &mut Actions) { let t = Tokens::get(); - ui.label(RichText::new("BROWSER").size(11.0).strong().color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("BROWSER")).size(11.0).strong().color(t.text_dim)); ui.add_space(4.0); browser_rows(app, ui, acts); } @@ -1077,27 +1078,27 @@ fn canvas_panel(app: &mut SolveApp, ctx: &egui::Context) { }); ui.end_row(); } - ui.label("Distance"); + ui.label(crate::i18n::tr_label("Distance")); ui.add(crate::prefs::length_drag(&mut m.distance, &app.session.doc.units, app.preferences.length_decimals).range(0.001..=1e6)); ui.end_row(); } else { let (mut x, mut y, mut w, mut ang, mut op, mut flip) = (c.center.x, c.center.y, c.width, c.angle.to_degrees(), c.opacity, c.flip); - ui.label("Center X"); + ui.label(crate::i18n::tr_label("Center X")); let r1 = ui.add(crate::prefs::length_drag(&mut x, &app.session.doc.units, app.preferences.length_decimals)); ui.end_row(); - ui.label("Center Y"); + ui.label(crate::i18n::tr_label("Center Y")); let r2 = ui.add(crate::prefs::length_drag(&mut y, &app.session.doc.units, app.preferences.length_decimals)); ui.end_row(); - ui.label("Width"); + ui.label(crate::i18n::tr_label("Width")); let r3 = ui.add(crate::prefs::length_drag(&mut w, &app.session.doc.units, app.preferences.length_decimals).range(0.01..=1e6)); ui.end_row(); - ui.label("Angle"); + ui.label(crate::i18n::tr_label("Angle")); let r4 = ui.add(egui::DragValue::new(&mut ang).speed(1.0).suffix(" deg")); ui.end_row(); - ui.label("Opacity"); + ui.label(crate::i18n::tr_label("Opacity")); let r5 = ui.add(egui::Slider::new(&mut op, 0.0..=1.0)); ui.end_row(); - ui.label("Flip"); + ui.label(crate::i18n::tr_label("Flip")); let r6 = ui.checkbox(&mut flip, ""); ui.end_row(); if [r1, r2, r3, r4, r5, r6].iter().any(|r| r.changed()) { @@ -1628,7 +1629,7 @@ fn occurrence_panel(app: &mut SolveApp, ui: &mut egui::Ui) { .collapsible(false) .show(&ctx, |ui| { if !m.path.is_empty() && app.session.occurrence_scope_count(&m.path).is_ok_and(|n| n > 1) { - ui.label("This child is shared. Position changes apply to every copy of its parent."); + ui.label(crate::i18n::tr_label("This child is shared. Position changes apply to every copy of its parent.")); } egui::Grid::new("sc_occ_grid").num_columns(2).spacing([12.0, 6.0]).show(ui, |ui| { for (k, axis) in ["X distance", "Y distance", "Z distance"].iter().enumerate() { @@ -1650,10 +1651,10 @@ fn occurrence_panel(app: &mut SolveApp, ui: &mut egui::Ui) { }); ui.add_space(6.0); ui.horizontal(|ui| { - if ui.button("Capture All Positions").clicked() { + if ui.button(crate::i18n::tr_label("Capture All Positions")).clicked() { action = Some("capture"); } - if ui.button("Revert All Positions").clicked() { + if ui.button(crate::i18n::tr_label("Revert All Positions")).clicked() { action = Some("revert"); } }); @@ -1842,7 +1843,7 @@ fn capture_prompt(app: &mut SolveApp, ctx: &egui::Context) { } let n = app.session.pending_moves.len(); let mut answer: Option<&str> = None; - crate::frame::window(ctx, "Capture Position", crate::frame::Width::Normal) + crate::frame::window(ctx, crate::i18n::tr_label("Capture Position"), crate::frame::Width::Normal) .id(egui::Id::new("sc_capture_prompt")) .collapsible(false) .resizable(false) @@ -1856,10 +1857,10 @@ fn capture_prompt(app: &mut SolveApp, ctx: &egui::Context) { ui.label(RichText::new("Capture keeps the new position; Revert puts it back.").color(Tokens::get().text_dim)); ui.add_space(6.0); ui.horizontal(|ui| { - if ui.button("Capture Position").clicked() { + if ui.button(crate::i18n::tr_label("Capture Position")).clicked() { answer = Some("capture"); } - if ui.button("Revert").clicked() { + if ui.button(crate::i18n::tr_label("Revert")).clicked() { answer = Some("revert"); } if ui.button("Cancel").clicked() { diff --git a/crates/ui-egui/src/canvas.rs b/crates/ui-egui/src/canvas.rs index 01fe4547..363c89c3 100644 --- a/crates/ui-egui/src/canvas.rs +++ b/crates/ui-egui/src/canvas.rs @@ -775,10 +775,10 @@ fn draw_revolve( } else { "Choose target".into() }; - ui.label(text).on_hover_text("Determined by To Object. Choose Angle to edit the angular extent."); + ui.label(text).on_hover_text(crate::i18n::tr_label("Determined by To Object. Choose Angle to edit the angular extent.")); } else if let Kind::Revolve { angle, .. } = &mut d.kind { ui.horizontal(|ui| { - ui.label(egui::RichText::new("Angle").color(Tokens::get().text_dim).size(11.5)); + ui.label(egui::RichText::new(crate::i18n::tr_label("Angle")).color(Tokens::get().text_dim).size(11.5)); let id = egui::Id::new("sc_canvas_value"); let response = ui.add(egui::TextEdit::singleline(angle).id(id).desired_width(72.0)); crate::params_dialog::complete(ui, &response, angle); diff --git a/crates/ui-egui/src/configuration_rules_ui.rs b/crates/ui-egui/src/configuration_rules_ui.rs index 0a0ebfbf..e88ec837 100644 --- a/crates/ui-egui/src/configuration_rules_ui.rs +++ b/crates/ui-egui/src/configuration_rules_ui.rs @@ -58,14 +58,14 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option, let suppression_features: Vec<(u64, String)> = features.iter().filter(|(id, _)| app.session.doc.configs.columns.contains(&Column::Suppress(*id))).cloned().collect(); ui.separator(); - ui.label(RichText::new("Configuration rules").strong()); + ui.label(RichText::new(crate::i18n::tr_label("Configuration rules")).strong()); ui.add(egui::Label::new("Rules run from top to bottom. Matched drives change effective values.").wrap()); ui.add(egui::Label::new("Matched restrictions check the final values.").wrap()); for (index, rule) in rules.iter().enumerate() { ui.push_id(&rule.id, |ui| { ui.horizontal(|ui| { let mut enabled = rule.enabled; - if ui.checkbox(&mut enabled, "").on_hover_text("Enable rule").changed() { + if ui.checkbox(&mut enabled, "").on_hover_text(crate::i18n::tr_label("Enable rule")).changed() { let mut r = rule.clone(); r.enabled = enabled; *error = app.run("config.rule", json!({"rule":r})).err(); @@ -74,10 +74,14 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option, if ui.small_button("Edit").clicked() { editor.rule = rule.clone(); } - if ui.add_enabled(index > 0, egui::Button::new("↑").small()).on_hover_text("Move earlier").clicked() { + if ui.add_enabled(index > 0, egui::Button::new("↑").small()).on_hover_text(crate::i18n::tr_label("Move earlier")).clicked() { *error = app.run("config.rule", json!({"id":rule.id,"index":index-1})).err(); } - if ui.add_enabled(index + 1 < rules.len(), egui::Button::new("↓").small()).on_hover_text("Move later").clicked() { + if ui + .add_enabled(index + 1 < rules.len(), egui::Button::new("↓").small()) + .on_hover_text(crate::i18n::tr_label("Move later")) + .clicked() + { *error = app.run("config.rule", json!({"id":rule.id,"index":index+1})).err(); } if ui.small_button("Delete").clicked() { @@ -98,7 +102,7 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option, ui.collapsing("Add or edit rule", |ui| { ui.horizontal(|ui| { expression(ui, "Rule name", &mut editor.rule.name); - ui.checkbox(&mut editor.rule.enabled, "Enabled"); + ui.checkbox(&mut editor.rule.enabled, crate::i18n::tr_label("Enabled")); if ui.small_button("New").clicked() { editor.rule = Editor::default().rule; } @@ -106,7 +110,7 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option, let mut length_unit = editor.rule.length_unit.clone().unwrap_or_else(|| app.session.doc.units.clone()); let old_unit = length_unit.clone(); ui.horizontal(|ui| { - ui.label("Length units"); + ui.label(crate::i18n::tr_label("Length units")); choose(ui, "rule_length_units", &mut length_unit, &["mm".into(), "cm".into(), "m".into(), "in".into(), "ft".into()]); }); if length_unit != old_unit { @@ -122,7 +126,7 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option, .to_string(); let prior = effect_kind.clone(); ui.horizontal(|ui| { - ui.label("Then"); + ui.label(crate::i18n::tr_label("Then")); choose( ui, "rule_effect_kind", @@ -149,7 +153,7 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option, RuleEffect::DriveSuppression { feature, value } => { ui.horizontal(|ui| { feature_choice(ui, "effect_feature", feature, &suppression_features); - ui.checkbox(value, "Suppressed"); + ui.checkbox(value, crate::i18n::tr_label("Suppressed")); }); } RuleEffect::ParameterRange { parameter, minimum, maximum } => { @@ -164,13 +168,13 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option, RuleEffect::AllowParameterValues { parameter, expressions } => { choose(ui, "allowed_parameter", parameter, ¶meters); let mut text = expressions.join("; "); - ui.label("Allowed expressions, separated by semicolons"); + ui.label(crate::i18n::tr_label("Allowed expressions, separated by semicolons")); if ui.add(egui::TextEdit::singleline(&mut text).desired_width(300.0)).changed() { *expressions = text.split(';').map(|s| s.trim().to_string()).collect(); } } } - if ui.add_enabled(!app.session.doc.configs.rows.is_empty(), egui::Button::new("Save Rule")).clicked() { + if ui.add_enabled(!app.session.doc.configs.rows.is_empty(), egui::Button::new(crate::i18n::tr_label("Save Rule"))).clicked() { let result = (|| -> Result<(), String> { let mut rule = editor.rule.clone(); if rule.id.is_empty() { @@ -190,7 +194,7 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option, let previous_row = editor.row.clone(); ui.horizontal(|ui| { choose(ui, "preview_configuration", &mut editor.row, &rows); - if ui.add_enabled(!editor.row.is_empty(), egui::Button::new("Preview Row")).clicked() { + if ui.add_enabled(!editor.row.is_empty(), egui::Button::new(crate::i18n::tr_label("Preview Row"))).clicked() { match app.session.execute("config.preview", &json!({"row":editor.row})) { Ok(result) => { editor.preview = Some(result); @@ -209,7 +213,7 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option, } if let Some(preview) = &editor.preview { ui.collapsing(format!("Preview: {}", preview["active"].as_str().unwrap_or("row")), |ui| { - ui.label("Preview leaves the current design unchanged."); + ui.label(crate::i18n::tr_label("Preview leaves the current design unchanged.")); if let Some(styles) = preview["styles"].as_array() { for style in styles { ui.add( @@ -287,7 +291,7 @@ fn condition_editor(ui: &mut Ui, condition: &mut RuleCondition, parameters: &[St choices.extend(["All".into(), "Any".into(), "Not".into()]); } ui.horizontal(|ui| { - ui.label("When"); + ui.label(crate::i18n::tr_label("When")); choose(ui, "condition_kind", &mut kind, &choices); }); if previous != kind { @@ -336,7 +340,7 @@ fn condition_editor(ui: &mut Ui, condition: &mut RuleCondition, parameters: &[St RuleCondition::Suppression { feature, value } => { ui.horizontal(|ui| { feature_choice(ui, "condition_feature", feature, features); - ui.checkbox(value, "Suppressed"); + ui.checkbox(value, crate::i18n::tr_label("Suppressed")); }); } RuleCondition::All { conditions } | RuleCondition::Any { conditions } => { @@ -354,7 +358,7 @@ fn condition_editor(ui: &mut Ui, condition: &mut RuleCondition, parameters: &[St if let Some(index) = remove { conditions.remove(index); } - if ui.add_enabled(conditions.len() < 32, egui::Button::new("Add condition").small()).clicked() { + if ui.add_enabled(conditions.len() < 32, egui::Button::new(crate::i18n::tr_label("Add condition")).small()).clicked() { conditions.push(RuleCondition::Always); } } diff --git a/crates/ui-egui/src/context_menu.rs b/crates/ui-egui/src/context_menu.rs index 629ecc70..a8c465be 100644 --- a/crates/ui-egui/src/context_menu.rs +++ b/crates/ui-egui/src/context_menu.rs @@ -17,6 +17,7 @@ use serde_json::{Value, json}; use solidcraft_engine::Sel; use crate::theme::Tokens; + use crate::{SolveApp, icons}; /// What a menu is about. @@ -1580,7 +1581,7 @@ fn show_rename(app: &mut SolveApp, ctx: &egui::Context) { let resp = crate::frame::area(egui::Id::new("sc_rename")).fixed_pos(r.at).constrain(true).order(egui::Order::Foreground).show(ctx, |ui| { menu_frame(ui, |ui| { ui.add_space(2.0); - ui.label(egui::RichText::new("Rename").size(11.0).color(t.text_dim)); + ui.label(egui::RichText::new(crate::i18n::tr_label("Rename")).size(11.0).color(t.text_dim)); let te = ui.add(egui::TextEdit::singleline(&mut r.text).desired_width(200.0).id(egui::Id::new("sc_rename_text"))); if !r.focused { // Start with the whole name selected, ready to type over. @@ -1637,27 +1638,27 @@ fn show_props(app: &mut SolveApp, ctx: &egui::Context) { let total = &v["total"]; let bodies = v["bodies"].as_array().cloned().unwrap_or_default(); if let [b] = bodies.as_slice() { - ui.label("Material"); + ui.label(crate::i18n::tr_label("Material")); ui.label(b["material"].as_str().unwrap_or("Default")); ui.end_row(); - ui.label("Density"); + ui.label(crate::i18n::tr_label("Density")); ui.label(format!("{:.3} g/cm³", f(b, "density_g_cm3"))); ui.end_row(); } - ui.label("Mass"); + ui.label(crate::i18n::tr_label("Mass")); ui.label(format!("{:.3} g", f(total, "mass_g"))); ui.end_row(); - ui.label("Volume"); + ui.label(crate::i18n::tr_label("Volume")); ui.label(crate::prefs::show_mm(app, f(total, "volume_mm3"), 3)); ui.end_row(); - ui.label("Area"); + ui.label(crate::i18n::tr_label("Area")); ui.label(crate::prefs::show_mm(app, f(total, "area_mm2"), 2)); ui.end_row(); let geometry = if total.get("center_of_mass").is_some() { Some(total) } else { bodies.first().filter(|_| bodies.len() == 1) }; if let Some(b) = geometry { if let Some(c) = b["center_of_mass"].as_array() { let c: Vec = c.iter().map(|x| crate::prefs::show_mm_bare(app, x.as_f64().unwrap_or(f64::NAN))).collect(); - ui.label("Center of mass"); + ui.label(crate::i18n::tr_label("Center of mass")); ui.label(format!("({}) {}", c.join(", "), crate::prefs::unit_scale(&app.session.doc.units).1)); ui.end_row(); } @@ -1668,12 +1669,12 @@ fn show_props(app: &mut SolveApp, ctx: &egui::Context) { .zip(z) .map(|(a, z)| crate::prefs::show_mm_bare(app, z.as_f64().unwrap_or(0.0) - a.as_f64().unwrap_or(0.0))) .collect(); - ui.label("Bounding box"); + ui.label(crate::i18n::tr_label("Bounding box")); ui.label(format!("{} {}", d.join(" × "), crate::prefs::unit_scale(&app.session.doc.units).1)); ui.end_row(); } } - ui.label("Faces / edges / vertices"); + ui.label(crate::i18n::tr_label("Faces / edges / vertices")); ui.label(format!("{} / {} / {}", total["faces"], total["edges"], total["vertices"])); ui.end_row(); }); diff --git a/crates/ui-egui/src/crash_ui.rs b/crates/ui-egui/src/crash_ui.rs index fb041405..c95bb5f9 100644 --- a/crates/ui-egui/src/crash_ui.rs +++ b/crates/ui-egui/src/crash_ui.rs @@ -61,7 +61,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { let mut open = true; let mut report: Option = None; let mut delete: Option> = None; - crate::frame::window(ctx, "Crash Reports", crate::frame::Width::Wide) + crate::frame::window(ctx, crate::i18n::tr_label("Crash Reports"), crate::frame::Width::Wide) .id(egui::Id::new("sc_crash_reports")) .open(&mut open) .default_size(vec2(620.0, 420.0)) @@ -84,7 +84,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { } ui.separator(); if app.crashes.reports.is_empty() { - ui.label("No crash reports."); + ui.label(crate::i18n::tr_label("No crash reports.")); } egui::ScrollArea::vertical().max_height(320.0).show(ui, |ui| { for r in &app.crashes.reports { @@ -119,7 +119,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { ui.label(RichText::new(&app.crashes.note).color(t.text_dim)); } ui.separator(); - if !app.crashes.reports.is_empty() && ui.button("Delete all").clicked() { + if !app.crashes.reports.is_empty() && ui.button(crate::i18n::tr_label("Delete all")).clicked() { delete = Some(None); } }); diff --git a/crates/ui-egui/src/delete.rs b/crates/ui-egui/src/delete.rs index d719a380..0781dde9 100644 --- a/crates/ui-egui/src/delete.rs +++ b/crates/ui-egui/src/delete.rs @@ -107,7 +107,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { }; let (deleted, fails) = (list("deleted"), list("would_fail")); let mut answer: Option = None; - crate::frame::window(ctx, "Delete", crate::frame::Width::Normal) + crate::frame::window(ctx, crate::i18n::tr_label("Delete"), crate::frame::Width::Normal) .id(egui::Id::new("sc_delete_confirm")) .collapsible(false) .resizable(false) @@ -115,10 +115,10 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { .show(ctx, |ui| { ui.set_max_width(360.0); if shared_occurrences(app, &p.params) { - ui.label("This child is shared. Deleting it removes it from every copy of its parent."); + ui.label(crate::i18n::tr_label("This child is shared. Deleting it removes it from every copy of its parent.")); } if !deleted.is_empty() { - ui.label("These features will be deleted:"); + ui.label(crate::i18n::tr_label("These features will be deleted:")); for d in deleted.iter().take(20) { ui.label(RichText::new(format!(" • {d}")).color(t.text)); } @@ -128,7 +128,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { } if !fails.is_empty() { ui.add_space(6.0); - ui.label(RichText::new("These features will fail:").color(t.warning)); + ui.label(RichText::new(crate::i18n::tr_label("These features will fail:")).color(t.warning)); for f in fails.iter().take(20) { ui.label(RichText::new(format!(" • {f}")).color(t.warning)); } diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index bab47fd2..b5dee163 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -1257,7 +1257,7 @@ fn input_rows(d: &mut Dialog, ui: &mut egui::Ui) { if chip.on_hover_text(tooltip).clicked() { activate = Some(i); } - if !inp.items.is_empty() && ui.small_button("×").on_hover_text("Clear the selection").clicked() { + if !inp.items.is_empty() && ui.small_button("×").on_hover_text(tr("Clear the selection")).clicked() { clear = Some(i); } }); @@ -1363,7 +1363,7 @@ fn measure_rows(app: &SolveApp, ui: &mut egui::Ui, r: Option<&Value>) { let t = Tokens::get(); let Some(r) = r else { ui.label(""); - ui.label(RichText::new("pick one or two vertices, edges or faces").color(t.text_dim)); + ui.label(RichText::new(tr("pick one or two vertices, edges or faces")).color(t.text_dim)); ui.end_row(); return; }; @@ -1388,7 +1388,7 @@ fn measure_rows(app: &SolveApp, ui: &mut egui::Ui, r: Option<&Value>) { ui.end_row(); } if r.get("distance_mm").is_some() { - ui.label(RichText::new("Distance").strong()); + ui.label(RichText::new(tr("Distance")).strong()); ui.label(RichText::new(fmt_mm(app, &r["distance_mm"])).strong()); ui.end_row(); let d = &r["delta"]; @@ -1399,7 +1399,7 @@ fn measure_rows(app: &SolveApp, ui: &mut egui::Ui, r: Option<&Value>) { } } if let Some(a) = r["angle_deg"].as_f64() { - ui.label(RichText::new("Angle").strong()); + ui.label(RichText::new(tr("Angle")).strong()); ui.label(RichText::new(format!("{a:.3}°")).strong()); ui.end_row(); } @@ -1555,10 +1555,10 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { && let Some(selection @ Sel::Face { .. }) = d.inputs.first().and_then(|i| i.items.first()) { row_label(ui, "Attachment"); - ui.label("This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane."); + ui.label(tr("This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.")); ui.end_row(); row_label(ui, ""); - if ui.button("Use fixed plane").clicked() + if ui.button(tr("Use fixed plane")).clicked() && let Some(mut plane) = crate::sketch_attachment_ui::face_plane(app, selection) { plane["fixed"] = json!(true); @@ -1606,7 +1606,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { if *direction < 2 { row_label(ui, "Reverse"); let mut reverse = *direction == 1; - if ui.checkbox(&mut reverse, "Reverse Direction").changed() { + if ui.checkbox(&mut reverse, tr("Reverse Direction")).changed() { *direction = usize::from(reverse); } ui.end_row(); @@ -1791,9 +1791,9 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { row_label(ui, "Mid Radius"); ui.horizontal(|ui| { ui.add(egui::DragValue::new(t).speed(0.01).range(0.01..=0.99).fixed_decimals(2)) - .on_hover_text("Position along the edge, 0 at the start end, 1 at the other"); + .on_hover_text(tr("Position along the edge, 0 at the start end, 1 at the other")); enter |= field(ui, r); - if ui.small_button("×").on_hover_text("Remove this point").clicked() { + if ui.small_button("×").on_hover_text(tr("Remove this point")).clicked() { remove = Some(k); } }); @@ -1803,7 +1803,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { mids.remove(k); } row_label(ui, ""); - if ui.button("Add Mid Radius").clicked() && mids.len() < 20 { + if ui.button(tr("Add Mid Radius")).clicked() && mids.len() < 20 { let t = if mids.is_empty() { 0.5 } else { (mids.iter().map(|m| m.0).fold(0.0, f64::max) + 1.0) * 0.5 }; mids.push((t.min(0.99), radius.clone())); } @@ -1887,7 +1887,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { enter |= field(ui, thickness); ui.end_row(); row_label(ui, "Depth"); - let r = ui.add(egui::TextEdit::singleline(depth).hint_text("to the next face")); + let r = ui.add(egui::TextEdit::singleline(depth).hint_text(tr("to the next face"))); crate::params_dialog::complete(ui, &r, depth); enter |= r.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)); ui.end_row(); @@ -1928,7 +1928,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { Kind::BoundaryFill { operation, cells, .. } => { row_label(ui, "Cells"); if cells.is_empty() { - ui.label(RichText::new("Pick the tool bodies").color(Tokens::get().text_dim)); + ui.label(RichText::new(tr("Pick the tool bodies")).color(Tokens::get().text_dim)); } ui.end_row(); for (i, (_, label, on)) in cells.iter_mut().enumerate() { @@ -1988,7 +1988,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { } ui.end_row(); row_label(ui, "Size"); - let r = ui.add(egui::TextEdit::singleline(designation).hint_text("fits the face, e.g. M8")); + let r = ui.add(egui::TextEdit::singleline(designation).hint_text(tr("fits the face, e.g. M8"))); enter |= r.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)); ui.end_row(); if !full { @@ -2117,7 +2117,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { row_label(ui, "Position"); ui.horizontal(|ui| { ui.label(format!("{:.2}, {:.2}, {:.2}", p.x, p.y, p.z)); - if ui.small_button("×").on_hover_text("Place at the origin instead").clicked() { + if ui.small_button("×").on_hover_text(tr("Place at the origin instead")).clicked() { *at = None; } }); @@ -2210,7 +2210,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { let (sr, sresp) = ui.allocate_exact_size(vec2(14.0, 14.0), egui::Sense::hover()); if app.preview.busy { egui::Spinner::new().size(14.0).paint_at(ui, sr); - sresp.on_hover_text("Updating the preview"); + sresp.on_hover_text(tr("Updating the preview")); } let raw_label = if matches!(d.kind, Kind::ConfirmDelete { .. }) { "Delete" } else { "OK" }; let label = tr(raw_label); @@ -2499,8 +2499,8 @@ fn hole_defaults() -> Kind { fn params_table(app: &mut SolveApp, ui: &mut egui::Ui, new_name: &mut String, new_expr: &mut String) { let t = Tokens::get(); - ui.label(RichText::new("Name").strong()); - ui.label(RichText::new("Expression · value").strong()); + ui.label(RichText::new(tr("Name")).strong()); + ui.label(RichText::new(tr("Expression · value")).strong()); ui.end_row(); let (vals, errs) = app.session.doc.param_values(); let params = app.session.doc.params.clone(); @@ -2541,10 +2541,10 @@ fn params_table(app: &mut SolveApp, ui: &mut egui::Ui, new_name: &mut String, ne }); ui.end_row(); } - ui.add(egui::TextEdit::singleline(new_name).hint_text("new name").desired_width(110.0)); + ui.add(egui::TextEdit::singleline(new_name).hint_text(tr("new name")).desired_width(110.0)); ui.horizontal(|ui| { - ui.add(egui::TextEdit::singleline(new_expr).hint_text("expression, e.g. 25 mm").desired_width(160.0)); - if ui.button("Add").clicked() + ui.add(egui::TextEdit::singleline(new_expr).hint_text(tr("expression, e.g. 25 mm")).desired_width(160.0)); + if ui.button(tr("Add")).clicked() && !new_name.is_empty() && app.run("parameters.change", json!({"name": new_name, "expression": new_expr})).is_ok() { diff --git a/crates/ui-egui/src/dialogs_appearance.rs b/crates/ui-egui/src/dialogs_appearance.rs index bc8bf0b4..c1ec64d7 100644 --- a/crates/ui-egui/src/dialogs_appearance.rs +++ b/crates/ui-egui/src/dialogs_appearance.rs @@ -315,7 +315,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Ap, inputs: &mut [Sel ui.label(format!("Component: {component}")); ui.end_row(); row_label(ui, ""); - if ui.button("Select bodies or faces instead").clicked() { + if ui.button(crate::i18n::tr_label("Select bodies or faces instead")).clicked() { k.component = None; } ui.end_row(); @@ -353,7 +353,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Ap, inputs: &mut [Sel let picked: Vec = inputs.first().map(|i| i.items.clone()).unwrap_or_default(); ui.horizontal(|ui| { let has_target = !picked.is_empty() || k.component.is_some(); - if ui.add_enabled(has_target, egui::Button::new("Apply to selection")).clicked() + if ui.add_enabled(has_target, egui::Button::new(crate::i18n::tr_label("Apply to selection"))).clicked() && let Some(p) = selected_params(k, &picked) { k.remove_override = false; @@ -366,8 +366,8 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Ap, inputs: &mut [Sel }); } if ui - .add_enabled(has_target, egui::Button::new("Remove override")) - .on_hover_text("Restore the inherited component or physical material appearance") + .add_enabled(has_target, egui::Button::new(crate::i18n::tr_label("Remove override"))) + .on_hover_text(crate::i18n::tr_label("Restore the inherited component or physical material appearance")) .clicked() && let Some(p) = clear_params(k, &picked) { @@ -420,7 +420,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Ap, inputs: &mut [Sel combo(ui, "ap_cat", &refs, &mut k.category); ui.end_row(); row_label(ui, "Search"); - let search = ui.add(egui::TextEdit::singleline(&mut k.search).hint_text("Appearance name").desired_width(190.0)); + let search = ui.add(egui::TextEdit::singleline(&mut k.search).hint_text(crate::i18n::tr_label("Appearance name")).desired_width(190.0)); crate::scenario::publish_handle("appearance:search", search.rect.center()); ui.end_row(); row_label(ui, ""); @@ -429,7 +429,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Ap, inputs: &mut [Sel let shown: Vec<(usize, &Look)> = lib.iter().enumerate().filter(|(_, l)| (k.category == 0 || l.category == want) && l.name.to_lowercase().contains(&query)).collect(); if shown.is_empty() { - ui.label(RichText::new("No matching appearances").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("No matching appearances")).color(t.text_dim)); } swatch_rows(ui, &shown, |ui, (i, l)| { let picked_look = k.look.as_deref() == Some(l.name.as_str()); diff --git a/crates/ui-egui/src/dialogs_assembly.rs b/crates/ui-egui/src/dialogs_assembly.rs index 0ab3c1a1..55e8582d 100644 --- a/crates/ui-egui/src/dialogs_assembly.rs +++ b/crates/ui-egui/src/dialogs_assembly.rs @@ -18,6 +18,7 @@ use crate::dialogs::{Dialog, Kind, combo, field, row_label}; use crate::preview::{Built, Colors}; use crate::selection::{BODIES, EDGES, FACES, SelInput, VERTICES}; use crate::theme::Tokens; + use crate::viewport::Proj; /// Joint types in the order the Type box lists them (command names). @@ -398,7 +399,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Asm, inputs: &mut [Se match k { Asm::NewComponent { name, activate } => { row_label(ui, "Name"); - let r = ui.add(egui::TextEdit::singleline(name).hint_text("Component1")); + let r = ui.add(egui::TextEdit::singleline(name).hint_text(crate::i18n::tr_label("Component1"))); enter |= r.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)); ui.end_row(); row_label(ui, "Activate"); @@ -467,7 +468,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Asm, inputs: &mut [Se } Asm::JointOrigin { name, .. } => { row_label(ui, "Name"); - let r = ui.add(egui::TextEdit::singleline(name).hint_text("Joint Origin1")); + let r = ui.add(egui::TextEdit::singleline(name).hint_text(crate::i18n::tr_label("Joint Origin1"))); enter |= r.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)); ui.end_row(); } @@ -477,7 +478,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Asm, inputs: &mut [Se let list = movable(s); if list.is_empty() { row_label(ui, ""); - ui.label(RichText::new("no joint that moves yet").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("no joint that moves yet")).color(t.text_dim)); ui.end_row(); return false; } @@ -552,7 +553,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Asm, inputs: &mut [Se let joints = &s.doc.assembly.joints; if joints.len() < 2 { row_label(ui, ""); - ui.label(RichText::new("needs two joints").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("needs two joints")).color(t.text_dim)); ui.end_row(); return false; } @@ -638,13 +639,13 @@ fn interference_rows(app: &SolveApp, ui: &mut egui::Ui, r: &Value) { let unchecked = r["unchecked"].as_array().cloned().unwrap_or_default(); if hits.is_empty() && unchecked.is_empty() { row_label(ui, "Result"); - ui.label(RichText::new("no interference").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("no interference")).color(t.text_dim)); ui.end_row(); return; } if !hits.is_empty() { row_label(ui, "Interferes"); - ui.label(RichText::new("Volume").strong()); + ui.label(RichText::new(crate::i18n::tr_label("Volume")).strong()); ui.end_row(); } for h in hits { @@ -992,11 +993,11 @@ fn joint_menu( open: &mut Option, run: &mut Option<(&'static str, Value)>, ) { - if ui.button("Edit Joint").clicked() { + if ui.button(crate::i18n::tr_label("Edit Joint")).clicked() { *open = edit_joint(app, id); ui.close(); } - if kind != JointKind::Rigid && ui.button("Drive Joint").clicked() { + if kind != JointKind::Rigid && ui.button(crate::i18n::tr_label("Drive Joint")).clicked() { *open = drive_joint(app, id); ui.close(); } diff --git a/crates/ui-egui/src/dialogs_motion.rs b/crates/ui-egui/src/dialogs_motion.rs index 1aef9842..523d8c68 100644 --- a/crates/ui-egui/src/dialogs_motion.rs +++ b/crates/ui-egui/src/dialogs_motion.rs @@ -368,14 +368,14 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel if ui.small_button(if off { "Unsuppress" } else { "Suppress" }).clicked() { let _ = app.run("contact.edit", json!({"set": n, "suppressed": !off})); } - if ui.small_button("×").on_hover_text("Delete the set").clicked() { + if ui.small_button("×").on_hover_text(crate::i18n::tr_label("Delete the set")).clicked() { let _ = app.run("contact.edit", json!({"set": n, "delete": true})); } }); ui.end_row(); } row_label(ui, ""); - if ui.button("Check collisions").clicked() { + if ui.button(crate::i18n::tr_label("Check collisions")).clicked() { *check = Some(app.session.execute("contact.check", &json!({})).unwrap_or_else(|e| json!({"error": e.to_string()}))); } ui.end_row(); @@ -415,7 +415,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel let moving = joints_moving(app); if moving.is_empty() { row_label(ui, ""); - ui.label(RichText::new("no joint that moves yet").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("no joint that moves yet")).color(t.text_dim)); ui.end_row(); return enter; } @@ -448,7 +448,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel *playing = false; } ui.add_space(6.0); - ui.checkbox(looping, "Loop"); + ui.checkbox(looping, crate::i18n::tr_label("Loop")); let names: Vec = SPEEDS.iter().map(|x| format!("{x}×")).collect(); let refs: Vec<&str> = names.iter().map(String::as_str).collect(); combo(ui, "ms_speed", &refs, speed); @@ -479,7 +479,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel row_label(ui, &format!("Track {}", ti + 1)); ui.horizontal(|ui| { combo(ui, &format!("ms_joint{ti}"), &refs, &mut pos); - if ui.small_button("×").on_hover_text("Remove the track").clicked() { + if ui.small_button("×").on_hover_text(crate::i18n::tr_label("Remove the track")).clicked() { remove = Some(ti); } }); @@ -532,7 +532,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel tracks.remove(i); } row_label(ui, ""); - if ui.button("Add Key").on_hover_text("Key a joint's value at this step").clicked() + if ui.button(crate::i18n::tr_label("Add Key")).on_hover_text(crate::i18n::tr_label("Key a joint's value at this step")).clicked() && let Some((ji, _, kind)) = moving.first() { let unit = if kind.is_angle(0) { "deg" } else { "mm" }; @@ -622,7 +622,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); egui::Grid::new("configuration_table").num_columns(2).min_col_width(210.0).spacing(vec2(10.0, 8.0)).show(ui, |ui| { // Header. - ui.label(RichText::new("Configuration").strong()); + ui.label(RichText::new(crate::i18n::tr_label("Configuration")).strong()); ui.horizontal(|ui| { for c in &tb.columns { ui.allocate_ui_with_layout(vec2(190.0, 22.0), egui::Layout::left_to_right(egui::Align::Center), |ui| { @@ -641,7 +641,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel .map(str::to_string) .unwrap_or(label); ui.add_sized(vec2(156.0, 22.0), egui::Label::new(RichText::new(label).strong()).truncate()).on_hover_text(c); - if ui.small_button("×").on_hover_text("Remove the column").clicked() { + if ui.small_button("×").on_hover_text(crate::i18n::tr_label("Remove the column")).clicked() { let key = if kind == "suppress" { "feature" } else { kind }; run( app, @@ -663,11 +663,11 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel ) .on_hover_text(name); if active { - ui.label(RichText::new("Active").color(t.accent)); + ui.label(RichText::new(crate::i18n::tr_label("Active")).color(t.accent)); if v.get("matches").and_then(Value::as_bool) == Some(false) && ui.button("Apply").clicked() { run(app, error, "config.activate", json!({ "row": name })); } - } else if ui.button("Activate").clicked() { + } else if ui.button(crate::i18n::tr_label("Activate")).clicked() { run(app, error, "config.activate", json!({ "row": name })); } }); @@ -737,7 +737,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel } }); } - if ui.small_button("×").on_hover_text("Delete the row").clicked() { + if ui.small_button("×").on_hover_text(crate::i18n::tr_label("Delete the row")).clicked() { run(app, error, "config.row", json!({"name": name, "delete": true})); } }); @@ -748,8 +748,12 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel // New row (a copy of the active one) and new column. ui.horizontal(|ui| { ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - ui.add(egui::TextEdit::singleline(new_row).hint_text("new configuration").desired_width(160.0)); - if ui.button("Add Row").on_hover_text("A new configuration, a copy of the active one").clicked() { + ui.add(egui::TextEdit::singleline(new_row).hint_text(crate::i18n::tr_label("new configuration")).desired_width(160.0)); + if ui + .button(crate::i18n::tr_label("Add Row")) + .on_hover_text(crate::i18n::tr_label("A new configuration, a copy of the active one")) + .clicked() + { let name = if new_row.trim().is_empty() { (tb.rows.len() + 1..).map(|k| format!("Configuration{k}")).find(|n| !tb.rows.iter().any(|r| &r.0 == n)).unwrap_or_default() } else { @@ -802,7 +806,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Mo, inputs: &mut [Sel } } ui.menu_button("Face Appearance", |ui| { - ui.label("Semantic faces share their appearance across instances."); + ui.label(crate::i18n::tr_label("Semantic faces share their appearance across instances.")); let state = app.session.model.state(); for body in &state.bodies { if body.body.is_mesh() { diff --git a/crates/ui-egui/src/dialogs_parts.rs b/crates/ui-egui/src/dialogs_parts.rs index 5097cf61..c86101c7 100644 --- a/crates/ui-egui/src/dialogs_parts.rs +++ b/crates/ui-egui/src/dialogs_parts.rs @@ -123,7 +123,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Pt, inputs: &[SelInpu }; if lib.is_empty() { row_label(ui, ""); - ui.label(RichText::new("the parts library is not available").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("the parts library is not available")).color(t.text_dim)); ui.end_row(); return false; } @@ -178,7 +178,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Pt, inputs: &[SelInpu ui.add(egui::Image::new(&tx).fit_to_exact_size(vec2(180.0, 112.0)).corner_radius(4.0)); } None => { - ui.label(RichText::new("no picture").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("no picture")).color(t.text_dim)); } } ui.end_row(); @@ -193,7 +193,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Pt, inputs: &[SelInpu } if inputs.first().is_some_and(|i| i.items.is_empty()) { row_label(ui, ""); - ui.label(RichText::new("pick a hole to seat it, or OK places it at the origin").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("pick a hole to seat it, or OK places it at the origin")).color(t.text_dim)); ui.end_row(); } false diff --git a/crates/ui-egui/src/dialogs_sheet.rs b/crates/ui-egui/src/dialogs_sheet.rs index 5f141a8f..f1d1cb99 100644 --- a/crates/ui-egui/src/dialogs_sheet.rs +++ b/crates/ui-egui/src/dialogs_sheet.rs @@ -216,7 +216,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Sm, inputs: &mut [Sel combo(ui, "sm_pos", &POSITION_LABELS, position); ui.end_row(); row_label(ui, "Bend Radius"); - let r = ui.add(egui::TextEdit::singleline(radius).hint_text("from the rule")); + let r = ui.add(egui::TextEdit::singleline(radius).hint_text(crate::i18n::tr_label("from the rule"))); crate::params_dialog::complete(ui, &r, radius); enter |= r.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)); ui.end_row(); @@ -225,7 +225,8 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Sm, inputs: &mut [Sel let points = edge_point_list(inputs); if points.len() > 1 || own.iter().any(|o| !(o.1.trim().is_empty() && o.2.trim().is_empty())) { row_label(ui, "Per Edge"); - ui.label(RichText::new("angle, height").weak()).on_hover_text("An edge's own angle and height. Empty: the values above."); + ui.label(RichText::new(crate::i18n::tr_label("angle, height")).weak()) + .on_hover_text("An edge's own angle and height. Empty: the values above."); ui.end_row(); let w = ((ui.spacing().text_edit_width - ui.spacing().item_spacing.x) / 2.0).max(40.0); for (n, p) in points.iter().enumerate() { @@ -266,13 +267,13 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Sm, inputs: &mut [Sel } Sm::Hem { length, gap, flip } => { row_label(ui, "Type"); - ui.label("Flat"); + ui.label(crate::i18n::tr_label("Flat")); ui.end_row(); row_label(ui, "Length"); enter |= field(ui, length); ui.end_row(); row_label(ui, "Gap"); - let r = ui.add(egui::TextEdit::singleline(gap).hint_text("from the rule")); + let r = ui.add(egui::TextEdit::singleline(gap).hint_text(crate::i18n::tr_label("from the rule"))); crate::params_dialog::complete(ui, &r, gap); enter |= r.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)); ui.end_row(); @@ -288,7 +289,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Sm, inputs: &mut [Sel enter |= field(ui, angle); ui.end_row(); row_label(ui, "Bend Radius"); - let r = ui.add(egui::TextEdit::singleline(radius).hint_text("from the rule")); + let r = ui.add(egui::TextEdit::singleline(radius).hint_text(crate::i18n::tr_label("from the rule"))); crate::params_dialog::complete(ui, &r, radius); enter |= r.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)); ui.end_row(); @@ -347,7 +348,7 @@ pub fn rows(app: &mut SolveApp, ui: &mut egui::Ui, k: &mut Sm, inputs: &mut [Sel ui.end_row(); if *pick < rules.len() && !app.session.doc.sheet.rules.is_empty() { row_label(ui, ""); - if ui.button("Delete rule").clicked() { + if ui.button(crate::i18n::tr_label("Delete rule")).clicked() { let n = rules.get(*pick).map(|r| r.name.clone()).unwrap_or_default(); match app.run("sheet.manage_rules", json!({"name": n, "delete": true})) { Ok(_) => { diff --git a/crates/ui-egui/src/documents.rs b/crates/ui-egui/src/documents.rs index 62e33962..7d909719 100644 --- a/crates/ui-egui/src/documents.rs +++ b/crates/ui-egui/src/documents.rs @@ -396,7 +396,7 @@ pub fn tabs(app: &mut SolveApp, ui: &mut egui::Ui, r: Rect, x0: f32, x1: f32) { } ui.painter().text(mr.center(), egui::Align2::CENTER_CENTER, format!("»{}", n - shown), FontId::proportional(12.0), t.app_bar_text); let id = egui::Id::new("sc_doc_more"); - if mresp.clone().on_hover_text("All open designs").clicked() { + if mresp.clone().on_hover_text(crate::i18n::tr_label("All open designs")).clicked() { ui.ctx().data_mut(|d| d.insert_temp(id, !d.get_temp::(id).unwrap_or(false))); } if ui.ctx().data(|d| d.get_temp::(id).unwrap_or(false)) { diff --git a/crates/ui-egui/src/file_load.rs b/crates/ui-egui/src/file_load.rs index 2a4e0dbf..ad490c2e 100644 --- a/crates/ui-egui/src/file_load.rs +++ b/crates/ui-egui/src/file_load.rs @@ -532,7 +532,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { if let Some(preview) = r.preview.as_ref().filter(|_| !cancelled) { let w = ui.available_width().min(320.0); ui.image((preview.id(), egui::vec2(w, w * 200.0 / 320.0))); - ui.label(egui::RichText::new("Saved preview. Geometry is being checked before editing.").small().weak()); + ui.label(egui::RichText::new(crate::i18n::tr_label("Saved preview. Geometry is being checked before editing.")).small().weak()); } ui.add_space(4.0); ui.horizontal(|ui| { diff --git a/crates/ui-egui/src/help.rs b/crates/ui-egui/src/help.rs index b8825885..2d66e603 100644 --- a/crates/ui-egui/src/help.rs +++ b/crates/ui-egui/src/help.rs @@ -103,17 +103,17 @@ fn about(app: &mut SolveApp, ctx: &egui::Context) { } let t = Tokens::get(); let mut open = true; - crate::frame::window(ctx, "About SolidCraft", crate::frame::Width::Normal) + crate::frame::window(ctx, crate::i18n::tr_label("About SolidCraft"), crate::frame::Width::Normal) .id(egui::Id::new("sc_about")) .open(&mut open) .default_size(vec2(440.0, 560.0)) .show(ctx, |ui| { ui.label(RichText::new("SolidCraft").size(22.0).strong()); ui.label(format!("Version {VERSION} · commit {COMMIT} · built {BUILD_DATE}")); - ui.label(RichText::new("Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.")).color(t.text_dim)); ui.add_space(6.0); ui.horizontal(|ui| { - if ui.button("Copy diagnostic information").clicked() { + if ui.button(crate::i18n::tr_label("Copy diagnostic information")).clicked() { ctx.copy_text(diagnostics(app)); } }); @@ -136,7 +136,7 @@ fn about(app: &mut SolveApp, ctx: &egui::Context) { ui.label(RichText::new(LICENSE_APACHE).monospace().size(11.0)); }); egui::CollapsingHeader::new("Third-party licences").show(ui, |ui| { - if ui.button("Copy all licences").clicked() { + if ui.button(crate::i18n::tr_label("Copy all licences")).clicked() { ctx.copy_text(solidcraft_engine::licences::all()); } third_party(ui); diff --git a/crates/ui-egui/src/home.rs b/crates/ui-egui/src/home.rs index 7aeb352e..fa9ffd48 100644 --- a/crates/ui-egui/src/home.rs +++ b/crates/ui-egui/src/home.rs @@ -357,7 +357,7 @@ pub fn show(app: &mut SolveApp, ui: &mut egui::Ui) { ui.horizontal(|ui| { ui.label(RichText::new("SolidCraft").size(26.0).strong().color(t.text)); ui.add_space(12.0); - ui.label(RichText::new("Start").size(16.0).color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("Start")).size(16.0).color(t.text_dim)); }); ui.add_space(16.0); ui.horizontal(|ui| { @@ -418,7 +418,7 @@ pub fn show(app: &mut SolveApp, ui: &mut egui::Ui) { ui.add_space(16.0); section(ui, "Recent"); if recent.is_empty() { - ui.label(RichText::new("Designs you open or save appear here.").color(t.text_dim)); + ui.label(RichText::new(crate::i18n::tr_label("Designs you open or save appear here.")).color(t.text_dim)); } else { grid(ui, recent.len(), |ui, i| { let Some(p) = recent.get(i) else { return }; @@ -451,12 +451,12 @@ pub fn show(app: &mut SolveApp, ui: &mut egui::Ui) { .on_hover_text(p.as_str()); crate::scenario::publish_handle(&format!("home:recent:{i}"), response.rect.center()); response.context_menu(|ui| { - if ui.button("Remove from list").clicked() { + if ui.button(crate::i18n::tr_label("Remove from list")).clicked() { app.home.recent.retain(|x| x != p); app.home.opened_at.remove(p); ui.close(); } - if !cfg!(target_arch = "wasm32") && ui.button("Show in folder").clicked() { + if !cfg!(target_arch = "wasm32") && ui.button(crate::i18n::tr_label("Show in folder")).clicked() { if let Some(show) = &app.services.show_in_folder { show(p); } diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 2830021a..2535d8e6 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -222,6 +222,13 @@ mod tests { assert_eq!(ja.text("ui.preferences"), "環境設定"); assert_eq!(ja.label("Extrude"), "押し出し"); assert_eq!(ja.label("CREATE SKETCH"), "スケッチを作成"); + assert_eq!(ja.label("New Component"), "新規コンポーネント"); + assert_eq!(ja.label("UTILITIES"), "ユーティリティ"); + assert_eq!(ja.label("CONFIGURE"), "構成"); + assert_eq!(ja.label("Drive Joints"), "ジョイントを駆動"); + assert_eq!(ja.label("Axis Through Cylinder/Cone/Torus"), "円柱/円錐/トーラスを通る軸"); + assert_eq!(ja.label("Filter commands or keys"), "コマンドまたはキーを検索"); + assert_eq!(ja.label("Context menu"), "コンテキスト メニュー"); assert_eq!(ja.label("NonExistentKey"), "NonExistentKey"); assert_eq!(Locale::for_language("unknown").text("ui.preferences"), "Preferences"); static PARTIAL: Catalog = Catalog::new("test", "Test", r#"{"ui.preferences":"Prefs"}"#); diff --git a/crates/ui-egui/src/issue_report.rs b/crates/ui-egui/src/issue_report.rs index 7ddad3d9..ef3b0383 100644 --- a/crates/ui-egui/src/issue_report.rs +++ b/crates/ui-egui/src/issue_report.rs @@ -505,7 +505,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { let mut retake = false; let mut close = false; let screen = ctx.content_rect(); - crate::frame::window(ctx, "Create Issue — review draft", crate::frame::Width::Wide) + crate::frame::window(ctx, crate::i18n::tr_label("Create Issue — review draft"), crate::frame::Width::Wide) .id(egui::Id::new("sc_issue_report")) .open(&mut open) .resizable(true) @@ -514,11 +514,11 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { .max_height((screen.height() - 32.0).max(100.0)) .vscroll(true) .show(ctx, |ui| { - ui.label("Review the report and screenshot before opening GitHub."); + ui.label(crate::i18n::tr_label("Review the report and screenshot before opening GitHub.")); ui.add( egui::TextEdit::singleline(&mut draft.title) .id(egui::Id::new("issue_report_title")) - .hint_text("Issue title") + .hint_text(crate::i18n::tr_label("Issue title")) .char_limit(160) .desired_width(f32::INFINITY), ); @@ -533,7 +533,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { }); truncate(&mut draft.title, 160); truncate(&mut draft.body, MAX_BODY); - ui.label(RichText::new("Remove private design details or paths before sharing.").small()); + ui.label(RichText::new(crate::i18n::tr_label("Remove private design details or paths before sharing.")).small()); ui.label(&draft.note); if let Some(image) = draft.image.as_ref() { let texture = @@ -545,8 +545,8 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { ); } ui.horizontal_wrapped(|ui| { - retake = ui.button("Retake screenshot").clicked(); - if ui.add_enabled(draft.image.is_some(), egui::Button::new("Copy screenshot")).clicked() + retake = ui.button(crate::i18n::tr_label("Retake screenshot")).clicked(); + if ui.add_enabled(draft.image.is_some(), egui::Button::new(crate::i18n::tr_label("Copy screenshot"))).clicked() && let Some(image) = draft.image.as_ref() { ctx.copy_image((**image).clone()); @@ -564,19 +564,19 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { format!("Could not save screenshot: {}", debug(&result.get("error"), 1000)) }; } - if ui.add_enabled(draft.image.is_some(), egui::Button::new("Remove screenshot")).clicked() { + if ui.add_enabled(draft.image.is_some(), egui::Button::new(crate::i18n::tr_label("Remove screenshot"))).clicked() { draft.image = None; draft.texture = None; draft.note = "Screenshot removed from this draft.".into(); } }); ui.horizontal_wrapped(|ui| { - if ui.button("Copy report").clicked() { + if ui.button(crate::i18n::tr_label("Copy report")).clicked() { ctx.copy_text(draft.body.clone()); draft.note = "Report copied. Paste it into the GitHub draft if needed.".into(); } let (url, copy_needed) = draft_url(&draft.title, &draft.body); - if ui.button("Open GitHub draft").clicked() { + if ui.button(crate::i18n::tr_label("Open GitHub draft")).clicked() { if copy_needed { ctx.copy_text(draft.body.clone()); } @@ -588,7 +588,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { } .into(); } - close = ui.button("Close draft").clicked(); + close = ui.button(crate::i18n::tr_label("Close draft")).clicked(); }); }); if open && !close { diff --git a/crates/ui-egui/src/keymap.rs b/crates/ui-egui/src/keymap.rs index 8e5f043f..88b65ac9 100644 --- a/crates/ui-egui/src/keymap.rs +++ b/crates/ui-egui/src/keymap.rs @@ -166,14 +166,18 @@ pub fn page(app: &mut SolveApp, ui: &mut egui::Ui) { { { ui.horizontal(|ui| { - ui.add(egui::TextEdit::singleline(&mut app.keymap.filter).hint_text("Filter commands or keys").desired_width(300.0)); - if !app.keymap.read_only && ui.button("Reset All").clicked() { + ui.add( + egui::TextEdit::singleline(&mut app.keymap.filter) + .hint_text(crate::i18n::tr_label("Filter commands or keys")) + .desired_width(300.0), + ); + if !app.keymap.read_only && ui.button(app.tr_label("Reset All")).clicked() { action = Some((String::new(), "reset_all")); } - if ui.button("Export…").on_hover_text("Keys, S box favourites and the toolbar, as a file").clicked() { + if ui.button(app.tr_label("Export…")).on_hover_text(app.tr_label("Keys, S box favourites and the toolbar, as a file")).clicked() { action = Some((String::new(), "export")); } - if !app.keymap.read_only && ui.button("Import…").clicked() { + if !app.keymap.read_only && ui.button(app.tr_label("Import…")).clicked() { action = Some((String::new(), "import")); } }); @@ -185,14 +189,14 @@ pub fn page(app: &mut SolveApp, ui: &mut egui::Ui) { if ui.button(format!("Use {key} here anyway")).clicked() { action = Some((format!("{id}\n{key}"), "replace")); } - if ui.button("Cancel").clicked() { + if ui.button(app.tr_label("Cancel")).clicked() { action = Some((String::new(), "cancel")); } }); } ui.label( RichText::new( - "Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).", + app.tr_label("Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation)."), ) .size(11.0) .color(t.text_dim), @@ -203,15 +207,16 @@ pub fn page(app: &mut SolveApp, ui: &mut egui::Ui) { egui::Grid::new("sc_keymap_grid").num_columns(4).striped(true).spacing([10.0, 4.0]).show(ui, |ui| { for c in command_specs() { let key = effective(app, c.id).unwrap_or_default(); - if !q.is_empty() && ![c.label, c.id, key.as_str()].iter().any(|s| s.to_lowercase().contains(&q)) { + let translated_label = app.tr_label(c.label); + if !q.is_empty() && ![c.label, c.id, key.as_str(), translated_label].iter().any(|s| s.to_lowercase().contains(&q)) { continue; } - ui.label(c.label); + ui.label(translated_label); ui.label(RichText::new(c.id).size(10.5).color(t.text_dim)); let capturing = app.keymap.capturing.as_deref() == Some(c.id); let changed = app.keymap.custom.contains_key(c.id); let text = if capturing { - "press a key…".to_string() + app.tr_label("press a key…").to_string() } else if key.is_empty() { "—".to_string() } else { @@ -223,14 +228,14 @@ pub fn page(app: &mut SolveApp, ui: &mut egui::Ui) { continue; } let b = egui::Button::new(RichText::new(text).color(if changed { t.accent } else { t.text })).min_size(egui::vec2(80.0, 0.0)); - if ui.add(b).on_hover_text("Click, then press the new key").clicked() { + if ui.add(b).on_hover_text(app.tr_label("Click, then press the new key")).clicked() { action = Some((c.id.to_string(), "capture")); } ui.horizontal(|ui| { - if ui.add_enabled(!key.is_empty(), egui::Button::new("Clear").small()).clicked() { + if ui.add_enabled(!key.is_empty(), egui::Button::new(app.tr_label("Clear")).small()).clicked() { action = Some((c.id.to_string(), "clear")); } - if ui.add_enabled(changed, egui::Button::new("Reset").small()).clicked() { + if ui.add_enabled(changed, egui::Button::new(app.tr_label("Reset")).small()).clicked() { action = Some((c.id.to_string(), "reset")); } }); diff --git a/crates/ui-egui/src/locales/en.json b/crates/ui-egui/src/locales/en.json index d06ffc44..34f3eb96 100644 --- a/crates/ui-egui/src/locales/en.json +++ b/crates/ui-egui/src/locales/en.json @@ -5,6 +5,262 @@ "browser.precision": "Precision: {precision}", "browser.sketch_name": "Sketch{number}", "browser.units": "Units: {units}", + "cmd.appearance_assign": "Appearance", + "cmd.appearance_library": "Appearance Library", + "cmd.appearance_list": "List Appearances", + "cmd.body_rename": "Rename Body", + "cmd.browser_group": "New Group", + "cmd.browser_move": "Move Browser Items", + "cmd.browser_order": "Order Browser Items", + "cmd.browser_rename_group": "Rename Group", + "cmd.browser_ungroup": "Ungroup", + "cmd.browser_visibility": "Show/Hide", + "cmd.canvas_calibrate": "Calibrate Canvas", + "cmd.canvas_decal": "Decal", + "cmd.canvas_delete": "Delete Canvas", + "cmd.canvas_edit": "Edit Canvas", + "cmd.canvas_insert": "Canvas", + "cmd.component_activate": "Activate Component", + "cmd.component_break_link": "Break Link", + "cmd.component_capture_position": "Capture Position", + "cmd.component_create": "New Component", + "cmd.component_delete": "Delete Component", + "cmd.component_from_bodies": "Create Components from Bodies", + "cmd.component_insert_design": "Insert Design", + "cmd.component_links": "List Links", + "cmd.component_list": "List Components", + "cmd.component_move_bodies": "Move Bodies to Component", + "cmd.component_move_sketches": "Move Sketches to Component", + "cmd.component_paste_new": "Paste New", + "cmd.component_properties": "Component Physical Properties", + "cmd.component_rename": "Rename Component", + "cmd.component_revert_position": "Revert Position", + "cmd.component_update_links": "Update Links", + "cmd.config_activate": "Activate Configuration", + "cmd.config_column": "Configuration Column", + "cmd.config_configure": "Configure", + "cmd.config_preview": "Preview Configuration", + "cmd.config_row": "Configuration Row", + "cmd.config_rule": "Configuration Rule", + "cmd.config_rules": "Configuration Rules", + "cmd.config_table": "Display Configuration Table", + "cmd.construct_axis_edge": "Axis Through Edge", + "cmd.construct_axis_normal_to_face": "Axis Perpendicular To Face", + "cmd.construct_axis_through_cylinder": "Axis Through Cylinder/Cone/Torus", + "cmd.construct_axis_two_planes": "Axis Through Two Planes", + "cmd.construct_axis_two_points": "Axis Through Two Points", + "cmd.construct_plane_along_path": "Plane Along Path", + "cmd.construct_plane_midplane": "Midplane", + "cmd.construct_plane_perpendicular": "Perpendicular Plane", + "cmd.construct_plane_tangent": "Tangent Plane", + "cmd.construct_plane_three_points": "Plane Through Three Points", + "cmd.construct_plane_two_edges": "Plane Through Two Edges", + "cmd.construct_point_along_path": "Point Along Path", + "cmd.construct_point_center": "Point At Center Of Circle/Sphere/Torus", + "cmd.construct_point_edge_plane": "Point At Edge And Plane", + "cmd.construct_point_three_planes": "Point Through Three Planes", + "cmd.construct_point_two_edges": "Point Through Two Edges", + "cmd.construct_point_vertex": "Point At Vertex", + "cmd.contact_check": "Check Contact", + "cmd.contact_create": "New Contact Set", + "cmd.contact_disable_all": "Disable Contact", + "cmd.contact_edit": "Edit Contact Set", + "cmd.contact_enable_all": "Enable All Contact", + "cmd.contact_enable_sets": "Enable Contact Sets", + "cmd.contact_list": "List Contact Sets", + "cmd.diagnostics_crash_report": "Crash Report", + "cmd.diagnostics_crash_reports": "Crash Reports", + "cmd.diagnostics_crash_reports_clear": "Delete Crash Reports", + "cmd.diagnostics_crash_test": "Crash Test", + "cmd.doc_recover": "Recover Design", + "cmd.doc_recovery_discard": "Discard Recovered Design", + "cmd.doc_recovery_list": "Recoverable Designs", + "cmd.document_inspect": "Inspect Design", + "cmd.document_units": "Change Design Units", + "cmd.edit_checkpoint": "Checkpoint", + "cmd.edit_restore_checkpoint": "Restore Checkpoint", + "cmd.engine_commands": "List Commands", + "cmd.explode_create": "Exploded View", + "cmd.explode_delete": "Delete Exploded View", + "cmd.explode_list": "List Exploded Views", + "cmd.explode_show": "Show Exploded View", + "cmd.expr_evaluate": "Evaluate Expression", + "cmd.face_delete": "Delete Face", + "cmd.file_export": "Export", + "cmd.file_insert_mesh": "Insert Mesh", + "cmd.file_insert_step": "Insert STEP", + "cmd.file_save_mesh": "Save As Mesh", + "cmd.inspect_accessibility": "Accessibility Analysis", + "cmd.inspect_center_of_mass": "Center of Mass", + "cmd.inspect_curvature_comb": "Curvature Comb Analysis", + "cmd.inspect_curvature_map": "Curvature Map Analysis", + "cmd.inspect_draft": "Draft Analysis", + "cmd.inspect_environment_map": "Environment Map Analysis", + "cmd.inspect_interference": "Interference", + "cmd.inspect_isocurve": "Isocurve Analysis", + "cmd.inspect_minimum_radius": "Minimum Radius Analysis", + "cmd.inspect_zebra": "Zebra Analysis", + "cmd.joint_as_built": "As-Built Joint", + "cmd.joint_create": "Joint", + "cmd.joint_delete": "Delete Joint", + "cmd.joint_drive": "Drive Joints", + "cmd.joint_edit": "Edit Joint", + "cmd.joint_limits": "Joint Limits", + "cmd.joint_list": "List Joints", + "cmd.joint_motion_link": "Motion Link", + "cmd.joint_origin": "Joint Origin", + "cmd.joint_rigid_group": "Rigid Group", + "cmd.joint_solve": "Solve Joints", + "cmd.material_assign": "Physical Material", + "cmd.material_create": "New Physical Material", + "cmd.material_delete": "Delete Physical Material", + "cmd.material_edit": "Edit Physical Material", + "cmd.material_list": "List Materials", + "cmd.mesh_convert": "Convert Mesh", + "cmd.model_edges": "List Edges", + "cmd.model_faces": "List Faces", + "cmd.model_threads": "List Threads", + "cmd.motion_delete": "Delete Motion Study", + "cmd.motion_export": "Export Motion Study", + "cmd.motion_list": "List Motion Studies", + "cmd.motion_play": "Play Motion Study", + "cmd.motion_study": "Motion Study", + "cmd.occurrence_copy": "Paste (Instance)", + "cmd.occurrence_ground": "Ground", + "cmd.occurrence_move": "Move Occurrence", + "cmd.occurrence_properties": "Occurrence Physical Properties", + "cmd.parameters_add": "Add User Parameter", + "cmd.parameters_change": "Change Parameters", + "cmd.parameters_comment": "Comment Parameter", + "cmd.parameters_complete": "Complete Expression", + "cmd.parameters_delete": "Delete Parameter", + "cmd.parameters_export": "Export Parameters", + "cmd.parameters_favorite": "Favourite Parameter", + "cmd.parameters_graph": "Parameter Graph", + "cmd.parameters_import": "Import Parameters", + "cmd.parameters_list": "List Parameters", + "cmd.parameters_rename": "Rename Parameter", + "cmd.parameters_users": "Parameter Users", + "cmd.parts_fastener": "Insert Fastener", + "cmd.parts_insert": "Insert Part", + "cmd.parts_library": "Standard Parts", + "cmd.parts_resize": "Change Part Size", + "cmd.plastic_assign_rule": "Assign Plastic Rule", + "cmd.plastic_boss": "Boss", + "cmd.plastic_lip": "Lip", + "cmd.plastic_manage_rules": "Manage Plastic Rules", + "cmd.plastic_rest": "Rest", + "cmd.plastic_rules": "List Plastic Rules", + "cmd.plastic_snap_fit": "Snap Fit", + "cmd.select_clear": "Clear Selection", + "cmd.sheet_convert": "Convert to Sheet Metal", + "cmd.sheet_export_bend_table": "Export Bend Table", + "cmd.sheet_export_dxf": "Export Flat Pattern as DXF", + "cmd.sheet_flange": "Flange", + "cmd.sheet_flat_pattern": "Create Flat Pattern", + "cmd.sheet_fold": "Fold", + "cmd.sheet_hem": "Hem", + "cmd.sheet_manage_rules": "Sheet Metal Rules", + "cmd.sheet_refold": "Refold", + "cmd.sheet_rules": "List Sheet Metal Rules", + "cmd.sheet_unfold": "Unfold", + "cmd.sketch_arc_center_point": "Center Point Arc", + "cmd.sketch_arc_tangent": "Tangent Arc", + "cmd.sketch_arc_three_point": "3-Point Arc", + "cmd.sketch_auto_constrain": "AutoConstrain", + "cmd.sketch_auto_constrain_from_datum": "AutoConstrain from datum", + "cmd.sketch_auto_project": "Auto-Project Edges on Reference", + "cmd.sketch_blend_curve": "Blend Curve", + "cmd.sketch_chain": "Chain", + "cmd.sketch_chamfer_distance_angle": "Distance and Angle Chamfer", + "cmd.sketch_chamfer_equal_distance": "Equal Distance Chamfer", + "cmd.sketch_chamfer_two_distance": "Two Distance Chamfer", + "cmd.sketch_circle_center": "Center Diameter Circle", + "cmd.sketch_circle_three_point": "3-Point Circle", + "cmd.sketch_circle_three_tangent": "3-Tangent Circle", + "cmd.sketch_circle_two_point": "2-Point Circle", + "cmd.sketch_circle_two_tangent": "2-Tangent Circle", + "cmd.sketch_constrainer": "Sketch Constrainer", + "cmd.sketch_constraint_fix": "Fix/UnFix", + "cmd.sketch_constraint_midpoint": "MidPoint", + "cmd.sketch_construction": "Normal/Construction", + "cmd.sketch_delete": "Delete Sketch Entities", + "cmd.sketch_dimension_text": "Move Dimension Text", + "cmd.sketch_drag": "Drag Sketch Geometry", + "cmd.sketch_drag_end": "End Sketch Drag", + "cmd.sketch_draw_dimensioned": "Draw Dimensioned Sketch Geometry", + "cmd.sketch_edit": "Edit Sketch", + "cmd.sketch_edit_text": "Edit Text", + "cmd.sketch_export_dxf": "Save As DXF", + "cmd.sketch_finish_auto_constrain": "Finish with AutoConstrain", + "cmd.sketch_fit_curves_to_section": "Fit Curves to Mesh Section", + "cmd.sketch_glyphs": "Constraint Glyphs", + "cmd.sketch_include_3d": "Include 3D Geometry", + "cmd.sketch_insert_dxf": "Insert DXF", + "cmd.sketch_insert_svg": "Insert SVG", + "cmd.sketch_inspect": "Inspect Sketch", + "cmd.sketch_intersection_curve": "Intersection Curve", + "cmd.sketch_isoparametric_curve": "Isoparametric Curve", + "cmd.sketch_line3d": "3D Line", + "cmd.sketch_line_midpoint": "Midpoint Line", + "cmd.sketch_move": "Move/Copy Sketch Entities", + "cmd.sketch_move3d": "Move 3D Point", + "cmd.sketch_move_point": "Drag Sketch Point", + "cmd.sketch_offset_break": "Break Offset Association", + "cmd.sketch_options": "Sketch Palette Options", + "cmd.sketch_point3d": "3D Point", + "cmd.sketch_polygon_circumscribed": "Circumscribed Polygon", + "cmd.sketch_polygon_edge": "Edge Polygon", + "cmd.sketch_polygon_inscribed": "Inscribed Polygon", + "cmd.sketch_project_to_surface": "Project To Surface", + "cmd.sketch_rectangle_center": "Center Rectangle", + "cmd.sketch_rectangle_three_point": "3-Point Rectangle", + "cmd.sketch_rectangle_two_point": "2-Point Rectangle", + "cmd.sketch_redefine": "Redefine Sketch Plane", + "cmd.sketch_slot_arc_center": "Center Point Arc Slot", + "cmd.sketch_slot_arc_three_point": "Three Point Arc Slot", + "cmd.sketch_slot_center_point": "Center Point Slot", + "cmd.sketch_slot_center_to_center": "Center to Center Slot", + "cmd.sketch_slot_overall": "Overall Slot", + "cmd.sketch_snap": "Snap Inference", + "cmd.sketch_solve": "Solve Sketch", + "cmd.sketch_spline3d": "3D Spline", + "cmd.sketch_spline_control_point": "Control Point Spline", + "cmd.sketch_spline_control_point_5": "Control Point Spline (Degree 5)", + "cmd.sketch_spline_fit_point": "Fit Point Spline", + "cmd.sketch_spun_profile": "Spun Profile", + "cmd.sketch_toggle_driven": "Toggle Driven Dimension", + "cmd.solid_align": "Align", + "cmd.solid_boundary_fill": "Boundary Fill", + "cmd.solid_bounding_solid": "Bounding Solid", + "cmd.solid_emboss": "Emboss", + "cmd.solid_move": "Move/Copy", + "cmd.solid_offset_face": "Offset Face", + "cmd.solid_press_pull": "Press Pull", + "cmd.solid_remove": "Remove", + "cmd.solid_replace_face": "Replace Face", + "cmd.solid_rib": "Rib", + "cmd.solid_split_face": "Split Face", + "cmd.solid_web": "Web", + "cmd.surface_patch": "Patch", + "cmd.surface_stitch": "Stitch", + "cmd.surface_thicken": "Thicken", + "cmd.timeline_compute_all": "Compute All", + "cmd.timeline_copy": "Copy Features", + "cmd.timeline_dependents": "Feature Dependents", + "cmd.timeline_inspect": "Inspect Feature", + "cmd.timeline_paste": "Paste Features", + "cmd.timeline_redefine": "Edit Feature", + "cmd.timeline_rename": "Rename", + "cmd.timeline_reorder": "Reorder Feature", + "cmd.timeline_roll_to": "Roll History Marker", + "cmd.timeline_rollback": "Move Timeline Marker", + "cmd.timeline_suppress": "Suppress Feature", + "cmd.view_apply": "Restore Named View", + "cmd.view_delete": "Delete Named View", + "cmd.view_list": "List Named Views", + "cmd.view_rename": "Rename Named View", + "cmd.view_save": "New Named View", "dialog.custom_axis": "↖ Custom Axis", "dialog.edit_title": "EDIT {title}", "dialog.select": "↖ Select", @@ -20,6 +276,8 @@ "sketch.draw_curves": "Draw as {linetype}", "sketch.make_selection": "Convert the selection to {linetype}", "ui.1_degree_of_freedom": "1 degree of freedom", + "ui.3d_mouse_speed": "3D mouse speed", + "ui.3d_mouse_windows": "3D mouse (Windows)", "ui.3d_sketch": "3D Sketch", "ui.about": "About", "ui.activate": "Activate", @@ -52,8 +310,11 @@ "ui.chord_length": "Chord Length", "ui.circle": "Circle", "ui.circular_pattern": "Circular Pattern", + "ui.clear": "Clear", "ui.clear_recent": "Clear Recent", "ui.clear_the_selection": "Clear the selection", + "ui.click_selects_whole_bodies": "Click selects whole bodies", + "ui.click_then_press_key": "Click, then press the new key", "ui.close": "Close", "ui.coil": "Coil", "ui.coincident": "Coincident", @@ -67,6 +328,7 @@ "ui.constraints_conflict": "Constraints conflict", "ui.construct": "Construct", "ui.construction": "Construction", + "ui.context_menu": "Context menu", "ui.copy": "Copy", "ui.counterbore": "Counterbore", "ui.countersink": "Countersink", @@ -102,6 +364,8 @@ "ui.equal": "Equal", "ui.expand": "Expand", "ui.export_ellipsis": "Export...", + "ui.export_ellipsis_keymap": "Export…", + "ui.export_keymap_tip": "Keys, S box favourites and the toolbar, as a file", "ui.extend": "Extend", "ui.extent_type": "Extent Type", "ui.extrude": "Extrude", @@ -110,6 +374,7 @@ "ui.features": "Features", "ui.file": "File", "ui.fillet": "Fillet", + "ui.filter_commands_or_keys": "Filter commands or keys", "ui.finish_sketch": "Finish Sketch", "ui.fix_unfix": "Fix/Unfix", "ui.flat": "Flat", @@ -118,12 +383,16 @@ "ui.fully_constrained": "Fully constrained", "ui.general": "General", "ui.graphics": "Graphics", + "ui.ground_shadow": "Ground shadow", + "ui.heading_add_ins": "ADD-INS", "ui.heading_assemble": "ASSEMBLE", "ui.heading_box": "BOX", "ui.heading_chamfer": "CHAMFER", "ui.heading_circular_pattern": "CIRCULAR PATTERN", "ui.heading_coil": "COIL", "ui.heading_combine": "COMBINE", + "ui.heading_configure": "CONFIGURE", + "ui.heading_constraints": "CONSTRAINTS", "ui.heading_construct": "CONSTRUCT", "ui.heading_create": "CREATE", "ui.heading_create_sketch": "CREATE SKETCH", @@ -140,6 +409,7 @@ "ui.heading_insert": "INSERT", "ui.heading_inspect": "INSPECT", "ui.heading_loft": "LOFT", + "ui.heading_make": "MAKE", "ui.heading_measure": "MEASURE", "ui.heading_mesh": "MESH", "ui.heading_mirror": "MIRROR", @@ -153,6 +423,7 @@ "ui.heading_pipe": "PIPE", "ui.heading_plane_at_angle": "PLANE AT ANGLE", "ui.heading_plastic": "PLASTIC", + "ui.heading_prepare": "PREPARE", "ui.heading_rectangular_pattern": "RECTANGULAR PATTERN", "ui.heading_revolve": "REVOLVE", "ui.heading_right": "RIGHT", @@ -172,6 +443,8 @@ "ui.heading_thread": "THREAD", "ui.heading_top": "TOP", "ui.heading_torus": "TORUS", + "ui.heading_utilities": "UTILITIES", + "ui.heading_utility": "UTILITY", "ui.help": "Help", "ui.hide": "Hide", "ui.hole": "Hole", @@ -179,6 +452,7 @@ "ui.hole_type": "Hole Type", "ui.home": "Home", "ui.horizontal_vertical": "Horizontal/Vertical", + "ui.import_ellipsis": "Import…", "ui.insert": "Insert", "ui.inspect": "Inspect", "ui.intersect": "Intersect", @@ -192,6 +466,7 @@ "ui.linetype": "Linetype", "ui.loft": "Loft", "ui.look_at": "Look At", + "ui.look_at_anim_desc": "Axis view, Look At, Home and Fit", "ui.manufacture": "Manufacture", "ui.measure": "Measure", "ui.midpoint": "Midpoint", @@ -228,6 +503,7 @@ "ui.path": "Path", "ui.pattern_on_path": "Pattern on Path", "ui.perpendicular": "Perpendicular", + "ui.perspective_view": "Perspective view", "ui.pipe": "Pipe", "ui.placement": "Placement", "ui.plane": "Plane", @@ -237,17 +513,23 @@ "ui.points": "Points", "ui.polygon": "Polygon", "ui.preferences": "Preferences", + "ui.press_a_key": "press a key…", "ui.profile": "Profile", "ui.profile_plane": "Profile Plane", "ui.profiles": "Profiles", "ui.project": "Project", + "ui.project_face_edges_sketch": "Project face edges into new sketches", "ui.quit": "Quit", + "ui.radial_context_menu": "Radial context menu", "ui.radius": "Radius", "ui.radius_type": "Radius Type", "ui.rectangle": "Rectangle", "ui.rectangular_pattern": "Rectangular Pattern", "ui.redo": "Redo", "ui.render": "Render", + "ui.renderer": "Renderer", + "ui.reset": "Reset", + "ui.reset_all": "Reset All", "ui.reset_the_settings_on_this_page": "Reset the settings on this page", "ui.restore_defaults": "Restore Defaults", "ui.reverse_zoom_direction": "Reverse zoom direction", @@ -259,6 +541,7 @@ "ui.scale": "Scale", "ui.section_analysis": "Section Analysis", "ui.select": "Select", + "ui.select_other_hint": "Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there.", "ui.selection": "Selection", "ui.shell": "Shell", "ui.show": "Show", @@ -279,10 +562,15 @@ "ui.slice": "Slice", "ui.slot": "Slot", "ui.smooth": "Smooth", + "ui.smooth_wheel_zoom": "Smooth wheel zoom", + "ui.smooth_wheel_zoom_tip": "Turn off to apply each wheel event immediately, without a smoothing tail", "ui.snap": "Snap", + "ui.space_mouse_hint": "Move and rotate the view together; sketches use pan and zoom only.", + "ui.space_mouse_navigate": "Navigate with SpaceNavigator / SpaceMouse", "ui.sphere": "Sphere", "ui.spline": "Spline", "ui.split_body": "Split Body", + "ui.stand_up_tip": "After a STEP or IGES file opens with Z up, offer a quarter turn about X", "ui.start": "Start", "ui.start_radius": "Start Radius", "ui.sweep": "Sweep", @@ -300,16 +588,262 @@ "ui.to_object": "To Object", "ui.top": "Top", "ui.torus": "Torus", + "ui.trackpad_pan_tip": "Trackpad gestures pan (off: they zoom like the wheel); mouse wheel zooms, thumb wheel pans sideways, pinch always zooms", "ui.trim": "Trim", + "ui.two_finger_scroll_pans": "Two-finger scroll pans", "ui.two_sides": "Two Sides", "ui.ui_scale": "UI scale", "ui.undo": "Undo", "ui.units": "Units", "ui.units_of_new_designs": "Units of new designs", "ui.untitled": "Untitled", + "ui.up_axis_note": "Which axis points up in the views (axis view, Home, Look At). Designs are unchanged.", "ui.variable": "Variable", "ui.view_centre": "View centre", + "ui.visual_shaded_hidden_edges": "Shaded with hidden edges", + "ui.visual_shaded_with_edges": "Shaded with edges", "ui.visual_style": "Visual style", + "ui.visual_wireframe": "Wireframe", "ui.workspace": "workspace", - "ui.zoom_to_the_cursor": "Zoom to the cursor" -} + "ui.y_up": "Y up", + "ui.z_up": "Z up", + "ui.zoom_to_cursor_tip": "The wheel zooms toward the point under the cursor (off: toward the view's centre)", + "ui.zoom_to_the_cursor": "Zoom to the cursor", + "A new configuration, a copy of the active one": "A new configuration, a copy of the active one", + "About SolidCraft": "About SolidCraft", + "Active": "Active", + "Active rule": "Active rule", + "Add": "Add", + "Add Key": "Add Key", + "Add Mid Radius": "Add Mid Radius", + "Add Row": "Add Row", + "All Sketch Points": "All Sketch Points", + "All open designs": "All open designs", + "Allowed expressions, separated by semicolons": "Allowed expressions, separated by semicolons", + "Also deletes": "Also deletes", + "Angle 2": "Angle 2", + "Animate": "Animate", + "Appearance name": "Appearance name", + "Applied Radius": "Applied Radius", + "Apply To": "Apply To", + "Area": "Area", + "Attachment": "Attachment", + "BROWSER": "BROWSER", + "Bend Line Position": "Bend Line Position", + "Bend Position": "Bend Position", + "Bend Radius": "Bend Radius", + "Bends": "Bends", + "Body": "Body", + "Bounding box": "Bounding box", + "CSV or JSON: updates existing parameters, adds new ones": "CSV or JSON: updates existing parameters, adds new ones", + "Capture All Positions": "Capture All Positions", + "Catch Direction": "Catch Direction", + "Cells": "Cells", + "Center X": "Center X", + "Center Y": "Center Y", + "Center of mass": "Center of mass", + "Chamfer Type": "Chamfer Type", + "Check collisions": "Check collisions", + "Checked": "Checked", + "Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.": "Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.", + "Close draft": "Close draft", + "Collisions": "Collisions", + "Colour": "Colour", + "Component1": "Component1", + "Configuration": "Configuration", + "Configuration rules": "Configuration rules", + "Contact": "Contact", + "Copy all licences": "Copy all licences", + "Copy diagnostic information": "Copy diagnostic information", + "Copy report": "Copy report", + "Corner Relief Shape": "Corner Relief Shape", + "Counterbore depth": "Counterbore depth", + "Countersink angle": "Countersink angle", + "Create Issue — review draft": "Create Issue — review draft", + "Customize Toolbar": "Customize Toolbar", + "Delete all": "Delete all", + "Delete rule": "Delete rule", + "Delete the row": "Delete the row", + "Delete the set": "Delete the set", + "Delete this parameter": "Delete this parameter", + "Density": "Density", + "Designs you open or save appear here.": "Designs you open or save appear here.", + "Determined by To Object. Choose Angle to edit the angular extent.": "Determined by To Object. Choose Angle to edit the angular extent.", + "Discard": "Discard", + "Double-click to rename": "Double-click to rename", + "Drive Joint": "Drive Joint", + "Edit Profile Sketch": "Edit Profile Sketch", + "Enable rule": "Enable rule", + "Enabled": "Enabled", + "Explode": "Explode", + "Extents": "Extents", + "Face attachment lost": "Face attachment lost", + "Faces / edges / vertices": "Faces / edges / vertices", + "Favourite": "Favourite", + "Files from many CAD programs have Y up, so they open lying on their back here (Z up).": "Files from many CAD programs have Y up, so they open lying on their back here (Z up).", + "Filter": "Filter", + "Find in Browser": "Find in Browser", + "Flat size": "Flat size", + "Follow camera (Look At sketches)": "Follow camera (Look At sketches)", + "Font": "Font", + "Full Length": "Full Length", + "Gap": "Gap", + "Grid": "Grid", + "Height": "Height", + "Home view": "Home view", + "In This Design": "In This Design", + "Interferes": "Interferes", + "Issue title": "Issue title", + "Joint Origin1": "Joint Origin1", + "Keep Tools": "Keep Tools", + "Later": "Later", + "Leave it": "Leave it", + "Legacy face attachment. Rebinding to a certified face creates an exact attachment.": "Legacy face attachment. Rebinding to a certified face creates an exact attachment.", + "Length": "Length", + "Length units": "Length units", + "Library": "Library", + "Loop": "Loop", + "Margin": "Margin", + "Mass": "Mass", + "Material": "Material", + "Mid Radius": "Mid Radius", + "Modeled": "Modeled", + "More toolbar panels": "More toolbar panels", + "Motion": "Motion", + "Move Type": "Move Type", + "Move earlier": "Move earlier", + "Move later": "Move later", + "Name": "Name", + "No crash reports.": "No crash reports.", + "No matching appearances": "No matching appearances", + "Not available yet": "Not available yet", + "Opacity": "Opacity", + "Open GitHub draft": "Open GitHub draft", + "Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.", + "Other side": "Other side", + "Parameter values": "Parameter values", + "Per Edge": "Per Edge", + "Pick the tool bodies": "Pick the tool bodies", + "Place at the origin instead": "Place at the origin instead", + "Playback": "Playback", + "Position": "Position", + "Position (0 to 1)": "Position (0 to 1)", + "Position along the edge, 0 at the start end, 1 at the other": "Position along the edge, 0 at the start end, 1 at the other", + "Preview leaves the current design unchanged.": "Preview leaves the current design unchanged.", + "RECENT": "RECENT", + "Radius Fit": "Radius Fit", + "Ratio": "Ratio", + "Recover": "Recover", + "Recover unsaved design?": "Recover unsaved design?", + "Remove Tools": "Remove Tools", + "Remove from list": "Remove from list", + "Remove private design details or paths before sharing.": "Remove private design details or paths before sharing.", + "Remove the column": "Remove the column", + "Remove the track": "Remove the track", + "Remove this point": "Remove this point", + "Report a bug — review a screenshot and open a GitHub draft": "Report a bug — review a screenshot and open a GitHub draft", + "Reset Toolbar": "Reset Toolbar", + "Restore the inherited component or physical material appearance": "Restore the inherited component or physical material appearance", + "Result": "Result", + "Retake screenshot": "Retake screenshot", + "Reverse": "Reverse", + "Reverse Direction": "Reverse Direction", + "Revert": "Revert", + "Revert All Positions": "Revert All Positions", + "Review the report and screenshot before opening GitHub.": "Review the report and screenshot before opening GitHub.", + "Rim Edge": "Rim Edge", + "Roll History Marker Here": "Roll History Marker Here", + "Rule": "Rule", + "Saved preview. Geometry is being checked before editing.": "Saved preview. Geometry is being checked before editing.", + "Scale factor": "Scale factor", + "Search": "Search", + "Search commands": "Search commands", + "Select bodies (a face picks its body)": "Select bodies (a face picks its body)", + "Select bodies or faces instead": "Select bodies or faces instead", + "Selection filter": "Selection filter", + "Semantic faces share their appearance across instances.": "Semantic faces share their appearance across instances.", + "Shape": "Shape", + "Show Agent Cursor": "Show Agent Cursor", + "Show in folder": "Show in folder", + "Size": "Size", + "Sketch plane has no body-face attachment.": "Sketch plane has no body-face attachment.", + "SolidCraft closed before these designs were saved. Their last autosave can be opened.": "SolidCraft closed before these designs were saved. Their last autosave can be opened.", + "Speed": "Speed", + "Stand it up": "Stand it up", + "Stand it up: a quarter turn about X, as one Move feature you can undo.": "Stand it up: a quarter turn about X, as one Move feature you can undo.", + "Stand this part up?": "Stand this part up?", + "Step": "Step", + "Steps": "Steps", + "Suppressed": "Suppressed", + "Swap Ends": "Swap Ends", + "Tangent Chain": "Tangent Chain", + "The dashed sketch is a saved plane guide. Select a new face to repair the attachment.": "The dashed sketch is a saved plane guide. Select a new face to repair the attachment.", + "The saved author occurrence is missing. Select a valid author placement before rebinding.": "The saved author occurrence is missing. Select a valid author placement before rebinding.", + "Then": "Then", + "These features will be deleted:": "These features will be deleted:", + "These features will fail:": "These features will fail:", + "This child is shared. Deleting it removes it from every copy of its parent.": "This child is shared. Deleting it removes it from every copy of its parent.", + "This child is shared. Position changes apply to every copy of its parent.": "This child is shared. Position changes apply to every copy of its parent.", + "This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.", + "To Offset": "To Offset", + "Tolerance": "Tolerance", + "Type": "Type", + "Updating the preview": "Updating the preview", + "Use fixed plane": "Use fixed plane", + "VIEW": "VIEW", + "Value": "Value", + "Volume": "Volume", + "Wall": "Wall", + "When": "When", + "Width": "Width", + "Will fail": "Will fail", + "angle, height": "angle, height", + "command name": "command name", + "expression, e.g. 25 mm": "expression, e.g. 25 mm", + "fits the face, e.g. M8": "fits the face, e.g. M8", + "from the rule": "from the rule", + "needs two joints": "needs two joints", + "new configuration": "new configuration", + "new name": "new name", + "new parameter": "new parameter", + "no interference": "no interference", + "no joint that moves yet": "no joint that moves yet", + "no picture": "no picture", + "pick a hole to seat it, or OK places it at the origin": "pick a hole to seat it, or OK places it at the origin", + "pick one or two vertices, edges or faces": "pick one or two vertices, edges or faces", + "the parts library is not available": "the parts library is not available", + "to the next face": "to the next face", + "Revert Position": "Revert Position", + "Construction": "Construction", + "Faces": "Faces", + "Edges": "Edges", + "Vertices": "Vertices", + "Sketch geometry and profiles": "Sketch geometry and profiles", + "Sketch curves": "Sketch curves", + "Sketch points": "Sketch points", + "Sketch dimensions": "Sketch dimensions", + "Sketch constraints": "Sketch constraints", + "0 turns it off": "0 turns it off", + "Show the pointer an AI agent moves (#35)": "Show the pointer an AI agent moves (#35)", + "Follow the camera (Look At sketches)": "Follow the camera (Look At sketches)", + "Flat": "Flat", + "Save Rule": "Save Rule", + "Preview Row": "Preview Row", + "Add condition": "Add condition", + "Apply to selection": "Apply to selection", + "Remove override": "Remove override", + "Copy screenshot": "Copy screenshot", + "Remove screenshot": "Remove screenshot", + "Use active author placement": "Use active author placement", + "Reattach selected face": "Reattach selected face", + "Use saved fixed plane": "Use saved fixed plane", + "Use selected face as fixed plane": "Use selected face as fixed plane", + "View navigator": "View navigator", + "Signed axes": "Signed axes", + "Cube": "Cube", + "Middle double-click": "Middle double-click", + "Double-clicking the middle button in the view: Home (the home view, framing what is shown), Fit (frame what is shown, keeping the orientation) or nothing": "Double-clicking the middle button in the view: Home (the home view, framing what is shown), Fit (frame what is shown, keeping the orientation) or nothing", + "Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).": "Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).", + "cmd.render_backends": "Render Backends", + "cmd.view_navigate": "Navigate View" +} \ No newline at end of file diff --git a/crates/ui-egui/src/locales/ja.json b/crates/ui-egui/src/locales/ja.json index c57ca04b..d4348ca2 100644 --- a/crates/ui-egui/src/locales/ja.json +++ b/crates/ui-egui/src/locales/ja.json @@ -5,10 +5,266 @@ "browser.precision": "精度: {precision}", "browser.sketch_name": "スケッチ{number}", "browser.units": "単位: {units}", + "cmd.appearance_assign": "外観", + "cmd.appearance_library": "外観ライブラリ", + "cmd.appearance_list": "外観を一覧表示", + "cmd.body_rename": "ボディの名前を変更", + "cmd.browser_group": "新規グループ", + "cmd.browser_move": "ブラウザ項目を移動", + "cmd.browser_order": "ブラウザ項目の並び順を変更", + "cmd.browser_rename_group": "グループの名前を変更", + "cmd.browser_ungroup": "グループ解除", + "cmd.browser_visibility": "表示/非表示", + "cmd.canvas_calibrate": "キャンバスの尺度を設定", + "cmd.canvas_decal": "デカール", + "cmd.canvas_delete": "キャンバスを削除", + "cmd.canvas_edit": "キャンバスを編集", + "cmd.canvas_insert": "キャンバス", + "cmd.component_activate": "コンポーネントをアクティブ化", + "cmd.component_break_link": "リンクを解除", + "cmd.component_capture_position": "位置をキャプチャ", + "cmd.component_create": "新規コンポーネント", + "cmd.component_delete": "コンポーネントを削除", + "cmd.component_from_bodies": "ボディからコンポーネントを作成", + "cmd.component_insert_design": "デザインを挿入", + "cmd.component_links": "リンクを一覧表示", + "cmd.component_list": "コンポーネントを一覧表示", + "cmd.component_move_bodies": "ボディをコンポーネントに移動", + "cmd.component_move_sketches": "スケッチをコンポーネントに移動", + "cmd.component_paste_new": "新規として貼り付け", + "cmd.component_properties": "コンポーネントの物理的プロパティ", + "cmd.component_rename": "コンポーネントの名前を変更", + "cmd.component_revert_position": "位置を元に戻す", + "cmd.component_update_links": "リンクを更新", + "cmd.config_activate": "構成をアクティブ化", + "cmd.config_column": "構成列", + "cmd.config_configure": "構成を設定", + "cmd.config_preview": "構成をプレビュー", + "cmd.config_row": "構成行", + "cmd.config_rule": "構成ルール", + "cmd.config_rules": "構成ルール一覧", + "cmd.config_table": "構成テーブルを表示", + "cmd.construct_axis_edge": "エッジを通る軸", + "cmd.construct_axis_normal_to_face": "面に垂直な軸", + "cmd.construct_axis_through_cylinder": "円柱/円錐/トーラスを通る軸", + "cmd.construct_axis_two_planes": "2平面を通る軸", + "cmd.construct_axis_two_points": "2点を通る軸", + "cmd.construct_plane_along_path": "パスに沿った平面", + "cmd.construct_plane_midplane": "中間平面", + "cmd.construct_plane_perpendicular": "垂直平面", + "cmd.construct_plane_tangent": "正接平面", + "cmd.construct_plane_three_points": "3点を通る平面", + "cmd.construct_plane_two_edges": "2エッジを通る平面", + "cmd.construct_point_along_path": "パスに沿った点", + "cmd.construct_point_center": "円/球/トーラスの中心点", + "cmd.construct_point_edge_plane": "エッジと平面の交点", + "cmd.construct_point_three_planes": "3平面の交点", + "cmd.construct_point_two_edges": "2エッジの交点", + "cmd.construct_point_vertex": "頂点上の点", + "cmd.contact_check": "接触を確認", + "cmd.contact_create": "新規接触セット", + "cmd.contact_disable_all": "接触を無効化", + "cmd.contact_edit": "接触セットを編集", + "cmd.contact_enable_all": "すべての接触を有効化", + "cmd.contact_enable_sets": "接触セットを有効化", + "cmd.contact_list": "接触セットを一覧表示", + "cmd.diagnostics_crash_report": "クラッシュレポート", + "cmd.diagnostics_crash_reports": "クラッシュレポート一覧", + "cmd.diagnostics_crash_reports_clear": "クラッシュレポートを消去", + "cmd.diagnostics_crash_test": "クラッシュテスト", + "cmd.doc_recover": "デザインを復元", + "cmd.doc_recovery_discard": "復元デザインを破棄", + "cmd.doc_recovery_list": "復元可能なデザイン", + "cmd.document_inspect": "デザインを検査", + "cmd.document_units": "デザインの単位を変更", + "cmd.edit_checkpoint": "チェックポイント", + "cmd.edit_restore_checkpoint": "チェックポイントを復元", + "cmd.engine_commands": "コマンドを一覧表示", + "cmd.explode_create": "分解図", + "cmd.explode_delete": "分解図を削除", + "cmd.explode_list": "分解図を一覧表示", + "cmd.explode_show": "分解図を表示", + "cmd.expr_evaluate": "式を評価", + "cmd.face_delete": "面を削除", + "cmd.file_export": "エクスポート", + "cmd.file_insert_mesh": "メッシュを挿入", + "cmd.file_insert_step": "STEP を挿入", + "cmd.file_save_mesh": "メッシュとして保存", + "cmd.inspect_accessibility": "アクセシビリティ解析", + "cmd.inspect_center_of_mass": "重心", + "cmd.inspect_curvature_comb": "曲率コーム解析", + "cmd.inspect_curvature_map": "曲率マップ解析", + "cmd.inspect_draft": "勾配解析", + "cmd.inspect_environment_map": "環境マップ解析", + "cmd.inspect_interference": "干渉", + "cmd.inspect_isocurve": "アイソカーブ解析", + "cmd.inspect_minimum_radius": "最小半径解析", + "cmd.inspect_zebra": "ゼブラ解析", + "cmd.joint_as_built": "現位置ジョイント", + "cmd.joint_create": "ジョイント", + "cmd.joint_delete": "ジョイントを削除", + "cmd.joint_drive": "ジョイントを駆動", + "cmd.joint_edit": "ジョイントを編集", + "cmd.joint_limits": "ジョイントの制限", + "cmd.joint_list": "ジョイントを一覧表示", + "cmd.joint_motion_link": "モーション リンク", + "cmd.joint_origin": "ジョイント原点", + "cmd.joint_rigid_group": "リジッド グループ", + "cmd.joint_solve": "ジョイントを解決", + "cmd.material_assign": "物理マテリアル", + "cmd.material_create": "新規物理マテリアル", + "cmd.material_delete": "物理マテリアルを削除", + "cmd.material_edit": "物理マテリアルを編集", + "cmd.material_list": "マテリアルを一覧表示", + "cmd.mesh_convert": "メッシュを変換", + "cmd.model_edges": "エッジを一覧表示", + "cmd.model_faces": "面を一覧表示", + "cmd.model_threads": "ねじを一覧表示", + "cmd.motion_delete": "モーション スタディを削除", + "cmd.motion_export": "モーション スタディをエクスポート", + "cmd.motion_list": "モーション スタディを一覧表示", + "cmd.motion_play": "モーション スタディを再生", + "cmd.motion_study": "モーション スタディ", + "cmd.occurrence_copy": "貼り付け(インスタンス)", + "cmd.occurrence_ground": "空間固定", + "cmd.occurrence_move": "オカレンスを移動", + "cmd.occurrence_properties": "オカレンスの物理的プロパティ", + "cmd.parameters_add": "ユーザー パラメータを追加", + "cmd.parameters_change": "パラメータを変更", + "cmd.parameters_comment": "パラメータにコメントを付与", + "cmd.parameters_complete": "式を補完", + "cmd.parameters_delete": "パラメータを削除", + "cmd.parameters_export": "パラメータをエクスポート", + "cmd.parameters_favorite": "お気に入りパラメータ", + "cmd.parameters_graph": "パラメータ グラフ", + "cmd.parameters_import": "パラメータをインポート", + "cmd.parameters_list": "パラメータを一覧表示", + "cmd.parameters_rename": "パラメータの名前を変更", + "cmd.parameters_users": "パラメータの参照先", + "cmd.parts_fastener": "ファスナーを挿入", + "cmd.parts_insert": "パーツを挿入", + "cmd.parts_library": "標準パーツ", + "cmd.parts_resize": "パーツ サイズを変更", + "cmd.plastic_assign_rule": "プラスチック ルールを割り当て", + "cmd.plastic_boss": "ボス", + "cmd.plastic_lip": "リップ", + "cmd.plastic_manage_rules": "プラスチック ルールを管理", + "cmd.plastic_rest": "レスト", + "cmd.plastic_rules": "プラスチック ルールを一覧表示", + "cmd.plastic_snap_fit": "スナップ フィット", + "cmd.select_clear": "選択をクリア", + "cmd.sheet_convert": "板金に変換", + "cmd.sheet_export_bend_table": "曲げテーブルをエクスポート", + "cmd.sheet_export_dxf": "展開図を DXF としてエクスポート", + "cmd.sheet_flange": "フランジ", + "cmd.sheet_flat_pattern": "展開図を作成", + "cmd.sheet_fold": "折り曲げ", + "cmd.sheet_hem": "ヘミング", + "cmd.sheet_manage_rules": "板金ルール", + "cmd.sheet_refold": "折り戻し", + "cmd.sheet_rules": "板金ルールを一覧表示", + "cmd.sheet_unfold": "展開", + "cmd.sketch_arc_center_point": "中心点円弧", + "cmd.sketch_arc_tangent": "正接円弧", + "cmd.sketch_arc_three_point": "3点指定円弧", + "cmd.sketch_auto_constrain": "自動拘束", + "cmd.sketch_auto_constrain_from_datum": "基準から自動拘束", + "cmd.sketch_auto_project": "参照上のエッジを自動投影", + "cmd.sketch_blend_curve": "ブレンド曲線", + "cmd.sketch_chain": "チェーン", + "cmd.sketch_chamfer_distance_angle": "距離と角度の面取り", + "cmd.sketch_chamfer_equal_distance": "等距離面取り", + "cmd.sketch_chamfer_two_distance": "2距離面取り", + "cmd.sketch_circle_center": "中心と直径で指定した円", + "cmd.sketch_circle_three_point": "3点指定円", + "cmd.sketch_circle_three_tangent": "3接線指定の円", + "cmd.sketch_circle_two_point": "2点指定円", + "cmd.sketch_circle_two_tangent": "2接線指定の円", + "cmd.sketch_constrainer": "スケッチ拘束ツール", + "cmd.sketch_constraint_fix": "固定/固定解除", + "cmd.sketch_constraint_midpoint": "中点", + "cmd.sketch_construction": "標準/コンストラクション", + "cmd.sketch_delete": "スケッチ要素を削除", + "cmd.sketch_dimension_text": "寸法テキストを移動", + "cmd.sketch_drag": "スケッチ ジオメトリをドラッグ", + "cmd.sketch_drag_end": "スケッチのドラッグを終了", + "cmd.sketch_draw_dimensioned": "寸法付きスケッチ ジオメトリを描画", + "cmd.sketch_edit": "スケッチを編集", + "cmd.sketch_edit_text": "テキストを編集", + "cmd.sketch_export_dxf": "DXF として保存", + "cmd.sketch_finish_auto_constrain": "自動拘束で終了", + "cmd.sketch_fit_curves_to_section": "メッシュ断面に曲線をフィット", + "cmd.sketch_glyphs": "拘束記号", + "cmd.sketch_include_3d": "3D ジオメトリを含める", + "cmd.sketch_insert_dxf": "DXF を挿入", + "cmd.sketch_insert_svg": "SVG を挿入", + "cmd.sketch_inspect": "スケッチを検査", + "cmd.sketch_intersection_curve": "交差曲線", + "cmd.sketch_isoparametric_curve": "アイソパラメトリック曲線", + "cmd.sketch_line3d": "3D 線分", + "cmd.sketch_line_midpoint": "中点線分", + "cmd.sketch_move": "スケッチ要素を移動/コピー", + "cmd.sketch_move3d": "3D 点を移動", + "cmd.sketch_move_point": "スケッチ点をドラッグ", + "cmd.sketch_offset_break": "オフセット関連付けを解除", + "cmd.sketch_options": "スケッチ パレット オプション", + "cmd.sketch_point3d": "3D 点", + "cmd.sketch_polygon_circumscribed": "外接ポリゴン", + "cmd.sketch_polygon_edge": "エッジ ポリゴン", + "cmd.sketch_polygon_inscribed": "内接ポリゴン", + "cmd.sketch_project_to_surface": "サーフェスに投影", + "cmd.sketch_rectangle_center": "中心指定の長方形", + "cmd.sketch_rectangle_three_point": "3点指定長方形", + "cmd.sketch_rectangle_two_point": "2点指定長方形", + "cmd.sketch_redefine": "スケッチ平面を再定義", + "cmd.sketch_slot_arc_center": "中心点円弧スロット", + "cmd.sketch_slot_arc_three_point": "3点円弧スロット", + "cmd.sketch_slot_center_point": "中心点スロット", + "cmd.sketch_slot_center_to_center": "中心間スロット", + "cmd.sketch_slot_overall": "全長指定スロット", + "cmd.sketch_snap": "スナップ推論", + "cmd.sketch_solve": "スケッチを解決", + "cmd.sketch_spline3d": "3D スプライン", + "cmd.sketch_spline_control_point": "制御点スプライン", + "cmd.sketch_spline_control_point_5": "制御点スプライン (次数 5)", + "cmd.sketch_spline_fit_point": "通過点スプライン", + "cmd.sketch_spun_profile": "回転プロファイル", + "cmd.sketch_toggle_driven": "従動寸法の切り替え", + "cmd.solid_align": "整列", + "cmd.solid_boundary_fill": "境界フィル", + "cmd.solid_bounding_solid": "バウンディング ソリッド", + "cmd.solid_emboss": "エンボス", + "cmd.solid_move": "移動/コピー", + "cmd.solid_offset_face": "面をオフセット", + "cmd.solid_press_pull": "プレス プル", + "cmd.solid_remove": "除去", + "cmd.solid_replace_face": "面を置換", + "cmd.solid_rib": "リブ", + "cmd.solid_split_face": "面を分割", + "cmd.solid_web": "ウェブ", + "cmd.surface_patch": "パッチ", + "cmd.surface_stitch": "ステッチ", + "cmd.surface_thicken": "厚み付け", + "cmd.timeline_compute_all": "すべて再計算", + "cmd.timeline_copy": "フィーチャーをコピー", + "cmd.timeline_dependents": "従属フィーチャー", + "cmd.timeline_inspect": "フィーチャーを検査", + "cmd.timeline_paste": "フィーチャーを貼り付け", + "cmd.timeline_redefine": "フィーチャーを編集", + "cmd.timeline_rename": "名前を変更", + "cmd.timeline_reorder": "フィーチャーの順序を変更", + "cmd.timeline_roll_to": "履歴マーカーを移動", + "cmd.timeline_rollback": "タイムライン マーカーを移動", + "cmd.timeline_suppress": "フィーチャーを抑制", + "cmd.view_apply": "名前付きビューを復元", + "cmd.view_delete": "名前付きビューを削除", + "cmd.view_list": "名前付きビューを一覧表示", + "cmd.view_rename": "名前付きビューの名前を変更", + "cmd.view_save": "新規名前付きビュー", "dialog.custom_axis": "↖ カスタム軸", "dialog.edit_title": "{title}を編集", "dialog.select": "↖ 選択", - "dialog.selected_count": "↖ {count} 個選択", + "dialog.selected_count": "↖ {count} 個選択中", "document.save_changes": "{name} への変更を保存しますか?", "document.unsaved_changes": "{name} には保存されていない変更があります。保存しない場合、変更内容は失われます。", "settings.msaa_applies_on_restart": "アンチエイリアスは次回 SolidCraft を起動したときに適用されます", @@ -20,15 +276,17 @@ "sketch.draw_curves": "{linetype}として描く", "sketch.make_selection": "選択を{linetype}にする", "ui.1_degree_of_freedom": "自由度 1", + "ui.3d_mouse_speed": "3D マウス速度", + "ui.3d_mouse_windows": "3D マウス (Windows)", "ui.3d_sketch": "3D スケッチ", "ui.about": "SolidCraft について", "ui.activate": "アクティブ化", "ui.active_component": "アクティブなコンポーネント", - "ui.agent_cursor": "AIエージェントカーソル", - "ui.agent_cursor_speed": "AIエージェント速度", + "ui.agent_cursor": "エージェントカーソル", + "ui.agent_cursor_speed": "エージェントカーソル速度", "ui.all": "すべて", "ui.angle": "角度", - "ui.angle_decimals": "角度の小数点桁数", + "ui.angle_decimals": "角度の小数点以下の桁数", "ui.animate_view_changes": "視点変更をアニメーション表示", "ui.animation": "アニメーション", "ui.animation_speed": "アニメーション速度", @@ -52,24 +310,28 @@ "ui.chord_length": "弦長", "ui.circle": "円", "ui.circular_pattern": "円形パターン", + "ui.clear": "クリア", "ui.clear_recent": "最近使った項目をクリア", "ui.clear_the_selection": "選択をクリア", + "ui.click_selects_whole_bodies": "クリックでボディ全体を選択", + "ui.click_then_press_key": "クリックした後、割り当てるキーを押してください", "ui.close": "閉じる", "ui.coil": "コイル", "ui.coincident": "一致", "ui.collapse": "折りたたむ", - "ui.collinear": "同一直線", + "ui.collinear": "同一直線上", "ui.combine": "結合", "ui.coming_later": "準備中", - "ui.concentric": "同心円", + "ui.concentric": "同心", "ui.conic_curve": "円錐曲線", "ui.constant": "一定", "ui.constraints_conflict": "拘束が競合しています", "ui.construct": "構築", - "ui.construction": "構築", + "ui.construction": "コンストラクション", + "ui.context_menu": "コンテキスト メニュー", "ui.copy": "コピー", "ui.counterbore": "座ぐり", - "ui.countersink": "皿もみ", + "ui.countersink": "皿穴", "ui.create": "作成", "ui.create_copy": "コピーを作成", "ui.create_sketch": "スケッチを作成", @@ -79,7 +341,7 @@ "ui.cut": "切り取り", "ui.cylinder": "円柱", "ui.dark": "ダーク", - "ui.default_modelling_orientation": "デフォルトのモデル方向", + "ui.default_modelling_orientation": "モデリングのデフォルト方向", "ui.degrees_of_freedom": "自由度", "ui.delete": "削除", "ui.depth": "深さ", @@ -94,14 +356,16 @@ "ui.don_t_save": "保存しない", "ui.draft": "勾配", "ui.drawing": "図面", - "ui.drill_point": "先端", + "ui.drill_point": "ドリル先端", "ui.edit": "編集", "ui.ellipse": "楕円", "ui.end_radius": "終了半径", "ui.entities": "エンティティ", "ui.equal": "等しい", "ui.expand": "展開", - "ui.export_ellipsis": "エクスポート...", + "ui.export_ellipsis": "エクスポート…", + "ui.export_ellipsis_keymap": "エクスポート…", + "ui.export_keymap_tip": "ショートカット、Sボックスのお気に入り、ツールバー設定をファイルに保存", "ui.extend": "延長", "ui.extent_type": "範囲タイプ", "ui.extrude": "押し出し", @@ -110,20 +374,25 @@ "ui.features": "フィーチャー", "ui.file": "ファイル", "ui.fillet": "フィレット", + "ui.filter_commands_or_keys": "コマンドまたはキーを検索", "ui.finish_sketch": "スケッチを終了", "ui.fix_unfix": "固定/固定解除", - "ui.flat": "フラット", + "ui.flat": "展開", "ui.flip": "反転", "ui.front": "正面", "ui.fully_constrained": "完全拘束", "ui.general": "一般", "ui.graphics": "グラフィックス", + "ui.ground_shadow": "地面の影", + "ui.heading_add_ins": "アドイン", "ui.heading_assemble": "アセンブリ", "ui.heading_box": "直方体", "ui.heading_chamfer": "面取り", "ui.heading_circular_pattern": "円形パターン", "ui.heading_coil": "コイル", "ui.heading_combine": "結合", + "ui.heading_configure": "構成", + "ui.heading_constraints": "拘束", "ui.heading_construct": "構築", "ui.heading_create": "作成", "ui.heading_create_sketch": "スケッチを作成", @@ -140,6 +409,7 @@ "ui.heading_insert": "挿入", "ui.heading_inspect": "検査", "ui.heading_loft": "ロフト", + "ui.heading_make": "製造", "ui.heading_measure": "計測", "ui.heading_mesh": "メッシュ", "ui.heading_mirror": "ミラー", @@ -153,6 +423,7 @@ "ui.heading_pipe": "パイプ", "ui.heading_plane_at_angle": "傾斜平面", "ui.heading_plastic": "プラスチック", + "ui.heading_prepare": "準備", "ui.heading_rectangular_pattern": "矩形パターン", "ui.heading_revolve": "回転", "ui.heading_right": "右側面", @@ -172,13 +443,16 @@ "ui.heading_thread": "ねじ", "ui.heading_top": "上面", "ui.heading_torus": "トーラス", + "ui.heading_utilities": "ユーティリティ", + "ui.heading_utility": "ユーティリティ", "ui.help": "ヘルプ", "ui.hide": "非表示", "ui.hole": "穴", - "ui.hole_tap_type": "タップタイプ", + "ui.hole_tap_type": "ねじ穴タイプ", "ui.hole_type": "穴タイプ", "ui.home": "ホーム", "ui.horizontal_vertical": "水平/垂直", + "ui.import_ellipsis": "インポート…", "ui.insert": "挿入", "ui.inspect": "検査", "ui.intersect": "交差", @@ -186,12 +460,13 @@ "ui.joints": "ジョイント", "ui.keyboard_shortcuts": "キーボードショートカット", "ui.language": "言語", - "ui.length_decimals": "長さの小数点桁数", + "ui.length_decimals": "長さの小数点以下の桁数", "ui.light": "ライト", "ui.line": "線分", "ui.linetype": "線種", "ui.loft": "ロフト", - "ui.look_at": "視点を合わせる", + "ui.look_at": "正面視", + "ui.look_at_anim_desc": "軸ビュー、正面視、ホーム、全体表示", "ui.manufacture": "製造", "ui.measure": "計測", "ui.midpoint": "中点", @@ -207,17 +482,17 @@ "ui.normal": "標準", "ui.object_type": "オブジェクトタイプ", "ui.objects": "オブジェクト", - "ui.offer_to_stand_up_y_up_files": "Y-upファイルを立ち上げるか確認", + "ui.offer_to_stand_up_y_up_files": "Y-upファイルを正立させるか確認", "ui.offset": "オフセット", "ui.offset_plane": "オフセット平面", "ui.one_side": "片側", "ui.open": "開く", - "ui.open_ellipsis": "開く...", + "ui.open_ellipsis": "開く…", "ui.open_preferences": "環境設定を開く", "ui.open_recent": "最近使った項目を開く", "ui.operation": "操作", "ui.options": "オプション", - "ui.orbit_around": "回転の中心", + "ui.orbit_around": "回転中心", "ui.origin": "原点", "ui.palette_points": "点", "ui.palette_profile": "プロファイル", @@ -228,6 +503,7 @@ "ui.path": "パス", "ui.pattern_on_path": "パス上のパターン", "ui.perpendicular": "直交", + "ui.perspective_view": "パースペクティブ表示", "ui.pipe": "パイプ", "ui.placement": "配置", "ui.plane": "平面", @@ -237,17 +513,23 @@ "ui.points": "点", "ui.polygon": "ポリゴン", "ui.preferences": "環境設定", + "ui.press_a_key": "キーを押してください…", "ui.profile": "プロファイル", "ui.profile_plane": "プロファイル平面", "ui.profiles": "プロファイル", "ui.project": "投影", + "ui.project_face_edges_sketch": "新規スケッチに面のエッジを自動投影", "ui.quit": "終了", + "ui.radial_context_menu": "パイ メニュー", "ui.radius": "半径", "ui.radius_type": "半径タイプ", "ui.rectangle": "長方形", "ui.rectangular_pattern": "矩形パターン", "ui.redo": "やり直す", "ui.render": "レンダリング", + "ui.renderer": "レンダラー", + "ui.reset": "リセット", + "ui.reset_all": "すべてリセット", "ui.reset_the_settings_on_this_page": "このページの設定をリセット", "ui.restore_defaults": "初期値に戻す", "ui.reverse_zoom_direction": "ズーム方向を反転", @@ -255,10 +537,11 @@ "ui.right": "右側面", "ui.save": "保存", "ui.save_as": "名前を付けて保存", - "ui.save_as_ellipsis": "名前を付けて保存...", + "ui.save_as_ellipsis": "名前を付けて保存…", "ui.scale": "尺度", "ui.section_analysis": "断面解析", "ui.select": "選択", + "ui.select_other_hint": "その他を選択: モデル上で左ボタンを長押し(または右クリック › その他を選択…)するとカーソル下の要素が一覧表示されます。同じ場所を再度クリックすると次の要素が選択されます。", "ui.selection": "選択", "ui.shell": "シェル", "ui.show": "表示", @@ -279,10 +562,15 @@ "ui.slice": "スライス", "ui.slot": "スロット", "ui.smooth": "スムーズ", + "ui.smooth_wheel_zoom": "滑らかなホイールズーム", + "ui.smooth_wheel_zoom_tip": "オフにすると、ホイール操作のたびにズームが即座に反映され、滑らかな減速効果は適用されません。", "ui.snap": "スナップ", + "ui.space_mouse_hint": "視点の移動と回転を同時に行います(スケッチ中はパンとズームのみ)", + "ui.space_mouse_navigate": "SpaceNavigator / SpaceMouseで視点を操作", "ui.sphere": "球", "ui.spline": "スプライン", "ui.split_body": "ボディを分割", + "ui.stand_up_tip": "Z軸上向きで開いたSTEPまたはIGESファイルに対し、X軸周りに90度回転させるか確認します", "ui.start": "開始", "ui.start_radius": "開始半径", "ui.sweep": "スイープ", @@ -291,7 +579,7 @@ "ui.system": "システム", "ui.tangent": "正接", "ui.taper_angle": "テーパ角度", - "ui.tapped": "タップ立て", + "ui.tapped": "ねじ穴", "ui.text": "テキスト", "ui.theme": "テーマ", "ui.thickness": "厚さ", @@ -300,16 +588,262 @@ "ui.to_object": "オブジェクトまで", "ui.top": "上面", "ui.torus": "トーラス", + "ui.trackpad_pan_tip": "トラックパッドのジェスチャーでパンします(オフの場合はマウスホイールと同様にズームします)。マウスホイールはズーム、サイドホイールは横方向のパン、ピンチ操作は常にズームになります。", "ui.trim": "トリム", + "ui.two_finger_scroll_pans": "2本指スクロールでパン", "ui.two_sides": "両側", "ui.ui_scale": "UIスケール", "ui.undo": "元に戻す", "ui.units": "単位", "ui.units_of_new_designs": "新規デザインの単位", "ui.untitled": "無題", + "ui.up_axis_note": "ビュー(軸ビュー、ホーム、正面視)で上向きにする軸を指定します。デザインデータ自体は変更されません。", "ui.variable": "可変", "ui.view_centre": "ビュー中心", + "ui.visual_shaded_hidden_edges": "隠線付きシェーディング", + "ui.visual_shaded_with_edges": "エッジ付きシェーディング", "ui.visual_style": "表示スタイル", + "ui.visual_wireframe": "ワイヤーフレーム", "ui.workspace": "ワークスペース", - "ui.zoom_to_the_cursor": "カーソル位置へズーム" -} + "ui.y_up": "Y軸上向き", + "ui.z_up": "Z軸上向き", + "ui.zoom_to_cursor_tip": "マウスホイールでカーソル位置を基準にズームします(オフの場合はビューの中心を基準にズームします)。", + "ui.zoom_to_the_cursor": "カーソル位置へズーム", + "A new configuration, a copy of the active one": "アクティブな構成をコピーして新しい構成を作成", + "About SolidCraft": "SolidCraft について", + "Active": "アクティブ", + "Active rule": "有効なルール", + "Add": "追加", + "Add Key": "キーを追加", + "Add Mid Radius": "中間半径を追加", + "Add Row": "行を追加", + "All Sketch Points": "すべてのスケッチ点", + "All open designs": "すべての開いているデザイン", + "Allowed expressions, separated by semicolons": "使用可能な式(セミコロンで区切る)", + "Also deletes": "同時に削除される要素:", + "Angle 2": "角度 2", + "Animate": "アニメーション", + "Appearance name": "外観名", + "Applied Radius": "適用半径", + "Apply To": "適用先", + "Area": "表面積", + "Attachment": "アタッチメント", + "BROWSER": "ブラウザ", + "Bend Line Position": "曲げ線位置", + "Bend Position": "曲げ位置", + "Bend Radius": "曲げ半径", + "Bends": "曲げ", + "Body": "ボディ", + "Bounding box": "境界ボックス", + "CSV or JSON: updates existing parameters, adds new ones": "CSVまたはJSON:既存のパラメータを更新し、新しいパラメータを追加します", + "Capture All Positions": "すべての位置をキャプチャ", + "Catch Direction": "キャッチ方向", + "Cells": "セル", + "Center X": "中心 X", + "Center Y": "中心 Y", + "Center of mass": "重心", + "Chamfer Type": "面取りタイプ", + "Check collisions": "衝突チェック", + "Checked": "チェック済み", + "Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.": "新しい平面を選択してください。スケッチジオメトリと寸法は2次元座標系のまま維持されます。", + "Close draft": "下書きを閉じる", + "Collisions": "衝突", + "Colour": "色", + "Component1": "コンポーネント1", + "Configuration": "構成", + "Configuration rules": "構成ルール", + "Contact": "接触", + "Copy all licences": "すべてのライセンスをコピー", + "Copy diagnostic information": "診断情報をコピー", + "Copy report": "レポートをコピー", + "Corner Relief Shape": "コーナーリリーフ形状", + "Counterbore depth": "座ぐり深さ", + "Countersink angle": "皿穴角度", + "Create Issue — review draft": "Issueを作成 — 下書きの確認", + "Customize Toolbar": "ツールバーのカスタマイズ", + "Delete all": "すべて削除", + "Delete rule": "ルールを削除", + "Delete the row": "行を削除", + "Delete the set": "セットを削除", + "Delete this parameter": "このパラメータを削除", + "Density": "密度", + "Designs you open or save appear here.": "開いたデザインや保存したデザインがここに表示されます。", + "Determined by To Object. Choose Angle to edit the angular extent.": "「対象オブジェクトまで」により決定されます。角度範囲を編集するには「角度」を選択してください。", + "Discard": "破棄", + "Double-click to rename": "ダブルクリックで名前変更", + "Drive Joint": "ジョイントを駆動", + "Edit Profile Sketch": "プロファイルスケッチを編集", + "Enable rule": "ルールを有効化", + "Enabled": "有効", + "Explode": "分解", + "Extents": "範囲", + "Face attachment lost": "面アタッチメントが失われました", + "Faces / edges / vertices": "面 / エッジ / 頂点", + "Favourite": "お気に入り", + "Files from many CAD programs have Y up, so they open lying on their back here (Z up).": "多くのCADではY軸を上向きとしているため、Z軸を上向きとするSolidCraftでは、読み込んだモデルが横倒しの向きで表示されることがあります。", + "Filter": "フィルター", + "Find in Browser": "ブラウザで検索", + "Flat size": "展開サイズ", + "Follow camera (Look At sketches)": "カメラ追従(スケッチを正面視)", + "Font": "フォント", + "Full Length": "全長", + "Gap": "ギャップ", + "Grid": "グリッド", + "Height": "高さ", + "Home view": "ホームビュー", + "In This Design": "このデザイン内", + "Interferes": "干渉あり", + "Issue title": "Issueタイトル", + "Joint Origin1": "ジョイント原点1", + "Keep Tools": "ツールボディを保持", + "Later": "後で", + "Leave it": "そのままにする", + "Legacy face attachment. Rebinding to a certified face creates an exact attachment.": "従来の面アタッチメントです。確定された面に再バインドすると正確なアタッチメントが作成されます。", + "Length": "長さ", + "Length units": "長さの単位", + "Library": "ライブラリ", + "Loop": "ループ", + "Margin": "マージン", + "Mass": "質量", + "Material": "材料", + "Mid Radius": "中間半径", + "Modeled": "モデル化済み", + "More toolbar panels": "その他のツールバーパネル", + "Motion": "モーション", + "Move Type": "移動タイプ", + "Move earlier": "前へ移動", + "Move later": "後へ移動", + "Name": "名前", + "No crash reports.": "クラッシュレポートはありません。", + "No matching appearances": "一致する外観がありません", + "Not available yet": "まだ利用できません", + "Opacity": "不透明度", + "Open GitHub draft": "GitHubの下書きを開く", + "Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "Rust製オープンソース・パラメトリック3D CAD。ライセンス: MIT または Apache-2.0。", + "Other side": "反対側", + "Parameter values": "パラメータ値", + "Per Edge": "エッジごと", + "Pick the tool bodies": "ツールボディを選択", + "Place at the origin instead": "代わりに原点に配置", + "Playback": "再生", + "Position": "位置", + "Position (0 to 1)": "位置 (0〜1)", + "Position along the edge, 0 at the start end, 1 at the other": "エッジ上の位置(始点が0、終点が1)", + "Preview leaves the current design unchanged.": "プレビューは現在のデザインを変更しません。", + "RECENT": "最近使用した項目", + "Radius Fit": "半径フィット", + "Ratio": "比率", + "Recover": "復元", + "Recover unsaved design?": "未保存のデザインを復元しますか?", + "Remove Tools": "ツールボディを削除", + "Remove from list": "リストから削除", + "Remove private design details or paths before sharing.": "共有前に、非公開の設計情報やファイルパスを削除してください。", + "Remove the column": "列を削除", + "Remove the track": "トラックを削除", + "Remove this point": "この点を削除", + "Report a bug — review a screenshot and open a GitHub draft": "バグを報告 — スクリーンショットを確認してGitHub下書きを作成", + "Reset Toolbar": "ツールバーをリセット", + "Restore the inherited component or physical material appearance": "コンポーネントまたは物理マテリアルから継承した外観に戻す", + "Result": "結果", + "Retake screenshot": "スクリーンショットを再取得", + "Reverse": "反転", + "Reverse Direction": "方向を反転", + "Revert": "元に戻す", + "Revert All Positions": "すべての位置を元に戻す", + "Review the report and screenshot before opening GitHub.": "GitHubを開く前にレポートとスクリーンショットを確認してください。", + "Rim Edge": "リムエッジ", + "Roll History Marker Here": "履歴マーカーをここに移動", + "Rule": "ルール", + "Saved preview. Geometry is being checked before editing.": "保存済みのプレビューです。編集前にジオメトリを検証しています。", + "Scale factor": "尺度係数", + "Search": "検索", + "Search commands": "コマンドを検索", + "Select bodies (a face picks its body)": "ボディを選択(面をクリックするとそのボディが選択されます)", + "Select bodies or faces instead": "代わりにボディまたは面を選択", + "Selection filter": "選択フィルター", + "Semantic faces share their appearance across instances.": "セマンティック面はインスタンス間で外観を共有します。", + "Shape": "形状", + "Show Agent Cursor": "エージェントカーソルを表示", + "Show in folder": "フォルダに表示", + "Size": "サイズ", + "Sketch plane has no body-face attachment.": "スケッチ平面にボディ面のアタッチメントがありません。", + "SolidCraft closed before these designs were saved. Their last autosave can be opened.": "これらのデザインが保存される前にSolidCraftが終了しました。最後の自動保存ファイルを開くことができます。", + "Speed": "速度", + "Stand it up": "正立させる", + "Stand it up: a quarter turn about X, as one Move feature you can undo.": "正立させる: 取り消し可能な1つの移動フィーチャーとして、X軸周りに90度回転します。", + "Stand this part up?": "このパーツを正立させますか?", + "Step": "ステップ", + "Steps": "ステップ数", + "Suppressed": "抑制", + "Swap Ends": "端点を入れ替え", + "Tangent Chain": "正接チェーン", + "The dashed sketch is a saved plane guide. Select a new face to repair the attachment.": "破線のスケッチは保存された平面ガイドです。新しい面を選択してアタッチメントを修復してください。", + "The saved author occurrence is missing. Select a valid author placement before rebinding.": "保存された作成元のオカレンスが見つかりません。再バインドする前に有効な作成元配置を選択してください。", + "Then": "次を実行 (Then)", + "These features will be deleted:": "以下のフィーチャーが削除されます:", + "These features will fail:": "以下のフィーチャーでエラーが発生します:", + "This child is shared. Deleting it removes it from every copy of its parent.": "この子要素は共有されています。削除すると親のすべてのコピーから削除されます。", + "This child is shared. Position changes apply to every copy of its parent.": "この子要素は共有されています。位置の変更は親のすべてのコピーに適用されます。", + "This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "この面は安定したアタッチメントを提供できません。別の面を選択するか、固定平面を明示的に使用してください。", + "To Offset": "オフセットまで", + "Tolerance": "公差", + "Type": "タイプ", + "Updating the preview": "プレビューを更新中", + "Use fixed plane": "固定平面を使用", + "VIEW": "表示", + "Value": "値", + "Volume": "体積", + "Wall": "肉厚", + "When": "条件 (When)", + "Width": "幅", + "Will fail": "失敗します", + "angle, height": "角度, 高さ", + "command name": "コマンド名", + "expression, e.g. 25 mm": "計算式 (例: 25 mm)", + "fits the face, e.g. M8": "面に適合するサイズ (例: M8)", + "from the rule": "ルールから", + "needs two joints": "2つのジョイントが必要", + "new configuration": "新規構成", + "new name": "新しい名前", + "new parameter": "新規パラメータ", + "no interference": "干渉なし", + "no joint that moves yet": "可動ジョイントがまだありません", + "no picture": "画像なし", + "pick a hole to seat it, or OK places it at the origin": "配置先の穴を選択するか、[OK]を押すと原点に配置します。", + "pick one or two vertices, edges or faces": "1つまたは2つの頂点、エッジ、面を選択", + "the parts library is not available": "パーツライブラリは利用できません", + "to the next face": "次の面まで", + "Revert Position": "位置を元に戻す", + "Construction": "コンストラクション", + "Flat": "展開", + "Faces": "面", + "Edges": "エッジ", + "Vertices": "頂点", + "Sketch geometry and profiles": "スケッチジオメトリとプロファイル", + "Sketch curves": "スケッチ曲線", + "Sketch points": "スケッチ点", + "Sketch dimensions": "スケッチ寸法", + "Sketch constraints": "スケッチ拘束", + "0 turns it off": "0で無効化", + "Show the pointer an AI agent moves (#35)": "エージェントが操作するポインターを表示 (#35)", + "Follow the camera (Look At sketches)": "カメラ追従(スケッチを正面視)", + "Save Rule": "ルールを保存", + "Preview Row": "行をプレビュー", + "Add condition": "条件を追加", + "Apply to selection": "選択項目に適用", + "Remove override": "オーバーライドを削除", + "Copy screenshot": "スクリーンショットをコピー", + "Remove screenshot": "スクリーンショットを削除", + "Use active author placement": "アクティブな作成元配置を使用", + "Reattach selected face": "選択した面を再アタッチ", + "Use saved fixed plane": "保存された固定平面を使用", + "Use selected face as fixed plane": "選択した面を固定平面として使用", + "View navigator": "ビューナビゲーター", + "Signed axes": "符号付き座標軸", + "Cube": "キューブ", + "Middle double-click": "中ボタンのダブルクリック", + "Double-clicking the middle button in the view: Home (the home view, framing what is shown), Fit (frame what is shown, keeping the orientation) or nothing": "ビュー上で中ボタンをダブルクリックした時の動作: ホーム(全体を収めたホームビュー)、全体表示(向きを維持して全体を収める)、または無効", + "Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).": "その他を選択: モデル上で左ボタンを長押し(または右クリック › その他を選択…)するとカーソル下の要素が一覧表示されます。同じ場所を再度クリックすると次の要素が選択されます。中ボタンをダブルクリックするとホームビューに戻ります(環境設定 › ナビゲーション)。", + "cmd.render_backends": "レンダリング バックエンド", + "cmd.view_navigate": "ビューナビゲーション" +} \ No newline at end of file diff --git a/crates/ui-egui/src/palette.rs b/crates/ui-egui/src/palette.rs index ff1c7c69..1968eeab 100644 --- a/crates/ui-egui/src/palette.rs +++ b/crates/ui-egui/src/palette.rs @@ -95,7 +95,7 @@ pub fn popup(app: &mut SolveApp, ctx: &egui::Context) { let mut picked: Option<&'static str> = None; let t = Tokens::get(); let center = ctx.content_rect().center(); - crate::frame::window(ctx, "Search commands", crate::frame::Width::Normal) + crate::frame::window(ctx, crate::i18n::tr_label("Search commands"), crate::frame::Width::Normal) .id(egui::Id::new("sc_search")) .pivot(egui::Align2::LEFT_TOP) .fixed_pos(egui::pos2(center.x - 200.0, 150.0)) @@ -103,7 +103,7 @@ pub fn popup(app: &mut SolveApp, ctx: &egui::Context) { .collapsible(false) .open(&mut open) .show(ctx, |ui| { - let r = ui.add(egui::TextEdit::singleline(&mut app.palette.text).hint_text("command name").desired_width(380.0)); + let r = ui.add(egui::TextEdit::singleline(&mut app.palette.text).hint_text(crate::i18n::tr_label("command name")).desired_width(380.0)); // Read Enter before taking the focus back (lost_focus reads the focus as it is now). let entered = r.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)); r.request_focus(); diff --git a/crates/ui-egui/src/params_dialog.rs b/crates/ui-egui/src/params_dialog.rs index 4987a442..69389624 100644 --- a/crates/ui-egui/src/params_dialog.rs +++ b/crates/ui-egui/src/params_dialog.rs @@ -125,7 +125,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { let t = Tokens::get(); let mut open = true; let all = rows(app); - crate::frame::window(ctx, RichText::new("PARAMETERS").strong().size(13.0), crate::frame::Width::Wide) + crate::frame::window(ctx, RichText::new(crate::i18n::tr_label("PARAMETERS")).strong().size(13.0), crate::frame::Width::Wide) .id(egui::Id::new("sc_params_dialog")) .open(&mut open) .default_width(740.0) @@ -134,9 +134,9 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { .collapsible(false) .show(ctx, |ui| { ui.horizontal(|ui| { - ui.add(egui::TextEdit::singleline(&mut d.filter).hint_text("Filter").desired_width(180.0)); + ui.add(egui::TextEdit::singleline(&mut d.filter).hint_text(crate::i18n::tr_label("Filter")).desired_width(180.0)); ui.separator(); - if ui.button("Import…").on_hover_text("CSV or JSON: updates existing parameters, adds new ones").clicked() + if ui.button("Import…").on_hover_text(crate::i18n::tr_label("CSV or JSON: updates existing parameters, adds new ones")).clicked() && let Some(p) = app.services.pick_open.as_ref().and_then(|f| f()) { d.error = app.run("parameters.import", json!({ "path": p })).err(); @@ -226,7 +226,7 @@ fn table(app: &mut SolveApp, ui: &mut egui::Ui, d: &mut ParamsDialog, rows: &[&R for r in rows { // Favourite star. let star = if r.favorite { RichText::new("★").color(t.accent) } else { RichText::new("☆").color(t.text_dim) }; - if ui.add(egui::Button::new(star).frame(false)).on_hover_text("Favourite").clicked() { + if ui.add(egui::Button::new(star).frame(false)).on_hover_text(crate::i18n::tr_label("Favourite")).clicked() { d.error = app.run("parameters.favorite", json!({"name": r.name, "favorite": !r.favorite})).err(); } // Name: double-click to rename. @@ -245,7 +245,11 @@ fn table(app: &mut SolveApp, ui: &mut egui::Ui, d: &mut ParamsDialog, rows: &[&R } _ => { let name = if r.source == "user" { RichText::new(&r.name) } else { RichText::new(&r.name).color(t.text_dim) }; - if ui.add(egui::Label::new(name).sense(egui::Sense::click())).on_hover_text("Double-click to rename").double_clicked() { + if ui + .add(egui::Label::new(name).sense(egui::Sense::click())) + .on_hover_text(crate::i18n::tr_label("Double-click to rename")) + .double_clicked() + { d.renaming = Some((r.name.clone(), r.name.clone())); } } @@ -321,7 +325,7 @@ fn table(app: &mut SolveApp, ui: &mut egui::Ui, d: &mut ParamsDialog, rows: &[&R if r.source == "user" { if ui .add(egui::Button::new(RichText::new("Delete").small().color(t.text_dim)).frame(false)) - .on_hover_text("Delete this parameter") + .on_hover_text(crate::i18n::tr_label("Delete this parameter")) .clicked() { d.error = app.run("parameters.delete", json!({"name": r.name})).err(); @@ -360,7 +364,8 @@ fn add_row(app: &mut SolveApp, ui: &mut egui::Ui, d: &mut ParamsDialog) { let expr_id = ui.make_persistent_id("pnew_expr"); let comment_id = ui.make_persistent_id("pnew_comment"); let focused_id = ui.memory(|m| [name_id, expr_id, comment_id].into_iter().find(|id| m.has_focus(*id))); - let name = ui.add(egui::TextEdit::singleline(&mut d.new_name).id(name_id).hint_text("new parameter").desired_width(120.0)); + let name = + ui.add(egui::TextEdit::singleline(&mut d.new_name).id(name_id).hint_text(crate::i18n::tr_label("new parameter")).desired_width(120.0)); crate::scenario::publish_handle("param:new:name", name.rect.center()); let unit_response = egui::ComboBox::from_id_salt("pnew_unit") .width(56.0) @@ -389,7 +394,7 @@ fn add_row(app: &mut SolveApp, ui: &mut egui::Ui, d: &mut ParamsDialog) { crate::scenario::publish_handle("param:new:comment", comment.rect.center()); let submit = !completed && enter_for(ui, focused_id.is_some()); let ok = !d.new_name.trim().is_empty() && live.is_ok(); - if ui.add_enabled(ok, egui::Button::new("Add")).clicked() || submit { + if ui.add_enabled(ok, egui::Button::new(crate::i18n::tr_label("Add"))).clicked() || submit { if let Err(error) = &live { d.error = Some(error.clone()); if let Some(id) = focused_id { diff --git a/crates/ui-egui/src/prefs.rs b/crates/ui-egui/src/prefs.rs index e1bb1807..f22a1505 100644 --- a/crates/ui-egui/src/prefs.rs +++ b/crates/ui-egui/src/prefs.rs @@ -879,7 +879,7 @@ fn page(app: &mut SolveApp, ui: &mut egui::Ui, t: &Tokens) { set_autosave(app); } ui.end_row(); - note(ui, "0 turns it off"); + note(ui, crate::i18n::tr_label("0 turns it off")); ui.label(app.tr("ui.length_decimals")); ui.add(egui::DragValue::new(&mut app.preferences.length_decimals).range(0..=6)); ui.end_row(); @@ -889,7 +889,7 @@ fn page(app: &mut SolveApp, ui: &mut egui::Ui, t: &Tokens) { ui.label(app.tr("ui.agent_cursor")); let speed_label = app.tr("ui.agent_cursor_speed"); let s = &mut app.ui.agent_cursor; - ui.checkbox(&mut s.show, "Show the pointer an AI agent moves (#35)"); + ui.checkbox(&mut s.show, crate::i18n::tr_label("Show the pointer an AI agent moves (#35)")); ui.end_row(); ui.label(speed_label); ui.add_enabled_ui(s.show, |ui| { @@ -897,29 +897,31 @@ fn page(app: &mut SolveApp, ui: &mut egui::Ui, t: &Tokens) { }); ui.end_row(); ui.label(""); - ui.add_enabled(s.show, egui::Checkbox::new(&mut s.follow_camera, "Follow the camera (Look At sketches)")); + ui.add_enabled(s.show, egui::Checkbox::new(&mut s.follow_camera, crate::i18n::tr_label("Follow the camera (Look At sketches)"))); ui.end_row(); } 1 => { - ui.label("Pan, zoom, orbit"); - egui::ComboBox::from_id_salt("pref_nav").selected_text(nav_preset(&app.preferences.nav).label).show_ui(ui, |ui| { + ui.label(app.tr_label("Pan, zoom, orbit")); + let current_preset_label = app.tr_label(nav_preset(&app.preferences.nav).label); + egui::ComboBox::from_id_salt("pref_nav").selected_text(current_preset_label).show_ui(ui, |ui| { for p in &NAV_PRESETS { - if ui.selectable_value(&mut app.preferences.nav, p.id.to_string(), p.label).clicked() { + if ui.selectable_value(&mut app.preferences.nav, p.id.to_string(), crate::i18n::tr_label(p.label)).clicked() { app.preferences.zoom_reverse = p.reverse_zoom; } } }); ui.end_row(); let snap_help = if app.preferences.nav == OPENSCAD_NAV { "" } else { "; hold Shift during orbit to snap" }; - note(ui, &format!("{}; Ctrl+left drag on empty space orbits{snap_help}; the wheel zooms", nav_preset(&app.preferences.nav).help)); - ui.label("Context menu"); - ui.checkbox(&mut app.preferences.radial_context_menu, "Radial context menu"); + let raw_help = format!("{}; Ctrl+left drag on empty space orbits{snap_help}; the wheel zooms", nav_preset(&app.preferences.nav).help); + note(ui, crate::i18n::tr_label(&raw_help)); + ui.label(crate::i18n::tr_label("Context menu")); + ui.checkbox(&mut app.preferences.radial_context_menu, crate::i18n::tr_label("Radial context menu")); ui.end_row(); - ui.label("View navigator"); + ui.label(crate::i18n::tr_label("View navigator")); let picker = - egui::ComboBox::from_id_salt("pref_navigator_style").selected_text(app.preferences.navigator_style.label()).show_ui(ui, |ui| { + egui::ComboBox::from_id_salt("pref_navigator_style").selected_text(crate::i18n::tr_label(app.preferences.navigator_style.label())).show_ui(ui, |ui| { for style in NavigatorStyle::ALL { - let response = ui.selectable_value(&mut app.preferences.navigator_style, style, style.label()); + let response = ui.selectable_value(&mut app.preferences.navigator_style, style, crate::i18n::tr_label(style.label())); crate::scenario::publish_rect(&format!("prefs:navigator:{}", style.label()), response.rect); crate::scenario::publish_handle(&format!("prefs:navigator:{}", style.label()), response.rect.center()); } @@ -927,89 +929,90 @@ fn page(app: &mut SolveApp, ui: &mut egui::Ui, t: &Tokens) { crate::scenario::publish_rect("prefs:navigator", picker.response.rect); crate::scenario::publish_handle("prefs:navigator", picker.response.rect.center()); ui.end_row(); - ui.label("Reverse zoom direction"); + ui.label(crate::i18n::tr_label("Reverse zoom direction")); ui.checkbox(&mut app.preferences.zoom_reverse, ""); ui.end_row(); - ui.label("Zoom to the cursor"); + ui.label(crate::i18n::tr_label("Zoom to the cursor")); ui.checkbox(&mut app.preferences.zoom_to_cursor, "") - .on_hover_text("The wheel zooms toward the point under the cursor (off: toward the view's centre)"); + .on_hover_text(crate::i18n::tr_label("The wheel zooms toward the point under the cursor (off: toward the view's centre)")); ui.end_row(); - ui.label("Smooth wheel zoom"); + ui.label(crate::i18n::tr_label("Smooth wheel zoom")); ui.checkbox(&mut app.preferences.smooth_wheel_zoom, "") - .on_hover_text("Turn off to apply each wheel event immediately, without a smoothing tail"); + .on_hover_text(crate::i18n::tr_label("Turn off to apply each wheel event immediately, without a smoothing tail")); ui.end_row(); - ui.label("Two-finger scroll pans"); - ui.checkbox(&mut app.preferences.trackpad_pan, "").on_hover_text( + ui.label(crate::i18n::tr_label("Two-finger scroll pans")); + ui.checkbox(&mut app.preferences.trackpad_pan, "").on_hover_text(crate::i18n::tr_label( "Trackpad gestures pan (off: they zoom like the wheel); mouse wheel zooms, thumb wheel pans sideways, pinch always zooms", - ); + )); ui.end_row(); - ui.label("Orbit around"); + ui.label(crate::i18n::tr_label("Orbit around")); ui.horizontal(|ui| { - ui.radio_value(&mut app.preferences.orbit_cursor, false, "View centre"); - ui.radio_value(&mut app.preferences.orbit_cursor, true, "Point under the cursor"); + ui.radio_value(&mut app.preferences.orbit_cursor, false, crate::i18n::tr_label("View centre")); + ui.radio_value(&mut app.preferences.orbit_cursor, true, crate::i18n::tr_label("Point under the cursor")); }); ui.end_row(); - ui.label("Middle double-click"); + ui.label(crate::i18n::tr_label("Middle double-click")); let current = MiddleDoubleClick::of(app); - egui::ComboBox::from_id_salt("pref_middle_double_click").selected_text(current.label()).show_ui(ui, |ui| { + egui::ComboBox::from_id_salt("pref_middle_double_click").selected_text(crate::i18n::tr_label(current.label())).show_ui(ui, |ui| { for (m, id, label) in MiddleDoubleClick::ALL { - if ui.selectable_label(current == m, label).clicked() { + if ui.selectable_label(current == m, crate::i18n::tr_label(label)).clicked() { app.preferences.middle_double_click = id.into(); } } }) .response - .on_hover_text("Double-clicking the middle button in the view: Home (the home view, framing what is shown), Fit (frame what is shown, keeping the orientation) or nothing"); + .on_hover_text(crate::i18n::tr_label("Double-clicking the middle button in the view: Home (the home view, framing what is shown), Fit (frame what is shown, keeping the orientation) or nothing")); ui.end_row(); - ui.label("Animate view changes"); - ui.checkbox(&mut app.preferences.look_at_anim, "Axis view, Look At, Home and Fit"); + ui.label(crate::i18n::tr_label("Animate view changes")); + ui.checkbox(&mut app.preferences.look_at_anim, crate::i18n::tr_label("Axis view, Look At, Home and Fit")); ui.end_row(); - ui.label("Animation speed"); + ui.label(crate::i18n::tr_label("Animation speed")); ui.add_enabled( app.preferences.look_at_anim, egui::Slider::new(&mut app.preferences.look_at_speed, 0.5..=3.0).step_by(0.25).custom_formatter(|v, _| format!("{v:.2}×")), ); ui.end_row(); - ui.label("3D mouse (Windows)"); - ui.checkbox(&mut app.preferences.space_mouse_enabled, "Navigate with SpaceNavigator / SpaceMouse"); + ui.label(crate::i18n::tr_label("3D mouse (Windows)")); + ui.checkbox(&mut app.preferences.space_mouse_enabled, crate::i18n::tr_label("Navigate with SpaceNavigator / SpaceMouse")); ui.end_row(); - ui.label("3D mouse speed"); + ui.label(crate::i18n::tr_label("3D mouse speed")); ui.add_enabled( app.preferences.space_mouse_enabled, egui::Slider::new(&mut app.preferences.space_mouse_speed, 0.25..=3.0).step_by(0.05).custom_formatter(|v, _| format!("{v:.2}×")), ); ui.end_row(); - note(ui, "Move and rotate the view together; sketches use pan and zoom only."); + note(ui, crate::i18n::tr_label("Move and rotate the view together; sketches use pan and zoom only.")); } PAGE_DESIGN => { - ui.label("Default modelling orientation"); + ui.label(crate::i18n::tr_label("Default modelling orientation")); ui.horizontal(|ui| { - ui.radio_value(&mut app.preferences.up_axis, "z".to_string(), "Z up"); - ui.radio_value(&mut app.preferences.up_axis, "y".to_string(), "Y up"); + ui.radio_value(&mut app.preferences.up_axis, "z".to_string(), crate::i18n::tr_label("Z up")); + ui.radio_value(&mut app.preferences.up_axis, "y".to_string(), crate::i18n::tr_label("Y up")); }); ui.end_row(); - note(ui, "Which axis points up in the views (axis view, Home, Look At). Designs are unchanged."); - ui.label("Offer to stand up Y-up files"); + note(ui, crate::i18n::tr_label("Which axis points up in the views (axis view, Home, Look At). Designs are unchanged.")); + ui.label(crate::i18n::tr_label("Offer to stand up Y-up files")); ui.checkbox(&mut app.preferences.offer_stand_up, "") - .on_hover_text("After a STEP or IGES file opens with Z up, offer a quarter turn about X"); + .on_hover_text(crate::i18n::tr_label("After a STEP or IGES file opens with Z up, offer a quarter turn about X")); ui.end_row(); } 4 => { - ui.label("Visual style"); + ui.label(crate::i18n::tr_label("Visual style")); let styles = ["Shaded with edges", "Shaded", "Wireframe", "Shaded with hidden edges"]; - egui::ComboBox::from_id_salt("pref_style").selected_text(styles[usize::from(app.ui.visual_style.min(3))]).show_ui(ui, |ui| { + let selected_label = crate::i18n::tr_label(styles[usize::from(app.ui.visual_style.min(3))]); + egui::ComboBox::from_id_salt("pref_style").selected_text(selected_label).show_ui(ui, |ui| { for (i, s) in styles.iter().enumerate() { - ui.selectable_value(&mut app.ui.visual_style, i as u8, *s); + ui.selectable_value(&mut app.ui.visual_style, i as u8, crate::i18n::tr_label(s)); } }); ui.end_row(); - ui.label("Grid"); + ui.label(crate::i18n::tr_label("Grid")); ui.checkbox(&mut app.ui.show_grid, ""); ui.end_row(); - ui.label("Ground shadow"); + ui.label(crate::i18n::tr_label("Ground shadow")); ui.checkbox(&mut app.ui.ground_shadow, ""); ui.end_row(); - ui.label("Perspective view"); + ui.label(crate::i18n::tr_label("Perspective view")); ui.checkbox(&mut app.ui.perspective, ""); ui.end_row(); ui.label(app.tr("ui.anti_aliasing")); @@ -1024,7 +1027,7 @@ fn page(app: &mut SolveApp, ui: &mut egui::Ui, t: &Tokens) { }); ui.end_row(); note(ui, app.tr("settings.msaa_applies_on_restart")); - ui.label("Renderer"); + ui.label(crate::i18n::tr_label("Renderer")); ui.label(match (&app.viewport.gpu, &app.help.gpu) { (Some(_), Some(g)) => format!("GPU: {g}"), (Some(_), None) => "GPU".to_string(), @@ -1033,7 +1036,7 @@ fn page(app: &mut SolveApp, ui: &mut egui::Ui, t: &Tokens) { ui.end_row(); } 5 => { - ui.label("Project face edges into new sketches"); + ui.label(crate::i18n::tr_label("Project face edges into new sketches")); let mut auto = app.session.auto_project; if ui.checkbox(&mut auto, "").changed() { let _ = app.run("sketch.auto_project", json!({ "value": auto })); @@ -1041,7 +1044,7 @@ fn page(app: &mut SolveApp, ui: &mut egui::Ui, t: &Tokens) { ui.end_row(); } _ => { - ui.label("Click selects whole bodies"); + ui.label(crate::i18n::tr_label("Click selects whole bodies")); ui.checkbox(&mut app.ui.pick_bodies, ""); ui.end_row(); } diff --git a/crates/ui-egui/src/recovery_ui.rs b/crates/ui-egui/src/recovery_ui.rs index 57ffd796..dfd3e813 100644 --- a/crates/ui-egui/src/recovery_ui.rs +++ b/crates/ui-egui/src/recovery_ui.rs @@ -57,30 +57,30 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { let dir = app.autosave.as_ref().map(|a| a.dir.clone()).or_else(recovery::default_dir); let mut act: Option<(Entry, bool)> = None; let mut later = false; - crate::frame::window(ctx, RichText::new("Recover unsaved design?").strong().size(13.0), crate::frame::Width::Normal) + crate::frame::window(ctx, RichText::new(crate::i18n::tr_label("Recover unsaved design?")).strong().size(13.0), crate::frame::Width::Normal) .collapsible(false) .resizable(false) .min_width(420.0) .anchor(egui::Align2::CENTER_CENTER, egui::vec2(0.0, 0.0)) .show(ctx, |ui| { - ui.label("SolidCraft closed before these designs were saved. Their last autosave can be opened."); + ui.label(crate::i18n::tr_label("SolidCraft closed before these designs were saved. Their last autosave can be opened.")); ui.add_space(6.0); for e in app.recoverable.iter().take(20) { ui.label(RichText::new(&e.name).strong()); let file = e.path.clone().unwrap_or_else(|| "never saved".into()); ui.label(RichText::new(format!("{file} · {} features · autosaved {}", e.features, ago(e.saved_at))).small().weak()); ui.horizontal(|ui| { - if ui.button("Recover").clicked() { + if ui.button(crate::i18n::tr_label("Recover")).clicked() { act = Some((e.clone(), true)); } - if ui.button("Discard").clicked() { + if ui.button(crate::i18n::tr_label("Discard")).clicked() { act = Some((e.clone(), false)); } }); ui.separator(); } ui.horizontal(|ui| { - if ui.button("Later").on_hover_text("Keep them; ask again next launch").clicked() { + if ui.button(crate::i18n::tr_label("Later")).on_hover_text("Keep them; ask again next launch").clicked() { later = true; } }); diff --git a/crates/ui-egui/src/shortcut_box.rs b/crates/ui-egui/src/shortcut_box.rs index 94d5c83d..34c46a9b 100644 --- a/crates/ui-egui/src/shortcut_box.rs +++ b/crates/ui-egui/src/shortcut_box.rs @@ -176,7 +176,10 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { ui.separator(); } let te = ui.add( - egui::TextEdit::singleline(&mut app.sbox.text).hint_text("Search commands").desired_width(W - 20.0).id(egui::Id::new("sc_sbox_text")), + egui::TextEdit::singleline(&mut app.sbox.text) + .hint_text(crate::i18n::tr_label("Search commands")) + .desired_width(W - 20.0) + .id(egui::Id::new("sc_sbox_text")), ); te.request_focus(); if te.changed() { @@ -184,7 +187,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { } ui.add_space(4.0); if app.sbox.text.trim().is_empty() && !app.sbox.recent.is_empty() { - ui.label(egui::RichText::new("RECENT").size(10.0).color(t.text_dim)); + ui.label(egui::RichText::new(crate::i18n::tr_label("RECENT")).size(10.0).color(t.text_dim)); } egui::ScrollArea::vertical().max_height(h - 90.0).show(ui, |ui| { ui.spacing_mut().item_spacing.y = 0.0; diff --git a/crates/ui-egui/src/sketch_attachment_ui.rs b/crates/ui-egui/src/sketch_attachment_ui.rs index 9cec8a6e..2531790e 100644 --- a/crates/ui-egui/src/sketch_attachment_ui.rs +++ b/crates/ui-egui/src/sketch_attachment_ui.rs @@ -154,17 +154,17 @@ pub fn panel(app: &mut SolveApp, ctx: &egui::Context, at: Pos2) { Some(*plane) } FaceAttachmentStatus::Lost { message, repair_plane } => { - ui.label(RichText::new("Face attachment lost").color(t.error)); + ui.label(RichText::new(crate::i18n::tr_label("Face attachment lost")).color(t.error)); ui.label(message); if repair_plane.is_some() { - ui.label("The dashed sketch is a saved plane guide. Select a new face to repair the attachment."); + ui.label(crate::i18n::tr_label("The dashed sketch is a saved plane guide. Select a new face to repair the attachment.")); } else { - ui.label("The saved author occurrence is missing. Select a valid author placement before rebinding."); + ui.label(crate::i18n::tr_label("The saved author occurrence is missing. Select a valid author placement before rebinding.")); } *repair_plane } FaceAttachmentStatus::Legacy { plane } => { - ui.label("Legacy face attachment. Rebinding to a certified face creates an exact attachment."); + ui.label(crate::i18n::tr_label("Legacy face attachment. Rebinding to a certified face creates an exact attachment.")); *plane } FaceAttachmentStatus::Sheet { plane } => { @@ -172,7 +172,7 @@ pub fn panel(app: &mut SolveApp, ctx: &egui::Context, at: Pos2) { *plane } FaceAttachmentStatus::Fixed { plane } => { - ui.label("Sketch plane has no body-face attachment."); + ui.label(crate::i18n::tr_label("Sketch plane has no body-face attachment.")); *plane } }; @@ -180,7 +180,7 @@ pub fn panel(app: &mut SolveApp, ctx: &egui::Context, at: Pos2) { if matches!(&status, FaceAttachmentStatus::Lost { repair_plane: None, .. }) { let author = app.session.doc.feature(sketch).map(|feature| feature.component); let available = author == Some(app.session.active_component); - if ui.add_enabled(available, egui::Button::new("Use active author placement")).clicked() { + if ui.add_enabled(available, egui::Button::new(crate::i18n::tr_label("Use active author placement"))).clicked() { draft.author_path = Some(app.session.active_occurrence_path.clone().unwrap_or_default()); draft.error = None; } @@ -188,7 +188,7 @@ pub fn panel(app: &mut SolveApp, ctx: &egui::Context, at: Pos2) { ui.label(format!("Author placement: {}", path_label(app, path))); } } - ui.label("Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates."); + ui.label(crate::i18n::tr_label("Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.")); ui.horizontal_wrapped(|ui| { for plane in ["XY", "XZ", "YZ"] { if ui.button(format!("Use {plane} plane")).clicked() { @@ -201,20 +201,20 @@ pub fn panel(app: &mut SolveApp, ctx: &egui::Context, at: Pos2) { draft.choose(json!(feature.name), feature.name.clone()); } } - if ui.add_enabled(selected.is_some(), egui::Button::new("Reattach selected face")).clicked() + if ui.add_enabled(selected.is_some(), egui::Button::new(crate::i18n::tr_label("Reattach selected face"))).clicked() && let Some(selection @ Sel::Face { .. }) = &selected && let Some(plane) = face_plane(app, selection) { let label = face_label(app, selection); draft.choose(plane, label); } - if ui.add_enabled(saved_plane.is_some(), egui::Button::new("Use saved fixed plane")).clicked() + if ui.add_enabled(saved_plane.is_some(), egui::Button::new(crate::i18n::tr_label("Use saved fixed plane"))).clicked() && let Some(plane) = saved_plane && let Err(error) = draft.choose_saved_fixed(app, plane) { draft.error = Some(error); } - if ui.add_enabled(selected.is_some(), egui::Button::new("Use selected face as fixed plane")).clicked() + if ui.add_enabled(selected.is_some(), egui::Button::new(crate::i18n::tr_label("Use selected face as fixed plane"))).clicked() && let Some(selection) = &selected && let Some(mut plane) = face_plane(app, selection) { diff --git a/crates/ui-egui/src/sketch_tools.rs b/crates/ui-egui/src/sketch_tools.rs index ac63328c..fc13937c 100644 --- a/crates/ui-egui/src/sketch_tools.rs +++ b/crates/ui-egui/src/sketch_tools.rs @@ -1221,7 +1221,7 @@ pub fn show(app: &mut SolveApp, ui: &egui::Ui, painter: &egui::Painter, proj: &P fn text_entry(app: &mut SolveApp, ctx: &egui::Context) { let Some((at, mut text)) = TEXT.with(|t| t.borrow_mut().take()) else { return }; let mut done = None; - crate::frame::window(ctx, "Text", crate::frame::Width::Normal) + crate::frame::window(ctx, crate::i18n::tr_label("Text"), crate::frame::Width::Normal) .collapsible(false) .resizable(false) .anchor(egui::Align2::CENTER_CENTER, egui::vec2(0.0, 0.0)) diff --git a/crates/ui-egui/src/stand_up.rs b/crates/ui-egui/src/stand_up.rs index b5f7034a..c6274776 100644 --- a/crates/ui-egui/src/stand_up.rs +++ b/crates/ui-egui/src/stand_up.rs @@ -35,20 +35,20 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) { return; } let mut act: Option<&str> = None; - crate::frame::window(ctx, "Stand this part up?", crate::frame::Width::Normal) + crate::frame::window(ctx, crate::i18n::tr_label("Stand this part up?"), crate::frame::Width::Normal) .id(egui::Id::new("sc_stand_up")) .collapsible(false) .resizable(false) .anchor(egui::Align2::CENTER_TOP, egui::vec2(0.0, 140.0)) .show(ctx, |ui| { - ui.label("Files from many CAD programs have Y up, so they open lying on their back here (Z up)."); - ui.label("Stand it up: a quarter turn about X, as one Move feature you can undo."); + ui.label(crate::i18n::tr_label("Files from many CAD programs have Y up, so they open lying on their back here (Z up).")); + ui.label(crate::i18n::tr_label("Stand it up: a quarter turn about X, as one Move feature you can undo.")); ui.add_space(6.0); ui.horizontal(|ui| { - if ui.button("Stand it up").clicked() { + if ui.button(crate::i18n::tr_label("Stand it up")).clicked() { act = Some("stand"); } - if ui.button("Leave it").clicked() { + if ui.button(crate::i18n::tr_label("Leave it")).clicked() { act = Some("leave"); } if ui.button("Don't ask again").on_hover_text("Preferences › Design turns the offer back on").clicked() { diff --git a/crates/ui-egui/src/theme.rs b/crates/ui-egui/src/theme.rs index 1032c470..7e327c27 100644 --- a/crates/ui-egui/src/theme.rs +++ b/crates/ui-egui/src/theme.rs @@ -356,9 +356,12 @@ mod tests { ..Default::default() }; output = ctx.run_ui(raw, |ui| { - crate::frame::window(ui.ctx(), "Parameters", crate::frame::Width::Normal).fade_in(false).show(ui.ctx(), |ui| { - ui.label("Parameter values"); - }); + crate::frame::window(ui.ctx(), crate::i18n::tr_label("Parameters"), crate::frame::Width::Normal).fade_in(false).show( + ui.ctx(), + |ui| { + ui.label(crate::i18n::tr_label("Parameter values")); + }, + ); }); output.textures_delta.clear(); } diff --git a/crates/ui-egui/src/timeline.rs b/crates/ui-egui/src/timeline.rs index aa4611f3..cabfaba4 100644 --- a/crates/ui-egui/src/timeline.rs +++ b/crates/ui-egui/src/timeline.rs @@ -236,17 +236,17 @@ pub fn timeline(app: &mut SolveApp, ui: &mut egui::Ui) { _ => None, }; resp.context_menu(|ui| { - if ui.button("Edit Feature").clicked() { + if ui.button(crate::i18n::tr_label("Edit Feature")).clicked() { edit = Some(*id); ui.close(); } if let Some(sk) = sketch_of - && ui.button("Edit Profile Sketch").clicked() + && ui.button(crate::i18n::tr_label("Edit Profile Sketch")).clicked() { app.edit_sketch(sk); ui.close(); } - if ui.button("Rename").clicked() { + if ui.button(crate::i18n::tr_label("Rename")).clicked() { app.dialog = Some(crate::dialogs::Dialog::rename(*id, name)); ui.close(); } @@ -254,11 +254,11 @@ pub fn timeline(app: &mut SolveApp, ui: &mut egui::Ui) { let _ = app.run("timeline.suppress", json!({"feature": id})); ui.close(); } - if ui.button("Roll History Marker Here").clicked() { + if ui.button(crate::i18n::tr_label("Roll History Marker Here")).clicked() { let _ = app.run("timeline.roll_to", json!({ "feature": id })); ui.close(); } - if ui.button("Find in Browser").clicked() { + if ui.button(crate::i18n::tr_label("Find in Browser")).clicked() { find_in_browser(app, *id); ui.close(); } diff --git a/crates/ui-egui/src/toolbar.rs b/crates/ui-egui/src/toolbar.rs index 76b0d0cc..19dcd528 100644 --- a/crates/ui-egui/src/toolbar.rs +++ b/crates/ui-egui/src/toolbar.rs @@ -311,7 +311,7 @@ pub fn app_bar(app: &mut SolveApp, ui: &mut egui::Ui) { t.app_bar_text, ); } - if response.on_hover_text("Report a bug — review a screenshot and open a GitHub draft").clicked() { + if response.on_hover_text(crate::i18n::tr_label("Report a bug — review a screenshot and open a GitHub draft")).clicked() { crate::help::run(app, &ui.ctx().clone(), "report"); } // Preferences, at the top right like Fusion's profile menu (also Ctrl+,). @@ -790,7 +790,7 @@ pub fn toolbar(app: &mut SolveApp, ui: &mut egui::Ui) { if *panel == "SELECT" { selection_filter(app, ui); } else if cmds.is_empty() { - ui.label(egui::RichText::new("Not available yet").color(t.text_dim)); + ui.label(egui::RichText::new(crate::i18n::tr_label("Not available yet")).color(t.text_dim)); } if sketch_create { sketch_create_menu(app, ui, &cmds, &mut menu, &mut toggle); @@ -874,7 +874,7 @@ pub fn toolbar(app: &mut SolveApp, ui: &mut egui::Ui) { } }); crate::scenario::publish_handle("toolbar:overflow", response.response.rect.center()); - response.response.on_hover_text("More toolbar panels"); + response.response.on_hover_text(crate::i18n::tr_label("More toolbar panels")); }); } painter.line_segment([pos2(r.left(), r.bottom() - 0.5), pos2(r.right(), r.bottom() - 0.5)], Stroke::new(1.0, t.border)); @@ -1136,8 +1136,8 @@ fn pin_icon(p: &egui::Painter, r: Rect, on: bool, col: Color32) { /// The SELECT panel: what a click in the view picks. fn selection_filter(app: &mut SolveApp, ui: &mut egui::Ui) { let t = Tokens::get(); - ui.label(egui::RichText::new("Selection filter").color(t.text_dim).size(11.0)); - ui.checkbox(&mut app.ui.pick_bodies, "Select bodies (a face picks its body)"); + ui.label(egui::RichText::new(crate::i18n::tr_label("Selection filter")).color(t.text_dim).size(11.0)); + ui.checkbox(&mut app.ui.pick_bodies, crate::i18n::tr_label("Select bodies (a face picks its body)")); for (k, label) in [ ("faces", "Faces"), ("edges", "Edges"), @@ -1149,7 +1149,7 @@ fn selection_filter(app: &mut SolveApp, ui: &mut egui::Ui) { ("constraints", "Sketch constraints"), ] { let mut on = !app.ui.pick_off.iter().any(|x| x == k); - if ui.checkbox(&mut on, label).changed() { + if ui.checkbox(&mut on, crate::i18n::tr_label(label)).changed() { app.ui.pick_off.retain(|x| x != k); if !on { app.ui.pick_off.push(k.to_string()); diff --git a/crates/ui-egui/src/toolbar_custom.rs b/crates/ui-egui/src/toolbar_custom.rs index efe2dd64..2e503e78 100644 --- a/crates/ui-egui/src/toolbar_custom.rs +++ b/crates/ui-egui/src/toolbar_custom.rs @@ -228,7 +228,7 @@ pub fn window(app: &mut SolveApp, ctx: &egui::Context) { let mut open = true; let mut changes: Vec<(&'static str, bool)> = Vec::new(); let mut reset_tab = false; - crate::frame::window(ctx, "Customize Toolbar", crate::frame::Width::Normal) + crate::frame::window(ctx, crate::i18n::tr_label("Customize Toolbar"), crate::frame::Width::Normal) .id(egui::Id::new("sc_toolbar_customize")) .open(&mut open) .default_height(520.0) @@ -261,7 +261,7 @@ pub fn window(app: &mut SolveApp, ctx: &egui::Context) { }); ui.separator(); ui.horizontal(|ui| { - if ui.button("Reset Toolbar").clicked() { + if ui.button(crate::i18n::tr_label("Reset Toolbar")).clicked() { reset_tab = true; } }); diff --git a/crates/ui-egui/src/viewport.rs b/crates/ui-egui/src/viewport.rs index 93881fd6..529cfc7e 100644 --- a/crates/ui-egui/src/viewport.rs +++ b/crates/ui-egui/src/viewport.rs @@ -2982,7 +2982,7 @@ fn signed_axis_view(app: &mut SolveApp, ui: &mut egui::Ui, rect: Rect) { crate::scenario::publish_handle("axis_view:home", home.center()); let hr = ui.interact(home, ui.id().with("axis_view_home"), Sense::click()); icons::paint(&painter, home, "home", t.icon, if hr.hovered() { t.accent_soft } else { t.overlay }, t.accent); - if hr.on_hover_text("Home view").clicked() { + if hr.on_hover_text(crate::i18n::tr_label("Home view")).clicked() { app.animate_view("home"); } } @@ -3153,19 +3153,19 @@ fn view_menu(app: &mut SolveApp, ui: &mut egui::Ui, button: Rect) -> bool { let r = area.show(ui.ctx(), |ui| { egui::Frame::popup(ui.style()).show(ui, |ui| { ui.set_width(220.0); - ui.label(egui::RichText::new("VIEW").strong().size(11.5)); - ui.checkbox(&mut app.ui.show_grid, "Grid"); - ui.checkbox(&mut app.ui.ground_shadow, "Ground shadow"); + ui.label(egui::RichText::new(crate::i18n::tr_label("VIEW")).strong().size(11.5)); + ui.checkbox(&mut app.ui.show_grid, crate::i18n::tr_label("Grid")); + ui.checkbox(&mut app.ui.ground_shadow, crate::i18n::tr_label("Ground shadow")); ui.separator(); let s = &mut app.ui.agent_cursor; - let show = ui.checkbox(&mut s.show, "Show Agent Cursor"); + let show = ui.checkbox(&mut s.show, crate::i18n::tr_label("Show Agent Cursor")); crate::scenario::publish_handle("view:agent_cursor", show.rect.center()); ui.add_enabled_ui(s.show, |ui| { ui.horizontal(|ui| { - ui.label("Speed"); + ui.label(crate::i18n::tr_label("Speed")); crate::agent_cursor::speed_slider(ui, &mut s.speed); }); - ui.checkbox(&mut s.follow_camera, "Follow camera (Look At sketches)"); + ui.checkbox(&mut s.follow_camera, crate::i18n::tr_label("Follow camera (Look At sketches)")); }); }); }); diff --git a/docs/i18n_catalog_ja.md b/docs/i18n_catalog_ja.md new file mode 100644 index 00000000..12edf234 --- /dev/null +++ b/docs/i18n_catalog_ja.md @@ -0,0 +1,848 @@ +# SolidCraft 英語・日本語 ローカライズ対照リスト (全 844 件) + +| 英語 (English) | 日本語 (Japanese) | キー名 (Key) | +| :--- | :--- | :--- | +| {command}: open a design first | {command}: 先にデザインを開いてください | `ui.needs_design` | +| {count} degrees of freedom | 自由度 {count} | `sketch.degrees_of_freedom` | +| {name} has unsaved changes. If you don't save, they are lost. | {name} には保存されていない変更があります。保存しない場合、変更内容は失われます。 | `document.unsaved_changes` | +| {setting}: {requested}× isn't supported by this graphics device; it is now {reset}× (supported: {supported}). | {setting}: {requested}× はこのグラフィックスデバイスではサポートされていないため、{reset}× に変更しました(サポート: {supported})。 | `settings.msaa_reset` | +| ↖ {count} selected | ↖ {count} 個選択中 | `dialog.selected_count` | +| ↖ Custom Axis | ↖ カスタム軸 | `dialog.custom_axis` | +| ↖ Select | ↖ 選択 | `dialog.select` | +| 0 turns it off | 0で無効化 | `0 turns it off` | +| 1 degree of freedom | 自由度 1 | `ui.1_degree_of_freedom` | +| 2-Point Circle | 2点指定円 | `cmd.sketch_circle_two_point` | +| 2-Point Rectangle | 2点指定長方形 | `cmd.sketch_rectangle_two_point` | +| 2-Tangent Circle | 2接線指定の円 | `cmd.sketch_circle_two_tangent` | +| 3-Point Arc | 3点指定円弧 | `cmd.sketch_arc_three_point` | +| 3-Point Circle | 3点指定円 | `cmd.sketch_circle_three_point` | +| 3-Point Rectangle | 3点指定長方形 | `cmd.sketch_rectangle_three_point` | +| 3-Tangent Circle | 3接線指定の円 | `cmd.sketch_circle_three_tangent` | +| 3D Line | 3D 線分 | `cmd.sketch_line3d` | +| 3D mouse (Windows) | 3D マウス (Windows) | `ui.3d_mouse_windows` | +| 3D mouse speed | 3D マウス速度 | `ui.3d_mouse_speed` | +| 3D Point | 3D 点 | `cmd.sketch_point3d` | +| 3D Sketch | 3D スケッチ | `ui.3d_sketch` | +| 3D Spline | 3D スプライン | `cmd.sketch_spline3d` | +| A new configuration, a copy of the active one | アクティブな構成をコピーして新しい構成を作成 | `A new configuration, a copy of the active one` | +| About | SolidCraft について | `ui.about` | +| About SolidCraft | SolidCraft について | `About SolidCraft` | +| Accessibility Analysis | アクセシビリティ解析 | `cmd.inspect_accessibility` | +| Activate | アクティブ化 | `ui.activate` | +| Activate Component | コンポーネントをアクティブ化 | `cmd.component_activate` | +| Activate Configuration | 構成をアクティブ化 | `cmd.config_activate` | +| Active | アクティブ | `Active` | +| Active component | アクティブなコンポーネント | `ui.active_component` | +| Active rule | 有効なルール | `Active rule` | +| Add | 追加 | `Add` | +| Add condition | 条件を追加 | `Add condition` | +| Add Key | キーを追加 | `Add Key` | +| Add Mid Radius | 中間半径を追加 | `Add Mid Radius` | +| Add Row | 行を追加 | `Add Row` | +| Add User Parameter | ユーザー パラメータを追加 | `cmd.parameters_add` | +| ADD-INS | アドイン | `ui.heading_add_ins` | +| After a STEP or IGES file opens with Z up, offer a quarter turn about X | Z軸上向きで開いたSTEPまたはIGESファイルに対し、X軸周りに90度回転させるか確認します | `ui.stand_up_tip` | +| Agent cursor | エージェントカーソル | `ui.agent_cursor` | +| Agent cursor speed | エージェントカーソル速度 | `ui.agent_cursor_speed` | +| Align | 整列 | `cmd.solid_align` | +| All | すべて | `ui.all` | +| All open designs | すべての開いているデザイン | `All open designs` | +| All Sketch Points | すべてのスケッチ点 | `All Sketch Points` | +| Allowed expressions, separated by semicolons | 使用可能な式(セミコロンで区切る) | `Allowed expressions, separated by semicolons` | +| Also deletes | 同時に削除される要素: | `Also deletes` | +| Angle | 角度 | `ui.angle` | +| Angle 2 | 角度 2 | `Angle 2` | +| Angle decimals | 角度の小数点以下の桁数 | `ui.angle_decimals` | +| angle, height | 角度, 高さ | `angle, height` | +| Animate | アニメーション | `Animate` | +| Animate view changes | 視点変更をアニメーション表示 | `ui.animate_view_changes` | +| Animation | アニメーション | `ui.animation` | +| Animation speed | アニメーション速度 | `ui.animation_speed` | +| Anti-aliasing | アンチエイリアス | `ui.anti_aliasing` | +| Anti-aliasing applies the next time SolidCraft starts | アンチエイリアスは次回 SolidCraft を起動したときに適用されます | `settings.msaa_applies_on_restart` | +| Appearance | 外観 | `cmd.appearance_assign` | +| Appearance Library | 外観ライブラリ | `cmd.appearance_library` | +| Appearance name | 外観名 | `Appearance name` | +| Applied Radius | 適用半径 | `Applied Radius` | +| Apply | 適用 | `ui.apply` | +| Apply To | 適用先 | `Apply To` | +| Apply to selection | 選択項目に適用 | `Apply to selection` | +| Arc | 円弧 | `ui.arc` | +| Area | 表面積 | `Area` | +| As-Built Joint | 現位置ジョイント | `cmd.joint_as_built` | +| Assemble | アセンブリ | `ui.assemble` | +| ASSEMBLE | アセンブリ | `ui.heading_assemble` | +| Assign Plastic Rule | プラスチック ルールを割り当て | `cmd.plastic_assign_rule` | +| Attachment | アタッチメント | `Attachment` | +| Auto-Project Edges on Reference | 参照上のエッジを自動投影 | `cmd.sketch_auto_project` | +| AutoConstrain | 自動拘束 | `cmd.sketch_auto_constrain` | +| AutoConstrain from datum | 基準から自動拘束 | `cmd.sketch_auto_constrain_from_datum` | +| Autosave every | 自動保存の間隔 | `ui.autosave_every` | +| Axes | 軸 | `ui.axes` | +| Axis | 軸 | `ui.axis` | +| Axis Perpendicular To Face | 面に垂直な軸 | `cmd.construct_axis_normal_to_face` | +| Axis Through Cylinder/Cone/Torus | 円柱/円錐/トーラスを通る軸 | `cmd.construct_axis_through_cylinder` | +| Axis Through Edge | エッジを通る軸 | `cmd.construct_axis_edge` | +| Axis Through Two Planes | 2平面を通る軸 | `cmd.construct_axis_two_planes` | +| Axis Through Two Points | 2点を通る軸 | `cmd.construct_axis_two_points` | +| Axis view, Look At, Home and Fit | 軸ビュー、正面視、ホーム、全体表示 | `ui.look_at_anim_desc` | +| Base point | 基点 | `ui.base_point` | +| Bend Line Position | 曲げ線位置 | `Bend Line Position` | +| Bend Position | 曲げ位置 | `Bend Position` | +| Bend Radius | 曲げ半径 | `Bend Radius` | +| Bends | 曲げ | `Bends` | +| Blend Curve | ブレンド曲線 | `cmd.sketch_blend_curve` | +| Bodies | ボディ | `ui.bodies` | +| Body | ボディ | `Body` | +| Body{number} | ボディ{number} | `browser.body_name` | +| Boss | ボス | `cmd.plastic_boss` | +| Boundary Fill | 境界フィル | `cmd.solid_boundary_fill` | +| Bounding box | 境界ボックス | `Bounding box` | +| Bounding Solid | バウンディング ソリッド | `cmd.solid_bounding_solid` | +| Box | 直方体 | `ui.box` | +| BOX | 直方体 | `ui.heading_box` | +| Break | 分割 | `ui.break` | +| Break Link | リンクを解除 | `cmd.component_break_link` | +| Break Offset Association | オフセット関連付けを解除 | `cmd.sketch_offset_break` | +| BROWSER | ブラウザ | `BROWSER` | +| Calibrate Canvas | キャンバスの尺度を設定 | `cmd.canvas_calibrate` | +| Cancel | キャンセル | `ui.cancel` | +| Canvas | キャンバス | `cmd.canvas_insert` | +| Canvases | キャンバス | `ui.canvases` | +| Capture All Positions | すべての位置をキャプチャ | `Capture All Positions` | +| Capture Position | 位置をキャプチャ | `cmd.component_capture_position` | +| Catch Direction | キャッチ方向 | `Catch Direction` | +| Cells | セル | `Cells` | +| Center Diameter Circle | 中心と直径で指定した円 | `cmd.sketch_circle_center` | +| Center of mass | 重心 | `Center of mass` | +| Center of Mass | 重心 | `cmd.inspect_center_of_mass` | +| Center Point Arc | 中心点円弧 | `cmd.sketch_arc_center_point` | +| Center Point Arc Slot | 中心点円弧スロット | `cmd.sketch_slot_arc_center` | +| Center Point Slot | 中心点スロット | `cmd.sketch_slot_center_point` | +| Center Rectangle | 中心指定の長方形 | `cmd.sketch_rectangle_center` | +| Center to Center Slot | 中心間スロット | `cmd.sketch_slot_center_to_center` | +| Center X | 中心 X | `Center X` | +| Center Y | 中心 Y | `Center Y` | +| Centerline | 中心線 | `ui.centerline` | +| Chain | チェーン | `cmd.sketch_chain` | +| Chamfer | 面取り | `ui.chamfer` | +| CHAMFER | 面取り | `ui.heading_chamfer` | +| Chamfer Type | 面取りタイプ | `Chamfer Type` | +| Change Design Units | デザインの単位を変更 | `cmd.document_units` | +| Change Parameters | パラメータを変更 | `cmd.parameters_change` | +| Change Part Size | パーツ サイズを変更 | `cmd.parts_resize` | +| Change workspace | ワークスペースの変更 | `ui.change_workspace` | +| Check collisions | 衝突チェック | `Check collisions` | +| Check Contact | 接触を確認 | `cmd.contact_check` | +| Checked | チェック済み | `Checked` | +| Checkpoint | チェックポイント | `cmd.edit_checkpoint` | +| Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates. | 新しい平面を選択してください。スケッチジオメトリと寸法は2次元座標系のまま維持されます。 | `Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.` | +| Chord Length | 弦長 | `ui.chord_length` | +| Circle | 円 | `ui.circle` | +| Circular Pattern | 円形パターン | `ui.circular_pattern` | +| CIRCULAR PATTERN | 円形パターン | `ui.heading_circular_pattern` | +| Circumscribed Polygon | 外接ポリゴン | `cmd.sketch_polygon_circumscribed` | +| Clear | クリア | `ui.clear` | +| Clear Recent | 最近使った項目をクリア | `ui.clear_recent` | +| Clear Selection | 選択をクリア | `cmd.select_clear` | +| Clear the selection | 選択をクリア | `ui.clear_the_selection` | +| Click selects whole bodies | クリックでボディ全体を選択 | `ui.click_selects_whole_bodies` | +| Click, then press the new key | クリックした後、割り当てるキーを押してください | `ui.click_then_press_key` | +| Close | 閉じる | `ui.close` | +| Close draft | 下書きを閉じる | `Close draft` | +| Coil | コイル | `ui.coil` | +| COIL | コイル | `ui.heading_coil` | +| Coincident | 一致 | `ui.coincident` | +| Collapse | 折りたたむ | `ui.collapse` | +| Collinear | 同一直線上 | `ui.collinear` | +| Collisions | 衝突 | `Collisions` | +| Colour | 色 | `Colour` | +| Combine | 結合 | `ui.combine` | +| COMBINE | 結合 | `ui.heading_combine` | +| coming later | 準備中 | `ui.coming_later` | +| command name | コマンド名 | `command name` | +| Comment Parameter | パラメータにコメントを付与 | `cmd.parameters_comment` | +| Complete Expression | 式を補完 | `cmd.parameters_complete` | +| Component Physical Properties | コンポーネントの物理的プロパティ | `cmd.component_properties` | +| Component{number} | コンポーネント{number} | `browser.component_name` | +| Component1 | コンポーネント1 | `Component1` | +| Compute All | すべて再計算 | `cmd.timeline_compute_all` | +| Concentric | 同心 | `ui.concentric` | +| Configuration | 構成 | `Configuration` | +| Configuration Column | 構成列 | `cmd.config_column` | +| Configuration Row | 構成行 | `cmd.config_row` | +| Configuration Rule | 構成ルール | `cmd.config_rule` | +| Configuration rules | 構成ルール | `Configuration rules` | +| Configuration Rules | 構成ルール一覧 | `cmd.config_rules` | +| Configure | 構成を設定 | `cmd.config_configure` | +| CONFIGURE | 構成 | `ui.heading_configure` | +| Conic Curve | 円錐曲線 | `ui.conic_curve` | +| Constant | 一定 | `ui.constant` | +| Constraint Glyphs | 拘束記号 | `cmd.sketch_glyphs` | +| Constraints | 拘束 | `ui.show_constraints` | +| CONSTRAINTS | 拘束 | `ui.heading_constraints` | +| Constraints conflict | 拘束が競合しています | `ui.constraints_conflict` | +| Construct | 構築 | `ui.construct` | +| CONSTRUCT | 構築 | `ui.heading_construct` | +| Construction | コンストラクション | `ui.construction` | +| Construction | コンストラクション | `Construction` | +| Contact | 接触 | `Contact` | +| Context menu | コンテキスト メニュー | `ui.context_menu` | +| Control Point Spline | 制御点スプライン | `cmd.sketch_spline_control_point` | +| Control Point Spline (Degree 5) | 制御点スプライン (次数 5) | `cmd.sketch_spline_control_point_5` | +| Convert Mesh | メッシュを変換 | `cmd.mesh_convert` | +| Convert the selection to {linetype} | 選択を{linetype}にする | `sketch.make_selection` | +| Convert to Sheet Metal | 板金に変換 | `cmd.sheet_convert` | +| Copy | コピー | `ui.copy` | +| Copy all licences | すべてのライセンスをコピー | `Copy all licences` | +| Copy diagnostic information | 診断情報をコピー | `Copy diagnostic information` | +| Copy Features | フィーチャーをコピー | `cmd.timeline_copy` | +| Copy report | レポートをコピー | `Copy report` | +| Copy screenshot | スクリーンショットをコピー | `Copy screenshot` | +| Corner Relief Shape | コーナーリリーフ形状 | `Corner Relief Shape` | +| Counterbore | 座ぐり | `ui.counterbore` | +| Counterbore depth | 座ぐり深さ | `Counterbore depth` | +| Countersink | 皿穴 | `ui.countersink` | +| Countersink angle | 皿穴角度 | `Countersink angle` | +| Crash Report | クラッシュレポート | `cmd.diagnostics_crash_report` | +| Crash Reports | クラッシュレポート一覧 | `cmd.diagnostics_crash_reports` | +| Crash Test | クラッシュテスト | `cmd.diagnostics_crash_test` | +| Create | 作成 | `ui.create` | +| CREATE | 作成 | `ui.heading_create` | +| Create Components from Bodies | ボディからコンポーネントを作成 | `cmd.component_from_bodies` | +| Create Copy | コピーを作成 | `ui.create_copy` | +| Create Flat Pattern | 展開図を作成 | `cmd.sheet_flat_pattern` | +| Create Issue — review draft | Issueを作成 — 下書きの確認 | `Create Issue — review draft` | +| Create Sketch | スケッチを作成 | `ui.create_sketch` | +| CREATE SKETCH | スケッチを作成 | `ui.heading_create_sketch` | +| CSV or JSON: updates existing parameters, adds new ones | CSVまたはJSON:既存のパラメータを更新し、新しいパラメータを追加します | `CSV or JSON: updates existing parameters, adds new ones` | +| Cube | キューブ | `Cube` | +| current | 現在 | `ui.current` | +| Curvature | 曲率 | `ui.curvature` | +| Curvature Comb Analysis | 曲率コーム解析 | `cmd.inspect_curvature_comb` | +| Curvature Map Analysis | 曲率マップ解析 | `cmd.inspect_curvature_map` | +| Customize Toolbar | ツールバーのカスタマイズ | `Customize Toolbar` | +| Cut | 切り取り | `ui.cut` | +| Cylinder | 円柱 | `ui.cylinder` | +| CYLINDER | 円柱 | `ui.heading_cylinder` | +| Dark | ダーク | `ui.dark` | +| Decal | デカール | `cmd.canvas_decal` | +| Default modelling orientation | モデリングのデフォルト方向 | `ui.default_modelling_orientation` | +| degrees of freedom | 自由度 | `ui.degrees_of_freedom` | +| Delete | 削除 | `ui.delete` | +| Delete all | すべて削除 | `Delete all` | +| Delete Canvas | キャンバスを削除 | `cmd.canvas_delete` | +| Delete Component | コンポーネントを削除 | `cmd.component_delete` | +| Delete Crash Reports | クラッシュレポートを消去 | `cmd.diagnostics_crash_reports_clear` | +| Delete Exploded View | 分解図を削除 | `cmd.explode_delete` | +| Delete Face | 面を削除 | `cmd.face_delete` | +| Delete Joint | ジョイントを削除 | `cmd.joint_delete` | +| Delete Motion Study | モーション スタディを削除 | `cmd.motion_delete` | +| Delete Named View | 名前付きビューを削除 | `cmd.view_delete` | +| Delete Parameter | パラメータを削除 | `cmd.parameters_delete` | +| Delete Physical Material | 物理マテリアルを削除 | `cmd.material_delete` | +| Delete rule | ルールを削除 | `Delete rule` | +| Delete Sketch Entities | スケッチ要素を削除 | `cmd.sketch_delete` | +| Delete the row | 行を削除 | `Delete the row` | +| Delete the set | セットを削除 | `Delete the set` | +| Delete this parameter | このパラメータを削除 | `Delete this parameter` | +| Density | 密度 | `Density` | +| Depth | 深さ | `ui.depth` | +| Design | デザイン | `ui.design` | +| DESIGN | デザイン | `ui.heading_design` | +| Designs you open or save appear here. | 開いたデザインや保存したデザインがここに表示されます。 | `Designs you open or save appear here.` | +| Determined by To Object. Choose Angle to edit the angular extent. | 「対象オブジェクトまで」により決定されます。角度範囲を編集するには「角度」を選択してください。 | `Determined by To Object. Choose Angle to edit the angular extent.` | +| Diameter | 直径 | `ui.diameter` | +| Dimension | 寸法 | `ui.dimension` | +| Dimensions | 寸法 | `ui.show_dimensions` | +| Direction | 方向 | `ui.direction` | +| Disable Contact | 接触を無効化 | `cmd.contact_disable_all` | +| Discard | 破棄 | `Discard` | +| Discard Recovered Design | 復元デザインを破棄 | `cmd.doc_recovery_discard` | +| Display Configuration Table | 構成テーブルを表示 | `cmd.config_table` | +| Distance | 距離 | `ui.distance` | +| Distance 1 | 距離 1 | `ui.distance_1` | +| Distance 2 | 距離 2 | `ui.distance_2` | +| Distance and Angle Chamfer | 距離と角度の面取り | `cmd.sketch_chamfer_distance_angle` | +| Document Settings | ドキュメントの設定 | `ui.document_settings` | +| Don't Save | 保存しない | `ui.don_t_save` | +| Double-click to rename | ダブルクリックで名前変更 | `Double-click to rename` | +| Double-clicking the middle button in the view: Home (the home view, framing what is shown), Fit (frame what is shown, keeping the orientation) or nothing | ビュー上で中ボタンをダブルクリックした時の動作: ホーム(全体を収めたホームビュー)、全体表示(向きを維持して全体を収める)、または無効 | `Double-clicking the middle button in the view: Home (the home view, framing what is shown), Fit (frame what is shown, keeping the orientation) or nothing` | +| Draft | 勾配 | `ui.draft` | +| DRAFT | 勾配 | `ui.heading_draft` | +| Draft Analysis | 勾配解析 | `cmd.inspect_draft` | +| Drag Sketch Geometry | スケッチ ジオメトリをドラッグ | `cmd.sketch_drag` | +| Drag Sketch Point | スケッチ点をドラッグ | `cmd.sketch_move_point` | +| Draw as {linetype} | {linetype}として描く | `sketch.draw_curves` | +| Draw Dimensioned Sketch Geometry | 寸法付きスケッチ ジオメトリを描画 | `cmd.sketch_draw_dimensioned` | +| Drawing | 図面 | `ui.drawing` | +| Drill Point | ドリル先端 | `ui.drill_point` | +| Drive Joint | ジョイントを駆動 | `Drive Joint` | +| Drive Joints | ジョイントを駆動 | `cmd.joint_drive` | +| Edge Polygon | エッジ ポリゴン | `cmd.sketch_polygon_edge` | +| Edges | エッジ | `Edges` | +| Edit | 編集 | `ui.edit` | +| EDIT | 編集 | `ui.heading_edit` | +| EDIT {title} | {title}を編集 | `dialog.edit_title` | +| Edit Canvas | キャンバスを編集 | `cmd.canvas_edit` | +| Edit Contact Set | 接触セットを編集 | `cmd.contact_edit` | +| Edit Feature | フィーチャーを編集 | `cmd.timeline_redefine` | +| Edit Joint | ジョイントを編集 | `cmd.joint_edit` | +| Edit Physical Material | 物理マテリアルを編集 | `cmd.material_edit` | +| Edit Profile Sketch | プロファイルスケッチを編集 | `Edit Profile Sketch` | +| Edit Sketch | スケッチを編集 | `cmd.sketch_edit` | +| Edit Text | テキストを編集 | `cmd.sketch_edit_text` | +| Ellipse | 楕円 | `ui.ellipse` | +| Emboss | エンボス | `cmd.solid_emboss` | +| Enable All Contact | すべての接触を有効化 | `cmd.contact_enable_all` | +| Enable Contact Sets | 接触セットを有効化 | `cmd.contact_enable_sets` | +| Enable rule | ルールを有効化 | `Enable rule` | +| Enabled | 有効 | `Enabled` | +| End Radius | 終了半径 | `ui.end_radius` | +| End Sketch Drag | スケッチのドラッグを終了 | `cmd.sketch_drag_end` | +| Entities | エンティティ | `ui.entities` | +| Environment Map Analysis | 環境マップ解析 | `cmd.inspect_environment_map` | +| Equal | 等しい | `ui.equal` | +| Equal Distance Chamfer | 等距離面取り | `cmd.sketch_chamfer_equal_distance` | +| Evaluate Expression | 式を評価 | `cmd.expr_evaluate` | +| Expand | 展開 | `ui.expand` | +| Explode | 分解 | `Explode` | +| Exploded View | 分解図 | `cmd.explode_create` | +| Export | エクスポート | `cmd.file_export` | +| Export Bend Table | 曲げテーブルをエクスポート | `cmd.sheet_export_bend_table` | +| Export Flat Pattern as DXF | 展開図を DXF としてエクスポート | `cmd.sheet_export_dxf` | +| Export Motion Study | モーション スタディをエクスポート | `cmd.motion_export` | +| Export Parameters | パラメータをエクスポート | `cmd.parameters_export` | +| Export... | エクスポート… | `ui.export_ellipsis` | +| Export… | エクスポート… | `ui.export_ellipsis_keymap` | +| expression, e.g. 25 mm | 計算式 (例: 25 mm) | `expression, e.g. 25 mm` | +| Extend | 延長 | `ui.extend` | +| Extent Type | 範囲タイプ | `ui.extent_type` | +| Extents | 範囲 | `Extents` | +| Extrude | 押し出し | `ui.extrude` | +| EXTRUDE | 押し出し | `ui.heading_extrude` | +| Face attachment lost | 面アタッチメントが失われました | `Face attachment lost` | +| Faces | 面 | `Faces` | +| Faces / edges / vertices | 面 / エッジ / 頂点 | `Faces / edges / vertices` | +| Factor | 倍率 | `ui.factor` | +| Favourite | お気に入り | `Favourite` | +| Favourite Parameter | お気に入りパラメータ | `cmd.parameters_favorite` | +| Feature Dependents | 従属フィーチャー | `cmd.timeline_dependents` | +| Feature Options | フィーチャーオプション | `ui.feature_options` | +| Features | フィーチャー | `ui.features` | +| File | ファイル | `ui.file` | +| Files from many CAD programs have Y up, so they open lying on their back here (Z up). | 多くのCADではY軸を上向きとしているため、Z軸を上向きとするSolidCraftでは、読み込んだモデルが横倒しの向きで表示されることがあります。 | `Files from many CAD programs have Y up, so they open lying on their back here (Z up).` | +| Fillet | フィレット | `ui.fillet` | +| FILLET | フィレット | `ui.heading_fillet` | +| Filter | フィルター | `Filter` | +| Filter commands or keys | コマンドまたはキーを検索 | `ui.filter_commands_or_keys` | +| Find in Browser | ブラウザで検索 | `Find in Browser` | +| Finish Sketch | スケッチを終了 | `ui.finish_sketch` | +| FINISH SKETCH | スケッチを終了 | `ui.heading_finish_sketch` | +| Finish with AutoConstrain | 自動拘束で終了 | `cmd.sketch_finish_auto_constrain` | +| Fit Curves to Mesh Section | メッシュ断面に曲線をフィット | `cmd.sketch_fit_curves_to_section` | +| Fit Point Spline | 通過点スプライン | `cmd.sketch_spline_fit_point` | +| fits the face, e.g. M8 | 面に適合するサイズ (例: M8) | `fits the face, e.g. M8` | +| Fix/Unfix | 固定/固定解除 | `ui.fix_unfix` | +| Fix/UnFix | 固定/固定解除 | `cmd.sketch_constraint_fix` | +| Flange | フランジ | `cmd.sheet_flange` | +| Flat | 展開 | `ui.flat` | +| Flat | 展開 | `Flat` | +| Flat size | 展開サイズ | `Flat size` | +| Flip | 反転 | `ui.flip` | +| Fold | 折り曲げ | `cmd.sheet_fold` | +| Follow camera (Look At sketches) | カメラ追従(スケッチを正面視) | `Follow camera (Look At sketches)` | +| Follow the camera (Look At sketches) | カメラ追従(スケッチを正面視) | `Follow the camera (Look At sketches)` | +| Font | フォント | `Font` | +| from the rule | ルールから | `from the rule` | +| Front | 正面 | `ui.front` | +| FRONT | 正面 | `ui.heading_front` | +| Full Length | 全長 | `Full Length` | +| Fully constrained | 完全拘束 | `ui.fully_constrained` | +| Gap | ギャップ | `Gap` | +| General | 一般 | `ui.general` | +| Graphics | グラフィックス | `ui.graphics` | +| Grid | グリッド | `Grid` | +| Ground | 空間固定 | `cmd.occurrence_ground` | +| Ground shadow | 地面の影 | `ui.ground_shadow` | +| Height | 高さ | `Height` | +| Help | ヘルプ | `ui.help` | +| Hem | ヘミング | `cmd.sheet_hem` | +| Hide | 非表示 | `ui.hide` | +| Hole | 穴 | `ui.hole` | +| HOLE | 穴 | `ui.heading_hole` | +| Hole Tap Type | ねじ穴タイプ | `ui.hole_tap_type` | +| Hole Type | 穴タイプ | `ui.hole_type` | +| Home | ホーム | `ui.home` | +| HOME | ホーム | `ui.heading_home` | +| Home view | ホームビュー | `Home view` | +| Horizontal/Vertical | 水平/垂直 | `ui.horizontal_vertical` | +| Import Parameters | パラメータをインポート | `cmd.parameters_import` | +| Import… | インポート… | `ui.import_ellipsis` | +| In This Design | このデザイン内 | `In This Design` | +| Include 3D Geometry | 3D ジオメトリを含める | `cmd.sketch_include_3d` | +| Inscribed Polygon | 内接ポリゴン | `cmd.sketch_polygon_inscribed` | +| Insert | 挿入 | `ui.insert` | +| INSERT | 挿入 | `ui.heading_insert` | +| Insert Design | デザインを挿入 | `cmd.component_insert_design` | +| Insert DXF | DXF を挿入 | `cmd.sketch_insert_dxf` | +| Insert Fastener | ファスナーを挿入 | `cmd.parts_fastener` | +| Insert Mesh | メッシュを挿入 | `cmd.file_insert_mesh` | +| Insert Part | パーツを挿入 | `cmd.parts_insert` | +| Insert STEP | STEP を挿入 | `cmd.file_insert_step` | +| Insert SVG | SVG を挿入 | `cmd.sketch_insert_svg` | +| Inspect | 検査 | `ui.inspect` | +| INSPECT | 検査 | `ui.heading_inspect` | +| Inspect Design | デザインを検査 | `cmd.document_inspect` | +| Inspect Feature | フィーチャーを検査 | `cmd.timeline_inspect` | +| Inspect Sketch | スケッチを検査 | `cmd.sketch_inspect` | +| Interference | 干渉 | `cmd.inspect_interference` | +| Interferes | 干渉あり | `Interferes` | +| Intersect | 交差 | `ui.intersect` | +| Intersection Curve | 交差曲線 | `cmd.sketch_intersection_curve` | +| Isocurve Analysis | アイソカーブ解析 | `cmd.inspect_isocurve` | +| Isoparametric Curve | アイソパラメトリック曲線 | `cmd.sketch_isoparametric_curve` | +| Issue title | Issueタイトル | `Issue title` | +| Join | 結合 | `ui.join` | +| Joint | ジョイント | `cmd.joint_create` | +| Joint Limits | ジョイントの制限 | `cmd.joint_limits` | +| Joint Origin | ジョイント原点 | `cmd.joint_origin` | +| Joint Origin1 | ジョイント原点1 | `Joint Origin1` | +| Joints | ジョイント | `ui.joints` | +| Keep Tools | ツールボディを保持 | `Keep Tools` | +| Keyboard Shortcuts | キーボードショートカット | `ui.keyboard_shortcuts` | +| Keys, S box favourites and the toolbar, as a file | ショートカット、Sボックスのお気に入り、ツールバー設定をファイルに保存 | `ui.export_keymap_tip` | +| Language | 言語 | `ui.language` | +| Later | 後で | `Later` | +| Leave it | そのままにする | `Leave it` | +| Legacy face attachment. Rebinding to a certified face creates an exact attachment. | 従来の面アタッチメントです。確定された面に再バインドすると正確なアタッチメントが作成されます。 | `Legacy face attachment. Rebinding to a certified face creates an exact attachment.` | +| Length | 長さ | `Length` | +| Length decimals | 長さの小数点以下の桁数 | `ui.length_decimals` | +| Length units | 長さの単位 | `Length units` | +| Library | ライブラリ | `Library` | +| Light | ライト | `ui.light` | +| Line | 線分 | `ui.line` | +| Linetype | 線種 | `ui.linetype` | +| Lip | リップ | `cmd.plastic_lip` | +| List Appearances | 外観を一覧表示 | `cmd.appearance_list` | +| List Commands | コマンドを一覧表示 | `cmd.engine_commands` | +| List Components | コンポーネントを一覧表示 | `cmd.component_list` | +| List Contact Sets | 接触セットを一覧表示 | `cmd.contact_list` | +| List Edges | エッジを一覧表示 | `cmd.model_edges` | +| List Exploded Views | 分解図を一覧表示 | `cmd.explode_list` | +| List Faces | 面を一覧表示 | `cmd.model_faces` | +| List Joints | ジョイントを一覧表示 | `cmd.joint_list` | +| List Links | リンクを一覧表示 | `cmd.component_links` | +| List Materials | マテリアルを一覧表示 | `cmd.material_list` | +| List Motion Studies | モーション スタディを一覧表示 | `cmd.motion_list` | +| List Named Views | 名前付きビューを一覧表示 | `cmd.view_list` | +| List Parameters | パラメータを一覧表示 | `cmd.parameters_list` | +| List Plastic Rules | プラスチック ルールを一覧表示 | `cmd.plastic_rules` | +| List Sheet Metal Rules | 板金ルールを一覧表示 | `cmd.sheet_rules` | +| List Threads | ねじを一覧表示 | `cmd.model_threads` | +| Loft | ロフト | `ui.loft` | +| LOFT | ロフト | `ui.heading_loft` | +| Look At | 正面視 | `ui.look_at` | +| Loop | ループ | `Loop` | +| MAKE | 製造 | `ui.heading_make` | +| Manage Plastic Rules | プラスチック ルールを管理 | `cmd.plastic_manage_rules` | +| Manufacture | 製造 | `ui.manufacture` | +| Margin | マージン | `Margin` | +| Mass | 質量 | `Mass` | +| Material | 材料 | `Material` | +| Measure | 計測 | `ui.measure` | +| MEASURE | 計測 | `ui.heading_measure` | +| MESH | メッシュ | `ui.heading_mesh` | +| Mid Radius | 中間半径 | `Mid Radius` | +| Middle double-click | 中ボタンのダブルクリック | `Middle double-click` | +| Midplane | 中間平面 | `cmd.construct_plane_midplane` | +| Midpoint | 中点 | `ui.midpoint` | +| MidPoint | 中点 | `cmd.sketch_constraint_midpoint` | +| Midpoint Line | 中点線分 | `cmd.sketch_line_midpoint` | +| Minimum Radius Analysis | 最小半径解析 | `cmd.inspect_minimum_radius` | +| Mirror | ミラー | `ui.mirror` | +| MIRROR | ミラー | `ui.heading_mirror` | +| Modeled | モデル化済み | `Modeled` | +| Modify | 修正 | `ui.modify` | +| MODIFY | 修正 | `ui.heading_modify` | +| More toolbar panels | その他のツールバーパネル | `More toolbar panels` | +| Motion | モーション | `Motion` | +| Motion Link | モーション リンク | `cmd.joint_motion_link` | +| Motion Study | モーション スタディ | `cmd.motion_study` | +| Move | 移動 | `ui.move` | +| MOVE | 移動 | `ui.heading_move` | +| Move 3D Point | 3D 点を移動 | `cmd.sketch_move3d` | +| Move and rotate the view together; sketches use pan and zoom only. | 視点の移動と回転を同時に行います(スケッチ中はパンとズームのみ) | `ui.space_mouse_hint` | +| Move Bodies to Component | ボディをコンポーネントに移動 | `cmd.component_move_bodies` | +| Move Browser Items | ブラウザ項目を移動 | `cmd.browser_move` | +| Move Dimension Text | 寸法テキストを移動 | `cmd.sketch_dimension_text` | +| Move earlier | 前へ移動 | `Move earlier` | +| Move later | 後へ移動 | `Move later` | +| Move Occurrence | オカレンスを移動 | `cmd.occurrence_move` | +| Move Sketches to Component | スケッチをコンポーネントに移動 | `cmd.component_move_sketches` | +| Move Timeline Marker | タイムライン マーカーを移動 | `cmd.timeline_rollback` | +| Move Type | 移動タイプ | `Move Type` | +| Move/Copy | 移動/コピー | `cmd.solid_move` | +| Move/Copy Sketch Entities | スケッチ要素を移動/コピー | `cmd.sketch_move` | +| Multiple | 複数 | `ui.multiple` | +| Name | 名前 | `Name` | +| Named Views | 名前付きビュー | `ui.named_views` | +| Navigate View | ビューナビゲーション | `cmd.view_navigate` | +| Navigate with SpaceNavigator / SpaceMouse | SpaceNavigator / SpaceMouseで視点を操作 | `ui.space_mouse_navigate` | +| Navigation | ナビゲーション | `ui.navigation` | +| needs two joints | 2つのジョイントが必要 | `needs two joints` | +| New Body | 新規ボディ | `ui.new_body` | +| New Component | 新規コンポーネント | `cmd.component_create` | +| new configuration | 新規構成 | `new configuration` | +| New Contact Set | 新規接触セット | `cmd.contact_create` | +| New Design | 新規デザイン | `ui.new_design` | +| New Group | 新規グループ | `cmd.browser_group` | +| new name | 新しい名前 | `new name` | +| New Named View | 新規名前付きビュー | `cmd.view_save` | +| new parameter | 新規パラメータ | `new parameter` | +| New Physical Material | 新規物理マテリアル | `cmd.material_create` | +| No crash reports. | クラッシュレポートはありません。 | `No crash reports.` | +| no interference | 干渉なし | `no interference` | +| no joint that moves yet | 可動ジョイントがまだありません | `no joint that moves yet` | +| No matching appearances | 一致する外観がありません | `No matching appearances` | +| no picture | 画像なし | `no picture` | +| Normal | 標準 | `ui.normal` | +| Normal/Construction | 標準/コンストラクション | `cmd.sketch_construction` | +| Not available yet | まだ利用できません | `Not available yet` | +| Not supported by this graphics device | このグラフィックスデバイスではサポートされていません | `settings.msaa_unsupported` | +| Object Type | オブジェクトタイプ | `ui.object_type` | +| Objects | オブジェクト | `ui.objects` | +| Occurrence Physical Properties | オカレンスの物理的プロパティ | `cmd.occurrence_properties` | +| Offer to stand up Y-up files | Y-upファイルを正立させるか確認 | `ui.offer_to_stand_up_y_up_files` | +| Offset | オフセット | `ui.offset` | +| Offset Face | 面をオフセット | `cmd.solid_offset_face` | +| Offset Plane | オフセット平面 | `ui.offset_plane` | +| OFFSET PLANE | オフセット平面 | `ui.heading_offset_plane` | +| OK | OK | `ui.heading_ok` | +| One Side | 片側 | `ui.one_side` | +| Opacity | 不透明度 | `Opacity` | +| Open | 開く | `ui.open` | +| Open GitHub draft | GitHubの下書きを開く | `Open GitHub draft` | +| Open Preferences | 環境設定を開く | `ui.open_preferences` | +| Open Recent | 最近使った項目を開く | `ui.open_recent` | +| Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0. | Rust製オープンソース・パラメトリック3D CAD。ライセンス: MIT または Apache-2.0。 | `Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.` | +| Open... | 開く… | `ui.open_ellipsis` | +| Operation | 操作 | `ui.operation` | +| Options | オプション | `ui.options` | +| Orbit around | 回転中心 | `ui.orbit_around` | +| Order Browser Items | ブラウザ項目の並び順を変更 | `cmd.browser_order` | +| Origin | 原点 | `ui.origin` | +| Other side | 反対側 | `Other side` | +| Overall Slot | 全長指定スロット | `cmd.sketch_slot_overall` | +| Pan, zoom, orbit | パン、ズーム、オービット | `ui.pan_zoom_orbit` | +| Parallel | 平行 | `ui.parallel` | +| Parameter Graph | パラメータ グラフ | `cmd.parameters_graph` | +| Parameter Users | パラメータの参照先 | `cmd.parameters_users` | +| Parameter values | パラメータ値 | `Parameter values` | +| Parameters | パラメータ | `ui.parameters` | +| PARAMETERS | パラメータ | `ui.heading_parameters` | +| Parameters ({count}) | パラメータ ({count}) | `browser.parameters` | +| Paste | 貼り付け | `ui.paste` | +| Paste (Instance) | 貼り付け(インスタンス) | `cmd.occurrence_copy` | +| Paste Features | フィーチャーを貼り付け | `cmd.timeline_paste` | +| Paste New | 新規として貼り付け | `cmd.component_paste_new` | +| Patch | パッチ | `cmd.surface_patch` | +| Path | パス | `ui.path` | +| Pattern on Path | パス上のパターン | `ui.pattern_on_path` | +| PATTERN ON PATH | パス上のパターン | `ui.heading_pattern_on_path` | +| Per Edge | エッジごと | `Per Edge` | +| Perpendicular | 直交 | `ui.perpendicular` | +| Perpendicular Plane | 垂直平面 | `cmd.construct_plane_perpendicular` | +| Perspective view | パースペクティブ表示 | `ui.perspective_view` | +| Physical Material | 物理マテリアル | `cmd.material_assign` | +| pick a hole to seat it, or OK places it at the origin | 配置先の穴を選択するか、[OK]を押すと原点に配置します。 | `pick a hole to seat it, or OK places it at the origin` | +| pick one or two vertices, edges or faces | 1つまたは2つの頂点、エッジ、面を選択 | `pick one or two vertices, edges or faces` | +| Pick the tool bodies | ツールボディを選択 | `Pick the tool bodies` | +| Pipe | パイプ | `ui.pipe` | +| PIPE | パイプ | `ui.heading_pipe` | +| Place at the origin instead | 代わりに原点に配置 | `Place at the origin instead` | +| Placement | 配置 | `ui.placement` | +| Plane | 平面 | `ui.plane` | +| Plane Along Path | パスに沿った平面 | `cmd.construct_plane_along_path` | +| Plane at Angle | 傾斜平面 | `ui.plane_at_angle` | +| PLANE AT ANGLE | 傾斜平面 | `ui.heading_plane_at_angle` | +| Plane Through Three Points | 3点を通る平面 | `cmd.construct_plane_three_points` | +| Plane Through Two Edges | 2エッジを通る平面 | `cmd.construct_plane_two_edges` | +| PLASTIC | プラスチック | `ui.heading_plastic` | +| Play Motion Study | モーション スタディを再生 | `cmd.motion_play` | +| Playback | 再生 | `Playback` | +| Point | 点 | `ui.point` | +| Point Along Path | パスに沿った点 | `cmd.construct_point_along_path` | +| Point At Center Of Circle/Sphere/Torus | 円/球/トーラスの中心点 | `cmd.construct_point_center` | +| Point At Edge And Plane | エッジと平面の交点 | `cmd.construct_point_edge_plane` | +| Point At Vertex | 頂点上の点 | `cmd.construct_point_vertex` | +| Point Through Three Planes | 3平面の交点 | `cmd.construct_point_three_planes` | +| Point Through Two Edges | 2エッジの交点 | `cmd.construct_point_two_edges` | +| Point under the cursor | カーソル下の点 | `ui.point_under_the_cursor` | +| Points | 点 | `ui.palette_points` | +| Points | 点 | `ui.points` | +| Polygon | ポリゴン | `ui.polygon` | +| Position | 位置 | `Position` | +| Position (0 to 1) | 位置 (0〜1) | `Position (0 to 1)` | +| Position along the edge, 0 at the start end, 1 at the other | エッジ上の位置(始点が0、終点が1) | `Position along the edge, 0 at the start end, 1 at the other` | +| Precision: {precision} | 精度: {precision} | `browser.precision` | +| Preferences | 環境設定 | `ui.preferences` | +| PREPARE | 準備 | `ui.heading_prepare` | +| press a key… | キーを押してください… | `ui.press_a_key` | +| Press Pull | プレス プル | `cmd.solid_press_pull` | +| Preview Configuration | 構成をプレビュー | `cmd.config_preview` | +| Preview leaves the current design unchanged. | プレビューは現在のデザインを変更しません。 | `Preview leaves the current design unchanged.` | +| Preview Row | 行をプレビュー | `Preview Row` | +| Profile | プロファイル | `ui.palette_profile` | +| Profile | プロファイル | `ui.profile` | +| Profile Plane | プロファイル平面 | `ui.profile_plane` | +| Profiles | プロファイル | `ui.profiles` | +| Project | 投影 | `ui.project` | +| Project face edges into new sketches | 新規スケッチに面のエッジを自動投影 | `ui.project_face_edges_sketch` | +| Project To Surface | サーフェスに投影 | `cmd.sketch_project_to_surface` | +| Projected Geometries | 投影ジオメトリ | `ui.show_projected_geometries` | +| Quit | 終了 | `ui.quit` | +| Radial context menu | パイ メニュー | `ui.radial_context_menu` | +| Radius | 半径 | `ui.radius` | +| Radius Fit | 半径フィット | `Radius Fit` | +| Radius Type | 半径タイプ | `ui.radius_type` | +| Ratio | 比率 | `Ratio` | +| Reattach selected face | 選択した面を再アタッチ | `Reattach selected face` | +| RECENT | 最近使用した項目 | `RECENT` | +| Recover | 復元 | `Recover` | +| Recover Design | デザインを復元 | `cmd.doc_recover` | +| Recover unsaved design? | 未保存のデザインを復元しますか? | `Recover unsaved design?` | +| Recoverable Designs | 復元可能なデザイン | `cmd.doc_recovery_list` | +| Rectangle | 長方形 | `ui.rectangle` | +| Rectangular Pattern | 矩形パターン | `ui.rectangular_pattern` | +| RECTANGULAR PATTERN | 矩形パターン | `ui.heading_rectangular_pattern` | +| Redefine Sketch Plane | スケッチ平面を再定義 | `cmd.sketch_redefine` | +| Redo | やり直す | `ui.redo` | +| Refold | 折り戻し | `cmd.sheet_refold` | +| Remove | 除去 | `cmd.solid_remove` | +| Remove from list | リストから削除 | `Remove from list` | +| Remove override | オーバーライドを削除 | `Remove override` | +| Remove private design details or paths before sharing. | 共有前に、非公開の設計情報やファイルパスを削除してください。 | `Remove private design details or paths before sharing.` | +| Remove screenshot | スクリーンショットを削除 | `Remove screenshot` | +| Remove the column | 列を削除 | `Remove the column` | +| Remove the track | トラックを削除 | `Remove the track` | +| Remove this point | この点を削除 | `Remove this point` | +| Remove Tools | ツールボディを削除 | `Remove Tools` | +| Rename | 名前を変更 | `cmd.timeline_rename` | +| Rename Body | ボディの名前を変更 | `cmd.body_rename` | +| Rename Component | コンポーネントの名前を変更 | `cmd.component_rename` | +| Rename Group | グループの名前を変更 | `cmd.browser_rename_group` | +| Rename Named View | 名前付きビューの名前を変更 | `cmd.view_rename` | +| Rename Parameter | パラメータの名前を変更 | `cmd.parameters_rename` | +| Render | レンダリング | `ui.render` | +| Render Backends | レンダリング バックエンド | `cmd.render_backends` | +| Renderer | レンダラー | `ui.renderer` | +| Reorder Feature | フィーチャーの順序を変更 | `cmd.timeline_reorder` | +| Replace Face | 面を置換 | `cmd.solid_replace_face` | +| Report a bug — review a screenshot and open a GitHub draft | バグを報告 — スクリーンショットを確認してGitHub下書きを作成 | `Report a bug — review a screenshot and open a GitHub draft` | +| Reset | リセット | `ui.reset` | +| Reset All | すべてリセット | `ui.reset_all` | +| Reset the settings on this page | このページの設定をリセット | `ui.reset_the_settings_on_this_page` | +| Reset Toolbar | ツールバーをリセット | `Reset Toolbar` | +| Rest | レスト | `cmd.plastic_rest` | +| Restore Checkpoint | チェックポイントを復元 | `cmd.edit_restore_checkpoint` | +| Restore Defaults | 初期値に戻す | `ui.restore_defaults` | +| Restore Named View | 名前付きビューを復元 | `cmd.view_apply` | +| Restore the inherited component or physical material appearance | コンポーネントまたは物理マテリアルから継承した外観に戻す | `Restore the inherited component or physical material appearance` | +| Result | 結果 | `Result` | +| Retake screenshot | スクリーンショットを再取得 | `Retake screenshot` | +| Reverse | 反転 | `Reverse` | +| Reverse Direction | 方向を反転 | `Reverse Direction` | +| Reverse zoom direction | ズーム方向を反転 | `ui.reverse_zoom_direction` | +| Revert | 元に戻す | `Revert` | +| Revert All Positions | すべての位置を元に戻す | `Revert All Positions` | +| Revert Position | 位置を元に戻す | `cmd.component_revert_position` | +| Revert Position | 位置を元に戻す | `Revert Position` | +| Review the report and screenshot before opening GitHub. | GitHubを開く前にレポートとスクリーンショットを確認してください。 | `Review the report and screenshot before opening GitHub.` | +| Revolve | 回転 | `ui.revolve` | +| REVOLVE | 回転 | `ui.heading_revolve` | +| Rib | リブ | `cmd.solid_rib` | +| Right | 右側面 | `ui.right` | +| RIGHT | 右側面 | `ui.heading_right` | +| Rigid Group | リジッド グループ | `cmd.joint_rigid_group` | +| Rim Edge | リムエッジ | `Rim Edge` | +| Roll History Marker | 履歴マーカーを移動 | `cmd.timeline_roll_to` | +| Roll History Marker Here | 履歴マーカーをここに移動 | `Roll History Marker Here` | +| Rule | ルール | `Rule` | +| Save | 保存 | `ui.save` | +| Save As | 名前を付けて保存 | `ui.save_as` | +| Save As DXF | DXF として保存 | `cmd.sketch_export_dxf` | +| Save As Mesh | メッシュとして保存 | `cmd.file_save_mesh` | +| Save As... | 名前を付けて保存… | `ui.save_as_ellipsis` | +| Save changes to {name}? | {name} への変更を保存しますか? | `document.save_changes` | +| Save Rule | ルールを保存 | `Save Rule` | +| Saved preview. Geometry is being checked before editing. | 保存済みのプレビューです。編集前にジオメトリを検証しています。 | `Saved preview. Geometry is being checked before editing.` | +| Scale | 尺度 | `ui.scale` | +| SCALE | 尺度 | `ui.heading_scale` | +| Scale factor | 尺度係数 | `Scale factor` | +| Search | 検索 | `Search` | +| Search commands | コマンドを検索 | `Search commands` | +| Section Analysis | 断面解析 | `ui.section_analysis` | +| SECTION ANALYSIS | 断面解析 | `ui.heading_section_analysis` | +| Select | 選択 | `ui.select` | +| SELECT | 選択 | `ui.heading_select` | +| Select bodies (a face picks its body) | ボディを選択(面をクリックするとそのボディが選択されます) | `Select bodies (a face picks its body)` | +| Select bodies or faces instead | 代わりにボディまたは面を選択 | `Select bodies or faces instead` | +| Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. | その他を選択: モデル上で左ボタンを長押し(または右クリック › その他を選択…)するとカーソル下の要素が一覧表示されます。同じ場所を再度クリックすると次の要素が選択されます。 | `ui.select_other_hint` | +| Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation). | その他を選択: モデル上で左ボタンを長押し(または右クリック › その他を選択…)するとカーソル下の要素が一覧表示されます。同じ場所を再度クリックすると次の要素が選択されます。中ボタンをダブルクリックするとホームビューに戻ります(環境設定 › ナビゲーション)。 | `Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).` | +| Selection | 選択 | `ui.selection` | +| Selection filter | 選択フィルター | `Selection filter` | +| Semantic faces share their appearance across instances. | セマンティック面はインスタンス間で外観を共有します。 | `Semantic faces share their appearance across instances.` | +| Settings were changed | 設定が変更されました | `settings.reset_title` | +| Shaded with edges | エッジ付きシェーディング | `ui.visual_shaded_with_edges` | +| Shaded with hidden edges | 隠線付きシェーディング | `ui.visual_shaded_hidden_edges` | +| Shape | 形状 | `Shape` | +| SHEET METAL | 板金 | `ui.heading_sheet_metal` | +| Sheet Metal Rules | 板金ルール | `cmd.sheet_manage_rules` | +| Shell | シェル | `ui.shell` | +| SHELL | シェル | `ui.heading_shell` | +| Show | 表示 | `ui.show` | +| Show Agent Cursor | エージェントカーソルを表示 | `Show Agent Cursor` | +| Show Exploded View | 分解図を表示 | `cmd.explode_show` | +| Show in folder | フォルダに表示 | `Show in folder` | +| Show Points | 点を表示 | `ui.show_points` | +| Show Profile | プロファイルを表示 | `ui.show_profile` | +| Show the pointer an AI agent moves (#35) | エージェントが操作するポインターを表示 (#35) | `Show the pointer an AI agent moves (#35)` | +| Show/Hide | 表示/非表示 | `cmd.browser_visibility` | +| Signed axes | 符号付き座標軸 | `Signed axes` | +| Simple | 単純 | `ui.simple` | +| Simulation | シミュレーション | `ui.simulation` | +| Single | 単一 | `ui.single` | +| Size | サイズ | `Size` | +| Sketch | スケッチ | `ui.sketch` | +| SKETCH | スケッチ | `ui.heading_sketch` | +| Sketch Constrainer | スケッチ拘束ツール | `cmd.sketch_constrainer` | +| Sketch constraints | スケッチ拘束 | `Sketch constraints` | +| Sketch curves | スケッチ曲線 | `Sketch curves` | +| Sketch Dimension | スケッチ寸法 | `ui.sketch_dimension` | +| Sketch dimensions | スケッチ寸法 | `Sketch dimensions` | +| Sketch geometry and profiles | スケッチジオメトリとプロファイル | `Sketch geometry and profiles` | +| Sketch Grid | スケッチ グリッド | `ui.sketch_grid` | +| SKETCH PALETTE | スケッチ パレット | `ui.heading_sketch_palette` | +| Sketch Palette Options | スケッチ パレット オプション | `cmd.sketch_options` | +| Sketch plane has no body-face attachment. | スケッチ平面にボディ面のアタッチメントがありません。 | `Sketch plane has no body-face attachment.` | +| Sketch points | スケッチ点 | `Sketch points` | +| Sketch Scale | スケッチ尺度 | `ui.sketch_scale` | +| SKETCH SCALE | スケッチの尺度 | `ui.heading_sketch_scale` | +| Sketch Status | スケッチの状態 | `ui.sketch_status` | +| Sketch{number} | スケッチ{number} | `browser.sketch_name` | +| Sketches | スケッチ | `ui.sketches` | +| Slice | スライス | `ui.slice` | +| Slot | スロット | `ui.slot` | +| Smooth | スムーズ | `ui.smooth` | +| Smooth wheel zoom | 滑らかなホイールズーム | `ui.smooth_wheel_zoom` | +| Snap | スナップ | `ui.snap` | +| Snap Fit | スナップ フィット | `cmd.plastic_snap_fit` | +| Snap Inference | スナップ推論 | `cmd.sketch_snap` | +| SOLID | ソリッド | `ui.heading_solid` | +| SolidCraft closed before these designs were saved. Their last autosave can be opened. | これらのデザインが保存される前にSolidCraftが終了しました。最後の自動保存ファイルを開くことができます。 | `SolidCraft closed before these designs were saved. Their last autosave can be opened.` | +| Solve Joints | ジョイントを解決 | `cmd.joint_solve` | +| Solve Sketch | スケッチを解決 | `cmd.sketch_solve` | +| Speed | 速度 | `Speed` | +| Sphere | 球 | `ui.sphere` | +| SPHERE | 球 | `ui.heading_sphere` | +| Spline | スプライン | `ui.spline` | +| Split Body | ボディを分割 | `ui.split_body` | +| SPLIT BODY | ボディを分割 | `ui.heading_split_body` | +| Split Face | 面を分割 | `cmd.solid_split_face` | +| Spun Profile | 回転プロファイル | `cmd.sketch_spun_profile` | +| Stand it up | 正立させる | `Stand it up` | +| Stand it up: a quarter turn about X, as one Move feature you can undo. | 正立させる: 取り消し可能な1つの移動フィーチャーとして、X軸周りに90度回転します。 | `Stand it up: a quarter turn about X, as one Move feature you can undo.` | +| Stand this part up? | このパーツを正立させますか? | `Stand this part up?` | +| Standard Parts | 標準パーツ | `cmd.parts_library` | +| Start | 開始 | `ui.start` | +| Start Radius | 開始半径 | `ui.start_radius` | +| Step | ステップ | `Step` | +| Steps | ステップ数 | `Steps` | +| Stitch | ステッチ | `cmd.surface_stitch` | +| Suppress Feature | フィーチャーを抑制 | `cmd.timeline_suppress` | +| Suppressed | 抑制 | `Suppressed` | +| SURFACE | サーフェス | `ui.heading_surface` | +| Swap Ends | 端点を入れ替え | `Swap Ends` | +| Sweep | スイープ | `ui.sweep` | +| SWEEP | スイープ | `ui.heading_sweep` | +| Symmetric | 対称 | `ui.symmetric` | +| Symmetry | 対称 | `ui.symmetry` | +| System | システム | `ui.system` | +| Tangent | 正接 | `ui.tangent` | +| Tangent Arc | 正接円弧 | `cmd.sketch_arc_tangent` | +| Tangent Chain | 正接チェーン | `Tangent Chain` | +| Tangent Plane | 正接平面 | `cmd.construct_plane_tangent` | +| Taper Angle | テーパ角度 | `ui.taper_angle` | +| Tapped | ねじ穴 | `ui.tapped` | +| Text | テキスト | `ui.text` | +| The dashed sketch is a saved plane guide. Select a new face to repair the attachment. | 破線のスケッチは保存された平面ガイドです。新しい面を選択してアタッチメントを修復してください。 | `The dashed sketch is a saved plane guide. Select a new face to repair the attachment.` | +| the parts library is not available | パーツライブラリは利用できません | `the parts library is not available` | +| The saved author occurrence is missing. Select a valid author placement before rebinding. | 保存された作成元のオカレンスが見つかりません。再バインドする前に有効な作成元配置を選択してください。 | `The saved author occurrence is missing. Select a valid author placement before rebinding.` | +| The wheel zooms toward the point under the cursor (off: toward the view's centre) | マウスホイールでカーソル位置を基準にズームします(オフの場合はビューの中心を基準にズームします)。 | `ui.zoom_to_cursor_tip` | +| Theme | テーマ | `ui.theme` | +| Then | 次を実行 (Then) | `Then` | +| These features will be deleted: | 以下のフィーチャーが削除されます: | `These features will be deleted:` | +| These features will fail: | 以下のフィーチャーでエラーが発生します: | `These features will fail:` | +| These settings don't work on this computer and would keep SolidCraft from starting, so they were changed: | 次の設定はこのコンピューターでは使用できず、SolidCraft が起動できなくなるため変更されました: | `settings.reset_intro` | +| Thicken | 厚み付け | `cmd.surface_thicken` | +| Thickness | 厚さ | `ui.thickness` | +| This child is shared. Deleting it removes it from every copy of its parent. | この子要素は共有されています。削除すると親のすべてのコピーから削除されます。 | `This child is shared. Deleting it removes it from every copy of its parent.` | +| This child is shared. Position changes apply to every copy of its parent. | この子要素は共有されています。位置の変更は親のすべてのコピーに適用されます。 | `This child is shared. Position changes apply to every copy of its parent.` | +| This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane. | この面は安定したアタッチメントを提供できません。別の面を選択するか、固定平面を明示的に使用してください。 | `This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.` | +| Thread | ねじ | `ui.thread` | +| THREAD | ねじ | `ui.heading_thread` | +| Three Point Arc Slot | 3点円弧スロット | `cmd.sketch_slot_arc_three_point` | +| Tip Angle | 先端角度 | `ui.tip_angle` | +| To Object | オブジェクトまで | `ui.to_object` | +| To Offset | オフセットまで | `To Offset` | +| to the next face | 次の面まで | `to the next face` | +| Toggle Driven Dimension | 従動寸法の切り替え | `cmd.sketch_toggle_driven` | +| Tolerance | 公差 | `Tolerance` | +| Top | 上面 | `ui.top` | +| TOP | 上面 | `ui.heading_top` | +| Torus | トーラス | `ui.torus` | +| TORUS | トーラス | `ui.heading_torus` | +| Trackpad gestures pan (off: they zoom like the wheel); mouse wheel zooms, thumb wheel pans sideways, pinch always zooms | トラックパッドのジェスチャーでパンします(オフの場合はマウスホイールと同様にズームします)。マウスホイールはズーム、サイドホイールは横方向のパン、ピンチ操作は常にズームになります。 | `ui.trackpad_pan_tip` | +| Trim | トリム | `ui.trim` | +| Turn off to apply each wheel event immediately, without a smoothing tail | オフにすると、ホイール操作のたびにズームが即座に反映され、滑らかな減速効果は適用されません。 | `ui.smooth_wheel_zoom_tip` | +| Two Distance Chamfer | 2距離面取り | `cmd.sketch_chamfer_two_distance` | +| Two Sides | 両側 | `ui.two_sides` | +| Two-finger scroll pans | 2本指スクロールでパン | `ui.two_finger_scroll_pans` | +| Type | タイプ | `Type` | +| UI scale | UIスケール | `ui.ui_scale` | +| Undo | 元に戻す | `ui.undo` | +| Unfold | 展開 | `cmd.sheet_unfold` | +| Ungroup | グループ解除 | `cmd.browser_ungroup` | +| Units | 単位 | `ui.units` | +| Units of new designs | 新規デザインの単位 | `ui.units_of_new_designs` | +| Units: {units} | 単位: {units} | `browser.units` | +| Untitled | 無題 | `ui.untitled` | +| Update Links | リンクを更新 | `cmd.component_update_links` | +| Updating the preview | プレビューを更新中 | `Updating the preview` | +| Use active author placement | アクティブな作成元配置を使用 | `Use active author placement` | +| Use fixed plane | 固定平面を使用 | `Use fixed plane` | +| Use saved fixed plane | 保存された固定平面を使用 | `Use saved fixed plane` | +| Use selected face as fixed plane | 選択した面を固定平面として使用 | `Use selected face as fixed plane` | +| UTILITIES | ユーティリティ | `ui.heading_utilities` | +| UTILITY | ユーティリティ | `ui.heading_utility` | +| Value | 値 | `Value` | +| Variable | 可変 | `ui.variable` | +| Vertices | 頂点 | `Vertices` | +| VIEW | 表示 | `VIEW` | +| View centre | ビュー中心 | `ui.view_centre` | +| View navigator | ビューナビゲーター | `View navigator` | +| Visual style | 表示スタイル | `ui.visual_style` | +| Volume | 体積 | `Volume` | +| Wall | 肉厚 | `Wall` | +| Web | ウェブ | `cmd.solid_web` | +| When | 条件 (When) | `When` | +| Which axis points up in the views (axis view, Home, Look At). Designs are unchanged. | ビュー(軸ビュー、ホーム、正面視)で上向きにする軸を指定します。デザインデータ自体は変更されません。 | `ui.up_axis_note` | +| Width | 幅 | `Width` | +| Will fail | 失敗します | `Will fail` | +| Wireframe | ワイヤーフレーム | `ui.visual_wireframe` | +| workspace | ワークスペース | `ui.workspace` | +| Y up | Y軸上向き | `ui.y_up` | +| Z up | Z軸上向き | `ui.z_up` | +| Zebra Analysis | ゼブラ解析 | `cmd.inspect_zebra` | +| Zoom to the cursor | カーソル位置へズーム | `ui.zoom_to_the_cursor` |