feat(i18n): complete Japanese localization and eliminate UI hardcoded strings (#753)

Completes the Japanese catalog (all commands, panels, dialogs and preferences) and routes the remaining hard-coded UI labels through the translation lookup. English stays the default.
This commit is contained in:
Mithril_MEX authored and GitHub committed 2026-10-13 13:24:24 -04:00
1 parent a8b3b21fd0
commit d437c21368
35 files changed
+2219 -265

No files matched your search

+15 -14
View File
@@ -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() {
+2 -2
View File
@@ -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);
+19 -15
View File
@@ -58,14 +58,14 @@ pub(super) fn show(ui: &mut Ui, app: &mut SolveApp, error: &mut Option<String>,
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<String>,
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<String>,
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<String>,
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<String>,
.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<String>,
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<String>,
RuleEffect::AllowParameterValues { parameter, expressions } => {
choose(ui, "allowed_parameter", parameter, &parameters);
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<String>,
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<String>,
}
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);
}
}
+10 -9
View File
@@ -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<String> = 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();
});
+3 -3
View File
@@ -61,7 +61,7 @@ pub fn show(app: &mut SolveApp, ctx: &egui::Context) {
let mut open = true;
let mut report: Option<String> = None;
let mut delete: Option<Option<String>> = 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);
}
});
+4 -4
View File
@@ -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<bool> = 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));
}
+20 -20
View File
@@ -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()
{
+6 -6
View File
@@ -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<Sel> = 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());
+9 -8
View File
@@ -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<Dialog>,
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();
}
+18 -14
View File
@@ -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<String> = 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() {
+3 -3
View File
@@ -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
+7 -6
View File
@@ -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(_) => {
+1 -1
View File
@@ -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::<bool>(id).unwrap_or(false)));
}
if ui.ctx().data(|d| d.get_temp::<bool>(id).unwrap_or(false)) {
+1 -1
View File
@@ -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| {
+4 -4
View File
@@ -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);
+4 -4
View File
@@ -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);
}
+7
View File
@@ -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"}"#);
+10 -10
View File
@@ -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 {
+17 -12
View File
@@ -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"));
}
});
+536 -2
View File
@@ -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"
}
+556 -22
View File
@@ -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": "ビューナビゲーション"
}
+2 -2
View File
@@ -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();
+13 -8
View File
@@ -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 {
+52 -49
View File
@@ -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();
}
+5 -5
View File
@@ -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;
}
});
+5 -2
View File
@@ -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;
+10 -10
View File
@@ -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)
{
+1 -1
View File
@@ -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))
+5 -5
View File
@@ -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() {
+6 -3
View File
@@ -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();
}
+5 -5
View File
@@ -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();
}
+6 -6
View File
@@ -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());
+2 -2
View File
@@ -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;
}
});
+7 -7
View File
@@ -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)"));
});
});
});