From b1d2ac2744ab1a790f6bbce205a9269bcec65c9b Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:18:23 +0300 Subject: [PATCH 01/10] Give the Options dialog a tab rail that can hold more pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dialog laid its pages out as a row of buttons across the top, which is what AutoCAD does and what fits while there are four of them. The pages this series adds take it to nine, and the names are translated into 21 languages — a row of nine German or Russian page names does not fit at any dialog width worth having. The rail is now a vertical list down the left, the dialog is 880×620 rather than 540×560, and the content pane scrolls on its own. Which page was open is now remembered. With four pages, reopening on General was a shrug; with nine it means hunting for the one you were last in. The ribbon's Options tool has existed all along — `ToolDef`, icon and all — but was marked `#[allow(dead_code)]` and never added to a group, so the dialog could only be reached by typing OPTIONS or from the start page. It now sits in Manage ▸ Application, beside About. No settings change in this commit; it is only the shell the rest needs. Co-Authored-By: Claude Opus 5 --- src/app/settings.rs | 3 +++ src/app/update/file.rs | 2 ++ src/app/view/modal.rs | 4 +-- src/modules/manage/mod.rs | 8 +++++- src/modules/manage/options.rs | 1 - src/ui/window/options.rs | 49 +++++++++++++++++++++++++---------- 6 files changed, 49 insertions(+), 18 deletions(-) diff --git a/src/app/settings.rs b/src/app/settings.rs index bdfab8ff9..c66b0c1bb 100644 --- a/src/app/settings.rs +++ b/src/app/settings.rs @@ -170,6 +170,8 @@ pub struct UserSettings { /// GRIPOBJLIMIT: past this many selected objects, no grips are drawn at /// all. 0 means no limit. The drawing header carries no slot for it. pub grip_object_limit: i32, + /// Which Options page was showing when the dialog was last closed. + pub options_tab: crate::ui::window::options::OptionsTab, /// CURSORTYPE: crosshair or the platform pointer over the drawing. pub cursor_type: CursorType, /// Explicit crosshair RGB. `None` keeps automatic background contrast. @@ -325,6 +327,7 @@ impl Default for UserSettings { zoom_factor: 60, cursor_size: 5, pick_box: 3, + options_tab: crate::ui::window::options::OptionsTab::General, double_click_block_refedit: false, double_click_block_attedit: true, grip_object_limit: DEFAULT_GRIP_OBJECT_LIMIT, diff --git a/src/app/update/file.rs b/src/app/update/file.rs index 771b2603b..bc4c020cd 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -365,6 +365,7 @@ impl OpenCADStudio { zoom_factor: self.zoom_factor, cursor_size: self.cursor_size, pick_box: self.pick_box, + options_tab: self.options_tab, double_click_block_refedit: self.double_click_block_refedit, double_click_block_attedit: self.double_click_block_attedit, grip_object_limit: self.grip_object_limit, @@ -422,6 +423,7 @@ impl OpenCADStudio { self.zoom_factor = s.zoom_factor.clamp(3, 100); self.cursor_size = s.cursor_size.clamp(1, 100); self.pick_box = s.pick_box.clamp(0, 50); + self.options_tab = s.options_tab; self.double_click_block_refedit = s.double_click_block_refedit; self.double_click_block_attedit = s.double_click_block_attedit; self.grip_object_limit = s.grip_object_limit.clamp(0, 32767); diff --git a/src/app/view/modal.rs b/src/app/view/modal.rs index 9d116889e..0c27f9278 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -175,8 +175,8 @@ impl OpenCADStudio { } super::super::ModalKind::Options => sized_flow( ex, - 540, - 560, + 880, + 620, |flow| { crate::ui::window::options::view_window( &self.default_save_format, diff --git a/src/modules/manage/mod.rs b/src/modules/manage/mod.rs index f1a66e7aa..48fda655e 100644 --- a/src/modules/manage/mod.rs +++ b/src/modules/manage/mod.rs @@ -79,7 +79,13 @@ impl CadModule for ManageModule { // ── Application ─────────────────────────────────────────────────── RibbonGroup { title: "Application", - tools: vec![RibbonItem::LargeTool(about::tool())], + tools: vec![ + // The tool and its icon already existed but were never + // added to a group, so the dialog could only be reached + // by typing OPTIONS or from the start page. + RibbonItem::LargeTool(options::tool()), + RibbonItem::LargeTool(about::tool()), + ], }, ] }) diff --git a/src/modules/manage/options.rs b/src/modules/manage/options.rs index 615f31d0a..75bea9afc 100644 --- a/src/modules/manage/options.rs +++ b/src/modules/manage/options.rs @@ -1,5 +1,4 @@ use crate::modules::{IconKind, ModuleEvent, ToolDef}; -#[allow(dead_code)] pub fn tool() -> ToolDef { ToolDef { id: "OPTIONS", diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index 7f3aa32d6..86325e844 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -7,7 +7,21 @@ use iced::widget::{ use iced::{Background, Border, Element, Fill, Theme}; use std::fmt; -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +/// Width of the vertical tab rail. Wide enough for the longest translated +/// page name; German and Russian are the ones that set it. +const TAB_RAIL_WIDTH: f32 = 178.0; +/// The dialog's own size when the modal is laid out intrinsically. +const DIALOG_WIDTH: f32 = 880.0; +const DIALOG_HEIGHT: f32 = 620.0; + +/// Which page of the Options dialog is showing. +/// +/// Persisted: with nine pages, reopening on General every time means hunting +/// for the one you were last in. +#[derive( + Clone, Copy, Debug, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize, +)] +#[serde(rename_all = "kebab-case")] pub enum OptionsTab { #[default] General, @@ -841,38 +855,45 @@ pub fn view_window<'a>( OptionsTab::Drawing => drawing.into(), }; + // A vertical rail rather than a horizontal strip: the tab names are + // translated into 21 languages, and a row of them stops fitting long + // before the list of pages is complete. let tab_button = |label, tab| { let selected = active_tab == tab; - button(text(label).size(12)) + button(text(label).size(12.5)) .on_press(Message::OptionsTabChanged(tab)) - .padding([6, 14]) - .style(if selected { button::primary } else { button::secondary }) + .padding([7, 12]) + .width(Fill) + .style(if selected { button::primary } else { button::text }) }; - let tabs = row![ + let tabs = column![ tab_button(crate::t!("General"), OptionsTab::General), tab_button(crate::t!("Display"), OptionsTab::Display), tab_button(crate::t!("Selection"), OptionsTab::Selection), tab_button(crate::t!("Drawing"), OptionsTab::Drawing), ] - .spacing(6); + .spacing(2) + .width(iced::Length::Fixed(TAB_RAIL_WIDTH)); - let body = column![ - tabs, - Space::new().height(12), + let pane = column![ // Keep the scrollbar in its own lane instead of floating over the // controls at the trailing edge of the Options content. - scrollable(content).spacing(8).height(sizing.height), + scrollable(content).spacing(8).height(Fill), Space::new().height(12), - row![Space::new().width(sizing.width), close], + row![Space::new().width(Fill), close], ] - .width(sizing.width) + .width(Fill) .height(sizing.height); + let body = row![tabs, Space::new().width(18), pane] + .width(sizing.width) + .height(sizing.height); + let intrinsic = sizing.width == crate::ui::modal::ModalSizing::INTRINSIC.width; container(body) .style(container::rounded_box) .padding([16, 18]) - .width(if intrinsic { iced::Length::Fixed(540.0) } else { sizing.width }) - .height(if intrinsic { iced::Length::Fixed(560.0) } else { sizing.height }) + .width(if intrinsic { iced::Length::Fixed(DIALOG_WIDTH) } else { sizing.width }) + .height(if intrinsic { iced::Length::Fixed(DIALOG_HEIGHT) } else { sizing.height }) .into() } From ec8d733857a020ed7ca9a1dc1b6c890e41d346ea Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:22:36 +0300 Subject: [PATCH 02/10] Give saving its own page, with the two settings that had no control General had become three unrelated controls: a language picker, a save format and a file association. The last two move to an Open and Save page, where they join the two saving preferences that have never had a widget. Automatic save has worked since the SAVETIME command was added and is persisted; the only way to change the interval was to type it. Same for the `.bak` copy from #205 and its ISAVEBAK command. Both are settings people expect to find in a dialog, and neither was in one. The page also carries a button through to the Plot dialog. Options holds the preferences; the plot device, paper and plot styles stay where they already work well. Note that the modal stack shows one dialog at a time, so the button replaces Options rather than stacking on it. Co-Authored-By: Claude Opus 5 --- src/app/mod.rs | 4 +++ src/app/update/mod.rs | 12 +++++++ src/app/view/modal.rs | 4 +++ src/ui/window/options.rs | 78 ++++++++++++++++++++++++++++++++++++++-- 4 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index 7ecbe186a..9a6eda5f0 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -2007,6 +2007,10 @@ pub enum Message { ShiftToAddToggled(bool), /// Toggle press-and-drag drawing a rectangle instead of a lasso (PICKDRAG). PickDragRectToggled(bool), + /// Change the automatic-save interval in minutes; 0 disables it (SAVETIME). + SaveTimeChanged(i32), + /// Toggle keeping a `.bak` copy when overwriting a drawing (ISAVEBAK). + BackupOnSaveChanged(bool), /// Restore Model Space display/canvas appearance to defaults. RestoreModelSpaceDisplayDefaults, /// Restore Selection visual effect settings to defaults. diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index af5910dde..8f29e3ae8 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -6188,6 +6188,18 @@ impl OpenCADStudio { Task::none() } + Message::SaveTimeChanged(minutes) => { + self.savetime_min = minutes.max(0); + self.persist_settings_if_changed(); + Task::none() + } + + Message::BackupOnSaveChanged(enabled) => { + self.backup_on_save = enabled; + self.persist_settings_if_changed(); + Task::none() + } + Message::PickDragRectToggled(rectangle) => { self.pick_drag_rect = rectangle; self.persist_settings_if_changed(); diff --git a/src/app/view/modal.rs b/src/app/view/modal.rs index 0c27f9278..ebf081925 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -192,6 +192,10 @@ impl OpenCADStudio { pick_drag_rect: self.pick_drag_rect, grip_object_limit: self.grip_object_limit, }, + crate::ui::window::options::AppPrefs { + savetime_min: self.savetime_min, + backup_on_save: self.backup_on_save, + }, self.double_click_block_refedit, self.double_click_block_attedit, self.cursor_type, diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index 86325e844..4b674795c 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -25,11 +25,25 @@ const DIALOG_HEIGHT: f32 = 620.0; pub enum OptionsTab { #[default] General, + OpenAndSave, Display, Selection, Drawing, } +/// Application preferences the dialog reads that are plain scalars on the app. +/// +/// Gathered rather than passed one by one: `view_window` already carries a +/// long positional list, and several of these are adjacent `bool`s that would +/// swap silently at the call site. +#[derive(Clone, Copy)] +pub struct AppPrefs { + /// SAVETIME, minutes between recovery saves; 0 disables. + pub savetime_min: i32, + /// ISAVEBAK: keep a `.bak` when overwriting. + pub backup_on_save: bool, +} + /// The Selection-card settings that live on `UserSettings` rather than on the /// model-space theme. /// @@ -70,6 +84,7 @@ pub fn view_window<'a>( active_tab: OptionsTab, cursor_size: i32, selection: SelectionPrefs, + prefs: AppPrefs, double_click_block_refedit: bool, double_click_block_attedit: bool, cursor_type: CursorType, @@ -187,8 +202,18 @@ pub fn view_window<'a>( ] .spacing(12) .align_y(iced::Center), - Space::new().height(22), - text(crate::tr!("options", "open-save-section")).size(15), + ] + .spacing(0) + .width(sizing.width); + + + // Saving preferences, gathered onto one page. The format and the file + // association were on General, which had become a page of three unrelated + // controls; the autosave interval and the backup toggle have existed since + // #205 with no control at all. + let open_and_save = column![ + text(crate::t!("Open and Save")).size(15), + Space::new().height(10), Space::new().height(10), row![ text(crate::tr!("options", "default-save-format-label")).size(12).width(150), @@ -222,6 +247,53 @@ pub fn view_window<'a>( )) .size(11) .width(sizing.width), + Space::new().height(22), + text(crate::t!("File Safety")).size(15), + Space::new().height(10), + row![ + text(crate::t!("Automatic save")).size(12).width(150), + slider(0..=120, prefs.savetime_min.clamp(0, 120), Message::SaveTimeChanged) + .step(1) + .width(Fill), + text(if prefs.savetime_min <= 0 { + crate::t!("Off").into_owned() + } else { + format!("{} min", prefs.savetime_min) + }) + .size(11) + .width(52), + ] + .spacing(10) + .align_y(iced::Center), + Space::new().height(6), + text(crate::t!( + "Minutes between recovery saves to a .sv$ file; 0 turns it off (SAVETIME)." + )) + .size(11) + .width(sizing.width), + Space::new().height(14), + row![ + iced::widget::checkbox(prefs.backup_on_save) + .on_toggle(Message::BackupOnSaveChanged) + .size(15), + text(crate::t!("Keep a .bak copy when overwriting a drawing (ISAVEBAK)")).size(12), + ] + .spacing(8) + .align_y(iced::Center), + Space::new().height(22), + text(crate::t!("Plotting")).size(15), + Space::new().height(10), + row![ + text(crate::t!("Plot device, paper, scale and plot styles")) + .size(12) + .width(Fill), + button(text(crate::t!("Plot and Page Setup…")).size(11)) + .on_press(Message::PlotDialogOpen) + .padding([4, 10]) + .style(button::secondary), + ] + .spacing(10) + .align_y(iced::Center), ] .spacing(0) .width(sizing.width); @@ -852,6 +924,7 @@ pub fn view_window<'a>( OptionsTab::General => general.into(), OptionsTab::Display => display_element.into(), OptionsTab::Selection => selection.into(), + OptionsTab::OpenAndSave => open_and_save.into(), OptionsTab::Drawing => drawing.into(), }; @@ -868,6 +941,7 @@ pub fn view_window<'a>( }; let tabs = column![ tab_button(crate::t!("General"), OptionsTab::General), + tab_button(crate::t!("Open and Save"), OptionsTab::OpenAndSave), tab_button(crate::t!("Display"), OptionsTab::Display), tab_button(crate::t!("Selection"), OptionsTab::Selection), tab_button(crate::t!("Drawing"), OptionsTab::Drawing), From a0027a8977f982395788fcdf4cc3db0cae57d578 Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:26:20 +0300 Subject: [PATCH 03/10] Put text fill and the command-line preferences on the Display page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three settings that work, persist, and could only be reached by typing their name: TEXTFILL, CLIPROMPTLINES and COMMANDLINEFADETIME. The last two govern how much of the command window is prompt and how long its history lingers — the kind of thing people fiddle with once and then leave, which is exactly what a settings dialog is for. One fix rides along. TEXTFILL is a process-global, so changing it invalidates the text in every open drawing; the SETVAR path rebuilt only the active tab, leaving the others rendering the previous setting until an unrelated edit happened to rebuild them. Both paths now go through `invalidate_text_everywhere`, so the checkbox and the command cannot disagree. Co-Authored-By: Claude Opus 5 --- src/app/commands/styleprops.rs | 4 +- src/app/mod.rs | 6 +++ src/app/update/file.rs | 11 +++++ src/app/update/mod.rs | 23 +++++++++++ src/app/view/modal.rs | 3 ++ src/ui/window/options.rs | 75 ++++++++++++++++++++++++++++++++++ 6 files changed, 119 insertions(+), 3 deletions(-) diff --git a/src/app/commands/styleprops.rs b/src/app/commands/styleprops.rs index 4efc41f80..12128fa88 100644 --- a/src/app/commands/styleprops.rs +++ b/src/app/commands/styleprops.rs @@ -2184,9 +2184,7 @@ impl OpenCADStudio { // TEXTFILL reset the glyph atlas; re-tessellate so text picks // up the re-baked filled / hollow tiles. if name == "TEXTFILL" { - self.tabs[i] - .scene - .invalidate_text_geometry_dependencies(); + self.invalidate_text_everywhere(); } // LTSCALE scales the dash pattern baked into every wire, and // PDMODE / PDSIZE decide the point glyph built at tessellation diff --git a/src/app/mod.rs b/src/app/mod.rs index 9a6eda5f0..65c2f715b 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -2011,6 +2011,12 @@ pub enum Message { SaveTimeChanged(i32), /// Toggle keeping a `.bak` copy when overwriting a drawing (ISAVEBAK). BackupOnSaveChanged(bool), + /// Toggle filled TrueType glyphs (TEXTFILL). + TextFillChanged(bool), + /// Change how many prompt lines sit above the command window (CLIPROMPTLINES). + ClipromptLinesChanged(i32), + /// Change how long command-line history lines stay visible (COMMANDLINEFADETIME). + CommandLineFadeChanged(i32), /// Restore Model Space display/canvas appearance to defaults. RestoreModelSpaceDisplayDefaults, /// Restore Selection visual effect settings to defaults. diff --git a/src/app/update/file.rs b/src/app/update/file.rs index bc4c020cd..61921204a 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -355,6 +355,17 @@ impl OpenCADStudio { } } + /// Rebuild text geometry in every open drawing. + /// + /// `TEXTFILL` is a process-global, so a change to it invalidates the text + /// in every tab. Doing only the active one leaves the others rendering the + /// previous setting until some unrelated edit happens to rebuild them. + pub(in crate::app) fn invalidate_text_everywhere(&mut self) { + for tab in &mut self.tabs { + tab.scene.invalidate_text_geometry_dependencies(); + } + } + /// Snapshot the persisted UI preferences from live state. pub(in crate::app) fn current_settings(&self) -> crate::app::settings::UserSettings { crate::app::settings::UserSettings { diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index 8f29e3ae8..9781b22f3 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -6200,6 +6200,29 @@ impl OpenCADStudio { Task::none() } + Message::TextFillChanged(filled) => { + crate::scene::text::sdf_atlas::set_textfill(filled); + self.invalidate_text_everywhere(); + self.persist_settings_if_changed(); + Task::none() + } + + Message::ClipromptLinesChanged(lines) => { + let lines = crate::app::settings::clamp_clipromptlines(lines); + self.cliprompt_lines = lines; + self.command_line.set_cliprompt_lines(lines.clamp(0, 50) as u8); + self.persist_settings_if_changed(); + Task::none() + } + + Message::CommandLineFadeChanged(ms) => { + let ms = crate::app::settings::clamp_commandline_fade_ms(ms); + self.commandline_fade_ms = ms; + self.command_line.set_commandline_fade_ms(ms.max(0) as u32); + self.persist_settings_if_changed(); + Task::none() + } + Message::PickDragRectToggled(rectangle) => { self.pick_drag_rect = rectangle; self.persist_settings_if_changed(); diff --git a/src/app/view/modal.rs b/src/app/view/modal.rs index ebf081925..50da6adfb 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -195,6 +195,9 @@ impl OpenCADStudio { crate::ui::window::options::AppPrefs { savetime_min: self.savetime_min, backup_on_save: self.backup_on_save, + textfill: crate::scene::text::sdf_atlas::textfill(), + cliprompt_lines: self.cliprompt_lines, + commandline_fade_ms: self.commandline_fade_ms, }, self.double_click_block_refedit, self.double_click_block_attedit, diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index 4b674795c..35e888006 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -42,6 +42,12 @@ pub struct AppPrefs { pub savetime_min: i32, /// ISAVEBAK: keep a `.bak` when overwriting. pub backup_on_save: bool, + /// TEXTFILL: fill TrueType glyphs rather than drawing them hollow. + pub textfill: bool, + /// CLIPROMPTLINES: prompt lines shown above the command window. + pub cliprompt_lines: i32, + /// COMMANDLINEFADETIME: how long overlay history lines stay visible, in ms. + pub commandline_fade_ms: i32, } /// The Selection-card settings that live on `UserSettings` rather than on the @@ -642,6 +648,75 @@ pub fn view_window<'a>( text(crate::t!("Changes the on-screen width in Model without affecting plotted output.")) .size(11) .width(sizing.width), + ) + .push(Space::new().height(14)) + .push( + row![ + iced::widget::checkbox(prefs.textfill) + .on_toggle(Message::TextFillChanged) + .size(15), + text(crate::t!("Fill TrueType glyphs (TEXTFILL)")).size(12), + ] + .spacing(8) + .align_y(iced::Center), + ) + .push(Space::new().height(24)) + .push(text(crate::t!("Command Line")).size(15)) + .push(Space::new().height(10)) + .push( + row![ + text(crate::t!("Prompt lines")).size(12).width(140), + slider( + 0..=50, + prefs.cliprompt_lines.clamp(0, 50), + Message::ClipromptLinesChanged, + ) + .step(1) + .width(Fill), + text(prefs.cliprompt_lines.clamp(0, 50).to_string()) + .size(11) + .width(44), + ] + .spacing(10) + .align_y(iced::Center), + ) + .push(Space::new().height(6)) + .push( + text(crate::t!( + "Temporary prompt lines shown above the command window (CLIPROMPTLINES)." + )) + .size(11) + .width(sizing.width), + ) + .push(Space::new().height(12)) + .push( + row![ + text(crate::t!("History fade time")).size(12).width(140), + slider( + 0..=60000, + prefs.commandline_fade_ms.clamp(0, 60000), + Message::CommandLineFadeChanged, + ) + .step(250) + .width(Fill), + text(if prefs.commandline_fade_ms <= 0 { + crate::t!("Off").into_owned() + } else { + format!("{:.1} s", prefs.commandline_fade_ms as f32 / 1000.0) + }) + .size(11) + .width(44), + ] + .spacing(10) + .align_y(iced::Center), + ) + .push(Space::new().height(6)) + .push( + text(crate::t!( + "How long overlay history lines stay visible; 0 skips them (COMMANDLINEFADETIME)." + )) + .size(11) + .width(sizing.width), ); let display_element = display.spacing(0).width(sizing.width); From 9c3f3625dada14cafb50d7706013bfffbd615588 Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:29:48 +0300 Subject: [PATCH 04/10] Add a User Preferences page for six command-only settings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zoom direction and factor, whether TEXTEDIT ends after one object, whether continued dimensions inherit the base dimension's style, which points QDIM measures from, and which annotative objects pick up a newly set scale. All six work today; none had a control. Two of them needed their meaning worked out rather than copied. ANNOAUTOSCALE stores the mode in the magnitude and on/off in the sign, and the four modes are not documented anywhere in the app — the command prompt just says `[-4..4]`. Reading `add_annotation_scale_to_objects` gives them: 1 skips layers that are off, frozen, locked or frozen in the viewport, 2 keeps the locked ones, 3 skips only locked, 4 takes everything. The dropdown names them instead of showing bare numbers, and choosing Off negates rather than zeroing, so the mode survives being switched off and back on — which is the convention the status-bar pill already follows. The QDIM origin priority had no system variable at all; it could only be reached through a keyword inside the running command. Drawing units stay in their own dialog; this page links to it. Co-Authored-By: Claude Opus 5 --- src/app/mod.rs | 12 +++ src/app/update/mod.rs | 43 +++++++++++ src/app/view/modal.rs | 6 ++ src/ui/window/options.rs | 157 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 218 insertions(+) diff --git a/src/app/mod.rs b/src/app/mod.rs index 65c2f715b..357a8a73e 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -2017,6 +2017,18 @@ pub enum Message { ClipromptLinesChanged(i32), /// Change how long command-line history lines stay visible (COMMANDLINEFADETIME). CommandLineFadeChanged(i32), + /// Toggle reversing the mouse-wheel zoom direction (ZOOMWHEEL). + ZoomWheelReversedChanged(bool), + /// Change how far one wheel notch zooms (ZOOMFACTOR, 3..=100). + ZoomFactorChanged(i32), + /// Toggle TEXTEDIT ending after one object (TEXTEDITMODE). + TextEditModeChanged(bool), + /// Toggle continued dimensions inheriting the base style (DIMCONTINUEMODE). + DimContinueModeChanged(bool), + /// Change which points QDIM measures from (0 endpoints, 1 intersections). + QdimSnapPriorityChanged(u8), + /// Change which annotative objects pick up a new scale (ANNOAUTOSCALE). + AnnoAutoScaleChanged(i8), /// Restore Model Space display/canvas appearance to defaults. RestoreModelSpaceDisplayDefaults, /// Restore Selection visual effect settings to defaults. diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index 9781b22f3..4b83b5732 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -6223,6 +6223,49 @@ impl OpenCADStudio { Task::none() } + Message::ZoomWheelReversedChanged(reversed) => { + self.zoom_wheel_reversed = reversed; + self.persist_settings_if_changed(); + Task::none() + } + + Message::ZoomFactorChanged(factor) => { + self.zoom_factor = factor.clamp(3, 100); + self.persist_settings_if_changed(); + Task::none() + } + + Message::TextEditModeChanged(single) => { + self.texteditmode = single; + self.persist_settings_if_changed(); + Task::none() + } + + Message::DimContinueModeChanged(inherit) => { + self.dimension_continue_mode = i16::from(inherit); + self.persist_settings_if_changed(); + Task::none() + } + + Message::QdimSnapPriorityChanged(priority) => { + self.quick_dimension_snap_priority = priority.min(1); + self.persist_settings_if_changed(); + Task::none() + } + + // The sign carries on/off and the magnitude the mode, so switching + // off and back on has to return to the mode that was chosen — the + // same convention the status-bar pill uses when it negates. + Message::AnnoAutoScaleChanged(mode) => { + self.annotation_auto_scale = if mode == 0 { + -self.annotation_auto_scale.abs().max(1) + } else { + mode.clamp(1, 4) + }; + self.persist_settings_if_changed(); + Task::none() + } + Message::PickDragRectToggled(rectangle) => { self.pick_drag_rect = rectangle; self.persist_settings_if_changed(); diff --git a/src/app/view/modal.rs b/src/app/view/modal.rs index 50da6adfb..3f650f643 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -198,6 +198,12 @@ impl OpenCADStudio { textfill: crate::scene::text::sdf_atlas::textfill(), cliprompt_lines: self.cliprompt_lines, commandline_fade_ms: self.commandline_fade_ms, + zoom_wheel_reversed: self.zoom_wheel_reversed, + zoom_factor: self.zoom_factor, + texteditmode: self.texteditmode, + dimension_continue_mode: self.dimension_continue_mode, + qdim_snap_priority: self.quick_dimension_snap_priority, + annotation_auto_scale: self.annotation_auto_scale, }, self.double_click_block_refedit, self.double_click_block_attedit, diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index 35e888006..14bbb2de6 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -28,6 +28,7 @@ pub enum OptionsTab { OpenAndSave, Display, Selection, + UserPreferences, Drawing, } @@ -48,6 +49,19 @@ pub struct AppPrefs { pub cliprompt_lines: i32, /// COMMANDLINEFADETIME: how long overlay history lines stay visible, in ms. pub commandline_fade_ms: i32, + /// ZOOMWHEEL: reverse the mouse-wheel zoom direction. + pub zoom_wheel_reversed: bool, + /// ZOOMFACTOR, 3..=100. + pub zoom_factor: i32, + /// TEXTEDITMODE: TEXTEDIT keeps prompting for the next object. + pub texteditmode: bool, + /// DIMCONTINUEMODE: continued dimensions inherit the base dimension's style. + pub dimension_continue_mode: i16, + /// QDIM extension-origin priority: 0 endpoints, 1 intersections. + pub qdim_snap_priority: u8, + /// ANNOAUTOSCALE, -4..=4. The sign is on/off; the magnitude selects which + /// objects a newly added scale reaches. + pub annotation_auto_scale: i8, } /// The Selection-card settings that live on `UserSettings` rather than on the @@ -995,11 +1009,153 @@ pub fn view_window<'a>( .spacing(0) .width(sizing.width); + + // ANNOAUTOSCALE's magnitude decides which objects a newly added scale + // reaches — 1 skips layers that are off, frozen, locked or frozen in the + // viewport, 2 keeps locked ones, 3 skips only locked, 4 takes everything. + // The sign is the on/off the status-bar pill flips, so the mode survives + // being switched off and back on. + let auto_scale_options = [ + (0i8, "Off"), + (1, "Skip objects on layers that are off, frozen or locked"), + (2, "Skip objects on layers that are off or frozen"), + (3, "Skip objects on locked layers"), + (4, "All annotative objects"), + ] + .into_iter() + .map(|(value, label)| Labelled { + value, + label: crate::t!(label).into_owned(), + }) + .collect::>(); + let selected_auto_scale = auto_scale_options + .iter() + .find(|choice| choice.value == prefs.annotation_auto_scale.max(0)) + .cloned(); + + let qdim_options = [ + (0u8, "Endpoints"), + (1, "Intersections"), + ] + .into_iter() + .map(|(value, label)| Labelled { + value, + label: crate::t!(label).into_owned(), + }) + .collect::>(); + let selected_qdim = qdim_options + .iter() + .find(|choice| choice.value == prefs.qdim_snap_priority) + .cloned(); + + let user_prefs = column![ + text(crate::t!("User Preferences")).size(15), + Space::new().height(10), + text(crate::t!("Zoom")).size(15), + Space::new().height(10), + row![ + iced::widget::checkbox(prefs.zoom_wheel_reversed) + .on_toggle(Message::ZoomWheelReversedChanged) + .size(15), + text(crate::t!("Reverse mouse wheel zoom (ZOOMWHEEL)")).size(12), + ] + .spacing(8) + .align_y(iced::Center), + Space::new().height(12), + row![ + text(crate::t!("Zoom factor")).size(12).width(150), + slider(3..=100, prefs.zoom_factor.clamp(3, 100), Message::ZoomFactorChanged) + .step(1) + .width(Fill), + text(prefs.zoom_factor.clamp(3, 100).to_string()).size(11).width(44), + ] + .spacing(10) + .align_y(iced::Center), + Space::new().height(6), + text(crate::t!("How far one wheel notch zooms (ZOOMFACTOR).")) + .size(11) + .width(sizing.width), + Space::new().height(24), + text(crate::t!("Text and Dimensions")).size(15), + Space::new().height(10), + row![ + iced::widget::checkbox(prefs.texteditmode) + .on_toggle(Message::TextEditModeChanged) + .size(15), + text(crate::t!("TEXTEDIT edits one object and ends (TEXTEDITMODE)")).size(12), + ] + .spacing(8) + .align_y(iced::Center), + Space::new().height(12), + row![ + iced::widget::checkbox(prefs.dimension_continue_mode == 1) + .on_toggle(Message::DimContinueModeChanged) + .size(15), + text(crate::t!( + "Continued dimensions inherit the base dimension's layer and style (DIMCONTINUEMODE)" + )) + .size(12), + ] + .spacing(8) + .align_y(iced::Center), + Space::new().height(12), + row![ + text(crate::t!("QDIM origin priority")).size(12).width(150), + iced::widget::pick_list(selected_qdim, qdim_options, |choice| choice.label.clone()) + .on_select(|choice| Message::QdimSnapPriorityChanged(choice.value)) + .width(Fill), + ] + .spacing(10) + .align_y(iced::Center), + Space::new().height(6), + text(crate::t!( + "Which points QDIM measures from. Also settable inside the command." + )) + .size(11) + .width(sizing.width), + Space::new().height(24), + text(crate::t!("Annotation")).size(15), + Space::new().height(10), + row![ + text(crate::t!("Add scales automatically")).size(12).width(150), + iced::widget::pick_list(selected_auto_scale, auto_scale_options, |choice| { + choice.label.clone() + }) + .on_select(|choice| Message::AnnoAutoScaleChanged(choice.value)) + .width(Fill), + ] + .spacing(10) + .align_y(iced::Center), + Space::new().height(6), + text(crate::t!( + "Which annotative objects pick up a newly set annotation scale (ANNOAUTOSCALE)." + )) + .size(11) + .width(sizing.width), + Space::new().height(24), + text(crate::t!("Drawing Units")).size(15), + Space::new().height(10), + row![ + text(crate::t!("Length, angle and insertion units")) + .size(12) + .width(Fill), + button(text(crate::t!("Drawing Units…")).size(11)) + .on_press(Message::OpenDrawingUnits) + .padding([4, 10]) + .style(button::secondary), + ] + .spacing(10) + .align_y(iced::Center), + ] + .spacing(0) + .width(sizing.width); + let content: Element<'a, Message> = match active_tab { OptionsTab::General => general.into(), OptionsTab::Display => display_element.into(), OptionsTab::Selection => selection.into(), OptionsTab::OpenAndSave => open_and_save.into(), + OptionsTab::UserPreferences => user_prefs.into(), OptionsTab::Drawing => drawing.into(), }; @@ -1019,6 +1175,7 @@ pub fn view_window<'a>( tab_button(crate::t!("Open and Save"), OptionsTab::OpenAndSave), tab_button(crate::t!("Display"), OptionsTab::Display), tab_button(crate::t!("Selection"), OptionsTab::Selection), + tab_button(crate::t!("User Preferences"), OptionsTab::UserPreferences), tab_button(crate::t!("Drawing"), OptionsTab::Drawing), ] .spacing(2) From b5f4b4d1cc992daf607be749109c279f00e58d71 Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:33:19 +0300 Subject: [PATCH 05/10] Add a Drafting page for the rotation angle and the polar increment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two drafting preferences had no proper home. The Drafting Settings dialog displays the drafting rotation and offers only a Reset button — there was no way to type an angle short of `SETVAR SNAPANG`. The polar tracking increment existed in exactly one place: a pop-up hanging off the status-bar pill. The rotation is a text field over an edit buffer rather than the value itself, so clearing it to retype does not snap the crosshair to zero on the way through; the buffer is reseeded whenever the value is restored from behind it. Angles render without a trailing `.0`, matching how the polar pop-up has always shown them — same kind of number, same reader. Snap modes, grid spacing and object snap stay in Drafting Settings, where they belong; the page links to it. Co-Authored-By: Claude Opus 5 --- src/app/mod.rs | 8 +++++ src/app/settings.rs | 12 +++++++ src/app/update/file.rs | 3 ++ src/app/update/mod.rs | 21 +++++++++++ src/app/view/modal.rs | 2 ++ src/ui/window/options.rs | 77 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 123 insertions(+) diff --git a/src/app/mod.rs b/src/app/mod.rs index 357a8a73e..d880c9918 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -517,6 +517,9 @@ pub(super) struct OpenCADStudio { crosshair_color: Option<[u8; 3]>, /// Editable Options buffer for the crosshair colour. crosshair_color_input: String, + /// Edit buffer for the SNAPANG field on the Options Drafting page. Kept + /// separate from `snap_angle_deg` so a half-typed angle is not parsed. + snap_angle_input: String, /// Model-space lineweight preview scale, in percent (25..=200). lineweight_display_scale: i32, /// Isometric drafting state and active axis pair. @@ -2029,6 +2032,10 @@ pub enum Message { QdimSnapPriorityChanged(u8), /// Change which annotative objects pick up a new scale (ANNOAUTOSCALE). AnnoAutoScaleChanged(i8), + /// Edit the drafting rotation field; parsed when it holds a valid angle (SNAPANG). + SnapAngleInputChanged(String), + /// Change the polar tracking increment in degrees. + PolarIncrementChanged(f32), /// Restore Model Space display/canvas appearance to defaults. RestoreModelSpaceDisplayDefaults, /// Restore Selection visual effect settings to defaults. @@ -3429,6 +3436,7 @@ impl OpenCADStudio { cursor_type: settings::CursorType::Crosshair, crosshair_color: None, crosshair_color_input: String::new(), + snap_angle_input: "0".to_string(), lineweight_display_scale: 100, isometric_drafting: false, iso_plane: settings::IsoPlane::Left, diff --git a/src/app/settings.rs b/src/app/settings.rs index c66b0c1bb..5aded5e11 100644 --- a/src/app/settings.rs +++ b/src/app/settings.rs @@ -145,6 +145,18 @@ pub(crate) fn snaps_from_osmode(osmode: i32) -> (Vec, bool) { (modes, osmode & OSMODE_SUPPRESS == 0) } +/// Render a drafting angle without a trailing `.0`, so `22.5` but `30`. +/// +/// The polar pop-up formats its presets the same way; both are showing the +/// same kind of number to the same person. +pub fn format_snap_angle(deg: f32) -> String { + if (deg - deg.round()).abs() < 1e-4 { + format!("{}", deg.round() as i32) + } else { + format!("{deg}") + } +} + /// GRIPOBJLIMIT default: past this many selected objects, no grips are drawn. pub const DEFAULT_GRIP_OBJECT_LIMIT: i32 = 100; diff --git a/src/app/update/file.rs b/src/app/update/file.rs index 61921204a..2803bdcf0 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -452,6 +452,9 @@ impl OpenCADStudio { } else { 0.0 }; + // The Options field edits a buffer rather than the value, so it has to + // be reseeded whenever the value is restored from behind it. + self.snap_angle_input = crate::app::settings::format_snap_angle(self.snap_angle_deg); // Ortho + running OSNAP are per-drawing (adopted from the header on // open / tab switch), not app-global, so they are not applied here. self.snapper.otrack_enabled = s.otrack; diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index 4b83b5732..463db49af 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -6266,6 +6266,27 @@ impl OpenCADStudio { Task::none() } + // Typed into freely; only committed when it parses, so clearing + // the field to retype does not snap the crosshair back to zero. + Message::SnapAngleInputChanged(value) => { + self.snap_angle_input = value; + if let Ok(angle) = self.snap_angle_input.trim().parse::() { + if angle.is_finite() { + self.snap_angle_deg = angle.rem_euclid(360.0); + self.persist_settings_if_changed(); + } + } + Task::none() + } + + Message::PolarIncrementChanged(deg) => { + if deg.is_finite() && deg > 0.0 { + self.polar_increment_deg = deg; + self.persist_settings_if_changed(); + } + Task::none() + } + Message::PickDragRectToggled(rectangle) => { self.pick_drag_rect = rectangle; self.persist_settings_if_changed(); diff --git a/src/app/view/modal.rs b/src/app/view/modal.rs index 3f650f643..207f28454 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -204,7 +204,9 @@ impl OpenCADStudio { dimension_continue_mode: self.dimension_continue_mode, qdim_snap_priority: self.quick_dimension_snap_priority, annotation_auto_scale: self.annotation_auto_scale, + polar_increment_deg: self.polar_increment_deg, }, + &self.snap_angle_input, self.double_click_block_refedit, self.double_click_block_attedit, self.cursor_type, diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index 14bbb2de6..b597d1715 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -27,6 +27,7 @@ pub enum OptionsTab { General, OpenAndSave, Display, + Drafting, Selection, UserPreferences, Drawing, @@ -62,6 +63,8 @@ pub struct AppPrefs { /// ANNOAUTOSCALE, -4..=4. The sign is on/off; the magnitude selects which /// objects a newly added scale reaches. pub annotation_auto_scale: i8, + /// Polar tracking increment in degrees. + pub polar_increment_deg: f32, } /// The Selection-card settings that live on `UserSettings` rather than on the @@ -105,6 +108,7 @@ pub fn view_window<'a>( cursor_size: i32, selection: SelectionPrefs, prefs: AppPrefs, + snap_angle_input: &'a str, double_click_block_refedit: bool, double_click_block_attedit: bool, cursor_type: CursorType, @@ -1150,11 +1154,83 @@ pub fn view_window<'a>( .spacing(0) .width(sizing.width); + + // Snap modes, grid and object snap stay in the Drafting Settings dialog. + // These two have no home: Drafting Settings shows the rotation angle but + // offers only Reset, and the polar increment lives solely in a status-bar + // pop-up. + let polar_options = [90.0f32, 45.0, 30.0, 22.5, 18.0, 15.0, 10.0, 5.0, 1.0] + .into_iter() + .map(|value| Labelled { + label: format!("{}°", crate::app::settings::format_snap_angle(value)), + value, + }) + .collect::>(); + let selected_polar = polar_options + .iter() + .find(|choice| (choice.value - prefs.polar_increment_deg).abs() < 1e-4) + .cloned() + .unwrap_or_else(|| Labelled { + value: prefs.polar_increment_deg, + label: format!( + "{}°", + crate::app::settings::format_snap_angle(prefs.polar_increment_deg) + ), + }); + + let drafting = column![ + text(crate::t!("Drafting")).size(15), + Space::new().height(10), + row![ + text(crate::t!("Drafting rotation")).size(12).width(150), + text_input("0", snap_angle_input) + .on_input(Message::SnapAngleInputChanged) + .width(110), + text(crate::t!("degrees")).size(11), + ] + .spacing(10) + .align_y(iced::Center), + Space::new().height(6), + text(crate::t!( + "Rotates the crosshair and the snap grid in the active UCS (SNAPANG)." + )) + .size(11) + .width(sizing.width), + Space::new().height(14), + row![ + text(crate::t!("Polar tracking increment")).size(12).width(150), + iced::widget::pick_list(Some(selected_polar), polar_options, |choice| { + choice.label.clone() + }) + .on_select(|choice| Message::PolarIncrementChanged(choice.value)) + .width(Fill), + ] + .spacing(10) + .align_y(iced::Center), + Space::new().height(24), + text(crate::t!("Snap and Grid")).size(15), + Space::new().height(10), + row![ + text(crate::t!("Snap modes, grid spacing and object snap")) + .size(12) + .width(Fill), + button(text(crate::t!("Drafting Settings…")).size(11)) + .on_press(Message::ToggleSnapPopup) + .padding([4, 10]) + .style(button::secondary), + ] + .spacing(10) + .align_y(iced::Center), + ] + .spacing(0) + .width(sizing.width); + let content: Element<'a, Message> = match active_tab { OptionsTab::General => general.into(), OptionsTab::Display => display_element.into(), OptionsTab::Selection => selection.into(), OptionsTab::OpenAndSave => open_and_save.into(), + OptionsTab::Drafting => drafting.into(), OptionsTab::UserPreferences => user_prefs.into(), OptionsTab::Drawing => drawing.into(), }; @@ -1174,6 +1250,7 @@ pub fn view_window<'a>( tab_button(crate::t!("General"), OptionsTab::General), tab_button(crate::t!("Open and Save"), OptionsTab::OpenAndSave), tab_button(crate::t!("Display"), OptionsTab::Display), + tab_button(crate::t!("Drafting"), OptionsTab::Drafting), tab_button(crate::t!("Selection"), OptionsTab::Selection), tab_button(crate::t!("User Preferences"), OptionsTab::UserPreferences), tab_button(crate::t!("Drawing"), OptionsTab::Drawing), From 5a638f243a410dd34c32fc1b97ac55e88c2917cb Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:41:26 +0300 Subject: [PATCH 06/10] Make the view toggles survive a restart, and give them a page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ViewCube, the UCS icon, its at-origin placement and selection cycling all have commands and status-bar pills, and all four kept their value only on the app struct. Turn the ViewCube off with NAVVCUBE, restart, and it is back. Nothing failed — the setting evaporated — so a checkbox for any of them would have been a checkbox that forgets. They are persisted first, with a round-trip test, and only then given controls. The new 3D Modeling page carries the three view tools plus the drawing variables that decide how solids are tessellated: ISOLINES, DISPSILH, SURFU, SURFV, SURFTYPE, SOLIDHIST and SHOWHIST. Those are saved in the DWG rather than in preferences, so the page says so beside each group and hides them entirely when no drawing is open. Changing them also rebuilds the geometry. The SETVAR path never did, which is why the comment beside LTSCALE's invalidation exists — the same reasoning applies here, and without it a new isoline count does not appear until some unrelated edit rebuilds the solid. Selection cycling joins the Selection page next to the other two selection modes, since that is what it is. Co-Authored-By: Claude Opus 5 --- src/app/mod.rs | 22 ++++ src/app/properties.rs | 23 ++++ src/app/settings.rs | 13 +++ src/app/update/file.rs | 29 +++++ src/app/update/mod.rs | 76 ++++++++++++ src/app/view/modal.rs | 23 ++++ src/ui/window/options.rs | 241 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 427 insertions(+) diff --git a/src/app/mod.rs b/src/app/mod.rs index d880c9918..6ee56bbe4 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -2036,6 +2036,28 @@ pub enum Message { SnapAngleInputChanged(String), /// Change the polar tracking increment in degrees. PolarIncrementChanged(f32), + /// Toggle the navigation cube (NAVVCUBE). + ShowViewCubeChanged(bool), + /// Toggle the UCS icon (UCSICON). + ShowUcsIconChanged(bool), + /// Toggle drawing the UCS icon at the origin (UCSICON ORigin). + UcsIconAtOriginChanged(bool), + /// Toggle selection cycling from Options; the status-bar pill toggles the same flag. + SelectionCyclingChanged(bool), + /// Change isolines per surface in the current drawing (ISOLINES). + IsolinesChanged(i16), + /// Toggle silhouette edges in the current drawing (DISPSILH). + DispSilhChanged(bool), + /// Change surface density U in the current drawing (SURFU). + SurfaceUChanged(i16), + /// Change surface density V in the current drawing (SURFV). + SurfaceVChanged(i16), + /// Change the surface type in the current drawing (SURFTYPE). + SurfaceTypeChanged(i16), + /// Toggle recording composite-solid history in the current drawing (SOLIDHIST). + SolidHistChanged(bool), + /// Change when solid history is shown in the current drawing (SHOWHIST). + ShowHistChanged(i16), /// Restore Model Space display/canvas appearance to defaults. RestoreModelSpaceDisplayDefaults, /// Restore Selection visual effect settings to defaults. diff --git a/src/app/properties.rs b/src/app/properties.rs index 8fd1faec1..bcbbd5aa3 100644 --- a/src/app/properties.rs +++ b/src/app/properties.rs @@ -4149,6 +4149,29 @@ mod grip_limit_tests { ); } + /// The ViewCube, the UCS icon and selection cycling all have commands and + /// status-bar pills, but their values lived only on the app struct: turn + /// the ViewCube off, restart, and it came straight back. Nothing failed — + /// the setting simply evaporated — which is exactly the kind of thing a + /// round-trip test catches and a person does not. + #[test] + fn the_view_toggles_survive_a_save_and_load() { + let mut app = OpenCADStudio::new_for_test(); + app.show_viewcube = false; + app.show_ucs_icon = false; + app.ucs_icon_at_origin = false; + app.selection_cycling = true; + + let saved = app.current_settings(); + let mut restored = OpenCADStudio::new_for_test(); + restored.apply_settings(&saved); + + assert!(!restored.show_viewcube, "the ViewCube must stay off"); + assert!(!restored.show_ucs_icon); + assert!(!restored.ucs_icon_at_origin); + assert!(restored.selection_cycling); + } + /// The Options card writes these four straight onto the app and relies on /// the snapshot/restore pair to carry them across a restart. Three of them /// had no UI until now and so no reason for anyone to notice if the pair diff --git a/src/app/settings.rs b/src/app/settings.rs index 5aded5e11..3032b0a60 100644 --- a/src/app/settings.rs +++ b/src/app/settings.rs @@ -184,6 +184,15 @@ pub struct UserSettings { pub grip_object_limit: i32, /// Which Options page was showing when the dialog was last closed. pub options_tab: crate::ui::window::options::OptionsTab, + /// Show the navigation cube (NAVVCUBE). + pub show_viewcube: bool, + /// Show the UCS icon (UCSICON). + pub show_ucs_icon: bool, + /// Draw the UCS icon at the origin rather than in the corner + /// (UCSICON ORigin / NOorigin). + pub ucs_icon_at_origin: bool, + /// Selection cycling: a click where objects overlap opens a picker. + pub selection_cycling: bool, /// CURSORTYPE: crosshair or the platform pointer over the drawing. pub cursor_type: CursorType, /// Explicit crosshair RGB. `None` keeps automatic background contrast. @@ -340,6 +349,10 @@ impl Default for UserSettings { cursor_size: 5, pick_box: 3, options_tab: crate::ui::window::options::OptionsTab::General, + show_viewcube: true, + show_ucs_icon: true, + ucs_icon_at_origin: true, + selection_cycling: false, double_click_block_refedit: false, double_click_block_attedit: true, grip_object_limit: DEFAULT_GRIP_OBJECT_LIMIT, diff --git a/src/app/update/file.rs b/src/app/update/file.rs index 2803bdcf0..86694f6b2 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -355,6 +355,24 @@ impl OpenCADStudio { } } + /// Write a tessellation-affecting header variable on the active drawing. + /// + /// These decide how solids and surfaces are tessellated, so the geometry + /// has to be rebuilt for the change to appear — the same reason `LTSCALE` + /// bumps it. Marking the tab modified is what makes the new value reach + /// the file. + pub(in crate::app) fn set_drawing_tessellation_var( + &mut self, + write: impl FnOnce(&mut acadrust::document::HeaderVariables), + ) { + let i = self.active_tab; + if let Some(tab) = self.tabs.get_mut(i) { + write(&mut tab.scene.document.header); + tab.scene.bump_geometry(); + tab.dirty = true; + } + } + /// Rebuild text geometry in every open drawing. /// /// `TEXTFILL` is a process-global, so a change to it invalidates the text @@ -377,6 +395,10 @@ impl OpenCADStudio { cursor_size: self.cursor_size, pick_box: self.pick_box, options_tab: self.options_tab, + show_viewcube: self.show_viewcube, + show_ucs_icon: self.show_ucs_icon, + ucs_icon_at_origin: self.ucs_icon_at_origin, + selection_cycling: self.selection_cycling, double_click_block_refedit: self.double_click_block_refedit, double_click_block_attedit: self.double_click_block_attedit, grip_object_limit: self.grip_object_limit, @@ -435,6 +457,13 @@ impl OpenCADStudio { self.cursor_size = s.cursor_size.clamp(1, 100); self.pick_box = s.pick_box.clamp(0, 50); self.options_tab = s.options_tab; + // These four drive real features with commands and status-bar pills, + // but they lived only on the app struct: turning the ViewCube off and + // restarting brought it straight back. + self.show_viewcube = s.show_viewcube; + self.show_ucs_icon = s.show_ucs_icon; + self.ucs_icon_at_origin = s.ucs_icon_at_origin; + self.selection_cycling = s.selection_cycling; self.double_click_block_refedit = s.double_click_block_refedit; self.double_click_block_attedit = s.double_click_block_attedit; self.grip_object_limit = s.grip_object_limit.clamp(0, 32767); diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index 463db49af..3e88cb454 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -6287,6 +6287,82 @@ impl OpenCADStudio { Task::none() } + Message::ShowViewCubeChanged(show) => { + self.show_viewcube = show; + self.persist_settings_if_changed(); + Task::none() + } + + Message::ShowUcsIconChanged(show) => { + self.show_ucs_icon = show; + self.persist_settings_if_changed(); + Task::none() + } + + Message::UcsIconAtOriginChanged(at_origin) => { + self.ucs_icon_at_origin = at_origin; + self.persist_settings_if_changed(); + Task::none() + } + + // The five below are drawing variables: they go into the header of + // the active drawing and mark it modified, exactly as SETVAR does. + // The four that feed solid tessellation also bump the geometry, or + // the change is invisible until an unrelated edit rebuilds it. + Message::IsolinesChanged(value) => { + self.set_drawing_tessellation_var(|header| header.isolines = value.max(0)); + Task::none() + } + + Message::DispSilhChanged(on) => { + self.set_drawing_tessellation_var(|header| header.display_silhouette = on); + Task::none() + } + + Message::SurfaceUChanged(value) => { + self.set_drawing_tessellation_var(|header| { + header.surface_u_density = value.clamp(0, 200) + }); + Task::none() + } + + Message::SurfaceVChanged(value) => { + self.set_drawing_tessellation_var(|header| { + header.surface_v_density = value.clamp(0, 200) + }); + Task::none() + } + + Message::SurfaceTypeChanged(value) => { + self.set_drawing_tessellation_var(|header| header.surface_type = value); + Task::none() + } + + Message::SolidHistChanged(record) => { + let i = self.active_tab; + if let Some(tab) = self.tabs.get_mut(i) { + tab.scene.document.header.record_solid_history = record; + tab.dirty = true; + } + Task::none() + } + + Message::ShowHistChanged(mode) => { + let i = self.active_tab; + if let Some(tab) = self.tabs.get_mut(i) { + tab.scene.document.header.show_solid_history = mode.clamp(0, 2); + tab.scene.bump_geometry(); + tab.dirty = true; + } + Task::none() + } + + Message::SelectionCyclingChanged(on) => { + self.selection_cycling = on; + self.persist_settings_if_changed(); + Task::none() + } + Message::PickDragRectToggled(rectangle) => { self.pick_drag_rect = rectangle; self.persist_settings_if_changed(); diff --git a/src/app/view/modal.rs b/src/app/view/modal.rs index 207f28454..e9b5278f6 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -191,6 +191,7 @@ impl OpenCADStudio { pick_add: self.pick_add, pick_drag_rect: self.pick_drag_rect, grip_object_limit: self.grip_object_limit, + selection_cycling: self.selection_cycling, }, crate::ui::window::options::AppPrefs { savetime_min: self.savetime_min, @@ -205,8 +206,30 @@ impl OpenCADStudio { qdim_snap_priority: self.quick_dimension_snap_priority, annotation_auto_scale: self.annotation_auto_scale, polar_increment_deg: self.polar_increment_deg, + show_viewcube: self.show_viewcube, + show_ucs_icon: self.show_ucs_icon, + ucs_icon_at_origin: self.ucs_icon_at_origin, }, &self.snap_angle_input, + { + let header = self + .tabs + .get(self.active_tab) + .map(|tab| &tab.scene.document.header); + crate::ui::window::options::DrawingPrefs { + available: header.is_some(), + isolines: header.map_or(4, |h| h.isolines), + display_silhouette: header + .is_some_and(|h| h.display_silhouette), + surface_u: header.map_or(6, |h| h.surface_u_density), + surface_v: header.map_or(6, |h| h.surface_v_density), + surface_type: header.map_or(6, |h| h.surface_type), + record_solid_history: header + .is_some_and(|h| h.record_solid_history), + show_solid_history: header + .map_or(1, |h| h.show_solid_history), + } + }, self.double_click_block_refedit, self.double_click_block_attedit, self.cursor_type, diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index b597d1715..a367f24be 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -28,6 +28,7 @@ pub enum OptionsTab { OpenAndSave, Display, Drafting, + Modeling, Selection, UserPreferences, Drawing, @@ -65,6 +66,35 @@ pub struct AppPrefs { pub annotation_auto_scale: i8, /// Polar tracking increment in degrees. pub polar_increment_deg: f32, + /// NAVVCUBE: show the navigation cube. + pub show_viewcube: bool, + /// UCSICON: show the UCS icon. + pub show_ucs_icon: bool, + /// UCSICON ORigin: draw it at the origin rather than the corner. + pub ucs_icon_at_origin: bool, +} + +/// Values read from the current drawing's header rather than from preferences. +/// +/// These are saved in the DWG, so they follow the drawing rather than the +/// application — the page labels them as such. `available` is false when no +/// drawing is open and the controls are not drawn at all. +#[derive(Clone, Copy)] +pub struct DrawingPrefs { + pub available: bool, + /// ISOLINES. + pub isolines: i16, + /// DISPSILH. + pub display_silhouette: bool, + /// SURFU / SURFV. + pub surface_u: i16, + pub surface_v: i16, + /// SURFTYPE: 5, 6 or 8. + pub surface_type: i16, + /// SOLIDHIST. + pub record_solid_history: bool, + /// SHOWHIST, 0..=2. + pub show_solid_history: i16, } /// The Selection-card settings that live on `UserSettings` rather than on the @@ -83,6 +113,8 @@ pub struct SelectionPrefs { pub pick_drag_rect: bool, /// GRIPOBJLIMIT, 0..=32767; 0 = no limit. pub grip_object_limit: i32, + /// Selection cycling: a click where objects overlap opens a picker. + pub selection_cycling: bool, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -109,6 +141,7 @@ pub fn view_window<'a>( selection: SelectionPrefs, prefs: AppPrefs, snap_angle_input: &'a str, + drawing_prefs: DrawingPrefs, double_click_block_refedit: bool, double_click_block_attedit: bool, cursor_type: CursorType, @@ -783,6 +816,15 @@ pub fn view_window<'a>( ] .spacing(8) .align_y(iced::Center), + Space::new().height(10), + row![ + iced::widget::checkbox(selection.selection_cycling) + .on_toggle(Message::SelectionCyclingChanged) + .size(15), + text(crate::t!("Clicking overlapping objects opens a picker")).size(12), + ] + .spacing(8) + .align_y(iced::Center), Space::new().height(24), row![ text(crate::t!("Visual Effect Settings")).size(15), @@ -1225,12 +1267,210 @@ pub fn view_window<'a>( .spacing(0) .width(sizing.width); + + let surface_type_options = [ + (5i16, "Quadratic B-spline"), + (6, "Cubic B-spline"), + (8, "Bezier"), + ] + .into_iter() + .map(|(value, label)| Labelled { + value, + label: format!("{} ({value})", crate::t!(label)), + }) + .collect::>(); + let selected_surface_type = surface_type_options + .iter() + .find(|choice| choice.value == drawing_prefs.surface_type) + .cloned(); + + let show_history_options = [ + (0i16, "Never"), + (1, "As set per solid"), + (2, "Always"), + ] + .into_iter() + .map(|(value, label)| Labelled { + value, + label: crate::t!(label).into_owned(), + }) + .collect::>(); + let selected_show_history = show_history_options + .iter() + .find(|choice| choice.value == drawing_prefs.show_solid_history.clamp(0, 2)) + .cloned(); + + let mut modeling = column![ + text(crate::t!("3D Modeling")).size(15), + Space::new().height(10), + text(crate::t!("Display Tools")).size(15), + Space::new().height(10), + row![ + iced::widget::checkbox(prefs.show_viewcube) + .on_toggle(Message::ShowViewCubeChanged) + .size(15), + text(crate::t!("Show the navigation cube (NAVVCUBE)")).size(12), + ] + .spacing(8) + .align_y(iced::Center), + Space::new().height(10), + row![ + iced::widget::checkbox(prefs.show_ucs_icon) + .on_toggle(Message::ShowUcsIconChanged) + .size(15), + text(crate::t!("Show the UCS icon (UCSICON)")).size(12), + ] + .spacing(8) + .align_y(iced::Center), + Space::new().height(10), + row![ + iced::widget::checkbox(prefs.ucs_icon_at_origin) + .on_toggle(Message::UcsIconAtOriginChanged) + .size(15), + text(crate::t!("Place the UCS icon at the origin (UCSICON ORigin)")).size(12), + ] + .spacing(8) + .align_y(iced::Center), + ]; + + if drawing_prefs.available { + modeling = modeling + .push(Space::new().height(24)) + .push( + row![ + text(crate::t!("Display Resolution")).size(15), + Space::new().width(10), + text(crate::t!("applies to the current drawing")).size(11), + ] + .align_y(iced::Center), + ) + .push(Space::new().height(10)) + .push( + row![ + text(crate::t!("Isolines per surface")).size(12).width(150), + slider( + 0..=64, + drawing_prefs.isolines.clamp(0, 64), + Message::IsolinesChanged, + ) + .step(1i16) + .width(Fill), + text(drawing_prefs.isolines.clamp(0, 64).to_string()) + .size(11) + .width(44), + ] + .spacing(10) + .align_y(iced::Center), + ) + .push(Space::new().height(10)) + .push( + row![ + iced::widget::checkbox(drawing_prefs.display_silhouette) + .on_toggle(Message::DispSilhChanged) + .size(15), + text(crate::t!("Show silhouette edges on solids (DISPSILH)")).size(12), + ] + .spacing(8) + .align_y(iced::Center), + ) + .push(Space::new().height(10)) + .push( + row![ + text(crate::t!("Surface density U")).size(12).width(150), + slider( + 0..=200, + drawing_prefs.surface_u.clamp(0, 200), + Message::SurfaceUChanged, + ) + .step(1i16) + .width(Fill), + text(drawing_prefs.surface_u.clamp(0, 200).to_string()) + .size(11) + .width(44), + ] + .spacing(10) + .align_y(iced::Center), + ) + .push(Space::new().height(10)) + .push( + row![ + text(crate::t!("Surface density V")).size(12).width(150), + slider( + 0..=200, + drawing_prefs.surface_v.clamp(0, 200), + Message::SurfaceVChanged, + ) + .step(1i16) + .width(Fill), + text(drawing_prefs.surface_v.clamp(0, 200).to_string()) + .size(11) + .width(44), + ] + .spacing(10) + .align_y(iced::Center), + ) + .push(Space::new().height(10)) + .push( + row![ + text(crate::t!("Surface type")).size(12).width(150), + iced::widget::pick_list( + selected_surface_type, + surface_type_options, + |choice| choice.label.clone(), + ) + .on_select(|choice| Message::SurfaceTypeChanged(choice.value)) + .width(Fill), + ] + .spacing(10) + .align_y(iced::Center), + ) + .push(Space::new().height(24)) + .push( + row![ + text(crate::t!("Solid History")).size(15), + Space::new().width(10), + text(crate::t!("applies to the current drawing")).size(11), + ] + .align_y(iced::Center), + ) + .push(Space::new().height(10)) + .push( + row![ + iced::widget::checkbox(drawing_prefs.record_solid_history) + .on_toggle(Message::SolidHistChanged) + .size(15), + text(crate::t!("Record the history of composite solids (SOLIDHIST)")) + .size(12), + ] + .spacing(8) + .align_y(iced::Center), + ) + .push(Space::new().height(10)) + .push( + row![ + text(crate::t!("Show solid history")).size(12).width(150), + iced::widget::pick_list( + selected_show_history, + show_history_options, + |choice| choice.label.clone(), + ) + .on_select(|choice| Message::ShowHistChanged(choice.value)) + .width(Fill), + ] + .spacing(10) + .align_y(iced::Center), + ); + } + + let modeling = modeling.spacing(0).width(sizing.width); + let content: Element<'a, Message> = match active_tab { OptionsTab::General => general.into(), OptionsTab::Display => display_element.into(), OptionsTab::Selection => selection.into(), OptionsTab::OpenAndSave => open_and_save.into(), OptionsTab::Drafting => drafting.into(), + OptionsTab::Modeling => modeling.into(), OptionsTab::UserPreferences => user_prefs.into(), OptionsTab::Drawing => drawing.into(), }; @@ -1251,6 +1491,7 @@ pub fn view_window<'a>( tab_button(crate::t!("Open and Save"), OptionsTab::OpenAndSave), tab_button(crate::t!("Display"), OptionsTab::Display), tab_button(crate::t!("Drafting"), OptionsTab::Drafting), + tab_button(crate::t!("3D Modeling"), OptionsTab::Modeling), tab_button(crate::t!("Selection"), OptionsTab::Selection), tab_button(crate::t!("User Preferences"), OptionsTab::UserPreferences), tab_button(crate::t!("Drawing"), OptionsTab::Drawing), From 7ea1aef95e890361b593bc2829d11d5ea94e0985 Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:45:20 +0300 Subject: [PATCH 07/10] Add a Files page, and links out to the editors that own their own dialogs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The application has no support-file search path — the four folders it uses are functions returning fixed paths, not settings. Rather than build a Files page that pretends otherwise, this one answers the question people actually open it to ask: where does this thing keep my plot styles. Each row shows the location and opens it in the file manager, and a row whose path the platform could not give says so with its button disabled. General gains buttons through to the plugin manager, the keyboard shortcut editor and the alias editor. Those three have good dialogs of their own and are not absorbed; Options simply stops being a place you cannot reach them from. Co-Authored-By: Claude Opus 5 --- src/app/mod.rs | 2 + src/app/update/mod.rs | 2 + src/app/view/modal.rs | 11 +++++ src/ui/window/options.rs | 94 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+) diff --git a/src/app/mod.rs b/src/app/mod.rs index 6ee56bbe4..9269c3b3d 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -2044,6 +2044,8 @@ pub enum Message { UcsIconAtOriginChanged(bool), /// Toggle selection cycling from Options; the status-bar pill toggles the same flag. SelectionCyclingChanged(bool), + /// Reveal one of the application's own folders in the system file manager. + OpenFolder(String), /// Change isolines per surface in the current drawing (ISOLINES). IsolinesChanged(i16), /// Toggle silhouette edges in the current drawing (DISPSILH). diff --git a/src/app/update/mod.rs b/src/app/update/mod.rs index 3e88cb454..3b4844fe5 100644 --- a/src/app/update/mod.rs +++ b/src/app/update/mod.rs @@ -6363,6 +6363,8 @@ impl OpenCADStudio { Task::none() } + Message::OpenFolder(path) => crate::sys::open_url(&path, None), + Message::PickDragRectToggled(rectangle) => { self.pick_drag_rect = rectangle; self.persist_settings_if_changed(); diff --git a/src/app/view/modal.rs b/src/app/view/modal.rs index e9b5278f6..0f59969ed 100644 --- a/src/app/view/modal.rs +++ b/src/app/view/modal.rs @@ -230,6 +230,17 @@ impl OpenCADStudio { .map_or(1, |h| h.show_solid_history), } }, + crate::ui::window::options::Folders { + config: crate::config::config_dir() + .map(|p| p.display().to_string()), + plot_styles: crate::io::plot_style::plot_styles_dir() + .ok() + .map(|p| p.display().to_string()), + plugins: crate::plugin::external::plugins_dir() + .map(|p| p.display().to_string()), + autosave: crate::config::config_dir() + .map(|_| std::env::temp_dir().display().to_string()), + }, self.double_click_block_refedit, self.double_click_block_attedit, self.cursor_type, diff --git a/src/ui/window/options.rs b/src/ui/window/options.rs index a367f24be..0923ebe21 100644 --- a/src/ui/window/options.rs +++ b/src/ui/window/options.rs @@ -25,6 +25,7 @@ const DIALOG_HEIGHT: f32 = 620.0; pub enum OptionsTab { #[default] General, + Files, OpenAndSave, Display, Drafting, @@ -74,6 +75,18 @@ pub struct AppPrefs { pub ucs_icon_at_origin: bool, } +/// The fixed locations the Files page lists. +/// +/// `None` where the platform could not give one — the row then says so and +/// its button is disabled rather than opening nothing. +#[derive(Clone, Default)] +pub struct Folders { + pub config: Option, + pub plot_styles: Option, + pub plugins: Option, + pub autosave: Option, +} + /// Values read from the current drawing's header rather than from preferences. /// /// These are saved in the DWG, so they follow the drawing rather than the @@ -142,6 +155,7 @@ pub fn view_window<'a>( prefs: AppPrefs, snap_angle_input: &'a str, drawing_prefs: DrawingPrefs, + folders: Folders, double_click_block_refedit: bool, double_click_block_attedit: bool, cursor_type: CursorType, @@ -259,6 +273,38 @@ pub fn view_window<'a>( ] .spacing(12) .align_y(iced::Center), + Space::new().height(24), + text(crate::t!("Applications")).size(15), + Space::new().height(10), + row![ + text(crate::t!("Installed plugins and their sources")).size(12).width(Fill), + button(text(crate::t!("Plugins…")).size(11)) + .on_press(Message::PluginManagerOpen) + .padding([4, 10]) + .style(button::secondary), + ] + .spacing(10) + .align_y(iced::Center), + Space::new().height(10), + row![ + text(crate::t!("Keyboard shortcuts")).size(12).width(Fill), + button(text(crate::t!("Keyboard Shortcuts…")).size(11)) + .on_press(Message::ShortcutsPanelOpen) + .padding([4, 10]) + .style(button::secondary), + ] + .spacing(10) + .align_y(iced::Center), + Space::new().height(10), + row![ + text(crate::t!("Command aliases")).size(12).width(Fill), + button(text(crate::t!("Command Aliases…")).size(11)) + .on_press(Message::AliasEditorOpen) + .padding([4, 10]) + .style(button::secondary), + ] + .spacing(10) + .align_y(iced::Center), ] .spacing(0) .width(sizing.width); @@ -1464,10 +1510,57 @@ pub fn view_window<'a>( let modeling = modeling.spacing(0).width(sizing.width); + + // The application has no support-file search path, so this page does not + // pretend to offer one. It shows where things actually live and opens the + // folder — which is the question people are really asking when they go + // looking for a Files page. + let folder_row = |label: std::borrow::Cow<'a, str>, path: Option| { + let shown = path.clone().unwrap_or_else(|| crate::t!("Not available").into_owned()); + let mut open = button(text(crate::t!("Open folder")).size(11)) + .padding([4, 10]) + .style(button::secondary); + if let Some(path) = path { + open = open.on_press(Message::OpenFolder(path)); + } + row![ + column![ + text(label).size(12), + text(shown).size(11), + ] + .spacing(2) + .width(Fill), + open, + ] + .spacing(10) + .align_y(iced::Center) + }; + + let files = column![ + text(crate::t!("Files")).size(15), + Space::new().height(6), + text(crate::t!( + "Where the application keeps its own files. These locations are fixed." + )) + .size(11) + .width(sizing.width), + Space::new().height(16), + folder_row(crate::t!("Configuration"), folders.config.clone()), + Space::new().height(12), + folder_row(crate::t!("Plot styles"), folders.plot_styles.clone()), + Space::new().height(12), + folder_row(crate::t!("Plugins"), folders.plugins.clone()), + Space::new().height(12), + folder_row(crate::t!("Autosave files"), folders.autosave.clone()), + ] + .spacing(0) + .width(sizing.width); + let content: Element<'a, Message> = match active_tab { OptionsTab::General => general.into(), OptionsTab::Display => display_element.into(), OptionsTab::Selection => selection.into(), + OptionsTab::Files => files.into(), OptionsTab::OpenAndSave => open_and_save.into(), OptionsTab::Drafting => drafting.into(), OptionsTab::Modeling => modeling.into(), @@ -1488,6 +1581,7 @@ pub fn view_window<'a>( }; let tabs = column![ tab_button(crate::t!("General"), OptionsTab::General), + tab_button(crate::t!("Files"), OptionsTab::Files), tab_button(crate::t!("Open and Save"), OptionsTab::OpenAndSave), tab_button(crate::t!("Display"), OptionsTab::Display), tab_button(crate::t!("Drafting"), OptionsTab::Drafting), From 55b2dc17965aff4d11e715526281aff73514dd82 Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:55:34 +0300 Subject: [PATCH 08/10] Translate the Options dialog into all 21 languages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sixty-five new strings, each one added to the source catalogue and given a value in every locale — not English placeholders. Terminology follows what each locale already uses for the surrounding labels rather than being coined fresh: grips, selection, preview, viewport, annotation scale and the UCS all have established words in these files, and the new strings use them. System-variable names stay in Latin uppercase inside the parentheses, as they already do in every locale's SETVAR listing — they are identifiers, not prose. One trap worth recording: Fluent attribute names must begin with a letter, so the obvious slug for "3D Modeling" is not a legal key. It parses as far as the message body and then fails the whole file, which surfaces as `Invalid Fluent syntax in EnUs` with a byte offset rather than as anything naming the attribute. Co-Authored-By: Claude Opus 5 --- locales/ar-SA/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/bg-BG/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/cs-CZ/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/de-DE/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/el-GR/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/en-US/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/es-ES/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/fi-FI/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/fr-FR/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/hi-IN/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/hu-HU/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/it-IT/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/ja-JP/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/ko-KR/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/nl-NL/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/pl-PL/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/pt-BR/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/ru-RU/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/tr-TR/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/zh-CN/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ locales/zh-TW/opencadstudio.ftl | 65 +++++++++++++++++++++++++++++++++ src/locale_catalog.rs | 65 +++++++++++++++++++++++++++++++++ 22 files changed, 1430 insertions(+) diff --git a/locales/ar-SA/opencadstudio.ftl b/locales/ar-SA/opencadstudio.ftl index fe5d8961f..6dd0fd5c2 100644 --- a/locales/ar-SA/opencadstudio.ftl +++ b/locales/ar-SA/opencadstudio.ftl @@ -1388,6 +1388,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = يتحكم في مربع التحديد المرئي ومنطقة النقر معًا. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = التطبيقات + .installed-plugins-and-their-sources = الإضافات المثبتة ومصادرها + .plugins-2 = الإضافات… + .keyboard-shortcuts-2 = اختصارات لوحة المفاتيح + .keyboard-shortcuts-3 = اختصارات لوحة المفاتيح… + .command-aliases-2 = الأسماء المستعارة للأوامر + .command-aliases-3 = الأسماء المستعارة للأوامر… + .file-safety = أمان الملفات + .automatic-save = الحفظ التلقائي + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = الدقائق بين عمليات حفظ الاسترداد في ملف ‎.sv$‎؛ القيمة 0 تعطّله (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = الاحتفاظ بنسخة ‎.bak‎ عند استبدال رسم (ISAVEBAK) + .plotting = الطباعة + .plot-device-paper-scale-and-plot-styles = جهاز الطباعة والورق والمقياس وأنماط الطباعة + .plot-and-page-setup = الطباعة وإعداد الصفحة… + .fill-truetype-glyphs-textfill = ملء محارف TrueType (TEXTFILL) + .command-line = سطر الأوامر + .prompt-lines = أسطر المطالبة + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = أسطر المطالبة المؤقتة أعلى نافذة الأوامر (CLIPROMPTLINES). + .history-fade-time = زمن تلاشي السجل + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = مدة بقاء أسطر السجل ظاهرة؛ القيمة 0 تتخطاها (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = النقر على الكائنات المتداخلة يفتح أداة اختيار + .block-edit = تحرير الكتلة + .double-click-to-edit-block-in-place-refedit = النقر المزدوج يحرر الكتلة في مكانها (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = النقر المزدوج على الكتل ذات السمات يحرر سماتها (ATTEDIT) + .user-preferences = تفضيلات المستخدم + .zoom = التكبير + .reverse-mouse-wheel-zoom-zoomwheel = عكس التكبير بعجلة الفأرة (ZOOMWHEEL) + .zoom-factor = معامل التكبير + .how-far-one-wheel-notch-zooms-zoomfactor = مقدار التكبير لكل درجة من العجلة (ZOOMFACTOR). + .text-and-dimensions = النص والأبعاد + .textedit-edits-one-object-and-ends-texteditmode = يحرر TEXTEDIT كائنًا واحدًا ثم ينتهي (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = الأبعاد المتصلة ترث طبقة ونمط البعد الأساسي (DIMCONTINUEMODE) + .qdim-origin-priority = أولوية أصل QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = النقاط التي يقيس منها QDIM. يمكن ضبطها داخل الأمر أيضًا. + .add-scales-automatically = إضافة المقاييس تلقائيًا + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = الكائنات التوضيحية التي تتبنى مقياس توضيح تم ضبطه حديثًا (ANNOAUTOSCALE). + .length-angle-and-insertion-units = وحدات الطول والزاوية والإدراج + .drawing-units-2 = وحدات الرسم… + .drafting = الرسم + .drafting-rotation = دوران الرسم + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = يدير الشعيرات المتقاطعة وشبكة الالتقاط في نظام الإحداثيات النشط (SNAPANG). + .polar-tracking-increment = زيادة التتبع القطبي + .snap-and-grid = الالتقاط والشبكة + .snap-modes-grid-spacing-and-object-snap = أوضاع الالتقاط وتباعد الشبكة والتقاط الكائنات + .drafting-settings-2 = إعدادات الرسم… + .modeling-3d = النمذجة ثلاثية الأبعاد + .display-tools = أدوات العرض + .show-the-navigation-cube-navvcube = إظهار مكعب التنقل (NAVVCUBE) + .show-the-ucs-icon-ucsicon = إظهار أيقونة نظام الإحداثيات (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = وضع أيقونة نظام الإحداثيات عند نقطة الأصل (UCSICON ORigin) + .display-resolution = دقة العرض + .applies-to-the-current-drawing = ينطبق على الرسم الحالي + .isolines-per-surface = خطوط التساوي لكل سطح + .show-silhouette-edges-on-solids-dispsilh = إظهار حواف الظل الخارجي على المجسمات (DISPSILH) + .surface-density-u = كثافة السطح U + .surface-density-v = كثافة السطح V + .surface-type = نوع السطح + .record-the-history-of-composite-solids-solidhist = تسجيل تاريخ المجسمات المركبة (SOLIDHIST) + .show-solid-history = إظهار تاريخ المجسمات + .not-available = غير متاح + .open-folder = فتح المجلد + .where-the-application-keeps-its-own-files-these-locations-are-fixed = المكان الذي يحفظ فيه التطبيق ملفاته الخاصة. هذه المواقع ثابتة. + .configuration = التهيئة + .plot-styles = أنماط الطباعة + .autosave-files = ملفات الحفظ التلقائي .selection-modes = أوضاع التحديد .use-shift-to-add-to-selection-pickadd = استخدام Shift للإضافة إلى التحديد (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = الضغط والسحب يرسم مستطيلاً بدلاً من التحديد الحر (PICKDRAG) diff --git a/locales/bg-BG/opencadstudio.ftl b/locales/bg-BG/opencadstudio.ftl index 01b8c9683..cb93e9870 100644 --- a/locales/bg-BG/opencadstudio.ftl +++ b/locales/bg-BG/opencadstudio.ftl @@ -1375,6 +1375,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Управлява видимото поле за избор и областта за щракване. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Приложения + .installed-plugins-and-their-sources = Инсталирани добавки и техните източници + .plugins-2 = Добавки… + .keyboard-shortcuts-2 = Клавишни комбинации + .keyboard-shortcuts-3 = Клавишни комбинации… + .command-aliases-2 = Псевдоними на команди + .command-aliases-3 = Псевдоними на команди… + .file-safety = Безопасност на файловете + .automatic-save = Автоматично записване + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Минути между възстановителните записи във файл .sv$; 0 го изключва (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Запазване на копие .bak при презаписване на чертеж (ISAVEBAK) + .plotting = Чертане + .plot-device-paper-scale-and-plot-styles = Устройство за чертане, хартия, мащаб и стилове на чертане + .plot-and-page-setup = Чертане и настройка на страница… + .fill-truetype-glyphs-textfill = Запълване на глифове TrueType (TEXTFILL) + .command-line = Команден ред + .prompt-lines = Редове с подкана + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Временни редове с подкана над командния прозорец (CLIPROMPTLINES). + .history-fade-time = Време на избледняване на историята + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Колко дълго остават видими редовете от историята; 0 ги пропуска (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Щракването върху припокриващи се обекти отваря избирач + .block-edit = Редактиране на блок + .double-click-to-edit-block-in-place-refedit = Двойно щракване редактира блока на място (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Двойно щракване върху блокове с атрибути редактира атрибутите (ATTEDIT) + .user-preferences = Потребителски предпочитания + .zoom = Мащабиране + .reverse-mouse-wheel-zoom-zoomwheel = Обръщане на мащабирането с колелцето (ZOOMWHEEL) + .zoom-factor = Коефициент на мащабиране + .how-far-one-wheel-notch-zooms-zoomfactor = Колко мащабира едно щракване на колелцето (ZOOMFACTOR). + .text-and-dimensions = Текст и размери + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT редактира един обект и приключва (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Продължените размери наследяват слоя и стила на базовия размер (DIMCONTINUEMODE) + .qdim-origin-priority = Приоритет на началото на QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = От кои точки мери QDIM. Настройва се и в самата команда. + .add-scales-automatically = Автоматично добавяне на мащаби + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Кои анотативни обекти приемат новозададен мащаб на анотация (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Единици за дължина, ъгъл и вмъкване + .drawing-units-2 = Единици на чертежа… + .drafting = Чертане на ръка + .drafting-rotation = Завъртане на чертането + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Завърта мерника и мрежата за прилепване в активната ПКС (SNAPANG). + .polar-tracking-increment = Стъпка на полярно проследяване + .snap-and-grid = Прилепване и мрежа + .snap-modes-grid-spacing-and-object-snap = Режими на прилепване, стъпка на мрежата и прилепване към обекти + .drafting-settings-2 = Настройки на чертането… + .modeling-3d = 3D моделиране + .display-tools = Инструменти за изглед + .show-the-navigation-cube-navvcube = Показвай навигационния куб (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Показвай иконата на ПКС (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Поставяй иконата на ПКС в началото (UCSICON ORigin) + .display-resolution = Разделителна способност на изгледа + .applies-to-the-current-drawing = отнася се за текущия чертеж + .isolines-per-surface = Изолинии на повърхнина + .show-silhouette-edges-on-solids-dispsilh = Показвай силуетни ръбове на телата (DISPSILH) + .surface-density-u = Плътност на повърхнината U + .surface-density-v = Плътност на повърхнината V + .surface-type = Тип повърхнина + .record-the-history-of-composite-solids-solidhist = Записвай историята на съставните тела (SOLIDHIST) + .show-solid-history = Показвай историята на телата + .not-available = Не е налично + .open-folder = Отвори папката + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Къде приложението държи собствените си файлове. Тези места са фиксирани. + .configuration = Конфигурация + .plot-styles = Стилове на чертане + .autosave-files = Файлове за автоматично записване .selection-modes = Режими на избор .use-shift-to-add-to-selection-pickadd = Използвай Shift за добавяне към избора (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Натискане и влачене чертае правоъгълник вместо ласо (PICKDRAG) diff --git a/locales/cs-CZ/opencadstudio.ftl b/locales/cs-CZ/opencadstudio.ftl index 1c4332caa..16f1737ec 100644 --- a/locales/cs-CZ/opencadstudio.ftl +++ b/locales/cs-CZ/opencadstudio.ftl @@ -1375,6 +1375,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Ovládá viditelný výběrový rámeček i oblast kliknutí. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Aplikace + .installed-plugins-and-their-sources = Nainstalované zásuvné moduly a jejich zdroje + .plugins-2 = Zásuvné moduly… + .keyboard-shortcuts-2 = Klávesové zkratky + .keyboard-shortcuts-3 = Klávesové zkratky… + .command-aliases-2 = Aliasy příkazů + .command-aliases-3 = Aliasy příkazů… + .file-safety = Bezpečnost souborů + .automatic-save = Automatické ukládání + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minuty mezi obnovovacími uloženími do souboru .sv$; 0 je vypne (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Při přepsání výkresu ponechat kopii .bak (ISAVEBAK) + .plotting = Vykreslování + .plot-device-paper-scale-and-plot-styles = Vykreslovací zařízení, papír, měřítko a styly vykreslení + .plot-and-page-setup = Vykreslit a nastavení stránky… + .fill-truetype-glyphs-textfill = Vyplňovat glyfy TrueType (TEXTFILL) + .command-line = Příkazový řádek + .prompt-lines = Řádky výzvy + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Dočasné řádky výzvy nad příkazovým oknem (CLIPROMPTLINES). + .history-fade-time = Doba mizení historie + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Jak dlouho zůstávají řádky historie viditelné; 0 je přeskočí (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Kliknutí na překrývající se objekty otevře výběr + .block-edit = Úprava bloku + .double-click-to-edit-block-in-place-refedit = Dvojklik upraví blok na místě (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Dvojklik na bloky s atributy upraví atributy (ATTEDIT) + .user-preferences = Předvolby uživatele + .zoom = Zoom + .reverse-mouse-wheel-zoom-zoomwheel = Obrátit zoom kolečkem myši (ZOOMWHEEL) + .zoom-factor = Faktor zoomu + .how-far-one-wheel-notch-zooms-zoomfactor = O kolik přiblíží jeden zub kolečka (ZOOMFACTOR). + .text-and-dimensions = Text a kóty + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT upraví jeden objekt a skončí (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Navazující kóty dědí hladinu a styl základní kóty (DIMCONTINUEMODE) + .qdim-origin-priority = Priorita počátku QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = Ze kterých bodů QDIM měří. Nastavitelné i uvnitř příkazu. + .add-scales-automatically = Přidávat měřítka automaticky + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Které anotativní objekty převezmou nově nastavené měřítko anotace (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Jednotky délky, úhlu a vložení + .drawing-units-2 = Jednotky výkresu… + .drafting = Kreslení + .drafting-rotation = Otočení kreslení + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Otáčí nitkový kříž a rastr uchopení v aktivním USS (SNAPANG). + .polar-tracking-increment = Krok polárního sledování + .snap-and-grid = Uchopení a rastr + .snap-modes-grid-spacing-and-object-snap = Režimy uchopení, rozteč rastru a uchopení objektů + .drafting-settings-2 = Nastavení kreslení… + .modeling-3d = 3D modelování + .display-tools = Nástroje zobrazení + .show-the-navigation-cube-navvcube = Zobrazit navigační kostku (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Zobrazit ikonu USS (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Umístit ikonu USS do počátku (UCSICON ORigin) + .display-resolution = Rozlišení zobrazení + .applies-to-the-current-drawing = platí pro aktuální výkres + .isolines-per-surface = Izočáry na plochu + .show-silhouette-edges-on-solids-dispsilh = Zobrazit obrysové hrany těles (DISPSILH) + .surface-density-u = Hustota plochy U + .surface-density-v = Hustota plochy V + .surface-type = Typ plochy + .record-the-history-of-composite-solids-solidhist = Zaznamenávat historii složených těles (SOLIDHIST) + .show-solid-history = Zobrazit historii těles + .not-available = Není k dispozici + .open-folder = Otevřít složku + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Kde aplikace uchovává vlastní soubory. Tato umístění jsou pevná. + .configuration = Konfigurace + .plot-styles = Styly vykreslení + .autosave-files = Soubory automatického ukládání .selection-modes = Režimy výběru .use-shift-to-add-to-selection-pickadd = Použít Shift pro přidání do výběru (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Tažení kreslí obdélník místo lasa (PICKDRAG) diff --git a/locales/de-DE/opencadstudio.ftl b/locales/de-DE/opencadstudio.ftl index 42781eee3..6560a0558 100644 --- a/locales/de-DE/opencadstudio.ftl +++ b/locales/de-DE/opencadstudio.ftl @@ -1376,6 +1376,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Steuert sowohl das sichtbare Auswahlkästchen als auch den Klickbereich. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Anwendungen + .installed-plugins-and-their-sources = Installierte Plug-ins und ihre Quellen + .plugins-2 = Plug-ins… + .keyboard-shortcuts-2 = Tastenkürzel + .keyboard-shortcuts-3 = Tastenkürzel… + .command-aliases-2 = Befehlsaliase + .command-aliases-3 = Befehlsaliase… + .file-safety = Dateisicherheit + .automatic-save = Automatisches Speichern + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minuten zwischen Wiederherstellungsspeicherungen in eine .sv$-Datei; 0 schaltet es aus (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Beim Überschreiben eine .bak-Kopie behalten (ISAVEBAK) + .plotting = Plotten + .plot-device-paper-scale-and-plot-styles = Plotgerät, Papier, Maßstab und Plotstile + .plot-and-page-setup = Plotten und Seiteneinrichtung… + .fill-truetype-glyphs-textfill = TrueType-Glyphen füllen (TEXTFILL) + .command-line = Befehlszeile + .prompt-lines = Eingabeaufforderungszeilen + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Temporäre Eingabeaufforderungszeilen über dem Befehlsfenster (CLIPROMPTLINES). + .history-fade-time = Ausblendzeit des Verlaufs + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Wie lange Verlaufszeilen sichtbar bleiben; 0 überspringt sie (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Klick auf überlappende Objekte öffnet eine Auswahl + .block-edit = Blockbearbeitung + .double-click-to-edit-block-in-place-refedit = Doppelklick bearbeitet den Block an Ort und Stelle (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Doppelklick auf Blöcke mit Attributen bearbeitet diese (ATTEDIT) + .user-preferences = Benutzereinstellungen + .zoom = Zoom + .reverse-mouse-wheel-zoom-zoomwheel = Mausradzoom umkehren (ZOOMWHEEL) + .zoom-factor = Zoomfaktor + .how-far-one-wheel-notch-zooms-zoomfactor = Wie weit eine Radrastung zoomt (ZOOMFACTOR). + .text-and-dimensions = Text und Bemaßung + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT bearbeitet ein Objekt und endet (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Fortgesetzte Bemaßungen erben Layer und Stil der Basisbemaßung (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM-Ursprungspriorität + .which-points-qdim-measures-from-also-settable-inside-the-command = Von welchen Punkten QDIM misst. Auch im Befehl einstellbar. + .add-scales-automatically = Maßstäbe automatisch hinzufügen + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Welche annotativen Objekte einen neu gesetzten Beschriftungsmaßstab übernehmen (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Längen-, Winkel- und Einfügeeinheiten + .drawing-units-2 = Zeichnungseinheiten… + .drafting = Entwurf + .drafting-rotation = Entwurfsdrehung + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Dreht Fadenkreuz und Fangraster im aktiven BKS (SNAPANG). + .polar-tracking-increment = Polarer Verfolgungsschritt + .snap-and-grid = Fang und Raster + .snap-modes-grid-spacing-and-object-snap = Fangmodi, Rasterabstand und Objektfang + .drafting-settings-2 = Entwurfseinstellungen… + .modeling-3d = 3D-Modellierung + .display-tools = Anzeigewerkzeuge + .show-the-navigation-cube-navvcube = Navigationswürfel anzeigen (NAVVCUBE) + .show-the-ucs-icon-ucsicon = BKS-Symbol anzeigen (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = BKS-Symbol am Ursprung platzieren (UCSICON ORigin) + .display-resolution = Anzeigeauflösung + .applies-to-the-current-drawing = gilt für die aktuelle Zeichnung + .isolines-per-surface = Isolinien pro Fläche + .show-silhouette-edges-on-solids-dispsilh = Silhouettenkanten an Volumenkörpern anzeigen (DISPSILH) + .surface-density-u = Flächendichte U + .surface-density-v = Flächendichte V + .surface-type = Flächentyp + .record-the-history-of-composite-solids-solidhist = Verlauf zusammengesetzter Volumenkörper aufzeichnen (SOLIDHIST) + .show-solid-history = Volumenkörperverlauf anzeigen + .not-available = Nicht verfügbar + .open-folder = Ordner öffnen + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Wo die Anwendung ihre eigenen Dateien ablegt. Diese Orte sind fest. + .configuration = Konfiguration + .plot-styles = Plotstile + .autosave-files = Dateien für automatisches Speichern .selection-modes = Auswahlmodi .use-shift-to-add-to-selection-pickadd = Umschalt zum Hinzufügen zur Auswahl verwenden (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Ziehen mit gedrückter Maustaste zeichnet ein Rechteck statt eines Lassos (PICKDRAG) diff --git a/locales/el-GR/opencadstudio.ftl b/locales/el-GR/opencadstudio.ftl index 96d170fd6..4adf40ce0 100644 --- a/locales/el-GR/opencadstudio.ftl +++ b/locales/el-GR/opencadstudio.ftl @@ -1377,6 +1377,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Ελέγχει τόσο το ορατό πλαίσιο επιλογής όσο και την περιοχή κλικ. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Εφαρμογές + .installed-plugins-and-their-sources = Εγκατεστημένα πρόσθετα και οι πηγές τους + .plugins-2 = Πρόσθετα… + .keyboard-shortcuts-2 = Συντομεύσεις πληκτρολογίου + .keyboard-shortcuts-3 = Συντομεύσεις πληκτρολογίου… + .command-aliases-2 = Ψευδώνυμα εντολών + .command-aliases-3 = Ψευδώνυμα εντολών… + .file-safety = Ασφάλεια αρχείων + .automatic-save = Αυτόματη αποθήκευση + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Λεπτά μεταξύ αποθηκεύσεων ανάκτησης σε αρχείο .sv$· το 0 την απενεργοποιεί (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Διατήρηση αντιγράφου .bak κατά την αντικατάσταση σχεδίου (ISAVEBAK) + .plotting = Εκτύπωση + .plot-device-paper-scale-and-plot-styles = Συσκευή εκτύπωσης, χαρτί, κλίμακα και στυλ εκτύπωσης + .plot-and-page-setup = Εκτύπωση και διαμόρφωση σελίδας… + .fill-truetype-glyphs-textfill = Γέμισμα γραμματοσειρών TrueType (TEXTFILL) + .command-line = Γραμμή εντολών + .prompt-lines = Γραμμές προτροπής + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Προσωρινές γραμμές προτροπής πάνω από το παράθυρο εντολών (CLIPROMPTLINES). + .history-fade-time = Χρόνος εξασθένισης ιστορικού + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Πόσο μένουν ορατές οι γραμμές ιστορικού· το 0 τις παραλείπει (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Το κλικ σε επικαλυπτόμενα αντικείμενα ανοίγει επιλογέα + .block-edit = Επεξεργασία μπλοκ + .double-click-to-edit-block-in-place-refedit = Διπλό κλικ για επεξεργασία μπλοκ επί τόπου (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Διπλό κλικ σε μπλοκ με χαρακτηριστικά για επεξεργασία τους (ATTEDIT) + .user-preferences = Προτιμήσεις χρήστη + .zoom = Ζουμ + .reverse-mouse-wheel-zoom-zoomwheel = Αντιστροφή ζουμ με τον τροχό (ZOOMWHEEL) + .zoom-factor = Συντελεστής ζουμ + .how-far-one-wheel-notch-zooms-zoomfactor = Πόσο ζουμάρει ένα σκαλί του τροχού (ZOOMFACTOR). + .text-and-dimensions = Κείμενο και διαστάσεις + .textedit-edits-one-object-and-ends-texteditmode = Το TEXTEDIT επεξεργάζεται ένα αντικείμενο και τερματίζει (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Οι συνεχόμενες διαστάσεις κληρονομούν επίπεδο και στυλ από τη βασική (DIMCONTINUEMODE) + .qdim-origin-priority = Προτεραιότητα αρχής QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = Από ποια σημεία μετρά το QDIM. Ρυθμίζεται και μέσα στην εντολή. + .add-scales-automatically = Αυτόματη προσθήκη κλιμάκων + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Ποια επισημειωματικά αντικείμενα παίρνουν μια νέα κλίμακα επισημείωσης (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Μονάδες μήκους, γωνίας και εισαγωγής + .drawing-units-2 = Μονάδες σχεδίου… + .drafting = Σχεδίαση + .drafting-rotation = Περιστροφή σχεδίασης + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Περιστρέφει το σταυρόνημα και το πλέγμα έλξης στο ενεργό UCS (SNAPANG). + .polar-tracking-increment = Βήμα πολικής παρακολούθησης + .snap-and-grid = Έλξη και πλέγμα + .snap-modes-grid-spacing-and-object-snap = Λειτουργίες έλξης, βήμα πλέγματος και έλξη αντικειμένων + .drafting-settings-2 = Ρυθμίσεις σχεδίασης… + .modeling-3d = Μοντελοποίηση 3D + .display-tools = Εργαλεία προβολής + .show-the-navigation-cube-navvcube = Εμφάνιση του κύβου πλοήγησης (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Εμφάνιση του εικονιδίου UCS (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Τοποθέτηση του εικονιδίου UCS στην αρχή των αξόνων (UCSICON ORigin) + .display-resolution = Ανάλυση εμφάνισης + .applies-to-the-current-drawing = ισχύει για το τρέχον σχέδιο + .isolines-per-surface = Ισοϋψείς ανά επιφάνεια + .show-silhouette-edges-on-solids-dispsilh = Εμφάνιση ακμών περιγράμματος σε στερεά (DISPSILH) + .surface-density-u = Πυκνότητα επιφάνειας U + .surface-density-v = Πυκνότητα επιφάνειας V + .surface-type = Τύπος επιφάνειας + .record-the-history-of-composite-solids-solidhist = Καταγραφή ιστορικού σύνθετων στερεών (SOLIDHIST) + .show-solid-history = Εμφάνιση ιστορικού στερεών + .not-available = Μη διαθέσιμο + .open-folder = Άνοιγμα φακέλου + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Πού κρατά η εφαρμογή τα δικά της αρχεία. Οι θέσεις αυτές είναι σταθερές. + .configuration = Ρυθμίσεις + .plot-styles = Στυλ εκτύπωσης + .autosave-files = Αρχεία αυτόματης αποθήκευσης .selection-modes = Τρόποι επιλογής .use-shift-to-add-to-selection-pickadd = Χρήση Shift για προσθήκη στην επιλογή (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Το πάτημα-και-σύρσιμο σχεδιάζει ορθογώνιο αντί για λάσο (PICKDRAG) diff --git a/locales/en-US/opencadstudio.ftl b/locales/en-US/opencadstudio.ftl index 0a4d99304..01541f940 100644 --- a/locales/en-US/opencadstudio.ftl +++ b/locales/en-US/opencadstudio.ftl @@ -1377,6 +1377,71 @@ common = .pick-box-size = Pick box size .controls-both-the-visible-selection-box-and-the-click-aperture = Controls both the visible selection box and the click aperture. .visual-effect-settings = Visual Effect Settings + .applications = Applications + .installed-plugins-and-their-sources = Installed plugins and their sources + .plugins-2 = Plugins… + .keyboard-shortcuts-2 = Keyboard shortcuts + .keyboard-shortcuts-3 = Keyboard Shortcuts… + .command-aliases-2 = Command aliases + .command-aliases-3 = Command Aliases… + .file-safety = File Safety + .automatic-save = Automatic save + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minutes between recovery saves to a .sv$ file; 0 turns it off (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Keep a .bak copy when overwriting a drawing (ISAVEBAK) + .plotting = Plotting + .plot-device-paper-scale-and-plot-styles = Plot device, paper, scale and plot styles + .plot-and-page-setup = Plot and Page Setup… + .fill-truetype-glyphs-textfill = Fill TrueType glyphs (TEXTFILL) + .command-line = Command Line + .prompt-lines = Prompt lines + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Temporary prompt lines shown above the command window (CLIPROMPTLINES). + .history-fade-time = History fade time + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = How long overlay history lines stay visible; 0 skips them (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Clicking overlapping objects opens a picker + .block-edit = Block Edit + .double-click-to-edit-block-in-place-refedit = Double-click to edit block in-place (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Double-click attributed blocks to edit attributes (ATTEDIT) + .user-preferences = User Preferences + .zoom = Zoom + .reverse-mouse-wheel-zoom-zoomwheel = Reverse mouse wheel zoom (ZOOMWHEEL) + .zoom-factor = Zoom factor + .how-far-one-wheel-notch-zooms-zoomfactor = How far one wheel notch zooms (ZOOMFACTOR). + .text-and-dimensions = Text and Dimensions + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT edits one object and ends (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Continued dimensions inherit the base dimension's layer and style (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM origin priority + .which-points-qdim-measures-from-also-settable-inside-the-command = Which points QDIM measures from. Also settable inside the command. + .add-scales-automatically = Add scales automatically + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Which annotative objects pick up a newly set annotation scale (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Length, angle and insertion units + .drawing-units-2 = Drawing Units… + .drafting = Drafting + .drafting-rotation = Drafting rotation + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Rotates the crosshair and the snap grid in the active UCS (SNAPANG). + .polar-tracking-increment = Polar tracking increment + .snap-and-grid = Snap and Grid + .snap-modes-grid-spacing-and-object-snap = Snap modes, grid spacing and object snap + .drafting-settings-2 = Drafting Settings… + .modeling-3d = 3D Modeling + .display-tools = Display Tools + .show-the-navigation-cube-navvcube = Show the navigation cube (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Show the UCS icon (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Place the UCS icon at the origin (UCSICON ORigin) + .display-resolution = Display Resolution + .applies-to-the-current-drawing = applies to the current drawing + .isolines-per-surface = Isolines per surface + .show-silhouette-edges-on-solids-dispsilh = Show silhouette edges on solids (DISPSILH) + .surface-density-u = Surface density U + .surface-density-v = Surface density V + .surface-type = Surface type + .record-the-history-of-composite-solids-solidhist = Record the history of composite solids (SOLIDHIST) + .show-solid-history = Show solid history + .not-available = Not available + .open-folder = Open folder + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Where the application keeps its own files. These locations are fixed. + .configuration = Configuration + .plot-styles = Plot styles + .autosave-files = Autosave files .selection-modes = Selection Modes .use-shift-to-add-to-selection-pickadd = Use Shift to add to selection (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Press and drag draws a rectangle instead of a lasso (PICKDRAG) diff --git a/locales/es-ES/opencadstudio.ftl b/locales/es-ES/opencadstudio.ftl index 6941fa1f2..c53101c47 100644 --- a/locales/es-ES/opencadstudio.ftl +++ b/locales/es-ES/opencadstudio.ftl @@ -1376,6 +1376,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Controla tanto el cuadro de selección visible como el área de clic. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Aplicaciones + .installed-plugins-and-their-sources = Complementos instalados y sus orígenes + .plugins-2 = Complementos… + .keyboard-shortcuts-2 = Atajos de teclado + .keyboard-shortcuts-3 = Atajos de teclado… + .command-aliases-2 = Alias de comandos + .command-aliases-3 = Alias de comandos… + .file-safety = Seguridad de archivos + .automatic-save = Guardado automático + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minutos entre guardados de recuperación en un archivo .sv$; 0 lo desactiva (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Conservar una copia .bak al sobrescribir un dibujo (ISAVEBAK) + .plotting = Trazado + .plot-device-paper-scale-and-plot-styles = Dispositivo de trazado, papel, escala y estilos de trazado + .plot-and-page-setup = Trazar y configurar página… + .fill-truetype-glyphs-textfill = Rellenar glifos TrueType (TEXTFILL) + .command-line = Línea de comandos + .prompt-lines = Líneas de solicitud + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Líneas de solicitud temporales sobre la ventana de comandos (CLIPROMPTLINES). + .history-fade-time = Tiempo de desvanecimiento del historial + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Cuánto permanecen visibles las líneas del historial; 0 las omite (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Al pulsar sobre objetos superpuestos se abre un selector + .block-edit = Edición de bloque + .double-click-to-edit-block-in-place-refedit = Doble clic para editar el bloque in situ (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Doble clic en bloques con atributos para editarlos (ATTEDIT) + .user-preferences = Preferencias de usuario + .zoom = Zoom + .reverse-mouse-wheel-zoom-zoomwheel = Invertir el zoom de la rueda del ratón (ZOOMWHEEL) + .zoom-factor = Factor de zoom + .how-far-one-wheel-notch-zooms-zoomfactor = Cuánto amplía un paso de la rueda (ZOOMFACTOR). + .text-and-dimensions = Texto y acotación + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT edita un objeto y termina (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Las cotas continuadas heredan la capa y el estilo de la cota base (DIMCONTINUEMODE) + .qdim-origin-priority = Prioridad de origen de QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = Desde qué puntos mide QDIM. También se ajusta dentro del comando. + .add-scales-automatically = Añadir escalas automáticamente + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Qué objetos anotativos adoptan una escala de anotación recién definida (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Unidades de longitud, ángulo e inserción + .drawing-units-2 = Unidades del dibujo… + .drafting = Dibujo + .drafting-rotation = Rotación de dibujo + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Gira la mira y la rejilla de forzado en el SCP activo (SNAPANG). + .polar-tracking-increment = Incremento de rastreo polar + .snap-and-grid = Forzado y rejilla + .snap-modes-grid-spacing-and-object-snap = Modos de forzado, espaciado de rejilla y referencia a objetos + .drafting-settings-2 = Parámetros de dibujo… + .modeling-3d = Modelado 3D + .display-tools = Herramientas de visualización + .show-the-navigation-cube-navvcube = Mostrar el cubo de navegación (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Mostrar el icono SCP (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Situar el icono SCP en el origen (UCSICON ORigin) + .display-resolution = Resolución de visualización + .applies-to-the-current-drawing = se aplica al dibujo actual + .isolines-per-surface = Isolíneas por superficie + .show-silhouette-edges-on-solids-dispsilh = Mostrar aristas de silueta en sólidos (DISPSILH) + .surface-density-u = Densidad de superficie U + .surface-density-v = Densidad de superficie V + .surface-type = Tipo de superficie + .record-the-history-of-composite-solids-solidhist = Registrar el historial de sólidos compuestos (SOLIDHIST) + .show-solid-history = Mostrar el historial de sólidos + .not-available = No disponible + .open-folder = Abrir carpeta + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Dónde guarda la aplicación sus propios archivos. Estas ubicaciones son fijas. + .configuration = Configuración + .plot-styles = Estilos de trazado + .autosave-files = Archivos de guardado automático .selection-modes = Modos de selección .use-shift-to-add-to-selection-pickadd = Usar Mayús para añadir a la selección (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Arrastrar dibuja un rectángulo en lugar de un lazo (PICKDRAG) diff --git a/locales/fi-FI/opencadstudio.ftl b/locales/fi-FI/opencadstudio.ftl index f251e2663..cc2df4dd5 100644 --- a/locales/fi-FI/opencadstudio.ftl +++ b/locales/fi-FI/opencadstudio.ftl @@ -1375,6 +1375,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Säätää sekä näkyvää valintaruutua että napsautusaluetta. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Sovellukset + .installed-plugins-and-their-sources = Asennetut laajennukset ja niiden lähteet + .plugins-2 = Laajennukset… + .keyboard-shortcuts-2 = Pikanäppäimet + .keyboard-shortcuts-3 = Pikanäppäimet… + .command-aliases-2 = Komentojen aliakset + .command-aliases-3 = Komentojen aliakset… + .file-safety = Tiedostoturvallisuus + .automatic-save = Automaattinen tallennus + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minuutit palautustallennusten välillä .sv$-tiedostoon; 0 poistaa käytöstä (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Säilytä .bak-kopio piirustusta korvattaessa (ISAVEBAK) + .plotting = Tulostus + .plot-device-paper-scale-and-plot-styles = Tulostuslaite, paperi, mittakaava ja tulostustyylit + .plot-and-page-setup = Tulosta ja sivun asetukset… + .fill-truetype-glyphs-textfill = Täytä TrueType-merkit (TEXTFILL) + .command-line = Komentorivi + .prompt-lines = Kehoterivit + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Väliaikaiset kehoterivit komentoikkunan yläpuolella (CLIPROMPTLINES). + .history-fade-time = Historian häivytysaika + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Kuinka kauan historiarivit pysyvät näkyvissä; 0 ohittaa ne (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Päällekkäisten objektien napsauttaminen avaa valitsimen + .block-edit = Lohkon muokkaus + .double-click-to-edit-block-in-place-refedit = Kaksoisnapsautus muokkaa lohkoa paikallaan (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Kaksoisnapsautus määritteellisiin lohkoihin muokkaa määritteitä (ATTEDIT) + .user-preferences = Käyttäjäasetukset + .zoom = Zoomaus + .reverse-mouse-wheel-zoom-zoomwheel = Käännä hiiren rullan zoomaus (ZOOMWHEEL) + .zoom-factor = Zoomauskerroin + .how-far-one-wheel-notch-zooms-zoomfactor = Kuinka paljon yksi rullan pykälä zoomaa (ZOOMFACTOR). + .text-and-dimensions = Teksti ja mitoitus + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT muokkaa yhden objektin ja päättyy (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Jatketut mitat perivät perusmitan tason ja tyylin (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM-lähtöpisteen prioriteetti + .which-points-qdim-measures-from-also-settable-inside-the-command = Mistä pisteistä QDIM mittaa. Asetettavissa myös komennon sisällä. + .add-scales-automatically = Lisää mittakaavat automaattisesti + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Mitkä selittävät objektit omaksuvat juuri asetetun selitemittakaavan (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Pituus-, kulma- ja lisäysyksiköt + .drawing-units-2 = Piirustuksen yksiköt… + .drafting = Piirto + .drafting-rotation = Piirron kierto + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Kiertää hiusristikkoa ja tarttumaruudukkoa aktiivisessa UCS:ssä (SNAPANG). + .polar-tracking-increment = Polaarisen seurannan askel + .snap-and-grid = Tartunta ja ruudukko + .snap-modes-grid-spacing-and-object-snap = Tarttumatilat, ruudukkoväli ja objektitartunta + .drafting-settings-2 = Piirtoasetukset… + .modeling-3d = 3D-mallinnus + .display-tools = Näyttötyökalut + .show-the-navigation-cube-navvcube = Näytä navigointikuutio (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Näytä UCS-kuvake (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Sijoita UCS-kuvake origoon (UCSICON ORigin) + .display-resolution = Näytön tarkkuus + .applies-to-the-current-drawing = koskee nykyistä piirustusta + .isolines-per-surface = Isoviivoja pintaa kohti + .show-silhouette-edges-on-solids-dispsilh = Näytä siluettireunat kappaleissa (DISPSILH) + .surface-density-u = Pinnan tiheys U + .surface-density-v = Pinnan tiheys V + .surface-type = Pinnan tyyppi + .record-the-history-of-composite-solids-solidhist = Tallenna koostekappaleiden historia (SOLIDHIST) + .show-solid-history = Näytä kappalehistoria + .not-available = Ei käytettävissä + .open-folder = Avaa kansio + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Missä sovellus säilyttää omat tiedostonsa. Nämä sijainnit ovat kiinteät. + .configuration = Määritykset + .plot-styles = Tulostustyylit + .autosave-files = Automaattitallennuksen tiedostot .selection-modes = Valintatilat .use-shift-to-add-to-selection-pickadd = Käytä Vaihto-näppäintä valintaan lisäämiseen (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Painallus ja veto piirtää suorakulmion lasson sijaan (PICKDRAG) diff --git a/locales/fr-FR/opencadstudio.ftl b/locales/fr-FR/opencadstudio.ftl index b04978ac3..34b31d280 100644 --- a/locales/fr-FR/opencadstudio.ftl +++ b/locales/fr-FR/opencadstudio.ftl @@ -1376,6 +1376,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Contrôle à la fois la case de sélection visible et la zone de clic. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Applications + .installed-plugins-and-their-sources = Plug-ins installés et leurs sources + .plugins-2 = Plug-ins… + .keyboard-shortcuts-2 = Raccourcis clavier + .keyboard-shortcuts-3 = Raccourcis clavier… + .command-aliases-2 = Alias de commandes + .command-aliases-3 = Alias de commandes… + .file-safety = Sécurité des fichiers + .automatic-save = Enregistrement automatique + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minutes entre les enregistrements de récupération dans un fichier .sv$ ; 0 le désactive (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Conserver une copie .bak lors de l'écrasement d'un dessin (ISAVEBAK) + .plotting = Traçage + .plot-device-paper-scale-and-plot-styles = Périphérique de traçage, papier, échelle et styles de tracé + .plot-and-page-setup = Tracer et mise en page… + .fill-truetype-glyphs-textfill = Remplir les glyphes TrueType (TEXTFILL) + .command-line = Ligne de commande + .prompt-lines = Lignes d'invite + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Lignes d'invite temporaires au-dessus de la fenêtre de commande (CLIPROMPTLINES). + .history-fade-time = Durée d'estompage de l'historique + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Combien de temps les lignes d'historique restent visibles ; 0 les ignore (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Cliquer sur des objets superposés ouvre un sélecteur + .block-edit = Édition de bloc + .double-click-to-edit-block-in-place-refedit = Double-clic pour modifier le bloc sur place (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Double-clic sur les blocs avec attributs pour les modifier (ATTEDIT) + .user-preferences = Préférences utilisateur + .zoom = Zoom + .reverse-mouse-wheel-zoom-zoomwheel = Inverser le zoom à la molette (ZOOMWHEEL) + .zoom-factor = Facteur de zoom + .how-far-one-wheel-notch-zooms-zoomfactor = De combien zoome un cran de molette (ZOOMFACTOR). + .text-and-dimensions = Texte et cotation + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT modifie un objet puis se termine (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Les cotes continues héritent du calque et du style de la cote de base (DIMCONTINUEMODE) + .qdim-origin-priority = Priorité d'origine QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = Depuis quels points QDIM mesure. Réglable aussi dans la commande. + .add-scales-automatically = Ajouter les échelles automatiquement + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Quels objets annotatifs adoptent une nouvelle échelle d'annotation (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Unités de longueur, d'angle et d'insertion + .drawing-units-2 = Unités du dessin… + .drafting = Dessin + .drafting-rotation = Rotation du dessin + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Fait pivoter le réticule et la grille d'accrochage dans le SCU actif (SNAPANG). + .polar-tracking-increment = Incrément de repérage polaire + .snap-and-grid = Accrochage et grille + .snap-modes-grid-spacing-and-object-snap = Modes d'accrochage, pas de la grille et accrochage aux objets + .drafting-settings-2 = Paramètres de dessin… + .modeling-3d = Modélisation 3D + .display-tools = Outils d'affichage + .show-the-navigation-cube-navvcube = Afficher le cube de navigation (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Afficher l'icône SCU (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Placer l'icône SCU à l'origine (UCSICON ORigin) + .display-resolution = Résolution d'affichage + .applies-to-the-current-drawing = s'applique au dessin en cours + .isolines-per-surface = Isolignes par surface + .show-silhouette-edges-on-solids-dispsilh = Afficher les arêtes de silhouette sur les solides (DISPSILH) + .surface-density-u = Densité de surface U + .surface-density-v = Densité de surface V + .surface-type = Type de surface + .record-the-history-of-composite-solids-solidhist = Enregistrer l'historique des solides composés (SOLIDHIST) + .show-solid-history = Afficher l'historique des solides + .not-available = Non disponible + .open-folder = Ouvrir le dossier + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Où l'application range ses propres fichiers. Ces emplacements sont fixes. + .configuration = Configuration + .plot-styles = Styles de tracé + .autosave-files = Fichiers d'enregistrement automatique .selection-modes = Modes de sélection .use-shift-to-add-to-selection-pickadd = Utiliser Maj pour ajouter à la sélection (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Le cliquer-glisser trace un rectangle au lieu d'un lasso (PICKDRAG) diff --git a/locales/hi-IN/opencadstudio.ftl b/locales/hi-IN/opencadstudio.ftl index a2a6224b3..6f6f276e0 100644 --- a/locales/hi-IN/opencadstudio.ftl +++ b/locales/hi-IN/opencadstudio.ftl @@ -1364,6 +1364,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = दिखने वाले चयन बॉक्स और क्लिक क्षेत्र दोनों को नियंत्रित करता है। .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = अनुप्रयोग + .installed-plugins-and-their-sources = स्थापित प्लगइन और उनके स्रोत + .plugins-2 = प्लगइन… + .keyboard-shortcuts-2 = कीबोर्ड शॉर्टकट + .keyboard-shortcuts-3 = कीबोर्ड शॉर्टकट… + .command-aliases-2 = कमांड उपनाम + .command-aliases-3 = कमांड उपनाम… + .file-safety = फ़ाइल सुरक्षा + .automatic-save = स्वतः सहेजना + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = .sv$ फ़ाइल में पुनर्प्राप्ति सहेजने के बीच मिनट; 0 इसे बंद करता है (SAVETIME)। + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = ड्रॉइंग को अधिलेखित करते समय .bak प्रति रखें (ISAVEBAK) + .plotting = प्लॉटिंग + .plot-device-paper-scale-and-plot-styles = प्लॉट डिवाइस, कागज़, स्केल और प्लॉट शैलियाँ + .plot-and-page-setup = प्लॉट और पेज सेटअप… + .fill-truetype-glyphs-textfill = TrueType ग्लिफ़ भरें (TEXTFILL) + .command-line = कमांड लाइन + .prompt-lines = प्रॉम्प्ट पंक्तियाँ + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = कमांड विंडो के ऊपर अस्थायी प्रॉम्प्ट पंक्तियाँ (CLIPROMPTLINES)। + .history-fade-time = इतिहास फ़ेड समय + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = इतिहास पंक्तियाँ कितनी देर दिखती हैं; 0 उन्हें छोड़ देता है (COMMANDLINEFADETIME)। + .clicking-overlapping-objects-opens-a-picker = अतिव्यापी ऑब्जेक्ट पर क्लिक करने से चयनकर्ता खुलता है + .block-edit = ब्लॉक संपादन + .double-click-to-edit-block-in-place-refedit = ब्लॉक को यथास्थान संपादित करने के लिए डबल-क्लिक करें (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = विशेषता वाले ब्लॉक पर डबल-क्लिक कर विशेषताएँ संपादित करें (ATTEDIT) + .user-preferences = उपयोगकर्ता प्राथमिकताएँ + .zoom = ज़ूम + .reverse-mouse-wheel-zoom-zoomwheel = माउस व्हील ज़ूम उलटें (ZOOMWHEEL) + .zoom-factor = ज़ूम गुणक + .how-far-one-wheel-notch-zooms-zoomfactor = व्हील का एक पायदान कितना ज़ूम करता है (ZOOMFACTOR)। + .text-and-dimensions = पाठ और आयाम + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT एक ऑब्जेक्ट संपादित कर समाप्त होता है (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = निरंतर आयाम आधार आयाम की लेयर और शैली प्राप्त करते हैं (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM मूल प्राथमिकता + .which-points-qdim-measures-from-also-settable-inside-the-command = QDIM किन बिंदुओं से मापता है। कमांड के भीतर भी सेट किया जा सकता है। + .add-scales-automatically = स्केल स्वतः जोड़ें + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = कौन-से एनोटेटिव ऑब्जेक्ट नया एनोटेशन स्केल लेते हैं (ANNOAUTOSCALE)। + .length-angle-and-insertion-units = लंबाई, कोण और सम्मिलन इकाइयाँ + .drawing-units-2 = ड्रॉइंग इकाइयाँ… + .drafting = ड्राफ्टिंग + .drafting-rotation = ड्राफ्टिंग घूर्णन + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = सक्रिय UCS में क्रॉसहेयर और स्नैप ग्रिड घुमाता है (SNAPANG)। + .polar-tracking-increment = ध्रुवीय ट्रैकिंग वृद्धि + .snap-and-grid = स्नैप और ग्रिड + .snap-modes-grid-spacing-and-object-snap = स्नैप मोड, ग्रिड अंतराल और ऑब्जेक्ट स्नैप + .drafting-settings-2 = ड्राफ्टिंग सेटिंग्स… + .modeling-3d = 3D मॉडलिंग + .display-tools = प्रदर्शन उपकरण + .show-the-navigation-cube-navvcube = नेविगेशन क्यूब दिखाएँ (NAVVCUBE) + .show-the-ucs-icon-ucsicon = UCS आइकन दिखाएँ (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = UCS आइकन मूल बिंदु पर रखें (UCSICON ORigin) + .display-resolution = प्रदर्शन विभेदन + .applies-to-the-current-drawing = वर्तमान ड्रॉइंग पर लागू + .isolines-per-surface = प्रति सतह आइसोलाइन + .show-silhouette-edges-on-solids-dispsilh = ठोसों पर सिल्हूट किनारे दिखाएँ (DISPSILH) + .surface-density-u = सतह घनत्व U + .surface-density-v = सतह घनत्व V + .surface-type = सतह प्रकार + .record-the-history-of-composite-solids-solidhist = संयुक्त ठोसों का इतिहास रिकॉर्ड करें (SOLIDHIST) + .show-solid-history = ठोस इतिहास दिखाएँ + .not-available = उपलब्ध नहीं + .open-folder = फ़ोल्डर खोलें + .where-the-application-keeps-its-own-files-these-locations-are-fixed = अनुप्रयोग अपनी फ़ाइलें कहाँ रखता है। ये स्थान निश्चित हैं। + .configuration = विन्यास + .plot-styles = प्लॉट शैलियाँ + .autosave-files = स्वतः सहेजी फ़ाइलें .selection-modes = चयन मोड .use-shift-to-add-to-selection-pickadd = चयन में जोड़ने के लिए Shift का उपयोग करें (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = दबाकर खींचने पर लैस्सो के बजाय आयत बनता है (PICKDRAG) diff --git a/locales/hu-HU/opencadstudio.ftl b/locales/hu-HU/opencadstudio.ftl index 373ac32e8..9f8e66a81 100644 --- a/locales/hu-HU/opencadstudio.ftl +++ b/locales/hu-HU/opencadstudio.ftl @@ -1375,6 +1375,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = A látható kijelölőnégyzetet és a kattintási területet is szabályozza. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Alkalmazások + .installed-plugins-and-their-sources = Telepített bővítmények és forrásaik + .plugins-2 = Bővítmények… + .keyboard-shortcuts-2 = Billentyűparancsok + .keyboard-shortcuts-3 = Billentyűparancsok… + .command-aliases-2 = Parancs-álnevek + .command-aliases-3 = Parancs-álnevek… + .file-safety = Fájlbiztonság + .automatic-save = Automatikus mentés + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Percek a .sv$ helyreállítási mentések között; a 0 kikapcsolja (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Rajz felülírásakor .bak másolat megőrzése (ISAVEBAK) + .plotting = Nyomtatás + .plot-device-paper-scale-and-plot-styles = Nyomtatóeszköz, papír, méretarány és nyomtatási stílusok + .plot-and-page-setup = Nyomtatás és oldalbeállítás… + .fill-truetype-glyphs-textfill = TrueType karakterek kitöltése (TEXTFILL) + .command-line = Parancssor + .prompt-lines = Kérdéssorok + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Ideiglenes kérdéssorok a parancsablak fölött (CLIPROMPTLINES). + .history-fade-time = Előzmények elhalványulási ideje + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Meddig maradnak láthatók az előzménysorok; a 0 kihagyja őket (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Átfedő objektumokra kattintva választó nyílik + .block-edit = Blokkszerkesztés + .double-click-to-edit-block-in-place-refedit = Dupla kattintás a blokk helyben szerkesztéséhez (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Dupla kattintás az attribútumos blokkok attribútumainak szerkesztéséhez (ATTEDIT) + .user-preferences = Felhasználói beállítások + .zoom = Nagyítás + .reverse-mouse-wheel-zoom-zoomwheel = Egérgörgős nagyítás megfordítása (ZOOMWHEEL) + .zoom-factor = Nagyítási tényező + .how-far-one-wheel-notch-zooms-zoomfactor = Mennyit nagyít egy görgőkattanás (ZOOMFACTOR). + .text-and-dimensions = Szöveg és méretezés + .textedit-edits-one-object-and-ends-texteditmode = A TEXTEDIT egy objektumot szerkeszt, majd befejezi (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = A folytatott méretek öröklik az alapméret fóliáját és stílusát (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM kiindulási prioritás + .which-points-qdim-measures-from-also-settable-inside-the-command = Mely pontoktól mér a QDIM. A parancson belül is beállítható. + .add-scales-automatically = Méretarányok automatikus hozzáadása + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Mely annotatív objektumok veszik át az újonnan beállított feliratozási méretarányt (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Hossz-, szög- és beszúrási egységek + .drawing-units-2 = Rajzegységek… + .drafting = Rajzolás + .drafting-rotation = Rajzolási elforgatás + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Elforgatja a szálkeresztet és az illesztőrácsot az aktív FKR-ben (SNAPANG). + .polar-tracking-increment = Poláris követési lépés + .snap-and-grid = Illesztés és rács + .snap-modes-grid-spacing-and-object-snap = Illesztési módok, rácstávolság és tárgyraszter + .drafting-settings-2 = Rajzolási beállítások… + .modeling-3d = 3D modellezés + .display-tools = Megjelenítési eszközök + .show-the-navigation-cube-navvcube = Navigációs kocka megjelenítése (NAVVCUBE) + .show-the-ucs-icon-ucsicon = FKR ikon megjelenítése (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = FKR ikon elhelyezése az origóban (UCSICON ORigin) + .display-resolution = Megjelenítési felbontás + .applies-to-the-current-drawing = az aktuális rajzra vonatkozik + .isolines-per-surface = Izovonalak felületenként + .show-silhouette-edges-on-solids-dispsilh = Sziluettélek megjelenítése testeken (DISPSILH) + .surface-density-u = Felületsűrűség U + .surface-density-v = Felületsűrűség V + .surface-type = Felülettípus + .record-the-history-of-composite-solids-solidhist = Összetett testek előzményeinek rögzítése (SOLIDHIST) + .show-solid-history = Testelőzmények megjelenítése + .not-available = Nem érhető el + .open-folder = Mappa megnyitása + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Hol tárolja az alkalmazás a saját fájljait. Ezek a helyek rögzítettek. + .configuration = Konfiguráció + .plot-styles = Nyomtatási stílusok + .autosave-files = Automatikus mentés fájljai .selection-modes = Kijelölési módok .use-shift-to-add-to-selection-pickadd = Shift használata a kijelöléshez adáshoz (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = A lenyomva húzás téglalapot rajzol lasszó helyett (PICKDRAG) diff --git a/locales/it-IT/opencadstudio.ftl b/locales/it-IT/opencadstudio.ftl index f2fb32860..264c68dc2 100644 --- a/locales/it-IT/opencadstudio.ftl +++ b/locales/it-IT/opencadstudio.ftl @@ -1375,6 +1375,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Controlla sia il riquadro di selezione visibile sia l’area di clic. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Applicazioni + .installed-plugins-and-their-sources = Plug-in installati e relative origini + .plugins-2 = Plug-in… + .keyboard-shortcuts-2 = Scorciatoie da tastiera + .keyboard-shortcuts-3 = Scorciatoie da tastiera… + .command-aliases-2 = Alias dei comandi + .command-aliases-3 = Alias dei comandi… + .file-safety = Sicurezza dei file + .automatic-save = Salvataggio automatico + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minuti tra i salvataggi di ripristino in un file .sv$; 0 lo disattiva (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Conserva una copia .bak quando si sovrascrive un disegno (ISAVEBAK) + .plotting = Stampa + .plot-device-paper-scale-and-plot-styles = Dispositivo di stampa, foglio, scala e stili di stampa + .plot-and-page-setup = Stampa e imposta pagina… + .fill-truetype-glyphs-textfill = Riempi i glifi TrueType (TEXTFILL) + .command-line = Riga di comando + .prompt-lines = Righe di richiesta + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Righe di richiesta temporanee sopra la finestra dei comandi (CLIPROMPTLINES). + .history-fade-time = Tempo di dissolvenza della cronologia + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Per quanto restano visibili le righe di cronologia; 0 le salta (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Fare clic su oggetti sovrapposti apre un selettore + .block-edit = Modifica blocco + .double-click-to-edit-block-in-place-refedit = Doppio clic per modificare il blocco sul posto (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Doppio clic sui blocchi con attributi per modificarli (ATTEDIT) + .user-preferences = Preferenze utente + .zoom = Zoom + .reverse-mouse-wheel-zoom-zoomwheel = Inverti lo zoom con la rotellina (ZOOMWHEEL) + .zoom-factor = Fattore di zoom + .how-far-one-wheel-notch-zooms-zoomfactor = Di quanto ingrandisce uno scatto della rotellina (ZOOMFACTOR). + .text-and-dimensions = Testo e quote + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT modifica un oggetto e termina (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Le quote continue ereditano layer e stile dalla quota di base (DIMCONTINUEMODE) + .qdim-origin-priority = Priorità di origine QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = Da quali punti misura QDIM. Impostabile anche dentro il comando. + .add-scales-automatically = Aggiungi scale automaticamente + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Quali oggetti annotativi adottano una scala di annotazione appena impostata (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Unità di lunghezza, angolo e inserimento + .drawing-units-2 = Unità del disegno… + .drafting = Disegno + .drafting-rotation = Rotazione di disegno + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Ruota il mirino e la griglia di snap nell'UCS attivo (SNAPANG). + .polar-tracking-increment = Incremento di puntamento polare + .snap-and-grid = Snap e griglia + .snap-modes-grid-spacing-and-object-snap = Modalità di snap, passo della griglia e snap agli oggetti + .drafting-settings-2 = Impostazioni disegno… + .modeling-3d = Modellazione 3D + .display-tools = Strumenti di visualizzazione + .show-the-navigation-cube-navvcube = Mostra il cubo di navigazione (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Mostra l'icona UCS (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Colloca l'icona UCS nell'origine (UCSICON ORigin) + .display-resolution = Risoluzione di visualizzazione + .applies-to-the-current-drawing = si applica al disegno corrente + .isolines-per-surface = Isolinee per superficie + .show-silhouette-edges-on-solids-dispsilh = Mostra i bordi di silhouette sui solidi (DISPSILH) + .surface-density-u = Densità superficie U + .surface-density-v = Densità superficie V + .surface-type = Tipo di superficie + .record-the-history-of-composite-solids-solidhist = Registra la cronologia dei solidi composti (SOLIDHIST) + .show-solid-history = Mostra la cronologia dei solidi + .not-available = Non disponibile + .open-folder = Apri cartella + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Dove l'applicazione tiene i propri file. Queste posizioni sono fisse. + .configuration = Configurazione + .plot-styles = Stili di stampa + .autosave-files = File di salvataggio automatico .selection-modes = Modalità di selezione .use-shift-to-add-to-selection-pickadd = Usa Maiusc per aggiungere alla selezione (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Premi e trascina disegna un rettangolo invece di un lazo (PICKDRAG) diff --git a/locales/ja-JP/opencadstudio.ftl b/locales/ja-JP/opencadstudio.ftl index d6d37b14a..a1e8ace50 100644 --- a/locales/ja-JP/opencadstudio.ftl +++ b/locales/ja-JP/opencadstudio.ftl @@ -1366,6 +1366,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = 表示される選択ボックスとクリック範囲の両方を制御します。 .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = アプリケーション + .installed-plugins-and-their-sources = インストール済みプラグインとその提供元 + .plugins-2 = プラグイン… + .keyboard-shortcuts-2 = キーボード ショートカット + .keyboard-shortcuts-3 = キーボード ショートカット… + .command-aliases-2 = コマンド エイリアス + .command-aliases-3 = コマンド エイリアス… + .file-safety = ファイルの安全性 + .automatic-save = 自動保存 + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = .sv$ ファイルへの復旧保存の間隔 (分)。0 で無効 (SAVETIME)。 + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = 図面を上書きするとき .bak のコピーを残す (ISAVEBAK) + .plotting = 印刷 + .plot-device-paper-scale-and-plot-styles = 印刷デバイス、用紙、尺度、印刷スタイル + .plot-and-page-setup = 印刷とページ設定… + .fill-truetype-glyphs-textfill = TrueType グリフを塗りつぶす (TEXTFILL) + .command-line = コマンド ライン + .prompt-lines = プロンプト行 + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = コマンド ウィンドウの上に表示する一時プロンプト行 (CLIPROMPTLINES)。 + .history-fade-time = 履歴のフェード時間 + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = 履歴行が表示され続ける時間。0 で表示しない (COMMANDLINEFADETIME)。 + .clicking-overlapping-objects-opens-a-picker = 重なったオブジェクトをクリックすると選択リストが開く + .block-edit = ブロック編集 + .double-click-to-edit-block-in-place-refedit = ダブルクリックでブロックをその場で編集 (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = 属性付きブロックをダブルクリックして属性を編集 (ATTEDIT) + .user-preferences = ユーザー設定 + .zoom = ズーム + .reverse-mouse-wheel-zoom-zoomwheel = マウス ホイールのズーム方向を反転 (ZOOMWHEEL) + .zoom-factor = ズーム倍率 + .how-far-one-wheel-notch-zooms-zoomfactor = ホイール 1 ノッチのズーム量 (ZOOMFACTOR)。 + .text-and-dimensions = 文字と寸法 + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT は 1 つのオブジェクトを編集して終了 (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = 連続寸法は基準寸法の画層とスタイルを引き継ぐ (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM の起点優先 + .which-points-qdim-measures-from-also-settable-inside-the-command = QDIM が測定する点。コマンド内でも設定できます。 + .add-scales-automatically = 尺度を自動的に追加 + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = 新しく設定した注釈尺度を受け取る注釈オブジェクト (ANNOAUTOSCALE)。 + .length-angle-and-insertion-units = 長さ、角度、挿入の単位 + .drawing-units-2 = 図面単位… + .drafting = 作図 + .drafting-rotation = 作図の回転 + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = アクティブな UCS でクロスヘアとスナップ グリッドを回転します (SNAPANG)。 + .polar-tracking-increment = 極トラッキングの増分 + .snap-and-grid = スナップとグリッド + .snap-modes-grid-spacing-and-object-snap = スナップ モード、グリッド間隔、オブジェクト スナップ + .drafting-settings-2 = 作図設定… + .modeling-3d = 3D モデリング + .display-tools = 表示ツール + .show-the-navigation-cube-navvcube = ナビゲーション キューブを表示 (NAVVCUBE) + .show-the-ucs-icon-ucsicon = UCS アイコンを表示 (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = UCS アイコンを原点に配置 (UCSICON ORigin) + .display-resolution = 表示解像度 + .applies-to-the-current-drawing = 現在の図面に適用されます + .isolines-per-surface = 面あたりのアイソライン + .show-silhouette-edges-on-solids-dispsilh = ソリッドのシルエット エッジを表示 (DISPSILH) + .surface-density-u = サーフェス密度 U + .surface-density-v = サーフェス密度 V + .surface-type = サーフェス タイプ + .record-the-history-of-composite-solids-solidhist = 複合ソリッドの履歴を記録 (SOLIDHIST) + .show-solid-history = ソリッドの履歴を表示 + .not-available = 利用できません + .open-folder = フォルダーを開く + .where-the-application-keeps-its-own-files-these-locations-are-fixed = アプリケーションが自身のファイルを置く場所です。これらの場所は固定です。 + .configuration = 構成 + .plot-styles = 印刷スタイル + .autosave-files = 自動保存ファイル .selection-modes = 選択モード .use-shift-to-add-to-selection-pickadd = Shift キーで選択に追加する (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = ドラッグで投げ縄ではなく矩形を描く (PICKDRAG) diff --git a/locales/ko-KR/opencadstudio.ftl b/locales/ko-KR/opencadstudio.ftl index c4423adb6..2a1c41d76 100644 --- a/locales/ko-KR/opencadstudio.ftl +++ b/locales/ko-KR/opencadstudio.ftl @@ -1375,6 +1375,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = 표시되는 선택 상자와 클릭 영역을 모두 제어합니다. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = 응용 프로그램 + .installed-plugins-and-their-sources = 설치된 플러그인 및 해당 소스 + .plugins-2 = 플러그인… + .keyboard-shortcuts-2 = 키보드 단축키 + .keyboard-shortcuts-3 = 키보드 단축키… + .command-aliases-2 = 명령 별칭 + .command-aliases-3 = 명령 별칭… + .file-safety = 파일 안전 + .automatic-save = 자동 저장 + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = .sv$ 파일로 복구 저장하는 간격(분). 0이면 해제 (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = 도면을 덮어쓸 때 .bak 사본 유지 (ISAVEBAK) + .plotting = 플롯 + .plot-device-paper-scale-and-plot-styles = 플롯 장치, 용지, 축척 및 플롯 스타일 + .plot-and-page-setup = 플롯 및 페이지 설정… + .fill-truetype-glyphs-textfill = TrueType 글리프 채우기 (TEXTFILL) + .command-line = 명령행 + .prompt-lines = 프롬프트 행 + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = 명령 창 위에 표시할 임시 프롬프트 행 (CLIPROMPTLINES). + .history-fade-time = 히스토리 페이드 시간 + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = 히스토리 행이 표시되는 시간. 0이면 건너뜀 (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = 겹친 객체를 클릭하면 선택기가 열림 + .block-edit = 블록 편집 + .double-click-to-edit-block-in-place-refedit = 두 번 클릭하여 블록을 제자리에서 편집 (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = 속성이 있는 블록을 두 번 클릭하여 속성 편집 (ATTEDIT) + .user-preferences = 사용자 환경설정 + .zoom = 줌 + .reverse-mouse-wheel-zoom-zoomwheel = 마우스 휠 줌 방향 반전 (ZOOMWHEEL) + .zoom-factor = 줌 배율 + .how-far-one-wheel-notch-zooms-zoomfactor = 휠 한 칸이 확대하는 정도 (ZOOMFACTOR). + .text-and-dimensions = 문자 및 치수 + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT는 객체 하나를 편집하고 종료 (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = 연속 치수가 기준 치수의 도면층과 스타일을 상속 (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM 원점 우선순위 + .which-points-qdim-measures-from-also-settable-inside-the-command = QDIM이 측정하는 점. 명령 안에서도 설정할 수 있습니다. + .add-scales-automatically = 축척 자동 추가 + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = 새로 설정한 주석 축척을 적용받을 주석 객체 (ANNOAUTOSCALE). + .length-angle-and-insertion-units = 길이, 각도 및 삽입 단위 + .drawing-units-2 = 도면 단위… + .drafting = 제도 + .drafting-rotation = 제도 회전 + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = 활성 UCS에서 십자선과 스냅 그리드를 회전합니다 (SNAPANG). + .polar-tracking-increment = 극좌표 추적 증분 + .snap-and-grid = 스냅 및 그리드 + .snap-modes-grid-spacing-and-object-snap = 스냅 모드, 그리드 간격 및 객체 스냅 + .drafting-settings-2 = 제도 설정… + .modeling-3d = 3D 모델링 + .display-tools = 표시 도구 + .show-the-navigation-cube-navvcube = 탐색 큐브 표시 (NAVVCUBE) + .show-the-ucs-icon-ucsicon = UCS 아이콘 표시 (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = UCS 아이콘을 원점에 배치 (UCSICON ORigin) + .display-resolution = 표시 해상도 + .applies-to-the-current-drawing = 현재 도면에 적용됩니다 + .isolines-per-surface = 곡면당 아이소라인 + .show-silhouette-edges-on-solids-dispsilh = 솔리드의 실루엣 모서리 표시 (DISPSILH) + .surface-density-u = 곡면 밀도 U + .surface-density-v = 곡면 밀도 V + .surface-type = 곡면 유형 + .record-the-history-of-composite-solids-solidhist = 복합 솔리드의 히스토리 기록 (SOLIDHIST) + .show-solid-history = 솔리드 히스토리 표시 + .not-available = 사용할 수 없음 + .open-folder = 폴더 열기 + .where-the-application-keeps-its-own-files-these-locations-are-fixed = 응용 프로그램이 자체 파일을 두는 위치입니다. 이 위치는 고정입니다. + .configuration = 구성 + .plot-styles = 플롯 스타일 + .autosave-files = 자동 저장 파일 .selection-modes = 선택 모드 .use-shift-to-add-to-selection-pickadd = Shift 키로 선택에 추가 (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = 누른 채 끌면 올가미 대신 사각형을 그림 (PICKDRAG) diff --git a/locales/nl-NL/opencadstudio.ftl b/locales/nl-NL/opencadstudio.ftl index 1d9c99d55..9f7b7c1fe 100644 --- a/locales/nl-NL/opencadstudio.ftl +++ b/locales/nl-NL/opencadstudio.ftl @@ -1374,6 +1374,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Bepaalt zowel het zichtbare selectievak als het klikgebied. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Toepassingen + .installed-plugins-and-their-sources = Geïnstalleerde plug-ins en hun bronnen + .plugins-2 = Plug-ins… + .keyboard-shortcuts-2 = Sneltoetsen + .keyboard-shortcuts-3 = Sneltoetsen… + .command-aliases-2 = Opdrachtaliassen + .command-aliases-3 = Opdrachtaliassen… + .file-safety = Bestandsveiligheid + .automatic-save = Automatisch opslaan + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minuten tussen herstelopslagen naar een .sv$-bestand; 0 schakelt het uit (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Een .bak-kopie bewaren bij het overschrijven van een tekening (ISAVEBAK) + .plotting = Plotten + .plot-device-paper-scale-and-plot-styles = Plotapparaat, papier, schaal en plotstijlen + .plot-and-page-setup = Plotten en pagina-instelling… + .fill-truetype-glyphs-textfill = TrueType-glyphs vullen (TEXTFILL) + .command-line = Opdrachtregel + .prompt-lines = Promptregels + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Tijdelijke promptregels boven het opdrachtvenster (CLIPROMPTLINES). + .history-fade-time = Vervaagtijd van geschiedenis + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Hoe lang geschiedenisregels zichtbaar blijven; 0 slaat ze over (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Klikken op overlappende objecten opent een kiezer + .block-edit = Blok bewerken + .double-click-to-edit-block-in-place-refedit = Dubbelklik om het blok ter plaatse te bewerken (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Dubbelklik op blokken met attributen om die te bewerken (ATTEDIT) + .user-preferences = Gebruikersvoorkeuren + .zoom = Zoomen + .reverse-mouse-wheel-zoom-zoomwheel = Muiswielzoom omkeren (ZOOMWHEEL) + .zoom-factor = Zoomfactor + .how-far-one-wheel-notch-zooms-zoomfactor = Hoeveel één wielklik zoomt (ZOOMFACTOR). + .text-and-dimensions = Tekst en maatvoering + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT bewerkt één object en stopt (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Doorlopende maten erven laag en stijl van de basismaat (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM-oorsprongprioriteit + .which-points-qdim-measures-from-also-settable-inside-the-command = Vanaf welke punten QDIM meet. Ook in te stellen binnen de opdracht. + .add-scales-automatically = Schalen automatisch toevoegen + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Welke annotatieve objecten een nieuw ingestelde annotatieschaal overnemen (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Lengte-, hoek- en invoegeenheden + .drawing-units-2 = Tekeneenheden… + .drafting = Tekenen + .drafting-rotation = Tekenrotatie + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Draait het draadkruis en het vangraster in het actieve BCS (SNAPANG). + .polar-tracking-increment = Polaire volgstap + .snap-and-grid = Vang en raster + .snap-modes-grid-spacing-and-object-snap = Vangmodi, rasterafstand en objectvang + .drafting-settings-2 = Tekeninstellingen… + .modeling-3d = 3D-modelleren + .display-tools = Weergavegereedschappen + .show-the-navigation-cube-navvcube = Navigatiekubus tonen (NAVVCUBE) + .show-the-ucs-icon-ucsicon = BCS-pictogram tonen (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = BCS-pictogram op de oorsprong plaatsen (UCSICON ORigin) + .display-resolution = Weergaveresolutie + .applies-to-the-current-drawing = geldt voor de huidige tekening + .isolines-per-surface = Isolijnen per oppervlak + .show-silhouette-edges-on-solids-dispsilh = Silhouetranden op vaste lichamen tonen (DISPSILH) + .surface-density-u = Oppervlakdichtheid U + .surface-density-v = Oppervlakdichtheid V + .surface-type = Oppervlaktype + .record-the-history-of-composite-solids-solidhist = Geschiedenis van samengestelde vaste lichamen vastleggen (SOLIDHIST) + .show-solid-history = Geschiedenis van vaste lichamen tonen + .not-available = Niet beschikbaar + .open-folder = Map openen + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Waar de toepassing haar eigen bestanden bewaart. Deze locaties liggen vast. + .configuration = Configuratie + .plot-styles = Plotstijlen + .autosave-files = Bestanden voor automatisch opslaan .selection-modes = Selectiemodi .use-shift-to-add-to-selection-pickadd = Shift gebruiken om aan de selectie toe te voegen (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Slepen tekent een rechthoek in plaats van een lasso (PICKDRAG) diff --git a/locales/pl-PL/opencadstudio.ftl b/locales/pl-PL/opencadstudio.ftl index 13bad04bc..03d2eeddd 100644 --- a/locales/pl-PL/opencadstudio.ftl +++ b/locales/pl-PL/opencadstudio.ftl @@ -1375,6 +1375,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Steruje widocznym polem wyboru oraz obszarem kliknięcia. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Aplikacje + .installed-plugins-and-their-sources = Zainstalowane wtyczki i ich źródła + .plugins-2 = Wtyczki… + .keyboard-shortcuts-2 = Skróty klawiszowe + .keyboard-shortcuts-3 = Skróty klawiszowe… + .command-aliases-2 = Aliasy poleceń + .command-aliases-3 = Aliasy poleceń… + .file-safety = Bezpieczeństwo plików + .automatic-save = Automatyczny zapis + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minuty między zapisami odzyskiwania do pliku .sv$; 0 wyłącza (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Zachowaj kopię .bak przy nadpisywaniu rysunku (ISAVEBAK) + .plotting = Kreślenie + .plot-device-paper-scale-and-plot-styles = Urządzenie kreślące, papier, skala i style wydruku + .plot-and-page-setup = Kreśl i ustawienia strony… + .fill-truetype-glyphs-textfill = Wypełniaj glify TrueType (TEXTFILL) + .command-line = Wiersz poleceń + .prompt-lines = Wiersze zachęty + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Tymczasowe wiersze zachęty nad oknem poleceń (CLIPROMPTLINES). + .history-fade-time = Czas zanikania historii + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Jak długo wiersze historii pozostają widoczne; 0 je pomija (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Kliknięcie nakładających się obiektów otwiera selektor + .block-edit = Edycja bloku + .double-click-to-edit-block-in-place-refedit = Dwukrotne kliknięcie edytuje blok w miejscu (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Dwukrotne kliknięcie bloków z atrybutami edytuje atrybuty (ATTEDIT) + .user-preferences = Preferencje użytkownika + .zoom = Powiększenie + .reverse-mouse-wheel-zoom-zoomwheel = Odwróć powiększanie kółkiem myszy (ZOOMWHEEL) + .zoom-factor = Współczynnik powiększenia + .how-far-one-wheel-notch-zooms-zoomfactor = O ile powiększa jedno kliknięcie kółka (ZOOMFACTOR). + .text-and-dimensions = Tekst i wymiary + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT edytuje jeden obiekt i kończy (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Wymiary kontynuowane dziedziczą warstwę i styl wymiaru bazowego (DIMCONTINUEMODE) + .qdim-origin-priority = Priorytet początku QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = Od których punktów mierzy QDIM. Ustawiane też wewnątrz polecenia. + .add-scales-automatically = Dodawaj skale automatycznie + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Które obiekty adnotacyjne przyjmują nowo ustawioną skalę adnotacji (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Jednostki długości, kąta i wstawiania + .drawing-units-2 = Jednostki rysunku… + .drafting = Kreślenie ręczne + .drafting-rotation = Obrót rysowania + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Obraca celownik i siatkę przyciągania w aktywnym LUW (SNAPANG). + .polar-tracking-increment = Przyrost śledzenia biegunowego + .snap-and-grid = Przyciąganie i siatka + .snap-modes-grid-spacing-and-object-snap = Tryby przyciągania, odstęp siatki i przyciąganie do obiektów + .drafting-settings-2 = Ustawienia rysowania… + .modeling-3d = Modelowanie 3D + .display-tools = Narzędzia wyświetlania + .show-the-navigation-cube-navvcube = Pokaż kostkę nawigacji (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Pokaż ikonę LUW (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Umieść ikonę LUW w początku układu (UCSICON ORigin) + .display-resolution = Rozdzielczość wyświetlania + .applies-to-the-current-drawing = dotyczy bieżącego rysunku + .isolines-per-surface = Izolinie na powierzchnię + .show-silhouette-edges-on-solids-dispsilh = Pokaż krawędzie sylwetki na bryłach (DISPSILH) + .surface-density-u = Gęstość powierzchni U + .surface-density-v = Gęstość powierzchni V + .surface-type = Typ powierzchni + .record-the-history-of-composite-solids-solidhist = Zapisuj historię brył złożonych (SOLIDHIST) + .show-solid-history = Pokaż historię brył + .not-available = Niedostępne + .open-folder = Otwórz folder + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Gdzie aplikacja przechowuje własne pliki. Te lokalizacje są stałe. + .configuration = Konfiguracja + .plot-styles = Style wydruku + .autosave-files = Pliki automatycznego zapisu .selection-modes = Tryby zaznaczania .use-shift-to-add-to-selection-pickadd = Użyj klawisza Shift, aby dodać do zaznaczenia (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Przeciąganie rysuje prostokąt zamiast lassa (PICKDRAG) diff --git a/locales/pt-BR/opencadstudio.ftl b/locales/pt-BR/opencadstudio.ftl index 58cf1b3d3..fefe16cea 100644 --- a/locales/pt-BR/opencadstudio.ftl +++ b/locales/pt-BR/opencadstudio.ftl @@ -1376,6 +1376,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Controla tanto a caixa de seleção visível quanto a área de clique. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Aplicativos + .installed-plugins-and-their-sources = Plug-ins instalados e suas origens + .plugins-2 = Plug-ins… + .keyboard-shortcuts-2 = Atalhos de teclado + .keyboard-shortcuts-3 = Atalhos de teclado… + .command-aliases-2 = Apelidos de comandos + .command-aliases-3 = Apelidos de comandos… + .file-safety = Segurança de arquivos + .automatic-save = Salvamento automático + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Minutos entre salvamentos de recuperação em um arquivo .sv$; 0 desativa (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Manter uma cópia .bak ao sobrescrever um desenho (ISAVEBAK) + .plotting = Plotagem + .plot-device-paper-scale-and-plot-styles = Dispositivo de plotagem, papel, escala e estilos de plotagem + .plot-and-page-setup = Plotar e configurar página… + .fill-truetype-glyphs-textfill = Preencher glifos TrueType (TEXTFILL) + .command-line = Linha de comando + .prompt-lines = Linhas de solicitação + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Linhas de solicitação temporárias acima da janela de comandos (CLIPROMPTLINES). + .history-fade-time = Tempo de esmaecimento do histórico + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Quanto tempo as linhas de histórico ficam visíveis; 0 as ignora (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Clicar em objetos sobrepostos abre um seletor + .block-edit = Edição de bloco + .double-click-to-edit-block-in-place-refedit = Duplo clique para editar o bloco no local (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Duplo clique em blocos com atributos para editá-los (ATTEDIT) + .user-preferences = Preferências do usuário + .zoom = Zoom + .reverse-mouse-wheel-zoom-zoomwheel = Inverter o zoom da roda do mouse (ZOOMWHEEL) + .zoom-factor = Fator de zoom + .how-far-one-wheel-notch-zooms-zoomfactor = Quanto um passo da roda amplia (ZOOMFACTOR). + .text-and-dimensions = Texto e cotas + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT edita um objeto e encerra (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Cotas continuadas herdam camada e estilo da cota base (DIMCONTINUEMODE) + .qdim-origin-priority = Prioridade de origem do QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = De quais pontos o QDIM mede. Também ajustável dentro do comando. + .add-scales-automatically = Adicionar escalas automaticamente + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Quais objetos anotativos recebem uma escala de anotação recém-definida (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Unidades de comprimento, ângulo e inserção + .drawing-units-2 = Unidades do desenho… + .drafting = Desenho + .drafting-rotation = Rotação de desenho + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Gira a mira e a grade de precisão no UCS ativo (SNAPANG). + .polar-tracking-increment = Incremento de rastreamento polar + .snap-and-grid = Precisão e grade + .snap-modes-grid-spacing-and-object-snap = Modos de precisão, espaçamento da grade e osnap + .drafting-settings-2 = Configurações de desenho… + .modeling-3d = Modelagem 3D + .display-tools = Ferramentas de exibição + .show-the-navigation-cube-navvcube = Mostrar o cubo de navegação (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Mostrar o ícone UCS (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Colocar o ícone UCS na origem (UCSICON ORigin) + .display-resolution = Resolução de exibição + .applies-to-the-current-drawing = aplica-se ao desenho atual + .isolines-per-surface = Isolinhas por superfície + .show-silhouette-edges-on-solids-dispsilh = Mostrar arestas de silhueta em sólidos (DISPSILH) + .surface-density-u = Densidade de superfície U + .surface-density-v = Densidade de superfície V + .surface-type = Tipo de superfície + .record-the-history-of-composite-solids-solidhist = Registrar o histórico de sólidos compostos (SOLIDHIST) + .show-solid-history = Mostrar o histórico de sólidos + .not-available = Não disponível + .open-folder = Abrir pasta + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Onde o aplicativo guarda seus próprios arquivos. Esses locais são fixos. + .configuration = Configuração + .plot-styles = Estilos de plotagem + .autosave-files = Arquivos de salvamento automático .selection-modes = Modos de seleção .use-shift-to-add-to-selection-pickadd = Usar Shift para adicionar à seleção (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Pressionar e arrastar desenha um retângulo em vez de um laço (PICKDRAG) diff --git a/locales/ru-RU/opencadstudio.ftl b/locales/ru-RU/opencadstudio.ftl index 13ba008b2..8c0d1656f 100644 --- a/locales/ru-RU/opencadstudio.ftl +++ b/locales/ru-RU/opencadstudio.ftl @@ -1379,6 +1379,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Управляет видимым прицелом выбора и областью щелчка. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Приложения + .installed-plugins-and-their-sources = Установленные плагины и их источники + .plugins-2 = Плагины… + .keyboard-shortcuts-2 = Сочетания клавиш + .keyboard-shortcuts-3 = Сочетания клавиш… + .command-aliases-2 = Псевдонимы команд + .command-aliases-3 = Псевдонимы команд… + .file-safety = Безопасность файлов + .automatic-save = Автосохранение + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Минуты между сохранениями восстановления в файл .sv$; 0 отключает (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Сохранять копию .bak при перезаписи чертежа (ISAVEBAK) + .plotting = Печать + .plot-device-paper-scale-and-plot-styles = Устройство печати, бумага, масштаб и стили печати + .plot-and-page-setup = Печать и параметры листа… + .fill-truetype-glyphs-textfill = Заливать глифы TrueType (TEXTFILL) + .command-line = Командная строка + .prompt-lines = Строки запроса + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Временные строки запроса над окном команд (CLIPROMPTLINES). + .history-fade-time = Время затухания журнала + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Как долго строки журнала остаются видимыми; 0 их пропускает (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Щелчок по перекрывающимся объектам открывает список выбора + .block-edit = Редактирование блока + .double-click-to-edit-block-in-place-refedit = Двойной щелчок редактирует блок на месте (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Двойной щелчок по блокам с атрибутами редактирует атрибуты (ATTEDIT) + .user-preferences = Пользовательские настройки + .zoom = Зумирование + .reverse-mouse-wheel-zoom-zoomwheel = Обратить зумирование колесом мыши (ZOOMWHEEL) + .zoom-factor = Коэффициент зумирования + .how-far-one-wheel-notch-zooms-zoomfactor = Насколько приближает один щелчок колеса (ZOOMFACTOR). + .text-and-dimensions = Текст и размеры + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT редактирует один объект и завершается (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Продолженные размеры наследуют слой и стиль базового размера (DIMCONTINUEMODE) + .qdim-origin-priority = Приоритет начала QDIM + .which-points-qdim-measures-from-also-settable-inside-the-command = От каких точек измеряет QDIM. Настраивается и внутри команды. + .add-scales-automatically = Добавлять масштабы автоматически + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Какие аннотативные объекты принимают вновь заданный масштаб аннотаций (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Единицы длины, угла и вставки + .drawing-units-2 = Единицы чертежа… + .drafting = Черчение + .drafting-rotation = Поворот черчения + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Поворачивает перекрестье и сетку привязки в активной ПСК (SNAPANG). + .polar-tracking-increment = Шаг полярного отслеживания + .snap-and-grid = Привязка и сетка + .snap-modes-grid-spacing-and-object-snap = Режимы привязки, шаг сетки и объектная привязка + .drafting-settings-2 = Параметры черчения… + .modeling-3d = 3D-моделирование + .display-tools = Инструменты отображения + .show-the-navigation-cube-navvcube = Показывать куб навигации (NAVVCUBE) + .show-the-ucs-icon-ucsicon = Показывать значок ПСК (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = Размещать значок ПСК в начале координат (UCSICON ORigin) + .display-resolution = Разрешение отображения + .applies-to-the-current-drawing = применяется к текущему чертежу + .isolines-per-surface = Изолиний на поверхность + .show-silhouette-edges-on-solids-dispsilh = Показывать силуэтные рёбра тел (DISPSILH) + .surface-density-u = Плотность поверхности U + .surface-density-v = Плотность поверхности V + .surface-type = Тип поверхности + .record-the-history-of-composite-solids-solidhist = Записывать историю составных тел (SOLIDHIST) + .show-solid-history = Показывать историю тел + .not-available = Недоступно + .open-folder = Открыть папку + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Где приложение хранит собственные файлы. Эти расположения фиксированы. + .configuration = Конфигурация + .plot-styles = Стили печати + .autosave-files = Файлы автосохранения .selection-modes = Режимы выбора .use-shift-to-add-to-selection-pickadd = Использовать Shift для добавления к выбору (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Нажатие и перетаскивание рисует прямоугольник вместо лассо (PICKDRAG) diff --git a/locales/tr-TR/opencadstudio.ftl b/locales/tr-TR/opencadstudio.ftl index 0ffa766d1..c1e06f91a 100644 --- a/locales/tr-TR/opencadstudio.ftl +++ b/locales/tr-TR/opencadstudio.ftl @@ -1362,6 +1362,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = Hem görünür seçim kutusunu hem de tıklama alanını denetler. .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = Uygulamalar + .installed-plugins-and-their-sources = Yüklü eklentiler ve kaynakları + .plugins-2 = Eklentiler… + .keyboard-shortcuts-2 = Klavye kısayolları + .keyboard-shortcuts-3 = Klavye kısayolları… + .command-aliases-2 = Komut takma adları + .command-aliases-3 = Komut takma adları… + .file-safety = Dosya güvenliği + .automatic-save = Otomatik kaydetme + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = Bir .sv$ dosyasına kurtarma kayıtları arasındaki dakika; 0 kapatır (SAVETIME). + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = Bir çizimin üzerine yazarken .bak kopyası tut (ISAVEBAK) + .plotting = Çizdirme + .plot-device-paper-scale-and-plot-styles = Çizim aygıtı, kâğıt, ölçek ve çizim stilleri + .plot-and-page-setup = Çizdir ve sayfa düzeni… + .fill-truetype-glyphs-textfill = TrueType karakterlerini doldur (TEXTFILL) + .command-line = Komut satırı + .prompt-lines = İstem satırları + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = Komut penceresinin üstündeki geçici istem satırları (CLIPROMPTLINES). + .history-fade-time = Geçmiş solma süresi + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = Geçmiş satırlarının ne kadar görünür kalacağı; 0 atlar (COMMANDLINEFADETIME). + .clicking-overlapping-objects-opens-a-picker = Üst üste binen nesnelere tıklamak bir seçici açar + .block-edit = Blok düzenleme + .double-click-to-edit-block-in-place-refedit = Bloğu yerinde düzenlemek için çift tıklayın (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = Öznitelikli bloklara çift tıklayarak özniteliklerini düzenleyin (ATTEDIT) + .user-preferences = Kullanıcı tercihleri + .zoom = Yakınlaştırma + .reverse-mouse-wheel-zoom-zoomwheel = Fare tekerleği yakınlaştırmasını ters çevir (ZOOMWHEEL) + .zoom-factor = Yakınlaştırma çarpanı + .how-far-one-wheel-notch-zooms-zoomfactor = Bir tekerlek adımının ne kadar yakınlaştıracağı (ZOOMFACTOR). + .text-and-dimensions = Metin ve ölçülendirme + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT bir nesneyi düzenler ve biter (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = Devam eden ölçüler temel ölçünün katmanını ve stilini devralır (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM başlangıç önceliği + .which-points-qdim-measures-from-also-settable-inside-the-command = QDIM'in hangi noktalardan ölçtüğü. Komutun içinden de ayarlanır. + .add-scales-automatically = Ölçekleri otomatik ekle + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = Yeni ayarlanan bir açıklama ölçeğini hangi açıklamalı nesnelerin alacağı (ANNOAUTOSCALE). + .length-angle-and-insertion-units = Uzunluk, açı ve ekleme birimleri + .drawing-units-2 = Çizim birimleri… + .drafting = Taslak + .drafting-rotation = Taslak dönüşü + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = Etkin UCS'de artı imleci ve yakalama ızgarasını döndürür (SNAPANG). + .polar-tracking-increment = Kutupsal izleme artışı + .snap-and-grid = Yakalama ve ızgara + .snap-modes-grid-spacing-and-object-snap = Yakalama modları, ızgara aralığı ve nesne yakalama + .drafting-settings-2 = Taslak ayarları… + .modeling-3d = 3B modelleme + .display-tools = Görüntüleme araçları + .show-the-navigation-cube-navvcube = Gezinme küpünü göster (NAVVCUBE) + .show-the-ucs-icon-ucsicon = UCS simgesini göster (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = UCS simgesini başlangıç noktasına yerleştir (UCSICON ORigin) + .display-resolution = Görüntüleme çözünürlüğü + .applies-to-the-current-drawing = geçerli çizim için geçerlidir + .isolines-per-surface = Yüzey başına eş çizgiler + .show-silhouette-edges-on-solids-dispsilh = Katılarda siluet kenarlarını göster (DISPSILH) + .surface-density-u = Yüzey yoğunluğu U + .surface-density-v = Yüzey yoğunluğu V + .surface-type = Yüzey türü + .record-the-history-of-composite-solids-solidhist = Bileşik katıların geçmişini kaydet (SOLIDHIST) + .show-solid-history = Katı geçmişini göster + .not-available = Kullanılamıyor + .open-folder = Klasörü aç + .where-the-application-keeps-its-own-files-these-locations-are-fixed = Uygulamanın kendi dosyalarını tuttuğu yer. Bu konumlar sabittir. + .configuration = Yapılandırma + .plot-styles = Çizim stilleri + .autosave-files = Otomatik kaydetme dosyaları .selection-modes = Seçim modları .use-shift-to-add-to-selection-pickadd = Seçime eklemek için Shift kullan (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = Basılı tutup sürükleme kement yerine dikdörtgen çizer (PICKDRAG) diff --git a/locales/zh-CN/opencadstudio.ftl b/locales/zh-CN/opencadstudio.ftl index b737e29f0..e7a4a81a2 100644 --- a/locales/zh-CN/opencadstudio.ftl +++ b/locales/zh-CN/opencadstudio.ftl @@ -1363,6 +1363,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = 同时控制可见选择框和单击范围。 .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = 应用程序 + .installed-plugins-and-their-sources = 已安装的插件及其来源 + .plugins-2 = 插件… + .keyboard-shortcuts-2 = 键盘快捷键 + .keyboard-shortcuts-3 = 键盘快捷键… + .command-aliases-2 = 命令别名 + .command-aliases-3 = 命令别名… + .file-safety = 文件安全 + .automatic-save = 自动保存 + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = 两次保存到 .sv$ 恢复文件之间的分钟数;0 表示关闭 (SAVETIME)。 + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = 覆盖图形时保留 .bak 副本 (ISAVEBAK) + .plotting = 打印 + .plot-device-paper-scale-and-plot-styles = 打印设备、图纸、比例和打印样式 + .plot-and-page-setup = 打印和页面设置… + .fill-truetype-glyphs-textfill = 填充 TrueType 字形 (TEXTFILL) + .command-line = 命令行 + .prompt-lines = 提示行 + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = 命令窗口上方显示的临时提示行 (CLIPROMPTLINES)。 + .history-fade-time = 历史淡出时间 + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = 历史行保持可见的时长;0 表示跳过 (COMMANDLINEFADETIME)。 + .clicking-overlapping-objects-opens-a-picker = 单击重叠对象时打开选择器 + .block-edit = 块编辑 + .double-click-to-edit-block-in-place-refedit = 双击就地编辑块 (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = 双击带属性的块以编辑属性 (ATTEDIT) + .user-preferences = 用户首选项 + .zoom = 缩放 + .reverse-mouse-wheel-zoom-zoomwheel = 反转鼠标滚轮缩放方向 (ZOOMWHEEL) + .zoom-factor = 缩放系数 + .how-far-one-wheel-notch-zooms-zoomfactor = 滚轮每格的缩放幅度 (ZOOMFACTOR)。 + .text-and-dimensions = 文字和标注 + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT 编辑一个对象后结束 (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = 连续标注继承基准标注的图层和样式 (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM 原点优先级 + .which-points-qdim-measures-from-also-settable-inside-the-command = QDIM 从哪些点测量。也可在命令内设置。 + .add-scales-automatically = 自动添加比例 + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = 哪些注释性对象接受新设置的注释比例 (ANNOAUTOSCALE)。 + .length-angle-and-insertion-units = 长度、角度和插入单位 + .drawing-units-2 = 图形单位… + .drafting = 草图 + .drafting-rotation = 草图旋转 + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = 在当前 UCS 中旋转十字光标和捕捉栅格 (SNAPANG)。 + .polar-tracking-increment = 极轴追踪增量 + .snap-and-grid = 捕捉和栅格 + .snap-modes-grid-spacing-and-object-snap = 捕捉模式、栅格间距和对象捕捉 + .drafting-settings-2 = 草图设置… + .modeling-3d = 三维建模 + .display-tools = 显示工具 + .show-the-navigation-cube-navvcube = 显示导航立方体 (NAVVCUBE) + .show-the-ucs-icon-ucsicon = 显示 UCS 图标 (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = 将 UCS 图标置于原点 (UCSICON ORigin) + .display-resolution = 显示分辨率 + .applies-to-the-current-drawing = 应用于当前图形 + .isolines-per-surface = 每个曲面的素线数 + .show-silhouette-edges-on-solids-dispsilh = 在实体上显示轮廓边 (DISPSILH) + .surface-density-u = 曲面密度 U + .surface-density-v = 曲面密度 V + .surface-type = 曲面类型 + .record-the-history-of-composite-solids-solidhist = 记录复合实体的历史 (SOLIDHIST) + .show-solid-history = 显示实体历史 + .not-available = 不可用 + .open-folder = 打开文件夹 + .where-the-application-keeps-its-own-files-these-locations-are-fixed = 应用程序存放自身文件的位置。这些位置是固定的。 + .configuration = 配置 + .plot-styles = 打印样式 + .autosave-files = 自动保存文件 .selection-modes = 选择模式 .use-shift-to-add-to-selection-pickadd = 使用 Shift 添加到选择集 (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = 按住并拖动时绘制矩形而非套索 (PICKDRAG) diff --git a/locales/zh-TW/opencadstudio.ftl b/locales/zh-TW/opencadstudio.ftl index bc7a4f144..446aa9b4f 100644 --- a/locales/zh-TW/opencadstudio.ftl +++ b/locales/zh-TW/opencadstudio.ftl @@ -1375,6 +1375,71 @@ common = .pick-box-size = { common.pickbox }: { common.size } .controls-both-the-visible-selection-box-and-the-click-aperture = 同時控制可見選取框與點選範圍。 .visual-effect-settings = { common.visual-effects } · { properties.settings } + .applications = 應用程式 + .installed-plugins-and-their-sources = 已安裝的外掛程式及其來源 + .plugins-2 = 外掛程式… + .keyboard-shortcuts-2 = 鍵盤快速鍵 + .keyboard-shortcuts-3 = 鍵盤快速鍵… + .command-aliases-2 = 指令別名 + .command-aliases-3 = 指令別名… + .file-safety = 檔案安全 + .automatic-save = 自動儲存 + .minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime = 兩次儲存到 .sv$ 復原檔之間的分鐘數;0 表示關閉 (SAVETIME)。 + .keep-a-bak-copy-when-overwriting-a-drawing-isavebak = 覆寫圖面時保留 .bak 副本 (ISAVEBAK) + .plotting = 出圖 + .plot-device-paper-scale-and-plot-styles = 出圖裝置、紙張、比例與出圖樣式 + .plot-and-page-setup = 出圖與頁面設定… + .fill-truetype-glyphs-textfill = 填滿 TrueType 字符 (TEXTFILL) + .command-line = 指令行 + .prompt-lines = 提示行 + .temporary-prompt-lines-shown-above-the-command-window-clipromptlines = 指令視窗上方顯示的暫時提示行 (CLIPROMPTLINES)。 + .history-fade-time = 歷程淡出時間 + .how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime = 歷程行保持顯示的時間;0 表示略過 (COMMANDLINEFADETIME)。 + .clicking-overlapping-objects-opens-a-picker = 點選重疊的物件時開啟選擇器 + .block-edit = 圖塊編輯 + .double-click-to-edit-block-in-place-refedit = 雙擊以就地編輯圖塊 (REFEDIT) + .double-click-attributed-blocks-to-edit-attributes-attedit = 雙擊具屬性的圖塊以編輯屬性 (ATTEDIT) + .user-preferences = 使用者偏好設定 + .zoom = 縮放 + .reverse-mouse-wheel-zoom-zoomwheel = 反轉滑鼠滾輪縮放方向 (ZOOMWHEEL) + .zoom-factor = 縮放係數 + .how-far-one-wheel-notch-zooms-zoomfactor = 滾輪每一格的縮放幅度 (ZOOMFACTOR)。 + .text-and-dimensions = 文字與標註 + .textedit-edits-one-object-and-ends-texteditmode = TEXTEDIT 編輯一個物件後結束 (TEXTEDITMODE) + .continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode = 連續標註繼承基準標註的圖層與樣式 (DIMCONTINUEMODE) + .qdim-origin-priority = QDIM 原點優先順序 + .which-points-qdim-measures-from-also-settable-inside-the-command = QDIM 從哪些點量測。也可在指令內設定。 + .add-scales-automatically = 自動加入比例 + .which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale = 哪些註解性物件接受新設定的註解比例 (ANNOAUTOSCALE)。 + .length-angle-and-insertion-units = 長度、角度與插入單位 + .drawing-units-2 = 圖面單位… + .drafting = 製圖 + .drafting-rotation = 製圖旋轉 + .rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang = 在使用中的 UCS 內旋轉十字游標與鎖點格線 (SNAPANG)。 + .polar-tracking-increment = 極座標追蹤增量 + .snap-and-grid = 鎖點與格線 + .snap-modes-grid-spacing-and-object-snap = 鎖點模式、格線間距與物件鎖點 + .drafting-settings-2 = 製圖設定… + .modeling-3d = 3D 塑型 + .display-tools = 顯示工具 + .show-the-navigation-cube-navvcube = 顯示導覽方塊 (NAVVCUBE) + .show-the-ucs-icon-ucsicon = 顯示 UCS 圖示 (UCSICON) + .place-the-ucs-icon-at-the-origin-ucsicon-origin = 將 UCS 圖示置於原點 (UCSICON ORigin) + .display-resolution = 顯示解析度 + .applies-to-the-current-drawing = 套用至目前的圖面 + .isolines-per-surface = 每個曲面的等值線 + .show-silhouette-edges-on-solids-dispsilh = 在實體上顯示輪廓邊 (DISPSILH) + .surface-density-u = 曲面密度 U + .surface-density-v = 曲面密度 V + .surface-type = 曲面類型 + .record-the-history-of-composite-solids-solidhist = 記錄複合實體的歷程 (SOLIDHIST) + .show-solid-history = 顯示實體歷程 + .not-available = 無法使用 + .open-folder = 開啟資料夾 + .where-the-application-keeps-its-own-files-these-locations-are-fixed = 應用程式存放自身檔案的位置。這些位置是固定的。 + .configuration = 組態 + .plot-styles = 出圖樣式 + .autosave-files = 自動儲存檔案 .selection-modes = 選取模式 .use-shift-to-add-to-selection-pickadd = 使用 Shift 加入選取集 (PICKADD) .press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag = 按住並拖曳時繪製矩形而非套索 (PICKDRAG) diff --git a/src/locale_catalog.rs b/src/locale_catalog.rs index 1e09a7e20..700d2f68c 100644 --- a/src/locale_catalog.rs +++ b/src/locale_catalog.rs @@ -4120,6 +4120,71 @@ pub(super) fn message_attribute(source: &str) -> Option<(&'static str, &'static "Pick box size" => Some(("common", "pick-box-size")), "Controls both the visible selection box and the click aperture." => Some(("common", "controls-both-the-visible-selection-box-and-the-click-aperture")), "Visual Effect Settings" => Some(("common", "visual-effect-settings")), + "Applications" => Some(("common", "applications")), + "Installed plugins and their sources" => Some(("common", "installed-plugins-and-their-sources")), + "Plugins…" => Some(("common", "plugins-2")), + "Keyboard shortcuts" => Some(("common", "keyboard-shortcuts-2")), + "Keyboard Shortcuts…" => Some(("common", "keyboard-shortcuts-3")), + "Command aliases" => Some(("common", "command-aliases-2")), + "Command Aliases…" => Some(("common", "command-aliases-3")), + "File Safety" => Some(("common", "file-safety")), + "Automatic save" => Some(("common", "automatic-save")), + "Minutes between recovery saves to a .sv$ file; 0 turns it off (SAVETIME)." => Some(("common", "minutes-between-recovery-saves-to-a-sv-file-0-turns-it-off-savetime")), + "Keep a .bak copy when overwriting a drawing (ISAVEBAK)" => Some(("common", "keep-a-bak-copy-when-overwriting-a-drawing-isavebak")), + "Plotting" => Some(("common", "plotting")), + "Plot device, paper, scale and plot styles" => Some(("common", "plot-device-paper-scale-and-plot-styles")), + "Plot and Page Setup…" => Some(("common", "plot-and-page-setup")), + "Fill TrueType glyphs (TEXTFILL)" => Some(("common", "fill-truetype-glyphs-textfill")), + "Command Line" => Some(("common", "command-line")), + "Prompt lines" => Some(("common", "prompt-lines")), + "Temporary prompt lines shown above the command window (CLIPROMPTLINES)." => Some(("common", "temporary-prompt-lines-shown-above-the-command-window-clipromptlines")), + "History fade time" => Some(("common", "history-fade-time")), + "How long overlay history lines stay visible; 0 skips them (COMMANDLINEFADETIME)." => Some(("common", "how-long-overlay-history-lines-stay-visible-0-skips-them-commandlinefadetime")), + "Clicking overlapping objects opens a picker" => Some(("common", "clicking-overlapping-objects-opens-a-picker")), + "Block Edit" => Some(("common", "block-edit")), + "Double-click to edit block in-place (REFEDIT)" => Some(("common", "double-click-to-edit-block-in-place-refedit")), + "Double-click attributed blocks to edit attributes (ATTEDIT)" => Some(("common", "double-click-attributed-blocks-to-edit-attributes-attedit")), + "User Preferences" => Some(("common", "user-preferences")), + "Zoom" => Some(("common", "zoom")), + "Reverse mouse wheel zoom (ZOOMWHEEL)" => Some(("common", "reverse-mouse-wheel-zoom-zoomwheel")), + "Zoom factor" => Some(("common", "zoom-factor")), + "How far one wheel notch zooms (ZOOMFACTOR)." => Some(("common", "how-far-one-wheel-notch-zooms-zoomfactor")), + "Text and Dimensions" => Some(("common", "text-and-dimensions")), + "TEXTEDIT edits one object and ends (TEXTEDITMODE)" => Some(("common", "textedit-edits-one-object-and-ends-texteditmode")), + "Continued dimensions inherit the base dimension's layer and style (DIMCONTINUEMODE)" => Some(("common", "continued-dimensions-inherit-the-base-dimension-s-layer-and-style-dimcontinuemode")), + "QDIM origin priority" => Some(("common", "qdim-origin-priority")), + "Which points QDIM measures from. Also settable inside the command." => Some(("common", "which-points-qdim-measures-from-also-settable-inside-the-command")), + "Add scales automatically" => Some(("common", "add-scales-automatically")), + "Which annotative objects pick up a newly set annotation scale (ANNOAUTOSCALE)." => Some(("common", "which-annotative-objects-pick-up-a-newly-set-annotation-scale-annoautoscale")), + "Length, angle and insertion units" => Some(("common", "length-angle-and-insertion-units")), + "Drawing Units…" => Some(("common", "drawing-units-2")), + "Drafting" => Some(("common", "drafting")), + "Drafting rotation" => Some(("common", "drafting-rotation")), + "Rotates the crosshair and the snap grid in the active UCS (SNAPANG)." => Some(("common", "rotates-the-crosshair-and-the-snap-grid-in-the-active-ucs-snapang")), + "Polar tracking increment" => Some(("common", "polar-tracking-increment")), + "Snap and Grid" => Some(("common", "snap-and-grid")), + "Snap modes, grid spacing and object snap" => Some(("common", "snap-modes-grid-spacing-and-object-snap")), + "Drafting Settings…" => Some(("common", "drafting-settings-2")), + "3D Modeling" => Some(("common", "modeling-3d")), + "Display Tools" => Some(("common", "display-tools")), + "Show the navigation cube (NAVVCUBE)" => Some(("common", "show-the-navigation-cube-navvcube")), + "Show the UCS icon (UCSICON)" => Some(("common", "show-the-ucs-icon-ucsicon")), + "Place the UCS icon at the origin (UCSICON ORigin)" => Some(("common", "place-the-ucs-icon-at-the-origin-ucsicon-origin")), + "Display Resolution" => Some(("common", "display-resolution")), + "applies to the current drawing" => Some(("common", "applies-to-the-current-drawing")), + "Isolines per surface" => Some(("common", "isolines-per-surface")), + "Show silhouette edges on solids (DISPSILH)" => Some(("common", "show-silhouette-edges-on-solids-dispsilh")), + "Surface density U" => Some(("common", "surface-density-u")), + "Surface density V" => Some(("common", "surface-density-v")), + "Surface type" => Some(("common", "surface-type")), + "Record the history of composite solids (SOLIDHIST)" => Some(("common", "record-the-history-of-composite-solids-solidhist")), + "Show solid history" => Some(("common", "show-solid-history")), + "Not available" => Some(("common", "not-available")), + "Open folder" => Some(("common", "open-folder")), + "Where the application keeps its own files. These locations are fixed." => Some(("common", "where-the-application-keeps-its-own-files-these-locations-are-fixed")), + "Configuration" => Some(("common", "configuration")), + "Plot styles" => Some(("common", "plot-styles")), + "Autosave files" => Some(("common", "autosave-files")), "Selection Modes" => Some(("common", "selection-modes")), "Use Shift to add to selection (PICKADD)" => Some(("common", "use-shift-to-add-to-selection-pickadd")), "Press and drag draws a rectangle instead of a lasso (PICKDRAG)" => Some(("common", "press-and-drag-draws-a-rectangle-instead-of-a-lasso-pickdrag")), From 4cc8e7db623b326f546547671d63a162cf4b47e7 Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 09:03:02 +0300 Subject: [PATCH 09/10] Fix four things the Options survey turned up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **TEXTFILL marked the drawing modified.** It is an application preference — it lives in a process global and is snapshotted into settings.json — but it was missing from the list of names that persist, so setting it dirtied the open drawing instead and never reached the settings file through that path. **LTSCALE and CELTSCALE validated differently depending on the door.** The standalone commands reject a value of zero or less, because a non-positive linetype scale degenerates every dash pattern in the drawing. `SETVAR LTSCALE -5` accepted it. A test drives both entry points for both variables and fails on the SETVAR path without the fix. **ISAVEBAK, SAVETIME and FILEASSOC were missing from the autocomplete registry** although all three dispatch, so the command line never offered them. **`bg_color` and `paper_bg_color` were dead fields**, always written as `None` and ignored on load since the model-space configuration superseded them. Removing them is safe: the config is `#[serde(default)]` and ignores unknown keys, so existing settings files simply stop carrying them. One thing the survey flagged that turned out not to be a bug: on the Display page the model background row hides itself outside Custom mode while the paper and desk rows do not. That asymmetry is correct — the canvas mode governs only the model background, and the other two apply in every mode. Co-Authored-By: Claude Opus 5 --- src/app/commands/mod.rs | 5 +++ src/app/commands/styleprops.rs | 56 ++++++++++++++++++++++++++++++++-- src/app/settings.rs | 8 ----- src/app/update/file.rs | 3 -- 4 files changed, 59 insertions(+), 13 deletions(-) diff --git a/src/app/commands/mod.rs b/src/app/commands/mod.rs index 8efa97d5b..3c6a00624 100644 --- a/src/app/commands/mod.rs +++ b/src/app/commands/mod.rs @@ -554,6 +554,11 @@ inventory::submit!(crate::command::CommandRegistration { "GRIPHOT", "GRIPHOVER", "GRIPOBJLIMIT", + // Dispatched all along, but absent from the registry, so command-line + // completion never offered them. + "ISAVEBAK", + "SAVETIME", + "FILEASSOC", // Reset selected entities' overrides to follow their layer. "SETBYLAYER", // Remove duplicate objects; set drawing base point; audit integrity; diff --git a/src/app/commands/styleprops.rs b/src/app/commands/styleprops.rs index 12128fa88..b99da19b4 100644 --- a/src/app/commands/styleprops.rs +++ b/src/app/commands/styleprops.rs @@ -1167,24 +1167,37 @@ impl OpenCADStudio { let outcome: Result<(String, bool), String> = { let h = &mut self.tabs[i].scene.document.header; match name.as_str() { + // The standalone LTSCALE and CELTSCALE commands + // require a positive value; reaching the same + // variable through SETVAR used to accept zero or a + // negative one, which degenerates every dash + // pattern in the drawing. "LTSCALE" => match &value { Some(v) => v .parse::() + .ok() + .filter(|x| x.is_finite() && *x > 0.0) .map(|x| { h.linetype_scale = x; (format!("LTSCALE = {x}"), true) }) - .map_err(|_| "SETVAR: numeric value required.".into()), + .ok_or_else(|| { + "SETVAR: positive numeric value required.".into() + }), None => Ok((format!("LTSCALE = {}", h.linetype_scale), false)), }, "CELTSCALE" => match &value { Some(v) => v .parse::() + .ok() + .filter(|x| x.is_finite() && *x > 0.0) .map(|x| { h.current_entity_linetype_scale = x; (format!("CELTSCALE = {x}"), true) }) - .map_err(|_| "SETVAR: numeric value required.".into()), + .ok_or_else(|| { + "SETVAR: positive numeric value required.".into() + }), None => Ok(( format!("CELTSCALE = {}", h.current_entity_linetype_scale), false, @@ -2156,6 +2169,12 @@ impl OpenCADStudio { | "GRIPHOVER" | "GRIPOBJLIMIT" | "DELOBJ" + // App-level, not part of the drawing: + // it lives in a process global and is + // snapshotted into the settings file. + // Without this it marked the drawing + // modified instead of persisting. + | "TEXTFILL" ) { self.persist_settings_if_changed(); } else { @@ -3144,3 +3163,36 @@ mod tests { assert_eq!(app.delete_objects, 3); } } + +#[cfg(test)] +mod scale_validation_tests { + use crate::app::OpenCADStudio; + + /// A linetype scale of zero or less degenerates every dash pattern in the + /// drawing, which is why the standalone commands reject it. Reaching the + /// same variable through SETVAR used to accept it, so which door you came + /// through decided whether the drawing could be broken. + #[test] + fn both_doors_to_ltscale_refuse_a_non_positive_value() { + for name in ["LTSCALE", "CELTSCALE"] { + for entry in [format!("{name} -5"), format!("SETVAR {name} -5")] { + let mut app = OpenCADStudio::new_for_test(); + app.automation_op(r#"{"op":"new"}"#); + let i = app.active_tab; + let before = if name == "LTSCALE" { + app.tabs[i].scene.document.header.linetype_scale + } else { + app.tabs[i].scene.document.header.current_entity_linetype_scale + }; + let _ = app.run_command_line(&entry); + let after = if name == "LTSCALE" { + app.tabs[i].scene.document.header.linetype_scale + } else { + app.tabs[i].scene.document.header.current_entity_linetype_scale + }; + assert_eq!(before, after, "{entry} must be refused"); + } + } + } +} + diff --git a/src/app/settings.rs b/src/app/settings.rs index 3032b0a60..9db2d574c 100644 --- a/src/app/settings.rs +++ b/src/app/settings.rs @@ -269,12 +269,6 @@ pub struct UserSettings { pub pick_drag_rect: bool, /// Show the floating Quick Properties panel when objects are selected. pub quick_properties: bool, - /// Persisted viewport background colours (0–255 RGB); `None` = app default - /// (dark grey model / off-white paper). Applied to every drawing tab on - /// launch and to tabs opened later, so a chosen background survives restarts - /// (#188). - pub bg_color: Option<[u8; 3]>, - pub paper_bg_color: Option<[u8; 3]>, /// Interface language preference. `System` negotiates against the /// platform locale on every launch. pub language: crate::i18n::Language, @@ -384,8 +378,6 @@ impl Default for UserSettings { pick_add: true, pick_drag_rect: false, quick_properties: false, - bg_color: None, - paper_bg_color: None, language: crate::i18n::Language::default(), cliprompt_lines: 3, commandline_fade_ms: 3000, diff --git a/src/app/update/file.rs b/src/app/update/file.rs index 86694f6b2..a98df8247 100644 --- a/src/app/update/file.rs +++ b/src/app/update/file.rs @@ -435,8 +435,6 @@ impl OpenCADStudio { pick_add: self.pick_add, pick_drag_rect: self.pick_drag_rect, quick_properties: self.quick_properties, - bg_color: None, - paper_bg_color: None, language: self.language, cliprompt_lines: crate::app::settings::clamp_clipromptlines(self.cliprompt_lines), commandline_fade_ms: crate::app::settings::clamp_commandline_fade_ms( @@ -516,7 +514,6 @@ impl OpenCADStudio { self.pick_add = s.pick_add; self.pick_drag_rect = s.pick_drag_rect; self.quick_properties = s.quick_properties; - // Legacy settings.bg_color / paper_bg_color are superseded by model_space config. if crate::i18n::set_language(s.language).is_ok() { self.language = s.language; } From 3093b631137e6b1c05b4fb6a005a82a71e194d3b Mon Sep 17 00:00:00 2001 From: Panos <25664832+mechpanos@users.noreply.github.com> Date: Thu, 10 Sep 2026 09:14:00 +0300 Subject: [PATCH 10/10] Stop the test suite reading and writing the developer's own settings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `new_for_test` was `Self::new()`, and `new` loads the real settings file. So every test ran against whatever the person running it had last set in the application. It surfaced as `a_selection_past_the_limit_gets_no_grips` failing on a machine where GRIPOBJLIMIT had been changed by hand: the test expected the default limit and got 32767. On a clean checkout, and in CI, it passes — which is the worst shape for this kind of bug. Tests now start from `AppConfig::default()`. That alone made things worse rather than better. The suite builds whole applications and changes preferences on them, and `AppConfig::save` writes to the real path, so a test run would have written *defaults* over the user's file where before it wrote back roughly what it had read. `save` is now inert under `cfg(test)`. Both halves matter: the first makes the suite deterministic, the second makes it harmless. This series adds around fifteen persisted settings, so every one of them was another way for a developer's own configuration to turn the suite red — or to be quietly overwritten by it. Co-Authored-By: Claude Opus 5 --- src/app/config.rs | 9 +++++++++ src/app/mod.rs | 11 ++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/app/config.rs b/src/app/config.rs index b22e28e70..6d1c8f0eb 100644 --- a/src/app/config.rs +++ b/src/app/config.rs @@ -460,7 +460,16 @@ impl AppConfig { /// Persist the config as JSON. Best-effort; silent on unavailable or /// read-only storage. + /// + /// Does nothing under `cfg(test)`. The path is the developer's own + /// settings file, and the suite builds whole applications and changes + /// preferences on them — without this, running `cargo test` rewrites the + /// settings of whoever ran it. pub fn save(&self) { + if cfg!(test) { + return; + } + #[cfg(not(target_arch = "wasm32"))] { let Some(path) = config_path() else { return }; diff --git a/src/app/mod.rs b/src/app/mod.rs index 9269c3b3d..eef45d546 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -3856,7 +3856,16 @@ impl OpenCADStudio { #[cfg(test)] pub(crate) fn new_for_test() -> Self { - Self::new() + let mut app = Self::new(); + // `new` loads the real settings file, so without this every test runs + // against whatever the developer last set in the application — a suite + // that passes on a clean machine and fails on a used one. It surfaced + // when a persisted `GRIPOBJLIMIT` made the grip-limit test see 32767 + // where it expected the default, and the number of persisted settings + // only grows. + app.apply_config(crate::app::config::AppConfig::default()); + app.last_saved_config = Some(app.current_config()); + app } /// Install `cmd` as the active interactive command for tab `tab`.