diff --git a/.github/workflows/build_orca.yml b/.github/workflows/build_orca.yml index 32aa726f5b..f29d7f0cc6 100644 --- a/.github/workflows/build_orca.yml +++ b/.github/workflows/build_orca.yml @@ -179,6 +179,13 @@ jobs: if: runner.os == 'macOS' && !inputs.macos-combine-only && !vars.SELF_HOSTED run: | df -hI / + # Deleting the unused Xcodes takes minutes, so only do it when the + # build might not fit. A cold build uses under 4 GiB after this step. + avail_gib=$(df -g / | awk 'NR == 2 { print $4 }') + if [ "$avail_gib" -ge 15 ]; then + echo "$avail_gib GiB free, enough for the build" + exit 0 + fi # Keep only the selected Xcode xcode=$(basename "$(cd "$(xcode-select -p)/../.." && pwd -P)") sudo find /Applications -maxdepth 1 -type d -name "Xcode_*.app" ! -name "$xcode" -exec rm -rf {} + diff --git a/README.md b/README.md index 408efb57b7..cf1b084e4c 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,8 @@ If you come across any of these in search results, please report them as Supports a broad range of printers: Bambu Lab, Prusa, Creality, Voron, and more. - **[Belt Printer Support](https://www.orcaslicer.com/wiki/belt_printing)** Slice for belt / conveyor (infinite-Z) printers, with belt-aware supports and a tilted-bed preview. Contributed by [Joseph Robertson (@HarrierPigeon)](https://github.com/HarrierPigeon). +- **[IDEX/IQEX Parallel Printing Support](https://www.orcaslicer.com/wiki/idex_iqex_parallel_printing)** + Print copies or mirror images of a part on every carriage of an IDEX or IQEX printer at once, with the mode chosen per plate and nozzle clearance zones shown on the bed. Contributed by [Clifford (@cgarwood82)](https://github.com/cgarwood82). - Additional features can be found in the [change notes](https://github.com/OrcaSlicer/OrcaSlicer/releases/). # Wiki diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index 7a4214f16d..21d6017c1c 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2021,10 +2021,11 @@ msgstr "" msgid "WebView2 Runtime" msgstr "" +#, possible-boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" #, possible-c-format, possible-boost-format @@ -4001,6 +4002,9 @@ msgstr "" msgid "AMS Materials Setting" msgstr "" +msgid "Wiki Guide" +msgstr "" + msgid "Close" msgstr "" @@ -4022,9 +4026,6 @@ msgstr "" msgid "Factors of Flow Dynamics Calibration" msgstr "" -msgid "Wiki Guide" -msgstr "" - msgid "PA Profile" msgstr "" @@ -4570,6 +4571,11 @@ msgstr "" msgid "Adjust" msgstr "" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5346,9 +5352,6 @@ msgstr "" msgid "Filament Grouping" msgstr "" -msgid "Why this grouping" -msgstr "" - msgid "Please place filaments on the printer based on grouping result." msgstr "" @@ -5529,6 +5532,43 @@ msgstr "" msgid "Sequence" msgstr "" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, possible-boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "" @@ -5737,6 +5777,12 @@ msgstr "" msgid "Labels" msgstr "" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + msgid "Move section plane" msgstr "" @@ -5779,7 +5825,7 @@ msgstr "" msgid "Size:" msgstr "" -#, possible-c-format, possible-boost-format +#, possible-boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "" @@ -6236,6 +6282,12 @@ msgstr "" msgid "Show Gridlines on plate" msgstr "" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "" @@ -7772,6 +7824,60 @@ msgstr "" msgid "Material settings" msgstr "" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "" @@ -7796,6 +7902,17 @@ msgstr "" msgid "Move plate to the front" msgstr "" +#, possible-boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, possible-boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "" @@ -7861,12 +7978,6 @@ msgstr "" msgid "Not installed" msgstr "" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "" - -msgid "Switch diameter" -msgstr "" - msgid "Configuration incompatible" msgstr "" @@ -7939,6 +8050,9 @@ msgstr "" msgid "Remove last mixed filament" msgstr "" +msgid "Remove all mixed filaments" +msgstr "" + msgid "Add mixed filament" msgstr "" @@ -7957,6 +8071,10 @@ msgstr "" msgid "Edit / Delete / Merge" msgstr "" +#, possible-boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "" @@ -8027,9 +8145,6 @@ msgstr "" msgid "Load 3MF" msgstr "" -msgid "BambuStudio Project" -msgstr "" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "" @@ -8059,17 +8174,6 @@ msgstr "" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "" -#, possible-c-format, possible-boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "" - -#, possible-c-format, possible-boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "" - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "" - msgid "Invalid values found in the 3MF:" msgstr "" @@ -8219,6 +8323,12 @@ msgstr "" msgid "Object with floating parts was detected" msgstr "" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "" @@ -8301,6 +8411,38 @@ msgstr "" msgid "Slicing Canceled" msgstr "" +#, possible-c-format, possible-boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "" @@ -8327,7 +8469,7 @@ msgstr "" msgid "Sync now" msgstr "" -msgid "Cannot undo or redo while an operation is running. Stop it first." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." msgstr "" msgid "" @@ -8389,6 +8531,11 @@ msgstr "" msgid "Project downloaded %d%%" msgstr "" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + msgid "Pressure Advance Test" msgstr "" @@ -8411,6 +8558,13 @@ msgstr "" msgid "Flowrate Test - Pass%d" msgstr "" +#, possible-boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + msgid "Nozzle temperature test" msgstr "" @@ -10575,6 +10729,9 @@ msgstr "" msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "" +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "" @@ -10960,6 +11117,12 @@ msgstr "" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "" +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, possible-boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -11070,9 +11233,24 @@ msgstr "" msgid "Wipe tower" msgstr "" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "" @@ -11082,6 +11260,18 @@ msgstr "" msgid "Z-Hop" msgstr "" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -11173,7 +11363,7 @@ msgid "Don't warn again for this preset" msgstr "" #, possible-c-format, possible-boost-format -msgid "%s: %s" +msgid "%s %s" msgstr "" msgid "No modifications need to be copied." @@ -11560,9 +11750,6 @@ msgstr "" msgid "Total ramming" msgstr "" -msgid "Volume" -msgstr "" - msgid "Ramming line" msgstr "" @@ -11610,6 +11797,118 @@ msgstr "" msgid "parse json failed" msgstr "" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +msgid "Custom Printer" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "" + +msgid "Vendor" +msgstr "" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "" + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "" + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + msgid "[Action Required] " msgstr "" @@ -12024,6 +12323,14 @@ msgstr "" msgid "No object can be printed. It may be too small." msgstr "" +#, possible-boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, possible-boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "" @@ -12183,6 +12490,26 @@ msgstr "" msgid "write callback failed" msgstr "" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, possible-boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, possible-boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, possible-boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "" @@ -12231,6 +12558,43 @@ msgstr "" msgid "No extrusions under current settings." msgstr "" +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, possible-boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "" @@ -12240,6 +12604,15 @@ msgstr "" msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "" +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "" @@ -12256,10 +12629,6 @@ msgstr "" msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "" -#, possible-boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "" - #, possible-boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "" @@ -12267,6 +12636,10 @@ msgstr "" msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "" +#, possible-boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "" + msgid "Variable layer height is not supported with Organic supports." msgstr "" @@ -13059,12 +13432,39 @@ msgstr "" msgid "This is the distance from the model to the outermost brim line." msgstr "" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "" +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "" @@ -14057,9 +14457,6 @@ msgstr "" msgid "money/kg" msgstr "" -msgid "Vendor" -msgstr "" - msgid "Vendor of filament. For show only." msgstr "" @@ -14121,6 +14518,65 @@ msgstr "" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "" +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +msgid "Linear" +msgstr "" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "" @@ -16133,6 +16589,99 @@ msgstr "" msgid "Use single nozzle to print multi filament." msgstr "" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "" @@ -16468,6 +17017,129 @@ msgstr "" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "" +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Z" +msgstr "" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "" @@ -16631,8 +17303,7 @@ msgstr "" msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" msgid "Center surface pattern on" @@ -16831,6 +17502,12 @@ msgstr "" msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "" +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "" @@ -17678,7 +18355,7 @@ msgstr "" msgid "Layer number" msgstr "" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." msgstr "" msgid "Layer Z" @@ -17818,9 +18495,6 @@ msgstr "" msgid "Calibrate" msgstr "" -msgid "Finish" -msgstr "" - msgid "How can I use calibration results?" msgstr "" @@ -18307,10 +18981,10 @@ msgid "" "Please verify the inputs." msgstr "" -msgid "Temperature calibration" +msgid "Not enabled yet on belt printers — use the PA Tower method instead." msgstr "" -msgid "Filament type" +msgid "Temperature calibration" msgstr "" msgid "PLA" @@ -18334,6 +19008,12 @@ msgstr "" msgid "PET-CF" msgstr "" +msgid "Test model" +msgstr "" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "" @@ -18426,9 +19106,6 @@ msgstr "" msgid "End retraction length: " msgstr "" -msgid "Test model" -msgstr "" - msgid "Ringing Tower" msgstr "" @@ -18832,9 +19509,6 @@ msgstr "" msgid "Filament Preset" msgstr "" -msgid "Create" -msgstr "" - msgid "Vendor is not selected; please reselect vendor." msgstr "" @@ -19110,6 +19784,9 @@ msgid "" "Can be shared with others." msgstr "" +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -19778,9 +20455,6 @@ msgstr "" msgid "Global settings" msgstr "" -msgid "Video tutorial" -msgstr "" - msgid "(Sync with printer)" msgstr "" @@ -20169,6 +20843,33 @@ msgstr "" msgid "PresetBundle" msgstr "" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "" @@ -20202,6 +20903,12 @@ msgstr "" msgid "ExportPresetBundle" msgstr "" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "" @@ -23594,165 +24301,6 @@ msgstr "" msgid "Size: %.1f × %.1f mm" msgstr "" -msgid "Primitive" -msgstr "" - -msgid "Empty mesh generated" -msgstr "" - -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "" - -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "" - -msgid "Width (X)" -msgstr "" - -msgid "Depth (Y)" -msgstr "" - -msgid "Height (Z)" -msgstr "" - -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "" - -msgid "Top R" -msgstr "" - -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "" - -msgid "Minor R" -msgstr "" - -msgid "All edges" -msgstr "" - -msgid "Top edges" -msgstr "" - -msgid "Bottom edges" -msgstr "" - -msgid "Lateral edges" -msgstr "" - -msgid "Mesh resolution" -msgstr "" - -msgid "Add Shape" -msgstr "" - -msgid "No outer profile" -msgstr "" - -msgid "Failed to make outer face" -msgstr "" - -msgid "Failed to build face with holes" -msgstr "" - -msgid "Revolve failed" -msgstr "" - -msgid "Profile" -msgstr "" - -msgid "Start new profile (for holes)" -msgstr "" - -msgid "Segments" -msgstr "" - -msgid "Sides" -msgstr "" - -msgid "Click on canvas to draw" -msgstr "" - -msgid "Snap to grid" -msgstr "" - -msgid "Grid step" -msgstr "" - -msgid "Outer" -msgstr "" - -msgid "closed" -msgstr "" - -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, possible-boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "" - -msgid "XY (Top)" -msgstr "" - -msgid "XZ (Front)" -msgstr "" - -msgid "YZ (Side)" -msgstr "" - -msgid "Revolve deg" -msgstr "" - -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "" - -msgid "Pocket (cut)" -msgstr "" - -#, possible-c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "" -msgstr[1] "" - -msgid "Draw a closed profile to enable" -msgstr "" - -msgid "Clear all" -msgstr "" - -msgid "Empty result" -msgstr "" - -#, possible-boost-format -msgid "Extrude: %1%" -msgstr "" - -#, possible-boost-format -msgid "Revolve: %1%" -msgstr "" - -msgid "No object selected" -msgstr "" - -msgid "Face failed" -msgstr "" - -msgid "Face with holes failed" -msgstr "" - -msgid "Tool mesh empty" -msgstr "" - -msgid "Pocket added (negative volume)" -msgstr "" - -#, possible-boost-format -msgid "Pocket: %1%" -msgstr "" - msgctxt "Keyboard Shortcut" msgid "Ins" msgstr "" @@ -23861,6 +24409,9 @@ msgstr "" msgid "Gizmo brim ears" msgstr "" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "" @@ -24622,9 +25173,6 @@ msgstr "" msgid "Custom Printer Setup" msgstr "" -msgid "Custom Printer" -msgstr "" - msgid "Define a custom printer profile" msgstr "" @@ -25110,7 +25658,7 @@ msgstr "" msgid "Click a triangle to paint it" msgstr "" -msgid "Needs the active layer mapped with Unwrap (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." msgstr "" msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -25122,13 +25670,13 @@ msgstr "" msgid "Checker" msgstr "" -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" msgstr "" msgid "Distortion" msgstr "" -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" msgstr "" msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -25215,17 +25763,10 @@ msgstr "" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "" -msgid "Mix by" +msgid "Mixed colors" msgstr "" -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "" - -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" #, possible-boost-format @@ -25575,12 +26116,6 @@ msgstr "" msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "" -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "" - -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "" - msgid "Preparing..." msgstr "" @@ -25599,6 +26134,12 @@ msgstr "" msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "" +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "" + +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "" + #, possible-boost-format msgid "%1% k" msgstr "" @@ -25764,6 +26305,27 @@ msgstr "" msgid "Printer plugins" msgstr "" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +msgid "Restore defaults" +msgstr "" + +msgid "Invalid JSON" +msgstr "" + msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "" @@ -25777,9 +26339,6 @@ msgid "" "This discards the preset's override and uses the global configuration." msgstr "" -msgid "Restore defaults" -msgstr "" - msgid "Using global configuration. Save the preset to persist it." msgstr "" @@ -25831,6 +26390,215 @@ msgstr "" msgid "Installed \"%s\"." msgstr "" +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Run \"%s\"" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + #, possible-c-format, possible-boost-format msgid "Failed to activate \"%s\"." msgstr "" @@ -25989,6 +26757,54 @@ msgstr "" msgid "Reloaded \"%s\"." msgstr "" +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + msgid "Purge Mode Settings" msgstr "" @@ -26007,6 +26823,16 @@ msgstr "" msgid "Terminal" msgstr "" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Process exited with code: %s" +msgstr "" + msgid "A command is already running." msgstr "" @@ -26208,6 +27034,9 @@ msgstr "" msgid "Change texture - choose another one from the texture library" msgstr "" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + msgid "Height map - show the layer's texture under the islands" msgstr "" @@ -26232,13 +27061,13 @@ msgstr "" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "" -msgid "Island - move, rotate and scale whole islands" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." msgstr "" -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." msgstr "" -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." msgstr "" msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -26268,7 +27097,12 @@ msgstr "" msgid "Snap - stick islands together when dragging one against another" msgstr "" -msgid "Frame all islands (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." msgstr "" msgid "No layer mapped with Unwrap" @@ -26278,20 +27112,53 @@ msgstr "" msgid "%.1f mm tile" msgstr "" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "" msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "" +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + #, possible-c-format, possible-boost-format msgid "%d islands, %s faces" msgstr "" -msgid "Forward" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." msgstr "" -msgid "Tools" +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + +msgid "Forward" msgstr "" msgid "View Source" @@ -26397,6 +27264,16 @@ msgid "" "%s" msgstr "" +#, possible-c-format, possible-boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + #, possible-c-format, possible-boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." msgstr "" @@ -26404,6 +27281,30 @@ msgstr "" msgid "Plugin permission request" msgstr "" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "" diff --git a/localization/i18n/ca/OrcaSlicer_ca.po b/localization/i18n/ca/OrcaSlicer_ca.po index b54974f840..f07272fd45 100644 --- a/localization/i18n/ca/OrcaSlicer_ca.po +++ b/localization/i18n/ca/OrcaSlicer_ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2025-03-15 10:55+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -2190,15 +2190,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"No s'ha pogut instal·lar el Microsoft WebView2 Runtime.\n" -"Algunes funcions, com ara l'auxiliar de configuració, poden aparèixer en blanc fins que estigui instal·lat.\n" -"Instal·leu-lo manualment des de https://developer.microsoft.com/microsoft-edge/webview2/ i reinicieu Orca Slicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4381,6 +4378,9 @@ msgstr "Anar a la placa" msgid "AMS Materials Setting" msgstr "Configuració de materials AMS" +msgid "Wiki Guide" +msgstr "Guia Wiki" + msgid "Close" msgstr "Tancar" @@ -4402,9 +4402,6 @@ msgstr "El valor d'entrada ha de ser superior a %1% i inferior a %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "Factors de Calibratge de les Dinàmiques de Flux" -msgid "Wiki Guide" -msgstr "Guia Wiki" - msgid "PA Profile" msgstr "Perfil PA( Pressure Advance )" @@ -4495,7 +4492,7 @@ msgstr "Desar" msgctxt "Navigation" msgid "Back" -msgstr "Darrera" +msgstr "Enrere" msgid "Example" msgstr "Exemple" @@ -4998,6 +4995,11 @@ msgstr "Voleu ajustar-la automàticament al límit (%g mm)?" msgid "Adjust" msgstr "Ajustar" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5839,9 +5841,6 @@ msgstr "Torna a tallar automàticament segons l'agrupació de filaments òptima; msgid "Filament Grouping" msgstr "Agrupació de filaments" -msgid "Why this grouping" -msgstr "Per què aquesta agrupació" - msgid "Please place filaments on the printer based on grouping result." msgstr "Col·loqueu els filaments a la impressora segons el resultat de l'agrupació." @@ -6032,6 +6031,43 @@ msgstr "Incrementar/reduir àrea edició" msgid "Sequence" msgstr "Seqüència" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Volum" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Selecció d'objecte" @@ -6248,6 +6284,12 @@ msgstr "Línies de la graella" msgid "Labels" msgstr "Etiquetes" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Moure el pla de secció" @@ -6297,7 +6339,7 @@ msgid "Size:" msgstr "Mida:" # AI Translated -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "S'han trobat conflictes de rutes de G-code a la capa %d, Z = %.2lfmm. Si us plau, separeu els objectes conflictius més lluny ( %s <-> %s )." @@ -6770,6 +6812,12 @@ msgstr "Mostra les línies de la graella" msgid "Show Gridlines on plate" msgstr "Mostra les línies de la graella a la placa" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Restableix el disseny de la finestra" @@ -8475,6 +8523,61 @@ msgstr "Veure tots els paràmetres de l'objecte" msgid "Material settings" msgstr "Configuració del Material" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Eines" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Treure la placa actual ( si no és l'última )" @@ -8499,6 +8602,17 @@ msgstr "Editar el nom de la placa actual" msgid "Move plate to the front" msgstr "Mou la placa cap al davant" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Personalitzar la placa actual" @@ -8565,12 +8679,6 @@ msgstr "AMS (1 ranura)" msgid "Not installed" msgstr "No instal·lat" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "El programari no admet l'ús de broquets de diàmetre diferent per a una impressió. Si els broquets esquerre i dret són inconsistents, només podem procedir amb impressió de capçal únic. Confirmeu quin broquet voleu utilitzar per a aquest projecte." - -msgid "Switch diameter" -msgstr "Canvia el diàmetre" - msgid "Configuration incompatible" msgstr "Configuració incompatible" @@ -8653,6 +8761,9 @@ msgstr "Filament mixt" msgid "Remove last mixed filament" msgstr "Eliminar l'últim filament mixt" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Afegir filament mixt" @@ -8676,6 +8787,10 @@ msgstr "El filament mixt té referències de components trencades" msgid "Edit / Delete / Merge" msgstr "Editar / Esborrar / Fusionar" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "El filament mixt de destinació utilitza aquest filament físic com a component. En fusionar-los s'eliminarà aquest filament físic i el filament mixt pot quedar no vàlid. Voleu continuar?" @@ -8750,10 +8865,6 @@ msgstr "Carregant fitxer: %s" msgid "Load 3MF" msgstr "Carregar 3MF" -# AI Translated -msgid "BambuStudio Project" -msgstr "Projecte de BambuStudio" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "El 3MF no és compatible amb OrcaSlicer, només carrega dades de geometria." @@ -8785,20 +8896,6 @@ msgstr "És millor que actualitzeu el vostre programari.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "La versió de 3MF %s és més nova que la versió de %s %s, es suggereix que actualitzis el teu programari." -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "El 3MF s'ha creat amb BambuStudio (versió %s), que és més recent que la versió compatible %s. S'han trobat opcions no reconegudes:" - -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "El 3MF s'ha creat amb BambuStudio (versió %s), que és més recent que la versió compatible %s. És possible que algunes opcions no siguin totalment compatibles." - -# AI Translated -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "El 3MF s'ha creat amb BambuStudio. És possible que algunes opcions difereixin de les d'OrcaSlicer." - msgid "Invalid values found in the 3MF:" msgstr "Valors no vàlids trobats en el 3MF:" @@ -8970,6 +9067,12 @@ msgstr "Voleu desactivar la caiguda automàtica per conservar el posicionament e msgid "Object with floating parts was detected" msgstr "S'ha detectat un objecte amb peces flotants" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "S'està executant un altre treball d'exportació." @@ -9054,6 +9157,38 @@ msgstr "Les dades no són vàlides" msgid "Slicing Canceled" msgstr "Laminat cancel·lat" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Connector de xarxa canviat correctament." @@ -9085,9 +9220,8 @@ msgstr "" msgid "Sync now" msgstr "Sincronitza ara" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "No es pot desfer ni refer mentre s'executa una operació. Atureu-la primer." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9158,6 +9292,11 @@ msgstr "S'ha produït un error en la baixada, excepció mida del Fitxer." msgid "Project downloaded %d%%" msgstr "Projecte descarregat %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Prova de Pressure Advance" @@ -9184,6 +9323,13 @@ msgstr "Calibratge de flux YOLO d'Orca" msgid "Flowrate Test - Pass%d" msgstr "Prova de relació de flux - Passada %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Prova de temperatura del broquet" @@ -11681,6 +11827,9 @@ msgstr "No s'admet la sincronització entre transmissions d'extrusor diferents n msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Sincronitza la modificació de paràmetres amb els paràmetres corresponents d'un altre extrusor." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Feu clic per restablir tots els paràmetres a l'última configuració desada." @@ -12100,6 +12249,12 @@ msgstr "Espai imprimible" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Seleccioneu la implementació de l'agent de xarxa per a la comunicació amb la impressora. Els agents disponibles es registren a l'inici." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12218,9 +12373,24 @@ msgstr "Diàmetre del broquet( nozzle )" msgid "Wipe tower" msgstr "Torre de Purga" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Paràmetres d'extrusor únic multimaterial" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Aquesta és una impressora de múltiples materials amb un sol extrusor, i els diàmetres de tots els extrusors es configuraran amb el nou valor. Vols continuar?" @@ -12230,6 +12400,18 @@ msgstr "Límits d'alçada de capa" msgid "Z-Hop" msgstr "Z-Hop" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12343,10 +12525,9 @@ msgstr "Continua" msgid "Don't warn again for this preset" msgstr "No tornar a avisar per a aquest perfil" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12778,9 +12959,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Empenta total" -msgid "Volume" -msgstr "Volum" - msgid "Ramming line" msgstr "Línia d'empenta" @@ -12831,6 +13009,119 @@ msgstr "L'inici de sessió ha fallat. Torneu-ho a provar." msgid "parse json failed" msgstr "l'anàlisi del json ha fallat" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "Benvingut a Orca Slicer" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer es configurarà en diversos passos. Comencem!" + +msgid "Get Started" +msgstr "Comença" + +msgid "Please select your login region" +msgstr "Si us plau selecciona la teva regió d'inici de sessió" + +msgid "Finish" +msgstr "Acabar" + +msgid "Printer Selection" +msgstr "Selecció d'Impressora" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Impressora personalitzada" + +msgid "Create" +msgstr "Crear" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "S'ha de seleccionar almenys una impressora." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Selecció de Filament" + +msgid "System Filaments" +msgstr "Filaments del Sistema" + +msgid "Custom Filaments" +msgstr "Filaments Personalitzats" + +msgid "Create New" +msgstr "Crear Nou" + +msgid "Filament type" +msgstr "Tipus de filament" + +msgid "Vendor" +msgstr "Fabricant" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "Netejar tot" + +msgid "At least one filament must be selected." +msgstr "S'ha de seleccionar almenys un filament." + +msgid "Do you want to use the default filament?" +msgstr "Vols utilitzar el filament per defecte?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Això desactiva totes les funcions al núvol, inclosa la sincronització de perfils amb Orca Cloud. Els usuaris que prefereixin treballar completament fora de línia poden activar aquesta opció." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Nota: quan el Mode Sigil·lós està activat, no es farà cap còpia de seguretat dels vostres perfils d'usuari a Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "Connectors propietaris" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "Alguns proveïdors d'impressora requereixen connectors propietaris per comunicar-se amb les seves impressores. Si us plau selecciona el connector corresponent si utilitzes aquestes impressores." + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "Tingues en compte que aquests connectors no són desenvolupats ni mantinguts per OrcaSlicer. S'han d'utilitzar a la teva discreció i risc." + +msgid "Install Bambu Network plug-in" +msgstr "Instal·lar connector Bambu Network" + msgid "[Action Required] " msgstr "[Acció necessària] " @@ -13300,6 +13591,14 @@ msgstr "G-code de canvi de rol d'extrusió del filament" msgid "No object can be printed. It may be too small." msgstr "No es pot imprimir cap objecte. Potser que sigui massa petit" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "La teva impressió és molt a prop de les regions de purga. Assegureu-vos que no hi ha col·lisions." @@ -13476,6 +13775,26 @@ msgstr "ha fallat la validació" msgid "write callback failed" msgstr "la trucada de recuperació de l'escriptura ha fallat" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% està massa a prop de l'àrea d'exclusió, pot haver-hi col·lisions en imprimir." @@ -13529,6 +13848,43 @@ msgstr "Si tot i així voleu imprimir, podeu activar l'opció a Preferències / msgid "No extrusions under current settings." msgstr "No hi ha extrusions a la configuració actual." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "S'està utilitzant un filament mixt amb degradat, però 'Subcapa de color mixt' està desactivat. El degradat no s'imprimirà." @@ -13539,6 +13895,15 @@ msgstr "El mode suau de timelapse no està permès quan la seqüència \"Per obj msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "La detecció d'acumulació no és compatible quan la seqüència \"per objecte\" està activada." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Activar tant l'alçada Z precisa com la torre de purga pot causar errors de tall." @@ -13555,10 +13920,6 @@ msgstr "El mode Gerro en Espiral no funciona quan un objecte conté més d'un ma msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Tot i que l'objecte %1% s'adapta al volum de construcció, la seva última capa supera l'alçada màxima del volum de construcció." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "L'objecte %1% supera l'alçada màxima del volum de construcció." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Tot i que l'objecte %1% s'adapta al volum de construcció, la seva última capa supera l'alçada màxima del volum de construcció." @@ -13566,6 +13927,10 @@ msgstr "Tot i que l'objecte %1% s'adapta al volum de construcció, la seva últi msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Potser voleu reduir la mida del model o canviar la configuració d'impressió actual i tornar-ho a provar." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "L'objecte %1% supera l'alçada màxima del volum de construcció." + msgid "Variable layer height is not supported with Organic supports." msgstr "Alçada de Capa Variable no és compatible amb suports Orgànics." @@ -14544,12 +14909,39 @@ msgstr "Velocitat dels ponts interns. Si el valor s'expressa com un percentatge, msgid "This is the distance from the model to the outermost brim line." msgstr "Distància del model a la línia de la Vora d'Adherència més exterior" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Tipus de Vora d'Adherència" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Això controla la generació de la vora d'adherència al costat extern i/o intern dels models. 'Automàtic' vol dir que l'amplada de la vora d'adherència s'analitza i es calcula automàticament." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Espai entre la Vora d'Adherència i l'objecte" @@ -15750,9 +16142,6 @@ msgstr "Preu del filament. Només per a estadístiques" msgid "money/kg" msgstr "diners/kg" -msgid "Vendor" -msgstr "Fabricant" - msgid "Vendor of filament. For show only." msgstr "Fabricant del filament. Només per a mostrar" @@ -15826,6 +16215,66 @@ msgstr "Farciment multilínia" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Ús de múltiples línies per al patró de farciment, si el patró de farciment ho admet." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Lineal" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Optimització del biaix de vinclament en Z (experimental)" @@ -18107,6 +18556,99 @@ msgstr "Extrusor únic multimaterial" msgid "Use single nozzle to print multi filament." msgstr "Utilitza un sol broquet per imprimir multifilament" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Canvi manual de filament" @@ -18489,6 +19031,130 @@ msgstr "Superposició de llindars" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Si l'angle del llindar és zero, es generarà suport per als voladissos el solapament dels quals estigui per sota del llindar. Com més petit sigui aquest valor, més inclinat serà el voladí que es pot imprimir sense suport." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Angle de branca de suport en arbre" @@ -18668,17 +19334,11 @@ msgstr "El nombre de capes sòlides superiors augmenta quan es tallen si el grui msgid "Separated infills" msgstr "Farciments separats" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Centra el farciment intern de cada peça sobre si mateixa, com si es laminés per separat, en lloc de sobre tot el conjunt. Les peces que es toquen o se superposen es tracten com un sol cos i comparteixen centre; les peces separades (o objectes 3D diferents) tenen cadascuna el seu.\n" -"Útil quan un conjunt agrupa diversos objectes que han de mantenir cadascun un farciment coherent i centrat en si mateix.\n" -"Afecta els patrons de línia i de graella i els farciments amb plantilla de rotació.\n" -"Els patrons vinculats a coordenades globals (Giroide, Panal d'abella, TPMS, ...) no es veuen afectats." # AI Translated msgid "Center surface pattern on" @@ -18912,6 +19572,12 @@ msgstr "La purga després del canvi de filament es farà dins del suport dels ob msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Aquest objecte s'utilitzarà per purgar el broquet després d'un canvi de filament per estalviar filament i disminuir el temps d'impressió. Com a resultat, es barrejaran els colors dels objectes. No tindrà cap efecte, tret que s'habiliti la Torre de Purga." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Distància màxima dels ponts" @@ -19823,8 +20489,8 @@ msgstr "Nom de la impressora física utilitzada per laminar." msgid "Layer number" msgstr "Número de capa" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Índex de la capa actual. Basat en 1( és a dir, la primera capa és el número 1 )." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Capa Z" @@ -19968,9 +20634,6 @@ msgstr "Recalibratge" msgid "Calibrate" msgstr "Calibrar" -msgid "Finish" -msgstr "Acabar" - msgid "How can I use calibration results?" msgstr "Com usar el resultat del calibratge?" @@ -20512,12 +21175,12 @@ msgstr "" "Els valors d'acceleració han de ser superiors als valors de velocitat.\n" "Verifiqueu les entrades." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Calibratge de temperatura" -msgid "Filament type" -msgstr "Tipus de filament" - msgid "PLA" msgstr "PLA" @@ -20539,6 +21202,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Model de test" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Temperatura Inicial: " @@ -20664,9 +21333,6 @@ msgstr "Longitud de la retracció d'inici: " msgid "End retraction length: " msgstr "Longitud de la retracció final: " -msgid "Test model" -msgstr "Model de test" - msgid "Ringing Tower" msgstr "Torre de Ringing" @@ -21117,9 +21783,6 @@ msgstr "per exemple, Bàsic, Mat, Seda, Marbre" msgid "Filament Preset" msgstr "Perfil de Filament" -msgid "Create" -msgstr "Crear" - msgid "Vendor is not selected; please reselect vendor." msgstr "El proveïdor no està seleccionat, torneu a seleccionar el proveïdor." @@ -21434,6 +22097,9 @@ msgstr "" "Impressora i tots els perfils de filament i de procés que pertanyen a la impressora.\n" "Es pot compartir amb altres persones." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -22198,10 +22864,6 @@ msgstr "Assigneu manualment el filament al broquet esquerre o dret" msgid "Global settings" msgstr "Configuració global" -# AI Translated -msgid "Video tutorial" -msgstr "Tutorial en vídeo" - msgid "(Sync with printer)" msgstr "(Sincronitza amb la impressora)" @@ -22645,6 +23307,33 @@ msgstr "Si s'activa, els valors anteriors es desen com a valors per defecte per msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "La carpeta del paquet no existeix." @@ -22689,6 +23378,12 @@ msgstr "Cancel·lar la subscripció al paquet" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "Desar el paquet de perfils" @@ -27127,214 +27822,6 @@ msgstr "Aquest tipus de lletra no té contorn per a aquest text" msgid "Size: %.1f × %.1f mm" msgstr "Mida: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitiva" - -# AI Translated -msgid "Empty mesh generated" -msgstr "S'ha generat una malla buida" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Caixa" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Ràpid:" - -# AI Translated -msgid "Width (X)" -msgstr "Amplada (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Profunditat (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Alçada (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R inferior" - -# AI Translated -msgid "Top R" -msgstr "R superior" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "R major" - -# AI Translated -msgid "Minor R" -msgstr "R menor" - -# AI Translated -msgid "All edges" -msgstr "Totes les arestes" - -# AI Translated -msgid "Top edges" -msgstr "Arestes superiors" - -# AI Translated -msgid "Bottom edges" -msgstr "Arestes inferiors" - -# AI Translated -msgid "Lateral edges" -msgstr "Arestes laterals" - -# AI Translated -msgid "Mesh resolution" -msgstr "Resolució de la malla" - -# AI Translated -msgid "Add Shape" -msgstr "Afegir forma" - -# AI Translated -msgid "No outer profile" -msgstr "No hi ha cap perfil exterior" - -# AI Translated -msgid "Failed to make outer face" -msgstr "No s'ha pogut crear la cara exterior" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "No s'ha pogut construir la cara amb forats" - -# AI Translated -msgid "Revolve failed" -msgstr "La revolució ha fallat" - -# AI Translated -msgid "Profile" -msgstr "Perfil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Començar un perfil nou (per a forats)" - -# AI Translated -msgid "Segments" -msgstr "Segments" - -# AI Translated -msgid "Sides" -msgstr "Costats" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Feu clic al llenç per dibuixar" - -# AI Translated -msgid "Snap to grid" -msgstr "Ajustar a la graella" - -# AI Translated -msgid "Grid step" -msgstr "Pas de la graella" - -# AI Translated -msgid "Outer" -msgstr "Exterior" - -# AI Translated -msgid "closed" -msgstr "tancat" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% punts %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Superior)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Frontal)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Lateral)" - -# AI Translated -msgid "Revolve deg" -msgstr "Graus de revolució" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Establiu 0 per a extrusió, >0 per a revolució" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Cavitat (tall)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu perfil tancat" -msgstr[1] "%zu perfils tancats" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Dibuixeu un perfil tancat per activar-ho" - -# AI Translated -msgid "Clear all" -msgstr "Esborrar-ho tot" - -# AI Translated -msgid "Empty result" -msgstr "Resultat buit" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Extrusió: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Revolució: %1%" - -# AI Translated -msgid "No object selected" -msgstr "No hi ha cap objecte seleccionat" - -# AI Translated -msgid "Face failed" -msgstr "No s'ha pogut crear la cara" - -# AI Translated -msgid "Face with holes failed" -msgstr "No s'ha pogut crear la cara amb forats" - -# AI Translated -msgid "Tool mesh empty" -msgstr "La malla de l'eina és buida" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Cavitat afegida (volum negatiu)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Cavitat: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27457,6 +27944,9 @@ msgstr "Gizmo ensamblar" msgid "Gizmo brim ears" msgstr "Gizmo orelles de la Vora d'Adherència" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Barra de desplaçament Vertical - Mou el barra de desplaçament actiu cap Amunt" @@ -28439,10 +28929,6 @@ msgstr "La meva configuració" msgid "Custom Printer Setup" msgstr "Configuració d'impressora personalitzada" -# AI Translated -msgid "Custom Printer" -msgstr "Impressora personalitzada" - # AI Translated msgid "Define a custom printer profile" msgstr "Definir un perfil d'impressora personalitzat" @@ -29087,9 +29573,8 @@ msgstr "Llindar d'angle - l'emplenament s'atura a les arestes més agudes que aq msgid "Click a triangle to paint it" msgstr "Feu clic a un triangle per pintar-lo" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Cal que la capa activa estigui mapada amb Desplegar (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -29103,17 +29588,15 @@ msgstr "Ràpid - el relleu només s'ombreja, no es construeix, i només per a la msgid "Checker" msgstr "Escaquer" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Escaquer - una quadrícula de prova en lloc de la textura. On els quadrats es mantenen quadrats, la textura no es distorsiona; on s'estiren, també s'estirarà la textura" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Distorsió" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Distorsió - mapa de calor de l'estirament, de blau a vermell, sobre el desplegament" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -29229,24 +29712,11 @@ msgstr "Barrejar filaments" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Intercala dos filaments per simular els colors intermedis, de manera que uns quants filaments poden cobrir una foto o un degradat. Una imatge de colors plans s'imprimeix igual en tots dos casos. Desactivat, utilitza un filament per àrea." -# AI Translated -msgid "Mix by" -msgstr "Barrejar per" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Superfície" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Capes: els dos filaments s'alternen entre capes d'impressió, cosa que es fon suaument a les superfícies verticals però desapareix a les horitzontals, on una capa sencera és una sola franja.\n" -"Superfície: un escaquer fi a través de la superfície, que funciona amb qualsevol angle però es pot percebre com una textura en lloc d'una barreja.\n" -"Automàtic: capes a les cares verticals; les cares horitzontals prenen el filament únic més proper, ja que un escaquer s'hi veu com un patró." # AI Translated #, boost-format @@ -29706,14 +30176,6 @@ msgstr "Calen uns %1% triangles, pressupost %2% - la fixació simplificarà la m msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Quants milers de triangles pot afegir el refinament al model. Sempre es divideix primer el triangle que s'ajusta pitjor, de manera que fins i tot una execució que ho gasta tot ho ha gastat on més es nota. Augmenteu-lo si el relleu encara es veu tosc." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Atura la fixació. El que ja s'hagi completat es queda al model i es pot desfer." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Tanca l'eina sense fixar. La pintura, les capes i els paràmetres es queden amb el model." - # AI Translated msgid "Preparing..." msgstr "Preparant..." @@ -29738,6 +30200,14 @@ msgstr "Converteix els mapes d'alçades pintats en geometria real, movent els v msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Converteix els mapes d'alçades pintats en geometria real. Primer la malla es remalla a una densitat uniforme i es refina on la textura es corba, perquè el detall tingui vèrtexs on caure - tot en un sol pas." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Atura la fixació. El que ja s'hagi completat es queda al model i es pot desfer." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Tanca l'eina sense fixar. La pintura, les capes i els paràmetres es queden amb el model." + # AI Translated #, boost-format msgid "%1% k" @@ -29954,6 +30424,28 @@ msgstr "Connectors de filament" msgid "Printer plugins" msgstr "Connectors d'impressora" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Restaurar els valors predeterminats" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "La configuració no és un JSON vàlid. Els canvis no s'han desat." @@ -29973,10 +30465,6 @@ msgstr "" "\n" "Això descarta la substitució del perfil i utilitza la configuració global." -# AI Translated -msgid "Restore defaults" -msgstr "Restaurar els valors predeterminats" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "S'utilitza la configuració global. Deseu el perfil perquè es conservi." @@ -30046,6 +30534,215 @@ msgstr "Instal·lant el connector" msgid "Installed \"%s\"." msgstr "S'ha instal·lat \"%s\"." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -30262,6 +30959,54 @@ msgstr "No s'ha pogut tornar a carregar el connector." msgid "Reloaded \"%s\"." msgstr "S'ha tornat a carregar \"%s\"." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "No hi ha informació del model" + +msgid "Edit Project Info" +msgstr "Editar Informació del Projecte" + +msgid "Model Information" +msgstr "Informació del Model" + +msgid "Accessories" +msgstr "Accessoris" + +msgid "Profile Information" +msgstr "Informació del Perfil" + +msgid "Model name" +msgstr "Nom del model" + +msgid "Created by" +msgstr "Creat per" + +msgid "Remixed by" +msgstr "Remesclat per" + +msgid "Shared by" +msgstr "Compartit per" + +msgid "Model description" +msgstr "Descripció del model" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "Nom del perfil" + +msgid "Profile Author" +msgstr "Autor del perfil" + +msgid "Profile description" +msgstr "Descripció del perfil" + # AI Translated msgid "Purge Mode Settings" msgstr "Paràmetres del mode de purga" @@ -30286,6 +31031,16 @@ msgstr "Redueix els residus de purga i imprimeix més ràpid. Pot causar una lle msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Ja s'està executant una ordre." @@ -30552,6 +31307,9 @@ msgstr " | acoblament ACTIVAT" msgid "Change texture - choose another one from the texture library" msgstr "Canviar la textura - trieu-ne una altra de la biblioteca de textures" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Mapa d'alçades - mostra la textura de la capa sota les illes" @@ -30584,17 +31342,14 @@ msgstr "Connectar les illes" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Distribueix el desplegament com una xarxa connectada: les peces que comparteixen una aresta es despleguen l'una al costat de l'altra (un cub es converteix en una xarxa unida en lloc de sis quadrats solts). Continuen sent illes separades, així que després encara podeu moure qualsevol d'elles a mà." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Illa - moure, girar i escalar illes senceres" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Vèrtex - arrossegueu els vèrtexs per canviar la forma; Màj/Ctrl per a la selecció múltiple" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Aresta - arrossegueu les arestes per canviar la forma; Màj/Ctrl per a la selecció múltiple" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30632,9 +31387,13 @@ msgstr "Esborrar les edicions UV - descarta tots els moviments manuals de vèrte msgid "Snap - stick islands together when dragging one against another" msgstr "Acoblar - enganxa les illes entre si en arrossegar-ne una contra una altra" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Enquadrar totes les illes (Inici)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30645,6 +31404,9 @@ msgstr "Cap capa mapada amb Desplegar" msgid "%.1f mm tile" msgstr "Tessel·la de %.1f mm" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Desactualitzat - la pintura, les costures o l'angle de costura han canviat des que es va fer aquest desplegament. Premeu per tornar a desplegar." @@ -30653,19 +31415,48 @@ msgstr "Desactualitzat - la pintura, les costures o l'angle de costura han canvi msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Aplana l'àrea pintada en illes UV. Només es calcula quan premeu aquest botó, no a cada edició - així que primer pinteu, canvieu l'angle de costura o marqueu costures, i després premeu Desplegar." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d illes, %s cares" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "No s'ha detectat el connector Bambu Network. Fes clic aquí per instal·lar-lo." + +msgid "Create new project" +msgstr "Crear nou projecte" + +msgid "Recently opened" +msgstr "Obert recentment" + +msgid "Open Containing Folder" +msgstr "Obrir Carpeta Contenidora" + # AI Translated msgid "Forward" msgstr "Endavant" -# AI Translated -msgid "Tools" -msgstr "Eines" - # AI Translated msgid "View Source" msgstr "Veure el codi font" @@ -30811,6 +31602,16 @@ msgstr "" "El connector \"%s\" sol·licita executar les ordres següents:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30820,6 +31621,30 @@ msgstr "El connector \"%s\" sol·licita permís per a l'esdeveniment d'auditoria msgid "Plugin permission request" msgstr "Sol·licitud de permís del connector" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "La interfície de configuració del connector era buida. Es mostra l'editor predeterminat." @@ -31407,6 +32232,317 @@ msgstr "" "Evitar la deformació( warping )\n" "Sabíeu que quan imprimiu materials propensos a deformar-se, com ara l'ABS, augmentar adequadament la temperatura del llit pot reduir la probabilitat de deformació?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "No s'ha pogut instal·lar el Microsoft WebView2 Runtime.\n" +#~ "Algunes funcions, com ara l'auxiliar de configuració, poden aparèixer en blanc fins que estigui instal·lat.\n" +#~ "Instal·leu-lo manualment des de https://developer.microsoft.com/microsoft-edge/webview2/ i reinicieu Orca Slicer." + +#~ msgid "Why this grouping" +#~ msgstr "Per què aquesta agrupació" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "El programari no admet l'ús de broquets de diàmetre diferent per a una impressió. Si els broquets esquerre i dret són inconsistents, només podem procedir amb impressió de capçal únic. Confirmeu quin broquet voleu utilitzar per a aquest projecte." + +#~ msgid "Switch diameter" +#~ msgstr "Canvia el diàmetre" + +# AI Translated +#~ msgid "BambuStudio Project" +#~ msgstr "Projecte de BambuStudio" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "El 3MF s'ha creat amb BambuStudio (versió %s), que és més recent que la versió compatible %s. S'han trobat opcions no reconegudes:" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "El 3MF s'ha creat amb BambuStudio (versió %s), que és més recent que la versió compatible %s. És possible que algunes opcions no siguin totalment compatibles." + +# AI Translated +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "El 3MF s'ha creat amb BambuStudio. És possible que algunes opcions difereixin de les d'OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "No es pot desfer ni refer mentre s'executa una operació. Atureu-la primer." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Centra el farciment intern de cada peça sobre si mateixa, com si es laminés per separat, en lloc de sobre tot el conjunt. Les peces que es toquen o se superposen es tracten com un sol cos i comparteixen centre; les peces separades (o objectes 3D diferents) tenen cadascuna el seu.\n" +#~ "Útil quan un conjunt agrupa diversos objectes que han de mantenir cadascun un farciment coherent i centrat en si mateix.\n" +#~ "Afecta els patrons de línia i de graella i els farciments amb plantilla de rotació.\n" +#~ "Els patrons vinculats a coordenades globals (Giroide, Panal d'abella, TPMS, ...) no es veuen afectats." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Índex de la capa actual. Basat en 1( és a dir, la primera capa és el número 1 )." + +# AI Translated +#~ msgid "Video tutorial" +#~ msgstr "Tutorial en vídeo" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitiva" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "S'ha generat una malla buida" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Caixa" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Ràpid:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Amplada (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Profunditat (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Alçada (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R inferior" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R superior" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "R major" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "R menor" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Totes les arestes" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Arestes superiors" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Arestes inferiors" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Arestes laterals" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Resolució de la malla" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Afegir forma" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "No hi ha cap perfil exterior" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "No s'ha pogut crear la cara exterior" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "No s'ha pogut construir la cara amb forats" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "La revolució ha fallat" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Perfil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Començar un perfil nou (per a forats)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segments" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Costats" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Feu clic al llenç per dibuixar" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Ajustar a la graella" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Pas de la graella" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Exterior" + +# AI Translated +#~ msgid "closed" +#~ msgstr "tancat" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% punts %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Superior)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Frontal)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Lateral)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Graus de revolució" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Establiu 0 per a extrusió, >0 per a revolució" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Cavitat (tall)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu perfil tancat" +#~ msgstr[1] "%zu perfils tancats" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Dibuixeu un perfil tancat per activar-ho" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Resultat buit" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Extrusió: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Revolució: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "No hi ha cap objecte seleccionat" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "No s'ha pogut crear la cara" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "No s'ha pogut crear la cara amb forats" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "La malla de l'eina és buida" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Cavitat afegida (volum negatiu)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Cavitat: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Cal que la capa activa estigui mapada amb Desplegar (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Escaquer - una quadrícula de prova en lloc de la textura. On els quadrats es mantenen quadrats, la textura no es distorsiona; on s'estiren, també s'estirarà la textura" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Distorsió - mapa de calor de l'estirament, de blau a vermell, sobre el desplegament" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Barrejar per" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Superfície" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Capes: els dos filaments s'alternen entre capes d'impressió, cosa que es fon suaument a les superfícies verticals però desapareix a les horitzontals, on una capa sencera és una sola franja.\n" +#~ "Superfície: un escaquer fi a través de la superfície, que funciona amb qualsevol angle però es pot percebre com una textura en lloc d'una barreja.\n" +#~ "Automàtic: capes a les cares verticals; les cares horitzontals prenen el filament únic més proper, ja que un escaquer s'hi veu com un patró." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Illa - moure, girar i escalar illes senceres" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Vèrtex - arrossegueu els vèrtexs per canviar la forma; Màj/Ctrl per a la selecció múltiple" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Aresta - arrossegueu les arestes per canviar la forma; Màj/Ctrl per a la selecció múltiple" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Enquadrar totes les illes (Inici)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Experimental) Utilitza agents d'impressora en lloc d'amfitrions d'impressió" @@ -31440,16 +32576,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Feu clic a una cara o a un pla de referència i després trieu una eina de dibuix" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31506,10 +32632,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Distància vertical" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Lineal" - #~ msgid "Face recognition" #~ msgstr "Reconeixement facial" @@ -33087,9 +34209,6 @@ msgstr "" #~ msgid "Bed Leveling" #~ msgstr "Anivellament del llit" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/cs/OrcaSlicer_cs.po b/localization/i18n/cs/OrcaSlicer_cs.po index 9be7881216..2fb3008072 100644 --- a/localization/i18n/cs/OrcaSlicer_cs.po +++ b/localization/i18n/cs/OrcaSlicer_cs.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: \n" "Last-Translator: Jakub Hencl\n" "Language-Team: \n" @@ -2159,15 +2159,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Nepodařilo se nainstalovat Microsoft WebView2 Runtime.\n" -"Některé funkce, včetně průvodce nastavením, se mohou zobrazovat prázdné, dokud nebude nainstalován.\n" -"Nainstalujte jej prosím ručně z https://developer.microsoft.com/microsoft-edge/webview2/ a restartujte Orca Slicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4337,6 +4334,9 @@ msgstr "Přejít na desku" msgid "AMS Materials Setting" msgstr "Nastavení materiálů AMS" +msgid "Wiki Guide" +msgstr "Wiki příručka" + msgid "Close" msgstr "Zavřít" @@ -4360,9 +4360,6 @@ msgstr "Vstupní hodnota musí být větší než %1% a menší než %2%." msgid "Factors of Flow Dynamics Calibration" msgstr "Faktory kalibrace dynamiky průtoku" -msgid "Wiki Guide" -msgstr "Wiki příručka" - msgid "PA Profile" msgstr "PA profil" @@ -4964,6 +4961,11 @@ msgstr "Upravit ji automaticky na limit (%g mm)?" msgid "Adjust" msgstr "Upravit" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5805,9 +5807,6 @@ msgstr "Automaticky znovu provést slicování podle optimálního seskupení fi msgid "Filament Grouping" msgstr "Seskupení filamentů" -msgid "Why this grouping" -msgstr "Proč toto seskupení" - msgid "Please place filaments on the printer based on grouping result." msgstr "Umístěte filamenty do tiskárny podle výsledku seskupení." @@ -5996,6 +5995,44 @@ msgstr "Zvětšit/zmenšit editační oblast" msgid "Sequence" msgstr "Sekvence" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +# AI Translated +msgid "Volume" +msgstr "Objem" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Výběr objektu" @@ -6217,6 +6254,12 @@ msgstr "Mřížka" msgid "Labels" msgstr "Popisky" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Posunout rovinu řezu" @@ -6266,7 +6309,7 @@ msgid "Size:" msgstr "Velikost:" # AI Translated -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Byly nalezeny konflikty drah G-code ve vrstvě %d, Z = %.2lf mm. Oddělte prosím konfliktní objekty více od sebe (%s <-> %s)." @@ -6747,6 +6790,12 @@ msgstr "Zobrazit mřížku" msgid "Show Gridlines on plate" msgstr "Zobrazit mřížku na podložce" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Obnovit rozložení oken" @@ -8450,6 +8499,61 @@ msgstr "Zobrazit nastavení všech objektů" msgid "Material settings" msgstr "Nastavení materiálu" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Nástroje" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Odstranit aktuální desku (pokud není poslední)" @@ -8475,6 +8579,17 @@ msgstr "Upravit název aktuální desky" msgid "Move plate to the front" msgstr "Přesuňte desku do přední pozice" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Přizpůsobit aktuální desku" @@ -8542,12 +8657,6 @@ msgstr "AMS (1 slot)" msgid "Not installed" msgstr "Nenainstalováno" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Software nepodporuje použití různých průměrů trysek v rámci jednoho tisku. Pokud se levá a pravá tryska liší, lze pokračovat pouze tiskem s jednou hlavou. Potvrďte prosím, kterou trysku chcete pro tento projekt použít." - -msgid "Switch diameter" -msgstr "Přepnout průměr" - msgid "Configuration incompatible" msgstr "Konfigurace není kompatibilní" @@ -8632,6 +8741,9 @@ msgstr "Míchaný filament" msgid "Remove last mixed filament" msgstr "Odebrat poslední míchaný filament" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Přidat míchaný filament" @@ -8654,6 +8766,10 @@ msgstr "Míchaný filament má poškozené odkazy na komponenty" msgid "Edit / Delete / Merge" msgstr "Upravit / Smazat / Sloučit" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Cílový míchaný filament používá tento fyzický filament jako komponentu. Sloučením se tento fyzický filament odstraní a míchaný filament může přestat být platný. Pokračovat?" @@ -8728,9 +8844,6 @@ msgstr "Načítání souboru: %s" msgid "Load 3MF" msgstr "Načíst 3MF" -msgid "BambuStudio Project" -msgstr "Projekt BambuStudio" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "3MF není OrcaSlicerem podporován, načítají se pouze data geometrie." @@ -8760,17 +8873,6 @@ msgstr "Doporučujeme aktualizovat software.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "Verze souboru 3MF %s je novější než verze %s %s, doporučujeme aktualizovat software." -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "Soubor 3MF byl vytvořen v BambuStudio (verze %s), která je novější než kompatibilní verze %s. Byla nalezena nerozpoznaná nastavení:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "Soubor 3MF byl vytvořen v BambuStudio (verze %s), která je novější než kompatibilní verze %s. Některá nastavení nemusí být plně kompatibilní." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "Soubor 3MF byl vytvořen v BambuStudio. Některá nastavení se mohou od OrcaSliceru lišit." - msgid "Invalid values found in the 3MF:" msgstr "V souboru 3MF byly nalezeny neplatné hodnoty:" @@ -8939,6 +9041,12 @@ msgstr "Zakázat automatické položení pro zachování pozice v ose Z?\n" msgid "Object with floating parts was detected" msgstr "Byl detekován objekt s visícími částmi" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Probíhá jiný exportní úkol." @@ -9023,6 +9131,38 @@ msgstr "Neplatná data" msgid "Slicing Canceled" msgstr "Slicing zrušen" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Síťový plugin byl úspěšně přepnut." @@ -9054,9 +9194,8 @@ msgstr "" msgid "Sync now" msgstr "Synchronizovat nyní" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Během probíhající operace nelze vracet zpět ani znovu provádět. Nejprve ji zastavte." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9127,6 +9266,11 @@ msgstr "Stažení selhalo, chyba velikosti souboru." msgid "Project downloaded %d%%" msgstr "Projekt stažen z %d %%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Test Pressure Advance" @@ -9154,6 +9298,13 @@ msgstr "Orca YOLO kalibrace průtoku" msgid "Flowrate Test - Pass%d" msgstr "Test průtoku - průchod %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Test teploty trysky" @@ -11642,6 +11793,9 @@ msgstr "Synchronizace mezi různými pohony extruderu nebo typy objemu trysky ne msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Synchronizovat úpravu parametrů s odpovídajícími parametry druhého extruderu." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Kliknutím obnovíte všechna nastavení na poslední uloženou předvolbu." @@ -12060,6 +12214,12 @@ msgstr "Tisknutelný prostor" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Vyberte implementaci síťového agenta pro komunikaci s tiskárnou. Dostupní agenti jsou registrováni při spuštění." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12176,9 +12336,24 @@ msgstr "Průměr trysky" msgid "Wipe tower" msgstr "Věž na očištění trysky" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Parametry jedné trysky pro více materiálů" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Toto je jednoextrudérová vícemateriálová tiskárna, průměry všech extrudérů budou nastaveny na novou hodnotu. Chcete pokračovat?" @@ -12188,6 +12363,18 @@ msgstr "Omezení výšky vrstvy" msgid "Z-Hop" msgstr "Z-Hop" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12298,10 +12485,9 @@ msgstr "Pokračovat" msgid "Don't warn again for this preset" msgstr "Pro tuto předvolbu již nezobrazovat upozornění" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12761,10 +12947,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Celkový ramming" -# AI Translated -msgid "Volume" -msgstr "Objem" - # AI Translated msgid "Ramming line" msgstr "Linie rammingu" @@ -12827,6 +13009,119 @@ msgstr "Přihlášení se nezdařilo. Zkuste to prosím znovu." msgid "parse json failed" msgstr "zpracování json se nezdařilo" +msgid "Loading…" +msgstr "Načtení probíhá…" + +msgid "Welcome to Orca Slicer" +msgstr "Vítejte v Orca Slicer" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer bude nastaven v několika krocích. Začněme!" + +msgid "Get Started" +msgstr "Začínáme" + +msgid "Please select your login region" +msgstr "Vyberte prosím svou oblast přihlášení" + +msgid "Finish" +msgstr "Dokončit" + +msgid "Printer Selection" +msgstr "Výběr tiskárny" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Vlastní tiskárna" + +msgid "Create" +msgstr "Vytvořit" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "Musí být vybrána alespoň jedna tiskárna." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Výběr Filamentu" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "Typ filamentu" + +msgid "Vendor" +msgstr "Dodavatel" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "Vymazat vše" + +msgid "At least one filament must be selected." +msgstr "Musí být vybraný alespoň jeden Filament." + +msgid "Do you want to use the default filament?" +msgstr "Chcete použít výchozí Filament?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Tím se vypnou všechny cloudové funkce včetně synchronizace profilů s Orca Cloud. Uživatelé, kteří chtějí pracovat zcela offline, mohou tuto možnost zapnout." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Poznámka: Je-li Stealth režim zapnut, nebudou vaše uživatelské profily zálohovány do Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "Instalovat Bambu Network plug-in" + # AI Translated msgid "[Action Required] " msgstr "[Vyžadována akce] " @@ -13293,6 +13588,14 @@ msgstr "G-code při změně role extruze (filament)" msgid "No object can be printed. It may be too small." msgstr "Nelze vytisknout žádný objekt. Možná je příliš malý." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Váš tisk je velmi blízko primovacím oblastem. Ujistěte se, že nedojde ke kolizi." @@ -13467,6 +13770,26 @@ msgstr "ověření selhalo" msgid "write callback failed" msgstr "zápis callbacku selhal" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% je příliš blízko vyhrazené oblasti, může dojít ke kolizím při tisku." @@ -13517,6 +13840,43 @@ msgstr "Pokud chcete přesto tisknout, můžete povolit možnost v Nastavení / msgid "No extrusions under current settings." msgstr "Při aktuálním nastavení nejsou žádné extruze." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Je použit míchaný filament s gradientem, ale 'Podvrstva míchané barvy' je vypnutá. Gradient nebude vytištěn." @@ -13527,6 +13887,15 @@ msgstr "Plynulý režim časosběru není podporován, pokud je povoleno pořad msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Detekce shlukování není podporována, pokud je povoleno pořadí tisku „podle objektu“." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Povolení přesné výšky Z a zároveň čistící věže může způsobit chyby při slicování." @@ -13543,10 +13912,6 @@ msgstr "Spirálový režim vázy nefunguje, pokud objekt obsahuje více než jed msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Ačkoliv objekt %1% sám zapadá do tiskového objemu, kvůli kompenzaci smrštění materiálu přesahuje maximální výšku tiskového objemu." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Objekt %1% přesahuje maximální výšku tiskového objemu." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Ačkoliv objekt %1% sám zapadá do tiskového objemu, jeho poslední vrstva přesahuje maximální výšku tiskového objemu." @@ -13554,6 +13919,10 @@ msgstr "Ačkoliv objekt %1% sám zapadá do tiskového objemu, jeho poslední vr msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Možná budete chtít zmenšit velikost modelu nebo změnit aktuální nastavení tisku a zkusit to znovu." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Objekt %1% přesahuje maximální výšku tiskového objemu." + msgid "Variable layer height is not supported with Organic supports." msgstr "Proměnná výška vrstvy není podporována s organickými podporami." @@ -14538,12 +14907,39 @@ msgstr "Rychlost vnitřních mostů. Pokud je hodnota zadána v procentech, vypo msgid "This is the distance from the model to the outermost brim line." msgstr "Vzdálenost od modelu k nejvzdálenější brim linii." +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Typ límce" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Tato volba řídí generování obruby na vnější a/nebo vnitřní straně modelů. Automaticky znamená, že šířka obruby je analyzována a vypočítána automaticky." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Mezera mezi límcem a objektem" @@ -15723,9 +16119,6 @@ msgstr "Cena filamentu. Pouze pro statistické účely." msgid "money/kg" msgstr "peníze/kg" -msgid "Vendor" -msgstr "Dodavatel" - msgid "Vendor of filament. For show only." msgstr "Dodavatel filamentu. Pouze pro zobrazení." @@ -15799,6 +16192,66 @@ msgstr "Víceřádková výplň" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Použití více řádků pro vzor výplně, pokud to daný vzor podporuje." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Lineární" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Optimalizace odolnosti proti vzpěru v ose Z (experimentální)" @@ -18059,6 +18512,99 @@ msgstr "Jedna tryska pro více materiálů" msgid "Use single nozzle to print multi filament." msgstr "Použít jednu trysku pro tisk více filamentů." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Manuální výměna filamentu" @@ -18444,6 +18990,130 @@ msgstr "Prahové překrytí" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Pokud je prahový úhel nula, podpora bude generována pro převisy s překrytím pod tímto prahem. Čím menší je tato hodnota, tím strmější převis lze tisknout bez podpory." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Úhel větvení stromové podpěry" @@ -18620,17 +19290,11 @@ msgstr "Počet horních pevných vrstev bude při slicování zvýšen, pokud tl msgid "Separated infills" msgstr "Oddělené výplně" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Vystředí vnitřní výplň každé části na ni samotnou, jako by byla slicována samostatně, místo na celou sestavu. Části, které se dotýkají nebo překrývají, jsou považovány za jedno těleso a sdílejí střed; oddělené části (nebo samostatné 3D objekty) mají každá svůj vlastní.\n" -"Hodí se, když sestava sdružuje několik objektů, z nichž si každý má zachovat konzistentní, na sebe vystředěnou výplň.\n" -"Ovlivňuje vzory Čára a Mřížka a výplně s rotační šablonou.\n" -"Vzory vázané na globální souřadnice (Gyroid, Včelí plástev, TPMS, ...) tím nejsou ovlivněny." # AI Translated msgid "Center surface pattern on" @@ -18863,6 +19527,12 @@ msgstr "Čištění po výměně filamentu se provede uvnitř podpor objektu. To msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Tento objekt bude použit k propláchnutí trysky po výměně filamentu, aby se šetřil filament a zkrátila doba tisku. Barvy objektů se tím smíchají. Neprojeví se to, pokud není povolena základní věž." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Maximální vzdálenost mostu" @@ -19760,8 +20430,8 @@ msgstr "Název fyzické tiskárny použité pro slicování." msgid "Layer number" msgstr "Číslo vrstvy" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Index aktuální vrstvy. Číslování začíná od jedničky (tj. první vrstva má číslo 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Vrstva Z" @@ -19905,9 +20575,6 @@ msgstr "Rekalibrace" msgid "Calibrate" msgstr "Kalibrovat" -msgid "Finish" -msgstr "Dokončit" - msgid "How can I use calibration results?" msgstr "Jak použít výsledek kalibrace?" @@ -20446,12 +21113,12 @@ msgstr "" "Hodnoty zrychlení musí být vyšší než hodnoty rychlosti.\n" "Zkontrolujte prosím zadané údaje." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Kalibrace teploty" -msgid "Filament type" -msgstr "Typ filamentu" - msgid "PLA" msgstr "PLA" @@ -20473,6 +21140,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Testovací model" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Počáteční teplota: " @@ -20598,9 +21271,6 @@ msgstr "Počáteční délka retrakce: " msgid "End retraction length: " msgstr "Koncová délka retrakce: " -msgid "Test model" -msgstr "Testovací model" - msgid "Ringing Tower" msgstr "Věž s ringingem" @@ -21051,9 +21721,6 @@ msgstr "např. Basic, Matte, Silk, Marble" msgid "Filament Preset" msgstr "filamentový přednastavený profil" -msgid "Create" -msgstr "Vytvořit" - msgid "Vendor is not selected; please reselect vendor." msgstr "Dodavatel není vybrán, prosím vyberte jej znovu." @@ -21365,6 +22032,9 @@ msgstr "" "Tiskárna a všechny předvolby filamentů a procesů, které k ní patří.\n" "Lze sdílet s ostatními." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -22140,9 +22810,6 @@ msgstr "Ručně přiřadit filament k levé nebo pravé trysce" msgid "Global settings" msgstr "Globální nastavení" -msgid "Video tutorial" -msgstr "Video tutoriál" - # AI Translated msgid "(Sync with printer)" msgstr "(Synchronizovat s tiskárnou)" @@ -22638,6 +23305,33 @@ msgstr "Je-li zapnuto, budou výše uvedené hodnoty uloženy jako výchozí pro msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "Složka balíčku neexistuje." @@ -22682,6 +23376,12 @@ msgstr "Zrušit odběr balíčku" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "Uložit balíček předvoleb" @@ -27135,215 +27835,6 @@ msgstr "Toto písmo nemá pro tento text žádný obrys" msgid "Size: %.1f × %.1f mm" msgstr "Velikost: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitiv" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Byla vygenerována prázdná síť" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Kvádr" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Rychle:" - -# AI Translated -msgid "Width (X)" -msgstr "Šířka (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Hloubka (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Výška (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "Spodní R" - -# AI Translated -msgid "Top R" -msgstr "Horní R" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "Hlavní R" - -# AI Translated -msgid "Minor R" -msgstr "Vedlejší R" - -# AI Translated -msgid "All edges" -msgstr "Všechny hrany" - -# AI Translated -msgid "Top edges" -msgstr "Horní hrany" - -# AI Translated -msgid "Bottom edges" -msgstr "Spodní hrany" - -# AI Translated -msgid "Lateral edges" -msgstr "Boční hrany" - -# AI Translated -msgid "Mesh resolution" -msgstr "Rozlišení sítě" - -# AI Translated -msgid "Add Shape" -msgstr "Přidat tvar" - -# AI Translated -msgid "No outer profile" -msgstr "Chybí vnější profil" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Nepodařilo se vytvořit vnější plochu" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Nepodařilo se vytvořit plochu s otvory" - -# AI Translated -msgid "Revolve failed" -msgstr "Rotace selhala" - -# AI Translated -msgid "Profile" -msgstr "Profil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Začít nový profil (pro otvory)" - -# AI Translated -msgid "Segments" -msgstr "Segmenty" - -# AI Translated -msgid "Sides" -msgstr "Strany" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Kreslete kliknutím na plátno" - -# AI Translated -msgid "Snap to grid" -msgstr "Přichytit k mřížce" - -# AI Translated -msgid "Grid step" -msgstr "Krok mřížky" - -# AI Translated -msgid "Outer" -msgstr "Vnější" - -# AI Translated -msgid "closed" -msgstr "uzavřený" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% b. %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (horní)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (přední)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (boční)" - -# AI Translated -msgid "Revolve deg" -msgstr "Rotace (°)" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "0 = vysunutí, >0 = rotace" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Kapsa (řez)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu uzavřený profil" -msgstr[1] "%zu uzavřené profily" -msgstr[2] "%zu uzavřených profilů" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Pro aktivaci nakreslete uzavřený profil" - -# AI Translated -msgid "Clear all" -msgstr "Vymazat vše" - -# AI Translated -msgid "Empty result" -msgstr "Prázdný výsledek" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Vysunutí: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Rotace: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Není vybrán žádný objekt" - -# AI Translated -msgid "Face failed" -msgstr "Vytvoření plochy selhalo" - -# AI Translated -msgid "Face with holes failed" -msgstr "Vytvoření plochy s otvory selhalo" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Síť nástroje je prázdná" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Kapsa přidána (záporný objem)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Kapsa: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27466,6 +27957,9 @@ msgstr "Gizmo sestavit" msgid "Gizmo brim ears" msgstr "Gizmo ouška lemu" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Vertikální posuvník – Posuňte aktivní jezdec nahoru" @@ -28447,10 +28941,6 @@ msgstr "Moje nastavení" msgid "Custom Printer Setup" msgstr "Nastavení vlastní tiskárny" -# AI Translated -msgid "Custom Printer" -msgstr "Vlastní tiskárna" - # AI Translated msgid "Define a custom printer profile" msgstr "Definujte vlastní profil tiskárny" @@ -29097,9 +29587,8 @@ msgstr "Prahový úhel - vyplňování se zastaví na hranách ostřejších ne msgid "Click a triangle to paint it" msgstr "Kliknutím na trojúhelník jej namalujete" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Vyžaduje aktivní vrstvu mapovanou pomocí Rozbalení (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -29113,17 +29602,15 @@ msgstr "Rychlý - reliéf je pouze vystínovaný, nikoli vytvořený, a jen pro msgid "Checker" msgstr "Šachovnice" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Šachovnice - testovací mřížka místo textury. Kde čtverce zůstávají čtvercové, není textura zkreslená; kde se protahují, protáhne se i textura" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Zkreslení" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Zkreslení - teplotní mapa protažení rozbalení od modré po červenou" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -29239,24 +29726,11 @@ msgstr "Míchat filamenty" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Prokládá dva filamenty, aby napodobil barvy mezi nimi, takže hrstka filamentů pokryje fotografii nebo barevný přechod. Obrázek z plochých barev se vytiskne stejně v obou případech. Vypnuto použije pro každou oblast jeden filament." -# AI Translated -msgid "Mix by" -msgstr "Míchat podle" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Povrch" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Vrstvy: dva filamenty se střídají po tiskových vrstvách, což se na svislých plochách plynule prolíná, ale na vodorovných plochách mizí, protože tam je celá vrstva jediným pruhem.\n" -"Povrch: jemná šachovnice po povrchu, která funguje v jakémkoli úhlu, ale může působit spíše jako textura než jako prolnutí.\n" -"Automaticky: vrstvy na svislých plochách; vodorovné plochy dostanou nejbližší jednotlivý filament, protože šachovnice by se na nich ukázala jako vzor." # AI Translated #, boost-format @@ -29716,14 +30190,6 @@ msgstr "Potřeba přibližně %1% trojúhelníků, rozpočet %2% - zapečení s msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Kolik tisíc trojúhelníků smí zjemnění do modelu přidat. Nejhůře sedící trojúhelník se vždy dělí jako první, takže i běh, který vyčerpá vše, je utratí tam, kde je to nejvíc vidět. Zvyšte, pokud reliéf stále vypadá hrubě." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Zastaví zapečení. Vše, co již bylo dokončeno, zůstane na modelu a lze to vrátit zpět." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Zavře nástroj bez zapečení. Vaše malba, vrstvy a nastavení zůstanou u modelu." - # AI Translated msgid "Preparing..." msgstr "Příprava..." @@ -29748,6 +30214,14 @@ msgstr "Převede namalované výškové mapy na skutečnou geometrii posunem ji msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Převede namalované výškové mapy na skutečnou geometrii. Síť se nejprve přesíťuje na rovnoměrnou hustotu a zjemní tam, kde se textura ohýbá, aby měl detail na čem ležet - vše v jednom kroku." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Zastaví zapečení. Vše, co již bylo dokončeno, zůstane na modelu a lze to vrátit zpět." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Zavře nástroj bez zapečení. Vaše malba, vrstvy a nastavení zůstanou u modelu." + # AI Translated #, boost-format msgid "%1% k" @@ -29964,6 +30438,28 @@ msgstr "Pluginy filamentu" msgid "Printer plugins" msgstr "Pluginy tiskárny" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Obnovit výchozí" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Konfigurace není platný JSON. Vaše změny nebyly uloženy." @@ -29983,10 +30479,6 @@ msgstr "" "\n" "Tím se zahodí přepsání v předvolbě a použije se globální konfigurace." -# AI Translated -msgid "Restore defaults" -msgstr "Obnovit výchozí" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Používá se globální konfigurace. Pro trvalé uložení uložte předvolbu." @@ -30056,6 +30548,215 @@ msgstr "Instalace pluginu" msgid "Installed \"%s\"." msgstr "Nainstalováno: „%s“." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -30272,6 +30973,54 @@ msgstr "Opětovné načtení pluginu se nezdařilo." msgid "Reloaded \"%s\"." msgstr "Znovu načteno: „%s“." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "Informace o modelu" + +msgid "Accessories" +msgstr "Příslušenství" + +msgid "Profile Information" +msgstr "Informace o profilu" + +msgid "Model name" +msgstr "Název modelu" + +msgid "Created by" +msgstr "Vytvořil" + +msgid "Remixed by" +msgstr "Přepracováno" + +msgid "Shared by" +msgstr "Sdíleno" + +msgid "Model description" +msgstr "Popis modelu" + +msgid "BOM" +msgstr "Seznam součástek (BOM)" + +msgid "Profile name" +msgstr "Název profilu" + +msgid "Profile Author" +msgstr "Autor profilu" + +msgid "Profile description" +msgstr "Popis profilu" + # AI Translated msgid "Purge Mode Settings" msgstr "Nastavení režimu čištění" @@ -30296,6 +31045,16 @@ msgstr "Snižuje odpad při čištění a tiskne rychleji. Může způsobit mír msgid "Terminal" msgstr "Terminál" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Příkaz již běží." @@ -30562,6 +31321,9 @@ msgstr " | přichycení ZAP" msgid "Change texture - choose another one from the texture library" msgstr "Změnit texturu - vyberte jinou z knihovny textur" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Výšková mapa - zobrazit texturu vrstvy pod ostrovy" @@ -30594,17 +31356,14 @@ msgstr "Propojit ostrovy" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Rozloží rozbalení jako souvislou síť: kusy, které sdílejí hranu, se rozloží vedle sebe (z krychle vznikne spojená síť místo šesti volných čtverců). Zůstávají samostatnými ostrovy, takže kterýkoli z nich můžete poté stále ručně přesunout." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Ostrov - přesouvání, otáčení a změna měřítka celých ostrovů" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Vrchol - tažením vrcholů měníte tvar; Shift/Ctrl pro vícenásobný výběr" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Hrana - tažením hran měníte tvar; Shift/Ctrl pro vícenásobný výběr" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30642,9 +31401,13 @@ msgstr "Vymazat úpravy UV - zahodí všechny ruční přesuny vrcholů/hran a v msgid "Snap - stick islands together when dragging one against another" msgstr "Přichycení - při tažení jednoho ostrova k druhému je k sobě přichytí" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Zarámovat všechny ostrovy (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30655,6 +31418,9 @@ msgstr "Žádná vrstva mapovaná pomocí Rozbalení" msgid "%.1f mm tile" msgstr "dlaždice %.1f mm" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Zastaralé - malba, švy nebo úhel švu se od vytvoření tohoto rozbalení změnily. Stiskněte pro nové rozbalení." @@ -30663,19 +31429,48 @@ msgstr "Zastaralé - malba, švy nebo úhel švu se od vytvoření tohoto rozbal msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Zploští namalovanou oblast do UV ostrovů. Počítá se jen po stisknutí tohoto tlačítka, ne při každé úpravě - proto nejprve namalujte, změňte úhel švu nebo označte švy a pak stiskněte Rozbalit." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "Ostrovy: %d, plochy: %s" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Síťový plug-in Bambu nebyl zjištěn. Klikněte zde k instalaci." + +msgid "Create new project" +msgstr "Vytvořit nový projekt" + +msgid "Recently opened" +msgstr "Nedávno otevřeno" + +msgid "Open Containing Folder" +msgstr "Otevřít složku obsahující" + # AI Translated msgid "Forward" msgstr "Vpřed" -# AI Translated -msgid "Tools" -msgstr "Nástroje" - # AI Translated msgid "View Source" msgstr "Zobrazit zdroj" @@ -30821,6 +31616,16 @@ msgstr "" "Plugin „%s“ žádá o spuštění následujících příkazů:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30830,6 +31635,30 @@ msgstr "Plugin „%s“ žádá o oprávnění pro auditní událost Pythonu „ msgid "Plugin permission request" msgstr "Žádost pluginu o oprávnění" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Konfigurační rozhraní pluginu bylo prázdné. Zobrazuje se výchozí editor." @@ -31418,6 +32247,313 @@ msgstr "" "Zamezte kroucení\n" "Víte, že při tisku materiálů náchylných ke kroucení, jako je ABS, může vhodné zvýšení teploty vyhřívané desky snížit pravděpodobnost kroucení?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Nepodařilo se nainstalovat Microsoft WebView2 Runtime.\n" +#~ "Některé funkce, včetně průvodce nastavením, se mohou zobrazovat prázdné, dokud nebude nainstalován.\n" +#~ "Nainstalujte jej prosím ručně z https://developer.microsoft.com/microsoft-edge/webview2/ a restartujte Orca Slicer." + +#~ msgid "Why this grouping" +#~ msgstr "Proč toto seskupení" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Software nepodporuje použití různých průměrů trysek v rámci jednoho tisku. Pokud se levá a pravá tryska liší, lze pokračovat pouze tiskem s jednou hlavou. Potvrďte prosím, kterou trysku chcete pro tento projekt použít." + +#~ msgid "Switch diameter" +#~ msgstr "Přepnout průměr" + +#~ msgid "BambuStudio Project" +#~ msgstr "Projekt BambuStudio" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "Soubor 3MF byl vytvořen v BambuStudio (verze %s), která je novější než kompatibilní verze %s. Byla nalezena nerozpoznaná nastavení:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "Soubor 3MF byl vytvořen v BambuStudio (verze %s), která je novější než kompatibilní verze %s. Některá nastavení nemusí být plně kompatibilní." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "Soubor 3MF byl vytvořen v BambuStudio. Některá nastavení se mohou od OrcaSliceru lišit." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Během probíhající operace nelze vracet zpět ani znovu provádět. Nejprve ji zastavte." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Vystředí vnitřní výplň každé části na ni samotnou, jako by byla slicována samostatně, místo na celou sestavu. Části, které se dotýkají nebo překrývají, jsou považovány za jedno těleso a sdílejí střed; oddělené části (nebo samostatné 3D objekty) mají každá svůj vlastní.\n" +#~ "Hodí se, když sestava sdružuje několik objektů, z nichž si každý má zachovat konzistentní, na sebe vystředěnou výplň.\n" +#~ "Ovlivňuje vzory Čára a Mřížka a výplně s rotační šablonou.\n" +#~ "Vzory vázané na globální souřadnice (Gyroid, Včelí plástev, TPMS, ...) tím nejsou ovlivněny." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Index aktuální vrstvy. Číslování začíná od jedničky (tj. první vrstva má číslo 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Video tutoriál" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitiv" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Byla vygenerována prázdná síť" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Kvádr" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Rychle:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Šířka (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Hloubka (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Výška (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "Spodní R" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "Horní R" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "Hlavní R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "Vedlejší R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Všechny hrany" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Horní hrany" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Spodní hrany" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Boční hrany" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Rozlišení sítě" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Přidat tvar" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Chybí vnější profil" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Nepodařilo se vytvořit vnější plochu" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Nepodařilo se vytvořit plochu s otvory" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Rotace selhala" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Začít nový profil (pro otvory)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmenty" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Strany" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Kreslete kliknutím na plátno" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Přichytit k mřížce" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Krok mřížky" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Vnější" + +# AI Translated +#~ msgid "closed" +#~ msgstr "uzavřený" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% b. %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (horní)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (přední)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (boční)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Rotace (°)" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "0 = vysunutí, >0 = rotace" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Kapsa (řez)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu uzavřený profil" +#~ msgstr[1] "%zu uzavřené profily" +#~ msgstr[2] "%zu uzavřených profilů" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Pro aktivaci nakreslete uzavřený profil" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Prázdný výsledek" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Vysunutí: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Rotace: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Není vybrán žádný objekt" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Vytvoření plochy selhalo" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Vytvoření plochy s otvory selhalo" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Síť nástroje je prázdná" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Kapsa přidána (záporný objem)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Kapsa: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Vyžaduje aktivní vrstvu mapovanou pomocí Rozbalení (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Šachovnice - testovací mřížka místo textury. Kde čtverce zůstávají čtvercové, není textura zkreslená; kde se protahují, protáhne se i textura" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Zkreslení - teplotní mapa protažení rozbalení od modré po červenou" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Míchat podle" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Povrch" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Vrstvy: dva filamenty se střídají po tiskových vrstvách, což se na svislých plochách plynule prolíná, ale na vodorovných plochách mizí, protože tam je celá vrstva jediným pruhem.\n" +#~ "Povrch: jemná šachovnice po povrchu, která funguje v jakémkoli úhlu, ale může působit spíše jako textura než jako prolnutí.\n" +#~ "Automaticky: vrstvy na svislých plochách; vodorovné plochy dostanou nejbližší jednotlivý filament, protože šachovnice by se na nich ukázala jako vzor." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Ostrov - přesouvání, otáčení a změna měřítka celých ostrovů" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Vrchol - tažením vrcholů měníte tvar; Shift/Ctrl pro vícenásobný výběr" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Hrana - tažením hran měníte tvar; Shift/Ctrl pro vícenásobný výběr" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Zarámovat všechny ostrovy (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Experimentální) Používat agenty tiskárny místo tiskových hostů" @@ -31451,16 +32587,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Klikněte na plochu nebo referenční rovinu a pak vyberte kreslicí nástroj" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31517,10 +32643,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Svislá vzdálenost" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Lineární" - #~ msgid "Face recognition" #~ msgstr "Rozpoznání plochy" @@ -33103,6 +34225,3 @@ msgstr "" #~ msgid "Bed Leveling" #~ msgstr "Vyrovnání podložky" - -#~ msgid "°" -#~ msgstr "°" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index e46e12e171..1cc27f5f64 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: \n" "Last-Translator: Heiko Liebscher \n" "Language-Team: \n" @@ -2117,15 +2117,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2-Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Die Microsoft WebView2 Runtime konnte nicht installiert werden.\n" -"Einige Funktionen, einschließlich des Einrichtungsassistenten, werden möglicherweise leer angezeigt, bis sie installiert ist.\n" -"Bitte installieren Sie sie manuell von https://developer.microsoft.com/microsoft-edge/webview2/ und starten Sie Orca Slicer neu." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4252,6 +4249,9 @@ msgstr "Zur Druckplatte wechseln" msgid "AMS Materials Setting" msgstr "AMS Material Einstellung" +msgid "Wiki Guide" +msgstr "Wiki-Anleitung" + msgid "Close" msgstr "Schließen" @@ -4273,9 +4273,6 @@ msgstr "Der Eingabewert sollte größer als %1% und kleiner als %2% sein" msgid "Factors of Flow Dynamics Calibration" msgstr "Dynamische Flusskalibrierungsfaktoren" -msgid "Wiki Guide" -msgstr "Wiki-Anleitung" - msgid "PA Profile" msgstr "PA-Profil" @@ -4865,6 +4862,11 @@ msgstr "Automatisch an den Grenzwert (%g mm) anpassen?" msgid "Adjust" msgstr "Anpassen" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5701,9 +5703,6 @@ msgstr "Automatisches Neuschneiden entsprechend der optimalen Filamentgruppierun msgid "Filament Grouping" msgstr "Filamentgruppierung" -msgid "Why this grouping" -msgstr "Warum diese Gruppierung" - msgid "Please place filaments on the printer based on grouping result." msgstr "Bitte platzieren Sie die Filamente auf dem Drucker basierend auf dem " @@ -5892,6 +5891,43 @@ msgstr "Bearbeitungsbereich vergrößern/verkleinern" msgid "Sequence" msgstr "Reihenfolge" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Volumen" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Objektauswahl" @@ -6108,6 +6144,12 @@ msgstr "Rasterlinien" msgid "Labels" msgstr "Beschriftungen" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Schnittebene bewegen" @@ -6156,7 +6198,7 @@ msgstr "Volumen:" msgid "Size:" msgstr "Größe:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Konflikte von G-Code-Pfaden wurden bei Layer %d, Z = %.2lf mm gefunden.Bitte trennen Sie die konfliktbehafteten Objekte weiter voneinander (%s <-> %s)." @@ -6625,6 +6667,12 @@ msgstr "Rasterlinien anzeigen" msgid "Show Gridlines on plate" msgstr "Rasterlinien auf der Druckplatte anzeigen" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Window-Layout zurücksetzen" @@ -8311,6 +8359,61 @@ msgstr "Alle Einstellungen des Objekts anzeigen" msgid "Material settings" msgstr "Material-Einstellungen" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Werkzeuge" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "entferne aktuelle Platte (wenn nicht die letzte)" @@ -8335,6 +8438,17 @@ msgstr "Bearbeite den Namen der aktuellen Platte" msgid "Move plate to the front" msgstr "Bewege die Platte nach vorne" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Aktuelle Platte anpassen" @@ -8401,12 +8515,6 @@ msgstr "AMS(1 Steckplatz)" msgid "Not installed" msgstr "Nicht installiert" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Die Software unterstützt nicht die Verwendung unterschiedlicher Düsendurchmesser für einen Druck. Wenn die linke und rechte Düse nicht übereinstimmen, können wir nur mit dem Einzelkopf-Druck fortfahren. Bitte bestätigen Sie, welche Düse Sie für dieses Projekt verwenden möchten." - -msgid "Switch diameter" -msgstr "Durchmesser wechseln" - msgid "Configuration incompatible" msgstr "Konfiguration nicht kompatibel" @@ -8488,6 +8596,9 @@ msgstr "Mischfilament" msgid "Remove last mixed filament" msgstr "Letztes Mischfilament entfernen" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Mischfilament hinzufügen" @@ -8511,6 +8622,10 @@ msgstr "Das Mischfilament enthält ungültige Komponentenverweise" msgid "Edit / Delete / Merge" msgstr "Bearbeiten / Löschen / Zusammenführen" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Das Ziel-Mischfilament verwendet dieses physische Filament als Komponente. Beim Zusammenführen wird dieses physische Filament entfernt und das Mischfilament kann dadurch ungültig werden. Fortfahren?" @@ -8586,10 +8701,6 @@ msgstr "Datei wird geladen: %s" msgid "Load 3MF" msgstr "Lade 3MF" -# AI Translated -msgid "BambuStudio Project" -msgstr "BambuStudio-Projekt" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "Der 3MF stammt nicht vom OrcaSlicer, lade nur die Geometriedaten." @@ -8619,18 +8730,6 @@ msgstr "Sie sollten Ihre Software aktualisieren.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "Die Version %s der 3MF ist neuer als die Version %s %s. Bitte Ihre Software aktualisieren." -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "Die 3MF-Datei wurde von BambuStudio (Version %s) erstellt, die neuer ist als die kompatible Version %s. Nicht erkannte Einstellungen gefunden:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "Die 3MF wurde von BambuStudio (Version %s) erstellt, die neuer ist als die kompatible Version %s. Einige Einstellungen sind möglicherweise nicht vollständig kompatibel." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "Die 3MF wurde von BambuStudio erstellt. Einige Einstellungen können von OrcaSlicer abweichen." - msgid "Invalid values found in the 3MF:" msgstr "Ungültige Werte in der 3MF-Datei gefunden:" @@ -8799,6 +8898,12 @@ msgstr "Auto-Drop deaktivieren, um die Z-Positionierung beizubehalten?\n" msgid "Object with floating parts was detected" msgstr "Objekt mit schwebenden Teilen erkannt" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Ein weiterer Exportauftrag läuft gerade." @@ -8884,6 +8989,38 @@ msgstr "Ungültige Daten" msgid "Slicing Canceled" msgstr "Slicing abgebrochen" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Netzwerk-Plugin erfolgreich gewechselt." @@ -8916,9 +9053,8 @@ msgstr "" msgid "Sync now" msgstr "Jetzt synchronisieren" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Rückgängig und Wiederholen sind während eines laufenden Vorgangs nicht möglich. Beenden Sie ihn zuerst." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -8990,6 +9126,11 @@ msgstr "Download fehlgeschlagen, Dateigröße nicht erlaubt." msgid "Project downloaded %d%%" msgstr "Projekt heruntergeladen %d%%Der Import in Orca Slicer ist fehlgeschlagen. Bitte laden Sie die Datei herunter und importieren Sie sie manuell." +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Test für Pressure Advance" @@ -9016,6 +9157,13 @@ msgstr "Orca YOLO Flusskalibrierung" msgid "Flowrate Test - Pass%d" msgstr "Flussratentest - Durchgang %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Düsentemperaturtest" @@ -11459,6 +11607,9 @@ msgstr "Die Synchronisierung verschiedener Extrudertypen oder Düsenvolumentypen msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Änderungen der Parameter mit den entsprechenden Parametern eines anderen Extruders synchronisieren." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Klicken Sie hier, um alle Einstellungen auf die zuletzt gespeicherten Parameter zurückzusetzen." @@ -11868,6 +12019,12 @@ msgstr "Druckbarer Raum" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Wählen Sie die Implementierung des Netzwerkagenten für die Druckerkommunikation. Verfügbare Agenten werden beim Start registriert." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -11981,9 +12138,24 @@ msgstr "Düsendurchmesser" msgid "Wipe tower" msgstr "Reinigungsturm" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Single-Extruder-Multimaterial-Parameter" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Dies ist ein Single-Extruder-Multimaterial-Drucker, die Durchmesser aller Extruder werden auf den neuen Wert gesetzt. Möchten Sie fortfahren?" @@ -11993,6 +12165,18 @@ msgstr "Höhenbegrenzungen für Schichten" msgid "Z-Hop" msgstr "Z-Hop" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -12099,8 +12283,8 @@ msgid "Don't warn again for this preset" msgstr "Nicht erneut für dieses Profil warnen" #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" msgid "No modifications need to be copied." msgstr "Es müssen keine Änderungen kopiert werden." @@ -12526,9 +12710,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Summe Ramming" -msgid "Volume" -msgstr "Volumen" - msgid "Ramming line" msgstr "Ramming-Linie" @@ -12577,6 +12758,120 @@ msgstr "Anmeldung fehlgeschlagen. Bitte versuchen Sie es erneut." msgid "parse json failed" msgstr "JSON-Parsing fehlgeschlagen" +msgid "Loading…" +msgstr "Laden…" + +msgid "Welcome to Orca Slicer" +msgstr "Willkommen im Orca Slicer" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Das Orca Slicer wird in mehreren Schritten eingerichtet. Lass uns anfangen!" + +msgid "Get Started" +msgstr "Loslegen" + +msgid "Please select your login region" +msgstr "Bitte wählen Sie Ihre Login-Region aus" + +msgid "Finish" +msgstr "Fertig" + +msgid "Printer Selection" +msgstr "Druckerauswahl" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Benutzerdefinierter Drucker" + +msgid "Create" +msgstr "Erstellen" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "Es muss mindestens ein Drucker ausgewählt sein." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Filamentauswahl" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "Filamenttyp" + +msgid "Vendor" +msgstr "Hersteller" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "Alle löschen" + +msgid "At least one filament must be selected." +msgstr "Es muss mindestens ein Filament ausgewählt sein." + +msgid "Do you want to use the default filament?" +msgstr "Möchten Sie das Standard-Filament verwenden?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Dies deaktiviert alle Cloud-Funktionen, einschließlich der Profil-Synchronisierung mit Orca Cloud. Benutzer, die es vorziehen, vollständig offline zu arbeiten, können diese Option aktivieren." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Hinweis: Wenn der Unsichtbare Modus aktiviert ist, werden Ihre Benutzerprofile nicht in Orca Cloud gesichert." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "Bambu Network-Plug-in installieren" + msgid "[Action Required] " msgstr "[Aktion erforderlich] " @@ -13035,6 +13330,14 @@ msgstr "G-Code für Extrusionsrollenwechsel verarbeiten" msgid "No object can be printed. It may be too small." msgstr "Es kann kein Objekt gedruckt werden. Vielleicht sind die Objekte zu klein." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Ihr Druck ist sehr nahe an den Priming-Regionen. Stellen Sie sicher, dass es keine Kollision gibt." @@ -13207,6 +13510,26 @@ msgstr "Überprüfung fehlgeschlagen" msgid "write callback failed" msgstr "Schreib-Callback fehlgeschlagen" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% liegt zu nahe an einem ausgeschlossenen Bereich. Beim Drucken kann es zu Kollisionen kommen." @@ -13257,6 +13580,43 @@ msgstr "Wenn Sie trotzdem drucken möchten, können Sie die Option in Einstellun msgid "No extrusions under current settings." msgstr "Keine Extrusion unter den aktuellen Einstellungen." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Es wird ein Mischfilament mit Verlauf verwendet, aber „Mischfarben-Unterschicht“ ist deaktiviert. Der Verlauf wird nicht gedruckt." @@ -13267,6 +13627,15 @@ msgstr "Der gewählte Zeitraffermodus wird nicht unterstützt, wenn die Sequenz msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Die Klumpenerkennung wird nicht unterstützt, wenn die Sequenz \"nach Objekt\" aktiviert ist." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Die gleichzeitige Aktivierung von präziser Z-Höhe und Reinigungsturm kann zu Schneidefehlern führen." @@ -13283,10 +13652,6 @@ msgstr "Der Vasen-Modus funktioniert nicht, wenn ein Objekt mehr als ein Materia msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Obwohl das Objekt %1% selbst in das Bauvolumen passt, überschreitet es die maximale Bauvolumenhöhe aufgrund der Material-Schrumpfungskompensation." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Das Objekt %1% überschreitet die maximale Bauvolumenhöhe." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Obwohl das Objekt %1% selbst in das Bauvolumen passt, überschreitet seine letzte Schicht die maximale Bauvolumenhöhe." @@ -13294,6 +13659,10 @@ msgstr "Obwohl das Objekt %1% selbst in das Bauvolumen passt, überschreitet sei msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Sie möchten möglicherweise die Größe Ihres Modells reduzieren oder die aktuellen Druckeinstellungen ändern und es erneut versuchen." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Das Objekt %1% überschreitet die maximale Bauvolumenhöhe." + msgid "Variable layer height is not supported with Organic supports." msgstr "Variable Schichthöhe wird nicht mit organischen Stützstrukturen unterstützt." @@ -14242,12 +14611,39 @@ msgstr "Geschwindigkeit der internen Brücken. Wenn der Wert als Prozentsatz ang msgid "This is the distance from the model to the outermost brim line." msgstr "Abstand vom Modell zur äußersten Randlinie" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Randtyp" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Dies steuert die Erstellung des Brims an der äußeren und/oder inneren Seitevon Modellen. Auto bedeutet, dass die Breite des Brims automatisch analysiert und berechnet wird." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Lücke zwischen Rand und Objekt" @@ -15422,9 +15818,6 @@ msgstr "Filamentpreis. Nur für statistische Zwecke." msgid "money/kg" msgstr "Kosten/kg" -msgid "Vendor" -msgstr "Hersteller" - msgid "Vendor of filament. For show only." msgstr "Hersteller des Filaments. Nur zur Anzeige." @@ -15498,6 +15891,66 @@ msgstr "Mehrzeilige Füllung" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Verwendung mehrerer Linien für das Füllmuster, wenn vom Füllmuster unterstützt." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Linear" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "Z-Buckling-Bias-Optimierung (experimentell)" @@ -17709,6 +18162,99 @@ msgstr "Einzelner Extruder, mehrere Materialien" msgid "Use single nozzle to print multi filament." msgstr "Benutze eine einzelne Düse zum Drucken mit mehreren Filamenten" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Manueller Filamentwechsel" @@ -18086,6 +18632,130 @@ msgstr "Schwellwertüberlappung" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Wenn der Schwellenwinkel null ist, werden Stützen für Überhänge generiert, deren Überlappung unter dem Schwellenwert liegt. Je kleiner dieser Wert ist, desto steiler kann der Überhang gedruckt werden, ohne Stützen zu benötigen." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Baumstütze Astwinkel" @@ -18260,17 +18930,11 @@ msgstr "Die Anzahl der oberen festen Schichten wird beim Slicen erhöht, wenn di msgid "Separated infills" msgstr "Getrennte Füllungen" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Zentriert die innere Füllung jedes Teils auf sich selbst, als ob es allein geslict würde, anstatt auf der gesamten Baugruppe. Teile, die sich berühren oder überlappen, werden als ein Körper behandelt und teilen sich ein Zentrum; separate Teile (oder eigenständige 3D-Objekte) erhalten jeweils ihr eigenes.\n" -"Nützlich, wenn eine Baugruppe mehrere Objekte gruppiert, die jeweils eine konsistente, selbstzentrierte Füllung behalten sollen.\n" -"Wirkt sich auf Linien- und Gittermuster sowie Rotationsvorlagen-Füllungen aus.\n" -"Muster, die an globale Koordinaten gebunden sind (Gyroid, Honeycomb, TPMS, ...), sind nicht betroffen." # AI Translated msgid "Center surface pattern on" @@ -18507,6 +19171,12 @@ msgstr "Die Reinigung nach dem Filamentwechsel erfolgt innerhalb der Stützstruk msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Dieses Objekt wird verwendet, um die Düse nach einem Filamentwechsel zu reinigen, Filament zu sparen und die Druckzeit zu verkürzen. Die Farben der Objekte werden dadurch gemischt. Dies wird nur wirksam, wenn der Reinigungsturm aktiviert ist." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Maximale Brückenlänge" @@ -19396,8 +20066,8 @@ msgstr "Name des physischen Druckers, der zum Slicen verwendet wird." msgid "Layer number" msgstr "Schichtnummer" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Index der aktuellen Schicht. Einsbasiert (d.h. die erste Schicht ist Nummer 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Schichthöhe Z" @@ -19541,9 +20211,6 @@ msgstr "Rekalibrierung" msgid "Calibrate" msgstr "Kalibrieren" -msgid "Finish" -msgstr "Fertig" - msgid "How can I use calibration results?" msgstr "Wie wird das Kalibrierungsergebnis verwendet?" @@ -20078,12 +20745,12 @@ msgstr "" "Beschleunigungswerte müssen größer als Geschwindigkeitswerte sein.\n" "Bitte überprüfen Sie die Eingaben." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Temperatur Test" -msgid "Filament type" -msgstr "Filamenttyp" - msgid "PLA" msgstr "PLA" @@ -20105,6 +20772,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Testmodell" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Starttemperatur" @@ -20230,9 +20903,6 @@ msgstr "Start Rückzugslänge" msgid "End retraction length: " msgstr "Ende Rückzugslänge" -msgid "Test model" -msgstr "Testmodell" - msgid "Ringing Tower" msgstr "Ringing Turm" @@ -20660,9 +21330,6 @@ msgstr "z.B. Basic, Matte, Silk, Marble" msgid "Filament Preset" msgstr "Filamentprofil" -msgid "Create" -msgstr "Erstellen" - msgid "Vendor is not selected; please reselect vendor." msgstr "Hersteller ist nicht ausgewählt, bitte Hersteller erneut auswählen." @@ -20970,6 +21637,9 @@ msgstr "" "Drucker und alle Filament- und Prozessprofile, die zum Drucker gehören.\n" "Kann mit anderen geteilt werden." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21675,9 +22345,6 @@ msgstr "Weist das Filament manuell der linken oder rechten Düse zu" msgid "Global settings" msgstr "Globale Einstellungen" -msgid "Video tutorial" -msgstr "Video-Tutorial" - msgid "(Sync with printer)" msgstr "(Mit Drucker synchronisieren)" @@ -22077,6 +22744,33 @@ msgstr "Wenn aktiviert, werden die obigen Werte als Standardwerte für zukünfti msgid "PresetBundle" msgstr "Preset-Bündel" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "Bündelordner existiert nicht." @@ -22110,6 +22804,12 @@ msgstr "Bündel abbestellen" msgid "ExportPresetBundle" msgstr "Preset-Bündel exportieren" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "Preset-Bündel speichern" @@ -26532,214 +27232,6 @@ msgstr "Diese Schriftart hat keinen Umriss für diesen Text" msgid "Size: %.1f × %.1f mm" msgstr "Größe: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitiv" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Leeres Netz erzeugt" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Quader" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Schnell:" - -# AI Translated -msgid "Width (X)" -msgstr "Breite (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Tiefe (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Höhe (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R unten" - -# AI Translated -msgid "Top R" -msgstr "R oben" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "R groß" - -# AI Translated -msgid "Minor R" -msgstr "R klein" - -# AI Translated -msgid "All edges" -msgstr "Alle Kanten" - -# AI Translated -msgid "Top edges" -msgstr "Obere Kanten" - -# AI Translated -msgid "Bottom edges" -msgstr "Untere Kanten" - -# AI Translated -msgid "Lateral edges" -msgstr "Seitliche Kanten" - -# AI Translated -msgid "Mesh resolution" -msgstr "Netzauflösung" - -# AI Translated -msgid "Add Shape" -msgstr "Form hinzufügen" - -# AI Translated -msgid "No outer profile" -msgstr "Kein Außenprofil" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Außenfläche konnte nicht erstellt werden" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Fläche mit Löchern konnte nicht erstellt werden" - -# AI Translated -msgid "Revolve failed" -msgstr "Rotieren fehlgeschlagen" - -# AI Translated -msgid "Profile" -msgstr "Profil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Neues Profil beginnen (für Löcher)" - -# AI Translated -msgid "Segments" -msgstr "Segmente" - -# AI Translated -msgid "Sides" -msgstr "Seiten" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Zum Zeichnen in die Ansicht klicken" - -# AI Translated -msgid "Snap to grid" -msgstr "Am Raster einrasten" - -# AI Translated -msgid "Grid step" -msgstr "Rasterabstand" - -# AI Translated -msgid "Outer" -msgstr "Außen" - -# AI Translated -msgid "closed" -msgstr "geschlossen" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% Punkte %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Oben)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Vorne)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Seite)" - -# AI Translated -msgid "Revolve deg" -msgstr "Rotieren (Grad)" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "0 zum Extrudieren, >0 zum Rotieren" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Tasche (Ausschnitt)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu geschlossenes Profil" -msgstr[1] "%zu geschlossene Profile" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Zum Aktivieren ein geschlossenes Profil zeichnen" - -# AI Translated -msgid "Clear all" -msgstr "Alle löschen" - -# AI Translated -msgid "Empty result" -msgstr "Leeres Ergebnis" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Extrudieren: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Rotieren: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Kein Objekt ausgewählt" - -# AI Translated -msgid "Face failed" -msgstr "Fläche fehlgeschlagen" - -# AI Translated -msgid "Face with holes failed" -msgstr "Fläche mit Löchern fehlgeschlagen" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Werkzeugnetz ist leer" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Tasche hinzugefügt (negatives Volumen)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Tasche: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -26861,6 +27353,9 @@ msgstr "Gizmo Zusammenbauen" msgid "Gizmo brim ears" msgstr "Gizmo mausohren" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Vertikaler Schieberegler - Aktiven Schieber nach oben bewegen" @@ -27842,10 +28337,6 @@ msgstr "Meine Einstellungen" msgid "Custom Printer Setup" msgstr "Benutzerdefinierte Druckereinrichtung" -# AI Translated -msgid "Custom Printer" -msgstr "Benutzerdefinierter Drucker" - # AI Translated msgid "Define a custom printer profile" msgstr "Ein benutzerdefiniertes Druckerprofil festlegen" @@ -28490,9 +28981,8 @@ msgstr "Winkelschwellenwert - die Füllung stoppt an Kanten, die schärfer als d msgid "Click a triangle to paint it" msgstr "Klicken Sie auf ein Dreieck, um es zu bemalen" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Erfordert, dass die aktive Ebene die Projektion „Abwickeln (LSCM)“ verwendet." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -28506,17 +28996,15 @@ msgstr "Schnell - das Relief wird nur schattiert, nicht aufgebaut, und nur für msgid "Checker" msgstr "Schachbrett" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Schachbrett - ein Testraster statt der Textur. Wo die Quadrate quadratisch bleiben, ist die Textur unverzerrt; wo sie sich dehnen, wird es auch die Textur" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Verzerrung" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Verzerrung - Dehnungs-Heatmap von Blau bis Rot über die Abwicklung" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28632,24 +29120,11 @@ msgstr "Filamente mischen" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Verschachtelt zwei Filamente, um die Zwischenfarben zu simulieren, sodass wenige Filamente ein Foto oder einen Farbverlauf abdecken können. Ein Bild mit flachen Farben wird in beiden Fällen gleich gedruckt. Ist dies deaktiviert, wird ein Filament pro Bereich verwendet." -# AI Translated -msgid "Mix by" -msgstr "Mischen nach" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Oberfläche" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Schichten: Die beiden Filamente wechseln sich zwischen den Druckschichten ab, was auf senkrechten Flächen gleichmäßig verläuft, auf flach liegenden aber verschwindet, da dort eine ganze Schicht ein einziges Band ist.\n" -"Oberfläche: ein feines Schachbrettmuster über die Oberfläche, das bei jedem Winkel funktioniert, aber eher als Textur denn als Mischung wirken kann.\n" -"Automatisch: Schichten auf senkrechten Flächen; flach liegende Flächen erhalten das nächstgelegene einzelne Filament, da ein Schachbrettmuster dort als Muster sichtbar wird." # AI Translated #, boost-format @@ -29109,14 +29584,6 @@ msgstr "Benötigt etwa %1% Dreiecke, Budget %2% - der Einbrennvorgang vereinfach msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Wie viele tausend Dreiecke die Verfeinerung dem Modell hinzufügen darf. Das am schlechtesten passende Dreieck wird immer zuerst geteilt, sodass selbst ein Durchlauf, der alles aufbraucht, die Dreiecke dort eingesetzt hat, wo es am meisten auffällt. Erhöhen Sie den Wert, wenn das Relief noch grob aussieht." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Stoppt das Einbrennen. Was bereits fertiggestellt wurde, bleibt auf dem Modell und kann rückgängig gemacht werden." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Schließt das Werkzeug ohne Einbrennen. Ihre Bemalung, Ebenen und Einstellungen bleiben beim Modell." - # AI Translated msgid "Preparing..." msgstr "Vorbereiten..." @@ -29141,6 +29608,14 @@ msgstr "Wandelt die gemalten Höhenkarten in echte Geometrie um, indem die berei msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Wandelt die gemalten Höhenkarten in echte Geometrie um. Das Netz wird auf eine gleichmäßige Dichte neu vernetzt und zuerst dort verfeinert, wo sich die Textur krümmt, damit die Details Eckpunkte vorfinden - alles in einem Schritt." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Stoppt das Einbrennen. Was bereits fertiggestellt wurde, bleibt auf dem Modell und kann rückgängig gemacht werden." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Schließt das Werkzeug ohne Einbrennen. Ihre Bemalung, Ebenen und Einstellungen bleiben beim Modell." + # AI Translated #, boost-format msgid "%1% k" @@ -29350,6 +29825,28 @@ msgstr "Filament-Plugins" msgid "Printer plugins" msgstr "Drucker-Plugins" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Standardwerte wiederherstellen" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Die Konfiguration ist kein gültiges JSON. Ihre Änderungen wurden nicht gespeichert." @@ -29369,10 +29866,6 @@ msgstr "" "\n" "Dadurch wird die Überschreibung des Profils verworfen und die globale Konfiguration verwendet." -# AI Translated -msgid "Restore defaults" -msgstr "Standardwerte wiederherstellen" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Globale Konfiguration wird verwendet. Speichern Sie das Profil, um dies dauerhaft zu übernehmen." @@ -29442,6 +29935,215 @@ msgstr "Plugin wird installiert" msgid "Installed \"%s\"." msgstr "„%s“ installiert." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29658,6 +30360,54 @@ msgstr "Plugin konnte nicht neu geladen werden." msgid "Reloaded \"%s\"." msgstr "„%s“ neu geladen." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "Modellinformationen" + +msgid "Accessories" +msgstr "Zubehör" + +msgid "Profile Information" +msgstr "Profilinformationen" + +msgid "Model name" +msgstr "Modellname" + +msgid "Created by" +msgstr "Erstellt von" + +msgid "Remixed by" +msgstr "Remixed von" + +msgid "Shared by" +msgstr "Geteilt von" + +msgid "Model description" +msgstr "Modellbeschreibung" + +msgid "BOM" +msgstr "Stückliste" + +msgid "Profile name" +msgstr "Profilname" + +msgid "Profile Author" +msgstr "Profilautor" + +msgid "Profile description" +msgstr "Profilbeschreibung" + # AI Translated msgid "Purge Mode Settings" msgstr "Einstellungen des Spülmodus" @@ -29682,6 +30432,16 @@ msgstr "Reduziert den Spülabfall und druckt schneller. Kann zu leichter Farbver msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Ein Befehl wird bereits ausgeführt." @@ -29948,6 +30708,9 @@ msgstr " | Einrasten EIN" msgid "Change texture - choose another one from the texture library" msgstr "Textur ändern - eine andere aus der Texturbibliothek wählen" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Höhenkarte - die Textur der Ebene unter den Inseln anzeigen" @@ -29980,17 +30743,14 @@ msgstr "Inseln verbinden" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Legt die Abwicklung als zusammenhängendes Faltnetz aus: Teile, die eine Kante teilen, werden nebeneinander aufgeklappt (ein Würfel wird zu einem zusammenhängenden Würfelnetz statt zu sechs losen Quadraten). Sie bleiben getrennte Inseln, sodass Sie jede davon anschließend noch von Hand verschieben können." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Insel - ganze Inseln verschieben, drehen und skalieren" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Eckpunkt - Eckpunkte zum Umformen ziehen; Umschalt/Strg für Mehrfachauswahl" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Kante - Kanten zum Umformen ziehen; Umschalt/Strg für Mehrfachauswahl" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30028,9 +30788,13 @@ msgstr "UV-Bearbeitungen löschen - alle manuellen Eckpunkt-/Kantenverschiebunge msgid "Snap - stick islands together when dragging one against another" msgstr "Einrasten - Inseln aneinander haften lassen, wenn eine gegen eine andere gezogen wird" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Alle Inseln einpassen (Pos1)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30041,6 +30805,9 @@ msgstr "Keine Ebene mit „Abwickeln“ projiziert" msgid "%.1f mm tile" msgstr "Kachel %.1f mm" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Veraltet - die Bemalung, die Nähte oder der Nahtwinkel haben sich seit dieser Abwicklung geändert. Drücken, um erneut abzuwickeln." @@ -30049,19 +30816,48 @@ msgstr "Veraltet - die Bemalung, die Nähte oder der Nahtwinkel haben sich seit msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Flacht den bemalten Bereich in UV-Inseln ab. Dies wird nur beim Drücken berechnet, nicht bei jeder Bearbeitung - also zuerst malen, den Nahtwinkel ändern oder Nähte markieren und dann „Abwickeln“ drücken." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d Inseln, %s Flächen" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Das Bambu Network-Plug-in wurde nicht erkannt. Klicken Sie hier, um es zu installieren." + +msgid "Create new project" +msgstr "Neues Projekt erstellen" + +msgid "Recently opened" +msgstr "Zuletzt geöffnet" + +msgid "Open Containing Folder" +msgstr "Enthaltenden Ordner öffnen" + # AI Translated msgid "Forward" msgstr "Vorwärts" -# AI Translated -msgid "Tools" -msgstr "Werkzeuge" - # AI Translated msgid "View Source" msgstr "Quelltext anzeigen" @@ -30207,6 +31003,16 @@ msgstr "" "Plugin „%s“ möchte den/die folgenden Befehl(e) ausführen:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30216,6 +31022,30 @@ msgstr "Plugin „%s“ fordert eine Berechtigung für das Python-Audit-Ereignis msgid "Plugin permission request" msgstr "Berechtigungsanfrage eines Plugins" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Die Konfigurationsoberfläche des Plugins war leer. Der Standardeditor wird angezeigt." @@ -30802,6 +31632,313 @@ msgstr "" "Verwerfungen vermeiden\n" "Wussten Sie, dass beim Drucken von Materialien, die zu Verwerfungen neigen, wie z.B. ABS, durch eine entsprechende Erhöhung der Heizbetttemperatur die Wahrscheinlichkeit von Verwerfungen verringert werden kann?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Die Microsoft WebView2 Runtime konnte nicht installiert werden.\n" +#~ "Einige Funktionen, einschließlich des Einrichtungsassistenten, werden möglicherweise leer angezeigt, bis sie installiert ist.\n" +#~ "Bitte installieren Sie sie manuell von https://developer.microsoft.com/microsoft-edge/webview2/ und starten Sie Orca Slicer neu." + +#~ msgid "Why this grouping" +#~ msgstr "Warum diese Gruppierung" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Die Software unterstützt nicht die Verwendung unterschiedlicher Düsendurchmesser für einen Druck. Wenn die linke und rechte Düse nicht übereinstimmen, können wir nur mit dem Einzelkopf-Druck fortfahren. Bitte bestätigen Sie, welche Düse Sie für dieses Projekt verwenden möchten." + +#~ msgid "Switch diameter" +#~ msgstr "Durchmesser wechseln" + +# AI Translated +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudio-Projekt" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "Die 3MF-Datei wurde von BambuStudio (Version %s) erstellt, die neuer ist als die kompatible Version %s. Nicht erkannte Einstellungen gefunden:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "Die 3MF wurde von BambuStudio (Version %s) erstellt, die neuer ist als die kompatible Version %s. Einige Einstellungen sind möglicherweise nicht vollständig kompatibel." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "Die 3MF wurde von BambuStudio erstellt. Einige Einstellungen können von OrcaSlicer abweichen." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Rückgängig und Wiederholen sind während eines laufenden Vorgangs nicht möglich. Beenden Sie ihn zuerst." + +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Zentriert die innere Füllung jedes Teils auf sich selbst, als ob es allein geslict würde, anstatt auf der gesamten Baugruppe. Teile, die sich berühren oder überlappen, werden als ein Körper behandelt und teilen sich ein Zentrum; separate Teile (oder eigenständige 3D-Objekte) erhalten jeweils ihr eigenes.\n" +#~ "Nützlich, wenn eine Baugruppe mehrere Objekte gruppiert, die jeweils eine konsistente, selbstzentrierte Füllung behalten sollen.\n" +#~ "Wirkt sich auf Linien- und Gittermuster sowie Rotationsvorlagen-Füllungen aus.\n" +#~ "Muster, die an globale Koordinaten gebunden sind (Gyroid, Honeycomb, TPMS, ...), sind nicht betroffen." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Index der aktuellen Schicht. Einsbasiert (d.h. die erste Schicht ist Nummer 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Video-Tutorial" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitiv" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Leeres Netz erzeugt" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Quader" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Schnell:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Breite (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Tiefe (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Höhe (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R unten" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R oben" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "R groß" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "R klein" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Alle Kanten" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Obere Kanten" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Untere Kanten" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Seitliche Kanten" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Netzauflösung" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Form hinzufügen" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Kein Außenprofil" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Außenfläche konnte nicht erstellt werden" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Fläche mit Löchern konnte nicht erstellt werden" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Rotieren fehlgeschlagen" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Neues Profil beginnen (für Löcher)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmente" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Seiten" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Zum Zeichnen in die Ansicht klicken" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Am Raster einrasten" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Rasterabstand" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Außen" + +# AI Translated +#~ msgid "closed" +#~ msgstr "geschlossen" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% Punkte %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Oben)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Vorne)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Seite)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Rotieren (Grad)" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "0 zum Extrudieren, >0 zum Rotieren" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Tasche (Ausschnitt)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu geschlossenes Profil" +#~ msgstr[1] "%zu geschlossene Profile" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Zum Aktivieren ein geschlossenes Profil zeichnen" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Leeres Ergebnis" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Extrudieren: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Rotieren: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Kein Objekt ausgewählt" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Fläche fehlgeschlagen" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Fläche mit Löchern fehlgeschlagen" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Werkzeugnetz ist leer" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Tasche hinzugefügt (negatives Volumen)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Tasche: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Erfordert, dass die aktive Ebene die Projektion „Abwickeln (LSCM)“ verwendet." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Schachbrett - ein Testraster statt der Textur. Wo die Quadrate quadratisch bleiben, ist die Textur unverzerrt; wo sie sich dehnen, wird es auch die Textur" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Verzerrung - Dehnungs-Heatmap von Blau bis Rot über die Abwicklung" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Mischen nach" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Oberfläche" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Schichten: Die beiden Filamente wechseln sich zwischen den Druckschichten ab, was auf senkrechten Flächen gleichmäßig verläuft, auf flach liegenden aber verschwindet, da dort eine ganze Schicht ein einziges Band ist.\n" +#~ "Oberfläche: ein feines Schachbrettmuster über die Oberfläche, das bei jedem Winkel funktioniert, aber eher als Textur denn als Mischung wirken kann.\n" +#~ "Automatisch: Schichten auf senkrechten Flächen; flach liegende Flächen erhalten das nächstgelegene einzelne Filament, da ein Schachbrettmuster dort als Muster sichtbar wird." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Insel - ganze Inseln verschieben, drehen und skalieren" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Eckpunkt - Eckpunkte zum Umformen ziehen; Umschalt/Strg für Mehrfachauswahl" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Kante - Kanten zum Umformen ziehen; Umschalt/Strg für Mehrfachauswahl" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Alle Inseln einpassen (Pos1)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Experimentell) Drucker-Agenten anstelle von Druck-Hosts verwenden" @@ -30835,16 +31972,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Auf eine Fläche oder eine Referenzebene klicken, dann ein Zeichenwerkzeug wählen" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -30901,10 +32028,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Vertikaler Abstand" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Linear" - #~ msgid "Face recognition" #~ msgstr "Gesichtserkennung" @@ -32582,9 +33705,6 @@ msgstr "" #~ "da die Objekte auf das Druckbett beschränkt sind \n" #~ "und nur Teile angehoben werden können." -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "Controls the density (spacing) of external bridge lines. Default is 100%.\n" #~ "Theoretically, 100% means a solid bridge, but due to the tendency of bridge extrusions to sag, 100% may not be sufficient.\n" diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index cafb65fa34..5182f71ba1 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2026-06-17 15:44-0300\n" "Last-Translator: Alexandre Folle de Menezes\n" "Language-Team: \n" @@ -2017,10 +2017,11 @@ msgstr "" msgid "WebView2 Runtime" msgstr "" +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" #, c-format, boost-format @@ -3997,6 +3998,9 @@ msgstr "" msgid "AMS Materials Setting" msgstr "" +msgid "Wiki Guide" +msgstr "" + msgid "Close" msgstr "" @@ -4018,9 +4022,6 @@ msgstr "" msgid "Factors of Flow Dynamics Calibration" msgstr "" -msgid "Wiki Guide" -msgstr "" - msgid "PA Profile" msgstr "" @@ -4566,6 +4567,11 @@ msgstr "" msgid "Adjust" msgstr "" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5342,9 +5348,6 @@ msgstr "" msgid "Filament Grouping" msgstr "" -msgid "Why this grouping" -msgstr "" - msgid "Please place filaments on the printer based on grouping result." msgstr "" @@ -5525,6 +5528,43 @@ msgstr "" msgid "Sequence" msgstr "" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "" @@ -5733,6 +5773,12 @@ msgstr "" msgid "Labels" msgstr "" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + msgid "Move section plane" msgstr "" @@ -5775,7 +5821,7 @@ msgstr "" msgid "Size:" msgstr "" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "" @@ -6232,6 +6278,12 @@ msgstr "" msgid "Show Gridlines on plate" msgstr "" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "" @@ -7768,6 +7820,60 @@ msgstr "" msgid "Material settings" msgstr "" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +msgid "Tools" +msgstr "" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "" @@ -7792,6 +7898,17 @@ msgstr "" msgid "Move plate to the front" msgstr "" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "" @@ -7857,12 +7974,6 @@ msgstr "" msgid "Not installed" msgstr "" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "" - -msgid "Switch diameter" -msgstr "" - msgid "Configuration incompatible" msgstr "" @@ -7935,6 +8046,9 @@ msgstr "" msgid "Remove last mixed filament" msgstr "" +msgid "Remove all mixed filaments" +msgstr "" + msgid "Add mixed filament" msgstr "" @@ -7953,6 +8067,10 @@ msgstr "" msgid "Edit / Delete / Merge" msgstr "" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "" @@ -8023,9 +8141,6 @@ msgstr "" msgid "Load 3MF" msgstr "" -msgid "BambuStudio Project" -msgstr "" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "" @@ -8055,17 +8170,6 @@ msgstr "" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "" -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "" - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "" - msgid "Invalid values found in the 3MF:" msgstr "" @@ -8215,6 +8319,12 @@ msgstr "" msgid "Object with floating parts was detected" msgstr "" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "" @@ -8297,6 +8407,38 @@ msgstr "" msgid "Slicing Canceled" msgstr "" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "" @@ -8323,7 +8465,7 @@ msgstr "" msgid "Sync now" msgstr "" -msgid "Cannot undo or redo while an operation is running. Stop it first." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." msgstr "" msgid "" @@ -8385,6 +8527,11 @@ msgstr "" msgid "Project downloaded %d%%" msgstr "" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + msgid "Pressure Advance Test" msgstr "" @@ -8407,6 +8554,13 @@ msgstr "" msgid "Flowrate Test - Pass%d" msgstr "" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + msgid "Nozzle temperature test" msgstr "" @@ -10571,6 +10725,9 @@ msgstr "" msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "" +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "" @@ -10956,6 +11113,12 @@ msgstr "" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "" +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -11066,9 +11229,24 @@ msgstr "" msgid "Wipe tower" msgstr "" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "" @@ -11078,6 +11256,18 @@ msgstr "" msgid "Z-Hop" msgstr "" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -11169,7 +11359,7 @@ msgid "Don't warn again for this preset" msgstr "" #, c-format, boost-format -msgid "%s: %s" +msgid "%s %s" msgstr "" msgid "No modifications need to be copied." @@ -11556,9 +11746,6 @@ msgstr "" msgid "Total ramming" msgstr "" -msgid "Volume" -msgstr "" - msgid "Ramming line" msgstr "" @@ -11606,6 +11793,118 @@ msgstr "" msgid "parse json failed" msgstr "" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +msgid "Custom Printer" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "" + +msgid "Vendor" +msgstr "" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "" + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "" + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + msgid "[Action Required] " msgstr "" @@ -12020,6 +12319,14 @@ msgstr "" msgid "No object can be printed. It may be too small." msgstr "" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "" @@ -12179,6 +12486,26 @@ msgstr "" msgid "write callback failed" msgstr "" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "" @@ -12227,6 +12554,43 @@ msgstr "" msgid "No extrusions under current settings." msgstr "" +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "" @@ -12236,6 +12600,15 @@ msgstr "" msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "" +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "" @@ -12252,10 +12625,6 @@ msgstr "" msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "" -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "" - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "" @@ -12263,6 +12632,10 @@ msgstr "" msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "" +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "" + msgid "Variable layer height is not supported with Organic supports." msgstr "" @@ -13055,12 +13428,39 @@ msgstr "" msgid "This is the distance from the model to the outermost brim line." msgstr "" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "" +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "" @@ -14053,9 +14453,6 @@ msgstr "" msgid "money/kg" msgstr "" -msgid "Vendor" -msgstr "" - msgid "Vendor of filament. For show only." msgstr "" @@ -14117,6 +14514,65 @@ msgstr "" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "" +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +msgid "Linear" +msgstr "" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "" @@ -16129,6 +16585,99 @@ msgstr "" msgid "Use single nozzle to print multi filament." msgstr "" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "" @@ -16464,6 +17013,129 @@ msgstr "" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "" +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Z" +msgstr "" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "" @@ -16627,8 +17299,7 @@ msgstr "" msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" msgid "Center surface pattern on" @@ -16827,6 +17498,12 @@ msgstr "" msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "" +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "" @@ -17674,7 +18351,7 @@ msgstr "" msgid "Layer number" msgstr "" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." msgstr "" msgid "Layer Z" @@ -17814,9 +18491,6 @@ msgstr "" msgid "Calibrate" msgstr "" -msgid "Finish" -msgstr "" - msgid "How can I use calibration results?" msgstr "" @@ -18303,10 +18977,10 @@ msgid "" "Please verify the inputs." msgstr "" -msgid "Temperature calibration" +msgid "Not enabled yet on belt printers — use the PA Tower method instead." msgstr "" -msgid "Filament type" +msgid "Temperature calibration" msgstr "" msgid "PLA" @@ -18330,6 +19004,12 @@ msgstr "" msgid "PET-CF" msgstr "" +msgid "Test model" +msgstr "" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "" @@ -18422,9 +19102,6 @@ msgstr "" msgid "End retraction length: " msgstr "" -msgid "Test model" -msgstr "" - msgid "Ringing Tower" msgstr "" @@ -18828,9 +19505,6 @@ msgstr "" msgid "Filament Preset" msgstr "" -msgid "Create" -msgstr "" - msgid "Vendor is not selected; please reselect vendor." msgstr "" @@ -19106,6 +19780,9 @@ msgid "" "Can be shared with others." msgstr "" +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -19774,9 +20451,6 @@ msgstr "" msgid "Global settings" msgstr "" -msgid "Video tutorial" -msgstr "" - msgid "(Sync with printer)" msgstr "" @@ -20165,6 +20839,33 @@ msgstr "" msgid "PresetBundle" msgstr "" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "" @@ -20198,6 +20899,12 @@ msgstr "" msgid "ExportPresetBundle" msgstr "" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "" @@ -23590,165 +24297,6 @@ msgstr "" msgid "Size: %.1f × %.1f mm" msgstr "" -msgid "Primitive" -msgstr "" - -msgid "Empty mesh generated" -msgstr "" - -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "" - -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "" - -msgid "Width (X)" -msgstr "" - -msgid "Depth (Y)" -msgstr "" - -msgid "Height (Z)" -msgstr "" - -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "" - -msgid "Top R" -msgstr "" - -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "" - -msgid "Minor R" -msgstr "" - -msgid "All edges" -msgstr "" - -msgid "Top edges" -msgstr "" - -msgid "Bottom edges" -msgstr "" - -msgid "Lateral edges" -msgstr "" - -msgid "Mesh resolution" -msgstr "" - -msgid "Add Shape" -msgstr "" - -msgid "No outer profile" -msgstr "" - -msgid "Failed to make outer face" -msgstr "" - -msgid "Failed to build face with holes" -msgstr "" - -msgid "Revolve failed" -msgstr "" - -msgid "Profile" -msgstr "" - -msgid "Start new profile (for holes)" -msgstr "" - -msgid "Segments" -msgstr "" - -msgid "Sides" -msgstr "" - -msgid "Click on canvas to draw" -msgstr "" - -msgid "Snap to grid" -msgstr "" - -msgid "Grid step" -msgstr "" - -msgid "Outer" -msgstr "" - -msgid "closed" -msgstr "" - -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "" - -msgid "XY (Top)" -msgstr "" - -msgid "XZ (Front)" -msgstr "" - -msgid "YZ (Side)" -msgstr "" - -msgid "Revolve deg" -msgstr "" - -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "" - -msgid "Pocket (cut)" -msgstr "" - -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "" -msgstr[1] "" - -msgid "Draw a closed profile to enable" -msgstr "" - -msgid "Clear all" -msgstr "" - -msgid "Empty result" -msgstr "" - -#, boost-format -msgid "Extrude: %1%" -msgstr "" - -#, boost-format -msgid "Revolve: %1%" -msgstr "" - -msgid "No object selected" -msgstr "" - -msgid "Face failed" -msgstr "" - -msgid "Face with holes failed" -msgstr "" - -msgid "Tool mesh empty" -msgstr "" - -msgid "Pocket added (negative volume)" -msgstr "" - -#, boost-format -msgid "Pocket: %1%" -msgstr "" - msgctxt "Keyboard Shortcut" msgid "Ins" msgstr "" @@ -23857,6 +24405,9 @@ msgstr "" msgid "Gizmo brim ears" msgstr "" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "" @@ -24618,9 +25169,6 @@ msgstr "" msgid "Custom Printer Setup" msgstr "" -msgid "Custom Printer" -msgstr "" - msgid "Define a custom printer profile" msgstr "" @@ -25106,7 +25654,7 @@ msgstr "" msgid "Click a triangle to paint it" msgstr "" -msgid "Needs the active layer mapped with Unwrap (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." msgstr "" msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -25118,13 +25666,13 @@ msgstr "" msgid "Checker" msgstr "" -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" msgstr "" msgid "Distortion" msgstr "" -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" msgstr "" msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -25211,17 +25759,10 @@ msgstr "" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "" -msgid "Mix by" +msgid "Mixed colors" msgstr "" -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "" - -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" #, boost-format @@ -25571,12 +26112,6 @@ msgstr "" msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "" -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "" - -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "" - msgid "Preparing..." msgstr "" @@ -25595,6 +26130,12 @@ msgstr "" msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "" +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "" + +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "" + #, boost-format msgid "%1% k" msgstr "" @@ -25760,6 +26301,27 @@ msgstr "" msgid "Printer plugins" msgstr "" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +msgid "Restore defaults" +msgstr "" + +msgid "Invalid JSON" +msgstr "" + msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "" @@ -25773,9 +26335,6 @@ msgid "" "This discards the preset's override and uses the global configuration." msgstr "" -msgid "Restore defaults" -msgstr "" - msgid "Using global configuration. Save the preset to persist it." msgstr "" @@ -25827,6 +26386,215 @@ msgstr "" msgid "Installed \"%s\"." msgstr "" +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + #, c-format, boost-format msgid "Failed to activate \"%s\"." msgstr "" @@ -25985,6 +26753,54 @@ msgstr "" msgid "Reloaded \"%s\"." msgstr "" +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + msgid "Purge Mode Settings" msgstr "" @@ -26003,6 +26819,16 @@ msgstr "" msgid "Terminal" msgstr "" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + msgid "A command is already running." msgstr "" @@ -26204,6 +27030,9 @@ msgstr "" msgid "Change texture - choose another one from the texture library" msgstr "" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + msgid "Height map - show the layer's texture under the islands" msgstr "" @@ -26228,13 +27057,13 @@ msgstr "" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "" -msgid "Island - move, rotate and scale whole islands" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." msgstr "" -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." msgstr "" -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." msgstr "" msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -26264,7 +27093,12 @@ msgstr "" msgid "Snap - stick islands together when dragging one against another" msgstr "" -msgid "Frame all islands (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." msgstr "" msgid "No layer mapped with Unwrap" @@ -26274,20 +27108,53 @@ msgstr "" msgid "%.1f mm tile" msgstr "" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "" msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "" +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + #, c-format, boost-format msgid "%d islands, %s faces" msgstr "" -msgid "Forward" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." msgstr "" -msgid "Tools" +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + +msgid "Forward" msgstr "" msgid "View Source" @@ -26393,6 +27260,16 @@ msgid "" "%s" msgstr "" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." msgstr "" @@ -26400,6 +27277,30 @@ msgstr "" msgid "Plugin permission request" msgstr "" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "" diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index 4e6a3d8001..ed76c12a2b 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: \n" "Last-Translator: Ian A. Bassi <>\n" "Language-Team: \n" @@ -2062,14 +2062,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"No se pudo instalar Microsoft WebView2 Runtime.\n" -"Algunas funciones, incluido el asistente de configuración, pueden aparecer en blanco hasta que se instale.\n" -"Instálelo manualmente desde https://developer.microsoft.com/microsoft-edge/webview2/ y reinicie Orca Slicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4128,6 +4126,9 @@ msgstr "Ir a la cama" msgid "AMS Materials Setting" msgstr "Ajustes de materiales AMS" +msgid "Wiki Guide" +msgstr "Guía en Wiki" + msgid "Close" msgstr "Cerrar" @@ -4151,9 +4152,6 @@ msgstr "El valor de entrada debe ser mayor que %1% y menor que %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "Factores de calibración de dinámicas de flujo" -msgid "Wiki Guide" -msgstr "Guía en Wiki" - msgid "PA Profile" msgstr "Perfil de «Pressure advance»" @@ -4732,6 +4730,11 @@ msgstr "¿Ajustarla automáticamente al límite (%g mm)?" msgid "Adjust" msgstr "Ajustar" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5557,9 +5560,6 @@ msgstr "Volver a laminar automáticamente según la agrupación óptima de filam msgid "Filament Grouping" msgstr "Agrupación de filamentos" -msgid "Why this grouping" -msgstr "Por qué esta agrupación" - msgid "Please place filaments on the printer based on grouping result." msgstr "Por favor, coloque los filamentos en la impresora según el resultado de la agrupación." @@ -5747,6 +5747,43 @@ msgstr "Incrementar/disminuir el área de edición" msgid "Sequence" msgstr "Secuencia" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Volumen" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Selección de objetos" @@ -5961,6 +5998,12 @@ msgstr "Cuadrícula" msgid "Labels" msgstr "Etiquetas" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Mover plano de sección" @@ -6009,7 +6052,7 @@ msgstr "Volumen:" msgid "Size:" msgstr "Tamaño:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Se han encontrado conflictos de rutas G-Code en la capa %d, Z = %.2lfmm. Por favor, separe más los objetos en conflicto (%s <-> %s)." @@ -6479,6 +6522,12 @@ msgstr "Mostrar cuadrícula" msgid "Show Gridlines on plate" msgstr "Mostrar cuadrícula en la cama" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Reiniciar Diseño de Ventana" @@ -8127,6 +8176,61 @@ msgstr "Ver todos los ajustes del objeto" msgid "Material settings" msgstr "Configuración de Material" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Herramientas" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Quitar cama actual (si no es la última)" @@ -8151,6 +8255,17 @@ msgstr "Editar el nombre de la cama actual" msgid "Move plate to the front" msgstr "Mover cama al frente" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Personalizar cama actual" @@ -8216,12 +8331,6 @@ msgstr "AMS (1 ranura)" msgid "Not installed" msgstr "No instalado" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "El software no admite usar boquillas de diámetros diferentes en una sola impresión. Si las boquillas izquierda y derecha son inconsistentes, solo podremos continuar con impresión de un solo cabezal. Confirme qué boquilla desea usar para este proyecto." - -msgid "Switch diameter" -msgstr "Cambiar diámetro" - msgid "Configuration incompatible" msgstr "Configuración incompatible" @@ -8297,6 +8406,9 @@ msgstr "Filamento mixto" msgid "Remove last mixed filament" msgstr "Eliminar el último filamento mixto" +msgid "Remove all mixed filaments" +msgstr "" + msgid "Add mixed filament" msgstr "Añadir filamento mixto" @@ -8315,6 +8427,10 @@ msgstr "El filamento mixto tiene referencias de componentes rotas" msgid "Edit / Delete / Merge" msgstr "Editar / Borrar / Fusionar" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "El filamento mixto de destino usa este filamento físico como componente. Al fusionarlos se eliminará este filamento físico y el filamento mixto puede quedar no válido. ¿Continuar?" @@ -8388,9 +8504,6 @@ msgstr "Cargando archivo: %s" msgid "Load 3MF" msgstr "Cargar 3MF" -msgid "BambuStudio Project" -msgstr "Proyecto de BambuStudio" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "El 3MF no es de Orca Slicer, cargando sólo datos de geometría." @@ -8420,17 +8533,6 @@ msgstr "Debería actualizar el software.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "La versión de 3MF %s es más nueva que la versión de %s %s. Se aconseja actualizar su software." -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "El archivo 3MF fue creado con BambuStudio (versión %s), que es más reciente que la versión compatible %s. Se han detectado ajustes no reconocidos:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "El archivo 3MF ha sido creado con BambuStudio (versión %s), que es más reciente que la versión compatible %s. Es posible que algunos ajustes no sean totalmente compatibles." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "El archivo 3MF ha sido creado por BambuStudio. Es posible que algunos ajustes difieran de los de OrcaSlicer." - msgid "Invalid values found in the 3MF:" msgstr "Valores inválidos encontrados en el 3MF:" @@ -8593,6 +8695,12 @@ msgstr "¿Desactivar la caída automática para mantener la posición en el eje msgid "Object with floating parts was detected" msgstr "Se ha detectado un objeto con partes flotantes" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Otro trabajo de exportación está en marcha." @@ -8675,6 +8783,38 @@ msgstr "Datos inválidos" msgid "Slicing Canceled" msgstr "Laminado Cancelado" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Plugin de red cambiado con éxito." @@ -8706,9 +8846,8 @@ msgstr "" msgid "Sync now" msgstr "Sincronizar ahora" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "No se puede deshacer ni rehacer mientras se ejecuta una operación. Deténgala primero." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -8775,6 +8914,11 @@ msgstr "Descarga fallida; error de tamaño de archivo." msgid "Project downloaded %d%%" msgstr "Proyecto descargado %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Prueba de Pressure Advance" @@ -8801,6 +8945,13 @@ msgstr "Calibración de flujo YOLO de Orca" msgid "Flowrate Test - Pass%d" msgstr "Prueba de flujo - Pasada %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Prueba de temperatura de la boquilla" @@ -11175,6 +11326,9 @@ msgstr "No se admite la sincronización entre diferentes tipos de extrusor o tip msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Sincroniza la modificación de parámetros con los parámetros correspondientes de otro extrusor." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Presionar para reiniciar todos los ajustes al perfil guardado por defecto." @@ -11580,6 +11734,12 @@ msgstr "Espacio imprimible" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Seleccione la implementación del agente de red para la comunicación con la impresora. Los agentes disponibles se registran al iniciar el sistema." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -11693,9 +11853,24 @@ msgstr "Diámetro de boquilla" msgid "Wipe tower" msgstr "Torre de purga" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Parámetros de extrusor único multimaterial" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Esta es una impresora multimaterial de un solo extrusor, los diámetros de todos los extrusores se ajustarán al nuevo valor. ¿Desea continuar?" @@ -11705,6 +11880,18 @@ msgstr "Límites de altura de la capa" msgid "Z-Hop" msgstr "Salto en Z" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -11811,8 +11998,8 @@ msgid "Don't warn again for this preset" msgstr "No volver a avisar para este perfil" #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" msgid "No modifications need to be copied." msgstr "No hay modificaciones que copiar." @@ -12229,9 +12416,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Moldeado total" -msgid "Volume" -msgstr "Volumen" - msgid "Ramming line" msgstr "Línea de moldeado" @@ -12279,6 +12463,119 @@ msgstr "El inicio de sesión ha fallado. Inténtalo de nuevo." msgid "parse json failed" msgstr "error al analizar el json" +msgid "Loading…" +msgstr "Cargando…" + +msgid "Welcome to Orca Slicer" +msgstr "Bienvenido a Orca Slicer" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer se configurará mediante varios pasos. ¡Comencemos!" + +msgid "Get Started" +msgstr "Comenzar" + +msgid "Please select your login region" +msgstr "Por favor, seleccione su región:" + +msgid "Finish" +msgstr "Finalizar" + +msgid "Printer Selection" +msgstr "Selección de la impresora" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Impresora personalizada" + +msgid "Create" +msgstr "Crear" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "Al menos se debe seleccionar una impresora." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Selección de filamento" + +msgid "System Filaments" +msgstr "Filamentos del sistema" + +msgid "Custom Filaments" +msgstr "Filamentos personalizados" + +msgid "Create New" +msgstr "Crear nuevo" + +msgid "Filament type" +msgstr "Tipo de filamento" + +msgid "Vendor" +msgstr "Fabricante" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "Limpiar todo" + +msgid "At least one filament must be selected." +msgstr "Al menos se debe seleccionar un filamento." + +msgid "Do you want to use the default filament?" +msgstr "¿Desea usar el filamento por defecto?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Esto desactiva todas las funciones en la nube, incluida la sincronización de perfiles con Orca Cloud. Los usuarios que prefieran trabajar totalmente sin conexión pueden activar esta opción." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Nota: Cuando el modo sigiloso está activado, no se realizará ninguna copia de seguridad de tus perfiles de usuario en Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "Activar modo sigiloso." + +msgid "Proprietary Plugins" +msgstr "Plugins propietarios" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "Algunos proveedores de impresoras requieren plugins propietarios para la comunicación con sus impresoras. Seleccione el plugin correspondiente si utiliza tales impresoras." + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "Tenga en cuenta que estos plugins no están desarrollados ni mantenidos por OrcaSlicer. Deben usarse bajo su propia responsabilidad." + +msgid "Install Bambu Network plug-in" +msgstr "Instalar plug-in Bambu Network" + msgid "[Action Required] " msgstr "[Acción requerida] " @@ -12732,6 +13029,14 @@ msgstr "G-Code de cambio de rol de extrusión del filamento" msgid "No object can be printed. It may be too small." msgstr "No se puede imprimir ningún objeto. Tal vez sea demasiado pequeño." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Las piezas se encuentran muy cerca de las regiones de purgado. Asegúrese de que no hay colisión." @@ -12903,6 +13208,26 @@ msgstr "validación fallida" msgid "write callback failed" msgstr "la llamada de recuperación de la escritura ha fallado" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% está demasiado cerca de la zona de exclusión. Podrían producirse colisiones al imprimir." @@ -12953,6 +13278,43 @@ msgstr "Si aún así quieres imprimir, puedes activar la opción en Preferencias msgid "No extrusions under current settings." msgstr "No hay extrusiones con los ajustes actuales." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Se está usando un filamento mixto con degradado, pero 'Subcapa de color mezclado' está desactivado. El degradado no se imprimirá." @@ -12962,6 +13324,15 @@ msgstr "Modo de timelapse suave no está soportado cuando la secuencia \"por obj msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "La detección de aglomeraciones no es compatible cuando la secuencia \"Por objeto\" está activada." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Habilitar tanto la altura Z precisa como la torre de purga puede causar errores de laminado." @@ -12978,10 +13349,6 @@ msgstr "El modo de jarrón en espiral no funciona cuando un objeto contiene más msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Aunque el objeto %1% se ajusta al volumen de construcción, supera la altura máxima del volumen de construcción debido a la compensación de la contracción del material." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "El objeto %1% supera la altura máxima del volumen de construcción." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Aunque el objeto %1% se ajusta al volumen de construcción, su última capa excede la altura máxima del volumen de construcción." @@ -12989,6 +13356,10 @@ msgstr "Aunque el objeto %1% se ajusta al volumen de construcción, su última c msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Es posible que desee reducir el tamaño de su modelo o cambiar la configuración de impresión actual y volver a intentarlo." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "El objeto %1% supera la altura máxima del volumen de construcción." + msgid "Variable layer height is not supported with Organic supports." msgstr "La altura de capa adaptativa no es compatible con los soportes orgánicos." @@ -13930,12 +14301,39 @@ msgstr "Velocidad de los puntes internos. Si se expresa como un porcentaje, ser msgid "This is the distance from the model to the outermost brim line." msgstr "Distancia del modelo a la línea más externa del borde de adherencia." +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Tipo de borde de adherencia" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Contro de la generación del borde de adherencia en el lado exterior y/o interior de los modelos. Auto significa que el ancho de lborde de adherencia es analizado y calculado automáticamente." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Espaciado borde de adherencia-objeto" @@ -15077,9 +15475,6 @@ msgstr "Precio del filamento. Sólo para las estadísticas." msgid "money/kg" msgstr "moneda/kg" -msgid "Vendor" -msgstr "Fabricante" - msgid "Vendor of filament. For show only." msgstr "Fabricante del filamento. Para mostrar solamente." @@ -15147,6 +15542,66 @@ msgstr "Relleno multilínea" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Usar múltiples líneas para el patrón de relleno, si el patrón de relleno lo soporta." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Lineal" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "Optimización del desplazamiento por deformación en Z (experimental)" @@ -17343,6 +17798,99 @@ msgstr "Multi Material con Extrusor Único" msgid "Use single nozzle to print multi filament." msgstr "Usa una único boquilla para imprimir multifilamento." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Cambio de Filamento Manual" @@ -17718,6 +18266,130 @@ msgstr "Umbral de solapamiento" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Si el ángulo umbral es cero, se generará soporte para los voladizos cuyo solapamiento sea inferior al umbral. Cuanto menor sea este valor, más pronunciado podrá ser el voladizo que se imprima sin soporte." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Ángulo de las rama de soporte Árbol" @@ -17897,13 +18569,8 @@ msgstr "Rellenos separados" msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Centra el relleno interno de cada pieza sobre sí misma, como si se laminara por separado, en lugar de sobre todo el conjunto. Las piezas que se tocan o se superponen se tratan como un solo cuerpo y comparten un centro; las piezas separadas (u objetos 3D distintos) tienen cada una el suyo.\n" -"Útil cuando un conjunto agrupa varios objetos que deben mantener cada uno un relleno coherente y autocentrado.\n" -"Afecta a los patrones de línea y cuadrícula y a los rellenos con plantilla de rotación.\n" -"Los patrones anclados a coordenadas globales (Giroide, Panal, TPMS, ...) no se ven afectados." msgid "Center surface pattern on" msgstr "Centrar el patrón de superficie en" @@ -18128,6 +18795,12 @@ msgstr "La purga tras el cambio de filamento se realizará dentro del soporte de msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Este objeto se utilizará para purgar la boquilla después de un cambio de filamento para ahorrar filamento y disminuir el tiempo de impresión. Los colores de los objetos se mezclarán como resultado. No tendrá efecto, a menos que la torre de purga esté activada." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Distancia máxima de puenteado" @@ -19012,8 +19685,8 @@ msgstr "Nombre de la impresora física utilizada para el corte." msgid "Layer number" msgstr "Número de capa" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Índice de la capa actual. Basado en uno (es decir, la primera capa es la número 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Z de capa" @@ -19157,9 +19830,6 @@ msgstr "Recalibración" msgid "Calibrate" msgstr "Calibración" -msgid "Finish" -msgstr "Finalizar" - msgid "How can I use calibration results?" msgstr "¿Cómo usar el resultado de la calibración?" @@ -19698,12 +20368,12 @@ msgstr "" "Los valores de aceleración deben ser mayores que los valores de velocidad.\n" "Verifique los datos introducidos." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Calibración de temperatura" -msgid "Filament type" -msgstr "Tipo de filamento" - msgid "PLA" msgstr "PLA" @@ -19725,6 +20395,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Modelo de prueba" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Temperatura inicial: " @@ -19850,9 +20526,6 @@ msgstr "Longitud de retracción inicial: " msgid "End retraction length: " msgstr "Longitud de retracción final: " -msgid "Test model" -msgstr "Modelo de prueba" - msgid "Ringing Tower" msgstr "Torre de resonancia" @@ -20279,9 +20952,6 @@ msgstr "por ejemplo: Básico, Mate, Seda, Mármol" msgid "Filament Preset" msgstr "Perfil de Filamento" -msgid "Create" -msgstr "Crear" - msgid "Vendor is not selected; please reselect vendor." msgstr "El fabricante no ha sido seleccionado, por favor, seleccione el fabricante." @@ -20588,6 +21258,9 @@ msgstr "" "Impresora y todos los perfiles de filamento y proceso que pertenecen a la impresora.\n" "Se puede compartir con otros." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21290,9 +21963,6 @@ msgstr "Asignar manualmente filamento a la boquilla izquierda o derecha" msgid "Global settings" msgstr "Ajustes globales" -msgid "Video tutorial" -msgstr "Vídeo tutorial" - msgid "(Sync with printer)" msgstr "(Sincronizar con impresora)" @@ -21685,6 +22355,33 @@ msgstr "Si está activado, los valores anteriores se guardan como los predetermi msgid "PresetBundle" msgstr "PaqueteDePerfiles" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "La carpeta «Bundle» no existe." @@ -21718,6 +22415,12 @@ msgstr "Desuscribirse del paquete" msgid "ExportPresetBundle" msgstr "ExportarPaqueteDePerfiles" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "Guardar paquete de perfiles" @@ -26095,213 +26798,6 @@ msgstr "Esta fuente no tiene contorno para este texto" msgid "Size: %.1f × %.1f mm" msgstr "Tamaño: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitivo" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Se generó una malla vacía" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Caja" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Rápido:" - -# AI Translated -msgid "Width (X)" -msgstr "Ancho (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Profundidad (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Altura (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R inferior" - -# AI Translated -msgid "Top R" -msgstr "R superior" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "R mayor" - -# AI Translated -msgid "Minor R" -msgstr "R menor" - -# AI Translated -msgid "All edges" -msgstr "Todas las aristas" - -# AI Translated -msgid "Top edges" -msgstr "Aristas superiores" - -# AI Translated -msgid "Bottom edges" -msgstr "Aristas inferiores" - -# AI Translated -msgid "Lateral edges" -msgstr "Aristas laterales" - -# AI Translated -msgid "Mesh resolution" -msgstr "Resolución de la malla" - -# AI Translated -msgid "Add Shape" -msgstr "Añadir forma" - -# AI Translated -msgid "No outer profile" -msgstr "No hay perfil exterior" - -# AI Translated -msgid "Failed to make outer face" -msgstr "No se pudo crear la cara exterior" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "No se pudo crear la cara con agujeros" - -# AI Translated -msgid "Revolve failed" -msgstr "Falló la revolución" - -# AI Translated -msgid "Profile" -msgstr "Perfil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Iniciar un nuevo perfil (para agujeros)" - -# AI Translated -msgid "Segments" -msgstr "Segmentos" - -# AI Translated -msgid "Sides" -msgstr "Lados" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Haga clic en el lienzo para dibujar" - -# AI Translated -msgid "Snap to grid" -msgstr "Ajustar a la cuadrícula" - -# AI Translated -msgid "Grid step" -msgstr "Paso de cuadrícula" - -# AI Translated -msgid "Outer" -msgstr "Exterior" - -# AI Translated -msgid "closed" -msgstr "cerrado" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% puntos %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (superior)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (frontal)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (lateral)" - -# AI Translated -msgid "Revolve deg" -msgstr "Grados de revolución" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Establezca 0 para extruir y >0 para revolución" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Cajera (corte)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu perfil cerrado" -msgstr[1] "%zu perfiles cerrados" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Dibuje un perfil cerrado para activarlo" - -msgid "Clear all" -msgstr "Borrar todo" - -# AI Translated -msgid "Empty result" -msgstr "Resultado vacío" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Extruir: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Revolución: %1%" - -# AI Translated -msgid "No object selected" -msgstr "No hay ningún objeto seleccionado" - -# AI Translated -msgid "Face failed" -msgstr "Falló la cara" - -# AI Translated -msgid "Face with holes failed" -msgstr "Falló la cara con agujeros" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Malla de la herramienta vacía" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Cajera añadida (volumen negativo)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Cajera: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -26417,6 +26913,9 @@ msgstr "Gizmo ensamblar" msgid "Gizmo brim ears" msgstr "Gizmo orejas de borde" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Control deslizante vertical - Mover el pulgar activo hacia Arriba" @@ -27398,10 +27897,6 @@ msgstr "Mis ajustes" msgid "Custom Printer Setup" msgstr "Configuración de impresora personalizada" -# AI Translated -msgid "Custom Printer" -msgstr "Impresora personalizada" - # AI Translated msgid "Define a custom printer profile" msgstr "Definir un perfil de impresora personalizado" @@ -28046,9 +28541,8 @@ msgstr "Umbral de ángulo - el relleno se detiene en las aristas más pronunciad msgid "Click a triangle to paint it" msgstr "Haga clic en un triángulo para pintarlo" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Requiere que la capa activa use el mapeo Desplegar (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -28062,17 +28556,15 @@ msgstr "Rápido - el relieve solo se sombrea, no se construye, y solo para la ca msgid "Checker" msgstr "Damero" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Damero - una cuadrícula de prueba en lugar de la textura. Donde los cuadrados siguen siendo cuadrados, la textura no se deforma; donde se estiran, la textura también se estirará" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Distorsión" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Distorsión - mapa de calor del estiramiento, de azul a rojo, sobre el despliegue" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28188,24 +28680,11 @@ msgstr "Mezclar filamentos" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Intercala dos filamentos para simular los colores intermedios, de modo que unos pocos filamentos pueden cubrir una foto o un degradado. Una imagen de colores planos se imprime igual en ambos casos. Desactivado usa un filamento por área." -# AI Translated -msgid "Mix by" -msgstr "Mezclar por" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Superficie" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Capas: los dos filamentos se alternan entre capas de impresión, lo que mezcla de forma suave en las superficies verticales pero desaparece en las horizontales, donde toda una capa es una sola franja.\n" -"Superficie: un damero fino sobre la superficie, que funciona con cualquier ángulo pero puede verse como una textura en lugar de como una mezcla.\n" -"Automático: capas en las caras verticales; las caras horizontales toman el filamento único más cercano, ya que allí un damero se ve como un patrón." # AI Translated #, boost-format @@ -28665,14 +29144,6 @@ msgstr "Necesita unos %1% triángulos, presupuesto %2% - el empotrado volverá a msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Cuántos miles de triángulos puede añadir el refinado al modelo. El triángulo que peor se ajusta siempre se divide primero, así que incluso una ejecución que lo gaste todo lo habrá gastado donde más se nota. Auméntelo si el relieve sigue viéndose basto." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Detiene el empotrado. Lo que ya había terminado se queda en el modelo y se puede deshacer." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Cierra la herramienta sin empotrar. Su pintura, capas y ajustes se quedan con el modelo." - # AI Translated msgid "Preparing..." msgstr "Preparando..." @@ -28697,6 +29168,14 @@ msgstr "Convierte los mapas de alturas pintados en geometría real moviendo los msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Convierte los mapas de alturas pintados en geometría real. Primero la malla se remalla con una densidad uniforme y se refina donde la textura cambia, para que el detalle tenga vértices donde apoyarse - todo en un solo paso." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Detiene el empotrado. Lo que ya había terminado se queda en el modelo y se puede deshacer." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Cierra la herramienta sin empotrar. Su pintura, capas y ajustes se quedan con el modelo." + # AI Translated #, boost-format msgid "%1% k" @@ -28905,6 +29384,28 @@ msgstr "Plugins de filamento" msgid "Printer plugins" msgstr "Plugins de impresora" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Restaurar valores predeterminados" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "La configuración no es un JSON válido. No se guardaron los cambios." @@ -28924,10 +29425,6 @@ msgstr "" "\n" "Esto descarta la configuración propia del perfil y usa la configuración global." -# AI Translated -msgid "Restore defaults" -msgstr "Restaurar valores predeterminados" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Usando la configuración global. Guarde el perfil para conservarla." @@ -28997,6 +29494,215 @@ msgstr "Instalando plugin" msgid "Installed \"%s\"." msgstr "Se ha instalado \"%s\"." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29213,6 +29919,54 @@ msgstr "No se pudo recargar el plugin." msgid "Reloaded \"%s\"." msgstr "Se ha recargado \"%s\"." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "No hay información sobre el modelo" + +msgid "Edit Project Info" +msgstr "Editar información del proyecto" + +msgid "Model Information" +msgstr "Información del modelo" + +msgid "Accessories" +msgstr "Accesorios" + +msgid "Profile Information" +msgstr "Información del perfil" + +msgid "Model name" +msgstr "Nombre del modelo" + +msgid "Created by" +msgstr "Creado por" + +msgid "Remixed by" +msgstr "Remixado por" + +msgid "Shared by" +msgstr "Compartido por" + +msgid "Model description" +msgstr "Descripción del modelo" + +msgid "BOM" +msgstr "Lista de materiales" + +msgid "Profile name" +msgstr "Nombre del perfil" + +msgid "Profile Author" +msgstr "Autor del perfil" + +msgid "Profile description" +msgstr "Descripción del perfil" + # AI Translated msgid "Purge Mode Settings" msgstr "Ajustes del modo de purga" @@ -29237,6 +29991,16 @@ msgstr "Reduce el desperdicio de purga e imprime más rápido. Puede causar una msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Ya se está ejecutando un comando." @@ -29503,6 +30267,9 @@ msgstr " | ajuste ACTIVO" msgid "Change texture - choose another one from the texture library" msgstr "Cambiar textura - elija otra de la biblioteca de texturas" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Mapa de alturas - muestra la textura de la capa bajo las islas" @@ -29535,17 +30302,14 @@ msgstr "Conectar islas" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Organiza el despliegue como una red conectada: las piezas que comparten una arista se despliegan una junto a otra (un cubo se convierte en una red unida en lugar de seis cuadrados sueltos). Siguen siendo islas separadas, así que después puede mover cualquiera de ellas a mano." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Isla - mover, girar y escalar islas completas" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Vértice - arrastre vértices para cambiar la forma; Shift/Ctrl para selección múltiple" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Arista - arrastre aristas para cambiar la forma; Shift/Ctrl para selección múltiple" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -29583,9 +30347,13 @@ msgstr "Borrar ediciones UV - descarta todos los movimientos manuales de vértic msgid "Snap - stick islands together when dragging one against another" msgstr "Ajustar - une las islas al arrastrar una contra otra" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Encuadrar todas las islas (Inicio)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -29596,6 +30364,9 @@ msgstr "Ninguna capa mapeada con Desplegar" msgid "%.1f mm tile" msgstr "tesela de %.1f mm" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Desactualizado - la pintura, las costuras o el ángulo de costura han cambiado desde que se hizo este despliegue. Pulse para desplegar de nuevo." @@ -29604,19 +30375,48 @@ msgstr "Desactualizado - la pintura, las costuras o el ángulo de costura han ca msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Aplana el área pintada en islas UV. Solo se calcula cuando pulsa este botón, no en cada edición - así que pinte, cambie el ángulo de costura o marque costuras primero, y luego pulse Desplegar." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d islas, %s caras" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Plug-in de Bambu Network no detectado. Haga clic aquí para instalarlo." + +msgid "Create new project" +msgstr "Crear nuevo proyecto" + +msgid "Recently opened" +msgstr "Abiertos recientemente" + +msgid "Open Containing Folder" +msgstr "Abrir carpeta contenedora" + # AI Translated msgid "Forward" msgstr "Adelante" -# AI Translated -msgid "Tools" -msgstr "Herramientas" - # AI Translated msgid "View Source" msgstr "Ver código fuente" @@ -29762,6 +30562,16 @@ msgstr "" "El plugin \"%s\" solicita ejecutar los siguientes comandos:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -29771,6 +30581,30 @@ msgstr "El plugin \"%s\" solicita permiso para el evento de auditoría de Python msgid "Plugin permission request" msgstr "Solicitud de permiso del plugin" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "La interfaz de configuración del plugin estaba vacía. Se muestra el editor predeterminado." @@ -30357,6 +31191,309 @@ msgstr "" "Evita la deformación\n" "¿Sabías que al imprimir materiales propensos a la deformación como el ABS, aumentar adecuadamente la temperatura de la cama térmica puede reducir la probabilidad de deformaciones?" +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "No se pudo instalar Microsoft WebView2 Runtime.\n" +#~ "Algunas funciones, incluido el asistente de configuración, pueden aparecer en blanco hasta que se instale.\n" +#~ "Instálelo manualmente desde https://developer.microsoft.com/microsoft-edge/webview2/ y reinicie Orca Slicer." + +#~ msgid "Why this grouping" +#~ msgstr "Por qué esta agrupación" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "El software no admite usar boquillas de diámetros diferentes en una sola impresión. Si las boquillas izquierda y derecha son inconsistentes, solo podremos continuar con impresión de un solo cabezal. Confirme qué boquilla desea usar para este proyecto." + +#~ msgid "Switch diameter" +#~ msgstr "Cambiar diámetro" + +#~ msgid "BambuStudio Project" +#~ msgstr "Proyecto de BambuStudio" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "El archivo 3MF fue creado con BambuStudio (versión %s), que es más reciente que la versión compatible %s. Se han detectado ajustes no reconocidos:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "El archivo 3MF ha sido creado con BambuStudio (versión %s), que es más reciente que la versión compatible %s. Es posible que algunos ajustes no sean totalmente compatibles." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "El archivo 3MF ha sido creado por BambuStudio. Es posible que algunos ajustes difieran de los de OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "No se puede deshacer ni rehacer mientras se ejecuta una operación. Deténgala primero." + +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Centra el relleno interno de cada pieza sobre sí misma, como si se laminara por separado, en lugar de sobre todo el conjunto. Las piezas que se tocan o se superponen se tratan como un solo cuerpo y comparten un centro; las piezas separadas (u objetos 3D distintos) tienen cada una el suyo.\n" +#~ "Útil cuando un conjunto agrupa varios objetos que deben mantener cada uno un relleno coherente y autocentrado.\n" +#~ "Afecta a los patrones de línea y cuadrícula y a los rellenos con plantilla de rotación.\n" +#~ "Los patrones anclados a coordenadas globales (Giroide, Panal, TPMS, ...) no se ven afectados." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Índice de la capa actual. Basado en uno (es decir, la primera capa es la número 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Vídeo tutorial" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitivo" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Se generó una malla vacía" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Caja" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Rápido:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Ancho (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Profundidad (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Altura (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R inferior" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R superior" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "R mayor" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "R menor" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Todas las aristas" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Aristas superiores" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Aristas inferiores" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Aristas laterales" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Resolución de la malla" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Añadir forma" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "No hay perfil exterior" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "No se pudo crear la cara exterior" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "No se pudo crear la cara con agujeros" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Falló la revolución" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Perfil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Iniciar un nuevo perfil (para agujeros)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmentos" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Lados" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Haga clic en el lienzo para dibujar" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Ajustar a la cuadrícula" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Paso de cuadrícula" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Exterior" + +# AI Translated +#~ msgid "closed" +#~ msgstr "cerrado" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% puntos %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (superior)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (frontal)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (lateral)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Grados de revolución" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Establezca 0 para extruir y >0 para revolución" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Cajera (corte)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu perfil cerrado" +#~ msgstr[1] "%zu perfiles cerrados" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Dibuje un perfil cerrado para activarlo" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Resultado vacío" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Extruir: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Revolución: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "No hay ningún objeto seleccionado" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Falló la cara" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Falló la cara con agujeros" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Malla de la herramienta vacía" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Cajera añadida (volumen negativo)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Cajera: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Requiere que la capa activa use el mapeo Desplegar (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Damero - una cuadrícula de prueba en lugar de la textura. Donde los cuadrados siguen siendo cuadrados, la textura no se deforma; donde se estiran, la textura también se estirará" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Distorsión - mapa de calor del estiramiento, de azul a rojo, sobre el despliegue" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Mezclar por" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Superficie" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Capas: los dos filamentos se alternan entre capas de impresión, lo que mezcla de forma suave en las superficies verticales pero desaparece en las horizontales, donde toda una capa es una sola franja.\n" +#~ "Superficie: un damero fino sobre la superficie, que funciona con cualquier ángulo pero puede verse como una textura en lugar de como una mezcla.\n" +#~ "Automático: capas en las caras verticales; las caras horizontales toman el filamento único más cercano, ya que allí un damero se ve como un patrón." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Isla - mover, girar y escalar islas completas" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Vértice - arrastre vértices para cambiar la forma; Shift/Ctrl para selección múltiple" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Arista - arrastre aristas para cambiar la forma; Shift/Ctrl para selección múltiple" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Encuadrar todas las islas (Inicio)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Experimental) Usar agentes de impresora en lugar de hosts de impresión" @@ -30390,16 +31527,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Haga clic en una cara o en un plano de referencia y luego elija una herramienta de dibujo" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -30456,10 +31583,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Distancia vertical" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Lineal" - #~ msgid "Face recognition" #~ msgstr "Reconocimiento de caras" @@ -32143,9 +33266,6 @@ msgstr "" #~ "ya que estos están sujetos a la cama \n" #~ "y solo se pueden levantar las piezas." -#~ msgid "°" -#~ msgstr "°" - #~ msgid "This disables all cloud services e.g. Orca Cloud and Bambu Cloud. This stops the transmission of data to Bambu's cloud services too. Users who don't use BBL machines or use LAN mode only can safely turn on this function." #~ msgstr "Esto desactiva todos los servicios en la nube, como Orca Cloud y Bambu Cloud. Además, detiene la transmisión de datos a los servicios en la nube de Bambu. Los usuarios que no utilicen máquinas BBL o que utilicen únicamente el modo LAN pueden activar esta función sin ningún problema." @@ -34867,9 +35987,6 @@ msgstr "" #~ msgid "Preview only mode for G-Code file." #~ msgstr "Modo de vista previa sólo para el archivo G-Code." -#~ msgid "Printer Selection" -#~ msgstr "Selección de la impresora" - #~ msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be seen outside" #~ msgstr "La purga tras el cambio de filamento se realizará dentro del relleno de los objetos. Esto puede reducir la cantidad de residuos y disminuir el tiempo de impresión. Si las paredes se imprimen con filamento transparente, el mezclado se podrá ver en el exterior." diff --git a/localization/i18n/eu/OrcaSlicer_eu.po b/localization/i18n/eu/OrcaSlicer_eu.po index ef5b78dacc..ed2f49e0bf 100644 --- a/localization/i18n/eu/OrcaSlicer_eu.po +++ b/localization/i18n/eu/OrcaSlicer_eu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2026-07-20 13:33+0200\n" "Last-Translator: Manu Goiogana \n" "Language-Team: \n" @@ -2098,14 +2098,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Ezin izan da Microsoft WebView2 Runtime instalatu.\n" -"Zenbait eginbide, konfigurazio-laguntzailea barne, hutsik ager daitezke instalatu arte.\n" -"Instalatu eskuz https://developer.microsoft.com/microsoft-edge/webview2/ helbidetik eta berrabiarazi OrcaSlicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4170,6 +4168,9 @@ msgstr "Joan plakara" msgid "AMS Materials Setting" msgstr "AMS Materialen Ezarpena" +msgid "Wiki Guide" +msgstr "Wiki Gida" + msgid "Close" msgstr "Itxi" @@ -4193,9 +4194,6 @@ msgstr "Sarreraren balioak %1% baino handiagoa eta %2% baino txikiagoa izan beha msgid "Factors of Flow Dynamics Calibration" msgstr "Fluxu-Dinamiken Kalibrazioaren faktoreak" -msgid "Wiki Guide" -msgstr "Wiki Gida" - # AI Translated msgid "PA Profile" msgstr "PA profila" @@ -4781,6 +4779,11 @@ msgstr "Automatikoki mugara (%g mm) doitu nahi duzu?" msgid "Adjust" msgstr "Doitu" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5611,9 +5614,6 @@ msgstr "Berriro xerratu automatikoki filamentuen taldekatze optimoaren arabera; msgid "Filament Grouping" msgstr "Filamentuen taldekatzea" -msgid "Why this grouping" -msgstr "Zergatik taldekatze hau" - msgid "Please place filaments on the printer based on grouping result." msgstr "Jarri filamentuak inprimagailuan taldekatze-emaitzaren arabera." @@ -5802,6 +5802,43 @@ msgstr "Edizio-eremua handitu/txikitu" msgid "Sequence" msgstr "Sekuentzia" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Bolumena" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Objektuen hautaketa" @@ -6015,6 +6052,12 @@ msgstr "Sareta-lerroak" msgid "Labels" msgstr "Etiketak" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Mugitu sekzio-planoa" @@ -6063,7 +6106,7 @@ msgstr "Bolumena:" msgid "Size:" msgstr "Tamaina:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "G-code ibilbideen gatazkak aurkitu dira %d geruzan, Z = %.2lf mm. Urrundu gehiago gatazkan dauden objektuak (%s <-> %s)." @@ -6529,6 +6572,12 @@ msgstr "Erakutsi sareta-lerroak" msgid "Show Gridlines on plate" msgstr "Erakutsi sareta-lerroak plakan" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Berrezarri Leihoaren Diseinua" @@ -8200,6 +8249,61 @@ msgstr "Ikusi objektuaren ezarpen guztiak" msgid "Material settings" msgstr "Materialaren ezarpenak" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Tresnak" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Kendu uneko plaka (azkena ez bada)" @@ -8224,6 +8328,17 @@ msgstr "Editatu uneko plakaren izena" msgid "Move plate to the front" msgstr "Eraman plaka aurrealdera" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Pertsonalizatu uneko plaka" @@ -8290,12 +8405,6 @@ msgstr "AMS (zirrikitu 1)" msgid "Not installed" msgstr "Instalatu gabe" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Softwareak ez du onartzen inprimatze berean diametro desberdineko pitak erabiltzea. Ezkerreko eta eskuineko pitak desberdinak badira, buru bakarreko inprimatzea baino ezin da egin. Berretsi zein pita erabili nahi duzun proiektu honetan." - -msgid "Switch diameter" -msgstr "Aldatu diametroa" - msgid "Configuration incompatible" msgstr "Konfigurazio bateraezina" @@ -8374,6 +8483,9 @@ msgstr "Filamentu nahasia" msgid "Remove last mixed filament" msgstr "Kendu azken filamentu nahasia" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Gehitu filamentu nahasia" @@ -8396,6 +8508,10 @@ msgstr "Filamentu nahasiak hautsitako osagai-erreferentziak ditu" msgid "Edit / Delete / Merge" msgstr "Editatu / Ezabatu / Batu" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Helburuko filamentu nahasiak filamentu fisiko hau erabiltzen du osagai gisa. Batzeak filamentu fisiko hau ezabatuko du eta filamentu nahasia baliogabetu dezake. Jarraitu?" @@ -8470,9 +8586,6 @@ msgstr "%s fitxategia kargatzen" msgid "Load 3MF" msgstr "Kargatu 3MF" -msgid "BambuStudio Project" -msgstr "BambuStudio proiektua" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "3MF-a ez du OrcaSlicerrek onartzen; geometriaren datuak bakarrik kargatzen." @@ -8503,17 +8616,6 @@ msgstr "Softwarea eguneratu beharko zenuke.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "3MF-aren %s bertsioa %s-ren %s bertsioa baino berriagoa da; softwarea eguneratzea gomendatzen da." -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "3MF fitxategia BambuStudio bidez sortu zen (%s bertsioa), bertsio hori bateragarria den %s bertsioa baino berriagoa da. Ezagutzen ez diren ezarpenak aurkitu dira:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "3MF fitxategia BambuStudioren %s bertsioarekin sortu da, eta hori %s bertsio bateragarria baino berriagoa da. Baliteke ezarpen batzuk guztiz bateragarriak ez izatea." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "3MF fitxategia BambuStudio erabiliz sortu da. Baliteke ezarpen batzuk OrcaSlicerrekoen desberdinak izatea." - msgid "Invalid values found in the 3MF:" msgstr "Balio baliogabeak aurkitu dira 3MF fitxategian:" @@ -8677,6 +8779,12 @@ msgstr "Auto-Drop desgaitu Z posizioa mantentzeko?\n" msgid "Object with floating parts was detected" msgstr "Airean dauden piezak dituen objektu bat detektatu da" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Beste esportazio-lan bat martxan dago." @@ -8759,6 +8867,38 @@ msgstr "Datu baliogabeak" msgid "Slicing Canceled" msgstr "Xerraketa bertan behera utzita" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Sareko plugina behar bezala aldatu da." @@ -8790,9 +8930,8 @@ msgstr "" msgid "Sync now" msgstr "Sinkronizatu orain" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Ezin da desegin edo berregin eragiketa bat martxan dagoen bitartean. Gelditu lehenik." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -8863,6 +9002,11 @@ msgstr "Deskargak huts egin du; fitxategiaren tamainarekin arazoa." msgid "Project downloaded %d%%" msgstr "Proiektua deskargatuta: %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advance proba" @@ -8889,6 +9033,13 @@ msgstr "Orca YOLO fluxu-kalibrazioa" msgid "Flowrate Test - Pass%d" msgstr "Fluxu-tasaren proba - %d. pasaldia" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Pitaren tenperatura-proba" @@ -11288,6 +11439,9 @@ msgstr "Ez da onartzen estrusore-eragile desberdinak edo pita-bolumen mota desbe msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Sinkronizatu parametroen aldaketak beste estrusoreko parametro baliokideekin." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Egin klik ezarpen guztiak azken aurrezarpen gordera berrezartzeko." @@ -11698,6 +11852,12 @@ msgstr "Inprimatzeko espazioa" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Hautatu sare-agentearen inplementazioa inprimagailuarekin komunikatzeko. Erabilgarri dauden agenteak abioan erregistratzen dira." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -11811,9 +11971,24 @@ msgstr "Pitaren diametroa" msgid "Wipe tower" msgstr "Purgatze-dorrea" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Estrusore bakarreko material anitzeko parametroak" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Hau estrusore bakarreko material anitzeko inprimagailua da; estrusore guztien diametroak balio berrira ezarriko dira. Jarraitu nahi duzu?" @@ -11823,6 +11998,18 @@ msgstr "Geruza-altueraren mugak" msgid "Z-Hop" msgstr "Z jauzia" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -11929,8 +12116,8 @@ msgid "Don't warn again for this preset" msgstr "Ez ohartarazi berriro aurrezarpen honetarako" #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" msgid "No modifications need to be copied." msgstr "Ez dago kopiatu beharreko aldaketarik." @@ -12345,9 +12532,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Erabateko moldaketa" -msgid "Volume" -msgstr "Bolumena" - msgid "Ramming line" msgstr "Moldaketa-lerroa" @@ -12395,6 +12579,120 @@ msgstr "Saio-hasierak huts egin du. Saiatu berriro." msgid "parse json failed" msgstr "JSONa analizatzeak huts egin du" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "Amaitu" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Inprimagailu pertsonalizatua" + +msgid "Create" +msgstr "Sortu" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "Filamentu mota" + +msgid "Vendor" +msgstr "Hornitzailea" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "Garbitu dena" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Honek hodeiko eginbide guztiak desgaitzen ditu, Orca Cloud profilen sinkronizazioa barne. Guztiz lineaz kanpo lan egin nahi duten erabiltzaileek aukera hau gaitu dezakete." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Oharra: Modu ezkutua gaituta dagoenean, zure erabiltzaile-profilen segurtasun-kopiarik ez da egingo Orca Cloud-en." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + msgid "[Action Required] " msgstr "[Ekintza behar da] " @@ -12851,6 +13149,14 @@ msgstr "Filamentua aldatzeko estrusio-funtzioaren G-codea" msgid "No object can be printed. It may be too small." msgstr "Ezin da objekturik inprimatu. Baliteke txikiegia izatea." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Zure inprimaketa purgatze-eremuetatik oso gertu dago. Ziurtatu ez dagoela talkarik." @@ -13022,6 +13328,26 @@ msgstr "baliozkotzeak huts egin du" msgid "write callback failed" msgstr "idazketa-callbackak huts egin du" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% bazterketa-eremutik gertuegi dago. Inprimatzean talkak gerta daitezke." @@ -13072,6 +13398,43 @@ msgstr "Hala ere inprimatu nahi baduzu, aukera hau gaitu dezakezu: Hobespenak / msgid "No extrusions under current settings." msgstr "Uneko ezarpenekin ez dago estrusiorik." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Gradientedun filamentu nahasi bat erabiltzen ari da, baina 'Kolore nahasiaren azpigeruza' desgaituta dago. Gradientea ez da inprimatuko." @@ -13082,6 +13445,15 @@ msgstr "Timelapsearen modu leuna ez da onartzen \"objektuka\" sekuentzia gaituta msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Material-metaketa detektatzea ez da onartzen \"objektuz objektu\" sekuentzia gaituta dagoenean." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Z altuera zehatza eta purgatze-dorrea batera gaitzeak xerratze-erroreak sor ditzake." @@ -13098,10 +13470,6 @@ msgstr "Espiral formako (loreontzi) moduak ez du funtzionatzen objektu batek mat msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "%1% objektua bera eraikitze-bolumenean kabitzen bada ere, gehieneko eraikitze-altuera gainditzen du materialaren uzkurdura-konpentsazioagatik." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "%1% objektuak gehieneko eraikitze-bolumenaren altuera gainditzen du." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "%1% objektua bera eraikitze-bolumenean kabitzen bada ere, azken geruzak gehieneko eraikitze-altuera gainditzen du." @@ -13109,6 +13477,10 @@ msgstr "%1% objektua bera eraikitze-bolumenean kabitzen bada ere, azken geruzak msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Modeloaren tamaina txikitu edo uneko inprimatze-ezarpenak aldatu eta berriro saiatu nahi izan dezakezu." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "%1% objektuak gehieneko eraikitze-bolumenaren altuera gainditzen du." + msgid "Variable layer height is not supported with Organic supports." msgstr "Geruza-altuera aldakorra ez da onartzen euskarri organikoekin." @@ -14061,12 +14433,39 @@ msgstr "Barru-zubien abiadura. Balioa ehuneko gisa adierazten bada, Zubien abiad msgid "This is the distance from the model to the outermost brim line." msgstr "Hau da modelotik itsaspen ertzaren kanporen lerrora dagoen distantzia." +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Itsaspen ertz mota" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Honek modeloen kanpoaldean eta/edo barrualdean sortzen den itsaspen ertzaren sorrera kontrolatzen du. 'Auto' aukerak esan nahi du itsaspen ertzaren zabalera automatikoki aztertu eta kalkulatzen dela." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Itsaspen ertza-objektu tartea" @@ -15224,9 +15623,6 @@ msgstr "Filamentuaren prezioa, estatistiketarako soilik." msgid "money/kg" msgstr "dirua/kg" -msgid "Vendor" -msgstr "Hornitzailea" - msgid "Vendor of filament. For show only." msgstr "Filamentuaren hornitzailea. Bistaratzeko soilik." @@ -15298,6 +15694,66 @@ msgstr "Lerro anitzeko betegarria" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Erabili hainbat lerro betegarri-patroirako, betegarri-patroiak onartzen badu." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Lineala" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "Z ardatzeko okerdura-biasaren optimizazioa (esperimentala)" @@ -17508,6 +17964,99 @@ msgstr "Estrusore bakarreko material anitzekoa" msgid "Use single nozzle to print multi filament." msgstr "Erabili pita bakarra hainbat filamentu inprimatzeko." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Eskuzko filamentu-aldaketa" @@ -17888,6 +18437,130 @@ msgstr "Atalase-gainjartzea" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Atalase-angelua zero bada, euskarria sortuko da gainjartzea atalasearen azpitik duten irtenguneetarako. Balio hau zenbat eta txikiagoa izan, orduan eta irtengune malkartsuagoa inprima daiteke euskarririk gabe." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Zuhaitz-euskarriaren adar-angelua" @@ -18063,17 +18736,11 @@ msgstr "Xerratzean goiko geruza solidoen kopurua handitzen da goiko oskol-geruze msgid "Separated infills" msgstr "Betegarri bereiziak" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Pieza bakoitzaren barruko betegarria bere buruarekiko zentratzen du, bereiz xerratuko balitz bezala, muntaketa osoarekiko zentratu beharrean. Elkar ukitzen edo gainjartzen diren piezak gorputz bakartzat hartzen dira eta zentro bera partekatzen dute; bereizitako pieza bakoitzak (edo 3D objektu bakoitzak) bere zentroa izango du.\n" -"Erabilgarria da muntaketa batek betegarri koherente eta autozentratua mantendu behar duten hainbat objektu biltzen dituenean.\n" -"Lerro eta sareta patroiei eta biraketa-txantiloia duten betegarriei eragiten die.\n" -"Koordenatu globaletara lotutako patroiei (Giroidea, Abaraska, TPMS...) ez die eragiten." # AI Translated msgid "Center surface pattern on" @@ -18298,6 +18965,12 @@ msgstr "Filamentua aldatu ondorengo purgatzea objektuen euskarrietan egingo da. msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Objektu hau filamentua aldatu ondoren pita purgatzeko erabiliko da, filamentua aurrezteko eta inprimatze-denbora laburtzeko. Ondorioz, objektuen koloreak nahasiko dira. Ez du eraginik izango purgatze-dorrea gaituta ez badago." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Zubiaren gehieneko distantzia" @@ -19183,8 +19856,8 @@ msgstr "Xerraketarako erabilitako inprimagailu fisikoaren izena." msgid "Layer number" msgstr "Geruza-zenbakia" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Uneko geruzaren indizea. Batean oinarritua (hau da, lehen geruza 1 zenbakia da)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Geruzaren Z" @@ -19328,9 +20001,6 @@ msgstr "Birkalibrazioa" msgid "Calibrate" msgstr "Kalibratu" -msgid "Finish" -msgstr "Amaitu" - msgid "How can I use calibration results?" msgstr "Nola erabil ditzaket kalibrazio-emaitzak?" @@ -19870,12 +20540,12 @@ msgstr "" "Azelerazio-balioek abiadura-balioek baino handiagoak izan behar dute.\n" "Egiaztatu sarrerak." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Tenperaturaren kalibrazioa" -msgid "Filament type" -msgstr "Filamentu mota" - msgid "PLA" msgstr "PLA" @@ -19897,6 +20567,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Proba-modeloa" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Hasierako tenp.: " @@ -20022,9 +20698,6 @@ msgstr "Hasierako atzera-egite luzera: " msgid "End retraction length: " msgstr "Amaierako atzera-egite luzera: " -msgid "Test model" -msgstr "Proba-modeloa" - msgid "Ringing Tower" msgstr "Erresonantzia dorrea" @@ -20452,9 +21125,6 @@ msgstr "adib. Oinarrizkoa, Matea, Zeta, Marmola" msgid "Filament Preset" msgstr "Filamentu-aurrezarpena" -msgid "Create" -msgstr "Sortu" - msgid "Vendor is not selected; please reselect vendor." msgstr "Ez da hornitzailerik hautatu; hautatu berriro." @@ -20758,6 +21428,9 @@ msgstr "" "Inprimagailua eta hari dagozkion filamentuen eta prozesuen aurrezarpen guztiak.\n" "Besteekin parteka daitezke." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21462,9 +22135,6 @@ msgstr "Esleitu filamentua eskuz ezkerreko edo eskuineko pitari" msgid "Global settings" msgstr "Ezarpen orokorrak" -msgid "Video tutorial" -msgstr "Bideo-tutoriala" - msgid "(Sync with printer)" msgstr "(Sinkronizatu inprimagailuarekin)" @@ -21858,6 +22528,33 @@ msgstr "Gaituz gero, goiko balioak etorkizuneko STEP inportazioetan erabiliko di msgid "PresetBundle" msgstr "Aurrezarpen-paketea" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "Pakete-karpeta ez da existitzen." @@ -21891,6 +22588,12 @@ msgstr "Utzi paketearen harpidetza" msgid "ExportPresetBundle" msgstr "Esportatu aurrezarpen-paketea" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "Gorde aurrezarpen sorta" @@ -26269,214 +26972,6 @@ msgstr "Letra-tipo honek ez du ingeradarik testu honetarako" msgid "Size: %.1f × %.1f mm" msgstr "Tamaina: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Oinarrizko geometria" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Sare hutsa sortu da" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Kutxa" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Azkar:" - -# AI Translated -msgid "Width (X)" -msgstr "Zabalera (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Sakonera (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Altuera (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "Beheko R" - -# AI Translated -msgid "Top R" -msgstr "Goiko R" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "R nagusia" - -# AI Translated -msgid "Minor R" -msgstr "R txikia" - -# AI Translated -msgid "All edges" -msgstr "Ertz guztiak" - -# AI Translated -msgid "Top edges" -msgstr "Goiko ertzak" - -# AI Translated -msgid "Bottom edges" -msgstr "Beheko ertzak" - -# AI Translated -msgid "Lateral edges" -msgstr "Alboko ertzak" - -# AI Translated -msgid "Mesh resolution" -msgstr "Sarearen bereizmena" - -# AI Translated -msgid "Add Shape" -msgstr "Gehitu forma" - -# AI Translated -msgid "No outer profile" -msgstr "Ez dago kanpoko profilik" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Ezin izan da kanpoko aurpegia sortu" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Ezin izan da zuloak dituen aurpegia eraiki" - -# AI Translated -msgid "Revolve failed" -msgstr "Erreboluzioak huts egin du" - -# AI Translated -msgid "Profile" -msgstr "Profila" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Hasi profil berri bat (zuloetarako)" - -# AI Translated -msgid "Segments" -msgstr "Segmentuak" - -# AI Translated -msgid "Sides" -msgstr "Aldeak" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Egin klik mihisean marrazteko" - -# AI Translated -msgid "Snap to grid" -msgstr "Atxiki saretara" - -# AI Translated -msgid "Grid step" -msgstr "Sareta-urratsa" - -# AI Translated -msgid "Outer" -msgstr "Kanpokoa" - -# AI Translated -msgid "closed" -msgstr "itxita" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% puntu %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Goikoa)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Aurrekoa)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Albokoa)" - -# AI Translated -msgid "Revolve deg" -msgstr "Erreboluzio-graduak" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Ezarri 0 estruitzeko, >0 erreboluzionatzeko" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Poltsa (ebaki)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu profil itxi" -msgstr[1] "%zu profil itxi" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Marraztu profil itxi bat gaitzeko" - -# AI Translated -msgid "Clear all" -msgstr "Garbitu dena" - -# AI Translated -msgid "Empty result" -msgstr "Emaitza hutsa" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Estrusioa: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Erreboluzioa: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Ez dago objekturik hautatuta" - -# AI Translated -msgid "Face failed" -msgstr "Aurpegiak huts egin du" - -# AI Translated -msgid "Face with holes failed" -msgstr "Zuloak dituen aurpegiak huts egin du" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Tresnaren sarea hutsik dago" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Poltsa gehitu da (bolumen negatiboa)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Poltsa: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -26598,6 +27093,9 @@ msgstr "Muntatzeko tresna" msgid "Gizmo brim ears" msgstr "Belarri ertzen tresna" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Graduatzaile bertikala - Mugitu hatz aktiboa gora" @@ -27582,10 +28080,6 @@ msgstr "Nire ezarpenak" msgid "Custom Printer Setup" msgstr "Inprimagailu pertsonalizatuaren konfigurazioa" -# AI Translated -msgid "Custom Printer" -msgstr "Inprimagailu pertsonalizatua" - # AI Translated msgid "Define a custom printer profile" msgstr "Definitu inprimagailu-profil pertsonalizatu bat" @@ -28230,9 +28724,8 @@ msgstr "Angelu-atalasea - betetzea hau baino zorrotzagoak diren ertzetan gelditz msgid "Click a triangle to paint it" msgstr "Egin klik triangelu batean hura margotzeko" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Geruza aktiboak Zabaldu (LSCM) mapaketa izan behar du." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -28246,17 +28739,15 @@ msgstr "Azkarra - erliebea itzalez irudikatzen da soilik, ez da eraikitzen, eta msgid "Checker" msgstr "Xake-taula" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Xake-taula - proba-sareta bat testuraren ordez. Laukiak karratu mantentzen diren lekuetan testura ez da deformatzen; luzatzen diren lekuetan, testura ere luzatuko da" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Distortsioa" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Distortsioa - luzapenaren bero-mapa, urdinetik gorrira, zabaltzearen gainean" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28372,24 +28863,11 @@ msgstr "Nahastu filamentuak" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Bi filamentu tartekatzen ditu tarteko koloreak simulatzeko; horrela, filamentu gutxi batzuekin argazki bat edo gradiente bat estal daiteke. Kolore lauko irudi bat berdin inprimatzen da bi kasuetan. Desaktibatuta, filamentu bat erabiltzen da eremu bakoitzeko." -# AI Translated -msgid "Mix by" -msgstr "Nahasteko modua" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Gainazala" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Geruzak: bi filamentuak inprimatze-geruzen artean txandakatzen dira; horrek leun nahasten ditu gainazal zutikoetan, baina gainazal lauetan desagertzen da, geruza oso bat banda bakarra baita.\n" -"Gainazala: xake-taula fin bat gainazalean zehar; edozein angelutan funtzionatzen du, baina nahasketa baino testura gisa irakur daiteke.\n" -"Automatikoa: geruzak aurpegi zutikoetan; aurpegi lauek filamentu bakar hurbilena hartzen dute, han xake-taula patroi gisa ikusten baita." # AI Translated #, boost-format @@ -28849,14 +29327,6 @@ msgstr "%1% triangelu inguru behar ditu, aurrekontua %2% - finkatzeak berriro si msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Fintzeak modeloari zenbat mila triangelu gehi diezazkiokeen. Okerren egokitzen den triangelua zatitzen da beti lehenik; beraz, guztia gastatzen duen exekuzio batek ere gehien nabaritzen den lekuan gastatu du. Igo ezazu erliebeak oraindik lodia ematen badu." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Finkatzea gelditzen du. Dagoeneko amaitu duena modeloan geratzen da, eta desegin daiteke." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Tresna ixten du finkatu gabe. Zure margoa, geruzak eta ezarpenak modeloarekin geratzen dira." - # AI Translated msgid "Preparing..." msgstr "Prestatzen..." @@ -28881,6 +29351,14 @@ msgstr "Bihurtu margotutako altuera-mapak benetako geometria, dagoeneko dauden e msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Bihurtu margotutako altuera-mapak benetako geometria. Sarea lehenik dentsitate uniformera birsaretzen da eta testura tolesten den lekuan fintzen da, xehetasunak erpinak izan ditzan - dena urrats bakarrean." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Finkatzea gelditzen du. Dagoeneko amaitu duena modeloan geratzen da, eta desegin daiteke." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Tresna ixten du finkatu gabe. Zure margoa, geruzak eta ezarpenak modeloarekin geratzen dira." + # AI Translated #, boost-format msgid "%1% k" @@ -29097,6 +29575,28 @@ msgstr "Filamentu-pluginak" msgid "Printer plugins" msgstr "Inprimagailu-pluginak" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Leheneratu lehenetsiak" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Konfigurazioa ez da baliozko JSON bat. Zure aldaketak ez dira gorde." @@ -29116,10 +29616,6 @@ msgstr "" "\n" "Honek aurrezarpenaren gainidazketa baztertzen du eta konfigurazio globala erabiltzen du." -# AI Translated -msgid "Restore defaults" -msgstr "Leheneratu lehenetsiak" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Konfigurazio globala erabiltzen. Gorde aurrezarpena iraunarazteko." @@ -29189,6 +29685,215 @@ msgstr "Plugina instalatzen" msgid "Installed \"%s\"." msgstr "\"%s\" instalatu da." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29405,6 +30110,54 @@ msgstr "Ezin izan da plugina birkargatu." msgid "Reloaded \"%s\"." msgstr "\"%s\" birkargatu da." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "Purgatze-moduaren ezarpenak" @@ -29429,6 +30182,16 @@ msgstr "Purgatze-hondakinak murrizten ditu eta azkarrago inprimatzen du. Kolore- msgid "Terminal" msgstr "Terminala" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Komando bat exekutatzen ari da dagoeneko." @@ -29695,6 +30458,9 @@ msgstr " | atxikitzea AKTIBATUTA" msgid "Change texture - choose another one from the texture library" msgstr "Aldatu testura - aukeratu beste bat testura-liburutegitik" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Altuera-mapa - erakutsi geruzaren testura uharteen azpian" @@ -29727,17 +30493,14 @@ msgstr "Konektatu uharteak" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Antolatu zabaltzea garapen konektatu gisa: ertz bat partekatzen duten zatiak elkarren ondoan zabaltzen dira (kubo bat garapen elkartu bihurtzen da, sei karratu solte izan beharrean). Uharte bereiziak izaten jarraitzen dute; beraz, gero edozein eskuz mugi dezakezu." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Uhartea - mugitu, biratu eta eskalatu uharte osoak" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Erpina - arrastatu erpinak forma aldatzeko; Shift/Ctrl hautaketa anitzerako" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Ertza - arrastatu ertzak forma aldatzeko; Shift/Ctrl hautaketa anitzerako" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -29775,9 +30538,13 @@ msgstr "Garbitu UV edizioak - baztertu erpin/ertzen eskuzko mugimendu guztiak et msgid "Snap - stick islands together when dragging one against another" msgstr "Atxiki - itsatsi uharteak bata bestearen kontra arrastatzean" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Enkoadratu uharte guztiak (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -29788,6 +30555,9 @@ msgstr "Ez dago Zabaldu mapaketa duen geruzarik" msgid "%.1f mm tile" msgstr "%.1f mm-ko lauza" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Zaharkituta - margoa, ebaki-lerroak edo ebaki-angelua aldatu dira zabaltze hau egin zenetik. Sakatu berriro zabaltzeko." @@ -29796,19 +30566,48 @@ msgstr "Zaharkituta - margoa, ebaki-lerroak edo ebaki-angelua aldatu dira zabalt msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Lautu margotutako eremua UV uharteetan. Hau sakatzen duzunean soilik kalkulatzen da, ez edizio bakoitzean; beraz, margotu, aldatu ebaki-angelua edo markatu ebaki-lerroak lehenik, eta gero sakatu Zabaldu." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d uharte, %s aurpegi" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + # AI Translated msgid "Forward" msgstr "Aurrera" -# AI Translated -msgid "Tools" -msgstr "Tresnak" - # AI Translated msgid "View Source" msgstr "Ikusi iturburua" @@ -29954,6 +30753,16 @@ msgstr "" "\"%s\" pluginak komando hauek exekutatzeko baimena eskatzen du:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -29963,6 +30772,30 @@ msgstr "\"%s\" pluginak baimena eskatzen du \"%s\" Python ikuskaritza-gertaerara msgid "Plugin permission request" msgstr "Pluginaren baimen-eskaera" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Pluginaren konfigurazio-interfazea hutsik zegoen. Editore lehenetsia erakusten." @@ -30549,6 +31382,310 @@ msgstr "" "Saihestu okertzea\n" "Ba al zenekien ABS bezalako okertzeko joera duten materialak inprimatzean ohe beroaren tenperatura egoki igotzeak okertzeko probabilitatea murriztu dezakeela?" +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Ezin izan da Microsoft WebView2 Runtime instalatu.\n" +#~ "Zenbait eginbide, konfigurazio-laguntzailea barne, hutsik ager daitezke instalatu arte.\n" +#~ "Instalatu eskuz https://developer.microsoft.com/microsoft-edge/webview2/ helbidetik eta berrabiarazi OrcaSlicer." + +#~ msgid "Why this grouping" +#~ msgstr "Zergatik taldekatze hau" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Softwareak ez du onartzen inprimatze berean diametro desberdineko pitak erabiltzea. Ezkerreko eta eskuineko pitak desberdinak badira, buru bakarreko inprimatzea baino ezin da egin. Berretsi zein pita erabili nahi duzun proiektu honetan." + +#~ msgid "Switch diameter" +#~ msgstr "Aldatu diametroa" + +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudio proiektua" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "3MF fitxategia BambuStudio bidez sortu zen (%s bertsioa), bertsio hori bateragarria den %s bertsioa baino berriagoa da. Ezagutzen ez diren ezarpenak aurkitu dira:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "3MF fitxategia BambuStudioren %s bertsioarekin sortu da, eta hori %s bertsio bateragarria baino berriagoa da. Baliteke ezarpen batzuk guztiz bateragarriak ez izatea." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "3MF fitxategia BambuStudio erabiliz sortu da. Baliteke ezarpen batzuk OrcaSlicerrekoen desberdinak izatea." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Ezin da desegin edo berregin eragiketa bat martxan dagoen bitartean. Gelditu lehenik." + +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Pieza bakoitzaren barruko betegarria bere buruarekiko zentratzen du, bereiz xerratuko balitz bezala, muntaketa osoarekiko zentratu beharrean. Elkar ukitzen edo gainjartzen diren piezak gorputz bakartzat hartzen dira eta zentro bera partekatzen dute; bereizitako pieza bakoitzak (edo 3D objektu bakoitzak) bere zentroa izango du.\n" +#~ "Erabilgarria da muntaketa batek betegarri koherente eta autozentratua mantendu behar duten hainbat objektu biltzen dituenean.\n" +#~ "Lerro eta sareta patroiei eta biraketa-txantiloia duten betegarriei eragiten die.\n" +#~ "Koordenatu globaletara lotutako patroiei (Giroidea, Abaraska, TPMS...) ez die eragiten." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Uneko geruzaren indizea. Batean oinarritua (hau da, lehen geruza 1 zenbakia da)." + +#~ msgid "Video tutorial" +#~ msgstr "Bideo-tutoriala" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Oinarrizko geometria" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Sare hutsa sortu da" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Kutxa" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Azkar:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Zabalera (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Sakonera (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Altuera (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "Beheko R" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "Goiko R" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "R nagusia" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "R txikia" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Ertz guztiak" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Goiko ertzak" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Beheko ertzak" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Alboko ertzak" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Sarearen bereizmena" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Gehitu forma" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Ez dago kanpoko profilik" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Ezin izan da kanpoko aurpegia sortu" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Ezin izan da zuloak dituen aurpegia eraiki" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Erreboluzioak huts egin du" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profila" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Hasi profil berri bat (zuloetarako)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmentuak" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Aldeak" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Egin klik mihisean marrazteko" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Atxiki saretara" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Sareta-urratsa" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Kanpokoa" + +# AI Translated +#~ msgid "closed" +#~ msgstr "itxita" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% puntu %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Goikoa)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Aurrekoa)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Albokoa)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Erreboluzio-graduak" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Ezarri 0 estruitzeko, >0 erreboluzionatzeko" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Poltsa (ebaki)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu profil itxi" +#~ msgstr[1] "%zu profil itxi" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Marraztu profil itxi bat gaitzeko" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Emaitza hutsa" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Estrusioa: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Erreboluzioa: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Ez dago objekturik hautatuta" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Aurpegiak huts egin du" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Zuloak dituen aurpegiak huts egin du" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Tresnaren sarea hutsik dago" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Poltsa gehitu da (bolumen negatiboa)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Poltsa: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Geruza aktiboak Zabaldu (LSCM) mapaketa izan behar du." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Xake-taula - proba-sareta bat testuraren ordez. Laukiak karratu mantentzen diren lekuetan testura ez da deformatzen; luzatzen diren lekuetan, testura ere luzatuko da" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Distortsioa - luzapenaren bero-mapa, urdinetik gorrira, zabaltzearen gainean" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Nahasteko modua" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Gainazala" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Geruzak: bi filamentuak inprimatze-geruzen artean txandakatzen dira; horrek leun nahasten ditu gainazal zutikoetan, baina gainazal lauetan desagertzen da, geruza oso bat banda bakarra baita.\n" +#~ "Gainazala: xake-taula fin bat gainazalean zehar; edozein angelutan funtzionatzen du, baina nahasketa baino testura gisa irakur daiteke.\n" +#~ "Automatikoa: geruzak aurpegi zutikoetan; aurpegi lauek filamentu bakar hurbilena hartzen dute, han xake-taula patroi gisa ikusten baita." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Uhartea - mugitu, biratu eta eskalatu uharte osoak" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Erpina - arrastatu erpinak forma aldatzeko; Shift/Ctrl hautaketa anitzerako" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Ertza - arrastatu ertzak forma aldatzeko; Shift/Ctrl hautaketa anitzerako" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Enkoadratu uharte guztiak (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Esperimentala) Erabili inprimagailu-agenteak inprimatze-hostenen ordez" @@ -30582,16 +31719,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Egin klik aurpegi batean edo erreferentzia-plano batean, gero hautatu marrazketa-tresna bat" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -30648,10 +31775,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Distantzia bertikala" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Lineala" - #~ msgid "Face recognition" #~ msgstr "Aurpegiak hauteman" @@ -32108,9 +33231,6 @@ msgstr "" #~ msgid "Object coordinates" #~ msgstr "Objektuaren koordenatuak" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "uniform scale" #~ msgstr "eskala uniformea" diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 19c0fa9673..1746b574c0 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: Guislain Cyril, Thomas Lété\n" @@ -2114,14 +2114,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Le runtime Microsoft WebView2 n’a pas pu être installé.\n" -"Certaines fonctionnalités, dont l’assistant de configuration, peuvent apparaître vides tant qu’il n’est pas installé.\n" -"Veuillez l’installer manuellement depuis https://developer.microsoft.com/microsoft-edge/webview2/ et redémarrer Orca Slicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4200,6 +4198,9 @@ msgstr "Aller à la plaque" msgid "AMS Materials Setting" msgstr "Réglage des matériaux AMS" +msgid "Wiki Guide" +msgstr "Guide wiki" + msgid "Close" msgstr "Fermer" @@ -4223,9 +4224,6 @@ msgstr "La valeur saisie doit être supérieure à %1% et inférieure à %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "Facteurs de calibration dynamique du débit" -msgid "Wiki Guide" -msgstr "Guide wiki" - msgid "PA Profile" msgstr "Profil PA" @@ -4315,7 +4313,7 @@ msgstr "Enregistrer" msgctxt "Navigation" msgid "Back" -msgstr "Arrière" +msgstr "Retour" msgid "Example" msgstr "Exemple" @@ -4810,6 +4808,11 @@ msgstr "L’ajuster automatiquement à la limite (%g mm) ?" msgid "Adjust" msgstr "Ajuster" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5646,9 +5649,6 @@ msgstr "Retrancher automatiquement selon le regroupement optimal des filaments, msgid "Filament Grouping" msgstr "Regroupement des filaments" -msgid "Why this grouping" -msgstr "Pourquoi ce regroupement" - msgid "Please place filaments on the printer based on grouping result." msgstr "Veuillez placer les filaments sur l'imprimante en fonction du résultat du regroupement." @@ -5837,6 +5837,43 @@ msgstr "Augmenter/diminuer la zone d'édition" msgid "Sequence" msgstr "Séquence" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Volume" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Sélection d’objet" @@ -6050,6 +6087,12 @@ msgstr "Quadrillage" msgid "Labels" msgstr "Étiquettes" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Déplacer le plan de coupe" @@ -6098,7 +6141,7 @@ msgstr "Volume :" msgid "Size:" msgstr "Taille :" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Des conflits de chemins G-code ont été trouvés au niveau de la couche %d, z = %.2lfmm. Veuillez séparer davantage les objets en conflit (%s <-> %s)." @@ -6569,6 +6612,12 @@ msgstr "Afficher le quadrillage" msgid "Show Gridlines on plate" msgstr "Afficher le quadrillage sur la plaque" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Réinitialiser la présentation de la fenêtre" @@ -8214,6 +8263,61 @@ msgstr "Afficher tous les paramètres de l'objet" msgid "Material settings" msgstr "Réglages des matériaux" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Outils" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Retirer la plaque actuelle (si elle n'est pas la dernière)" @@ -8238,6 +8342,17 @@ msgstr "Modifier le nom de la plaque actuelle" msgid "Move plate to the front" msgstr "Déplacer la plaque vers l’avant" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Personnaliser la plaque actuelle" @@ -8304,12 +8419,6 @@ msgstr "AMS (1 emplacement)" msgid "Not installed" msgstr "Non installé" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Le logiciel ne prend pas en charge l'utilisation de buses de diamètres différents pour une même impression. Si les buses gauche et droite sont différentes, nous ne pouvons procéder qu'avec une impression à tête unique. Veuillez confirmer quelle buse vous souhaitez utiliser pour ce projet." - -msgid "Switch diameter" -msgstr "Changer le diamètre" - msgid "Configuration incompatible" msgstr "Configuration incompatible" @@ -8391,6 +8500,9 @@ msgstr "Filament mixte" msgid "Remove last mixed filament" msgstr "Supprimer le dernier filament mixte" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Ajouter un filament mixte" @@ -8413,6 +8525,10 @@ msgstr "Le filament mixte comporte des références de composants invalides" msgid "Edit / Delete / Merge" msgstr "Éditer / Supprimer / Fusionner" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Le filament mixte cible utilise ce filament physique comme composant. La fusion supprimera ce filament physique et risque de rendre le filament mixte invalide. Continuer ?" @@ -8487,9 +8603,6 @@ msgstr "Chargement du fichier : %s" msgid "Load 3MF" msgstr "Charger 3MF" -msgid "BambuStudio Project" -msgstr "Projet BambuStudio" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "Le 3MF n'est pas pris en charge par OrcaSlicer, chargement des données géométriques uniquement." @@ -8519,17 +8632,6 @@ msgstr "Vous feriez mieux de mettre à jour votre logiciel.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "La version %s du 3MF est plus récente que la version %s de %s. Nous vous suggérons de mettre à jour votre logiciel." -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "Le fichier 3MF a été créé par BambuStudio (version %s), plus récente que la version compatible %s. Paramètres non reconnus détectés :" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "Le fichier 3MF a été créé par BambuStudio (version %s), plus récente que la version compatible %s. Certains paramètres peuvent ne pas être totalement compatibles." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "Le fichier 3MF a été créé par BambuStudio. Certains paramètres peuvent différer de ceux d’OrcaSlicer." - msgid "Invalid values found in the 3MF:" msgstr "Valeurs invalides trouvées dans le 3MF :" @@ -8694,6 +8796,12 @@ msgstr "Désactiver le dépôt automatique pour préserver le positionnement en msgid "Object with floating parts was detected" msgstr "Un objet comportant des parties flottantes a été détecté" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Une autre tâche d'exportation est en cours d'exécution." @@ -8776,6 +8884,38 @@ msgstr "Donnée non valide" msgid "Slicing Canceled" msgstr "Découpe annulée" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Plug-in réseau changé avec succès." @@ -8807,9 +8947,8 @@ msgstr "" msgid "Sync now" msgstr "Synchroniser maintenant" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Impossible d’annuler ou de rétablir pendant qu’une opération est en cours. Arrêtez-la d’abord." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -8880,6 +9019,11 @@ msgstr "Le téléchargement a échoué, exception de taille de fichier." msgid "Project downloaded %d%%" msgstr "Projet téléchargé à %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Test de Pressure Advance" @@ -8906,6 +9050,13 @@ msgstr "Calibration du débit Orca YOLO" msgid "Flowrate Test - Pass%d" msgstr "Test de débit - Passe %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Test de température de buse" @@ -11314,6 +11465,9 @@ msgstr "La synchronisation entre des entraînements d’extrudeur ou des types d msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Synchroniser la modification des paramètres avec les paramètres correspondants d’un autre extrudeur." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Cliquez pour rétablir tous les paramètres au dernier préréglage enregistré." @@ -11723,6 +11877,12 @@ msgstr "Espace imprimable" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Sélectionner l'implémentation de l'agent réseau pour la communication avec l'imprimante. Les agents disponibles sont enregistrés au démarrage." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -11836,9 +11996,24 @@ msgstr "Diamètre de la buse" msgid "Wipe tower" msgstr "Tour d’essuyage" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Paramètres multi-matériaux pour extrudeur unique" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Il s’agit d’une imprimante mono extrudeur multimatériaux, les diamètres de tous les extrudeurs seront réglés sur la nouvelle valeur. Voulez-vous continuer ?" @@ -11848,6 +12023,18 @@ msgstr "Limites de hauteur de couche" msgid "Z-Hop" msgstr "Saut en Z" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -11954,8 +12141,8 @@ msgid "Don't warn again for this preset" msgstr "Ne plus avertir pour ce préréglage" #, c-format, boost-format -msgid "%s: %s" -msgstr "%s : %s" +msgid "%s %s" +msgstr "" msgid "No modifications need to be copied." msgstr "Aucune modification à copier." @@ -12376,9 +12563,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Bourrage total" -msgid "Volume" -msgstr "Volume" - msgid "Ramming line" msgstr "Ligne de bourrage" @@ -12426,6 +12610,120 @@ msgstr "Échec de la connexion. Veuillez réessayer." msgid "parse json failed" msgstr "Échec de l’analyse du JSON" +msgid "Loading…" +msgstr "Chargement en cours…" + +msgid "Welcome to Orca Slicer" +msgstr "Bienvenue sur Orca Slicer" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer sera configuré en plusieurs étapes. Commençons !" + +msgid "Get Started" +msgstr "Commencer" + +msgid "Please select your login region" +msgstr "Veuillez sélectionner votre région de connexion" + +msgid "Finish" +msgstr "Terminer" + +msgid "Printer Selection" +msgstr "Sélection de l'imprimante" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Imprimante personnalisée" + +msgid "Create" +msgstr "Créer" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "Au moins une imprimante doit être sélectionnée." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Sélection des filaments" + +msgid "System Filaments" +msgstr "Filaments du système" + +msgid "Custom Filaments" +msgstr "Filaments personnalisés" + +msgid "Create New" +msgstr "Créer un nouveau filament" + +msgid "Filament type" +msgstr "Filament" + +msgid "Vendor" +msgstr "Fabricant" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "Tout effacer" + +msgid "At least one filament must be selected." +msgstr "Au moins un filament doit être sélectionné." + +msgid "Do you want to use the default filament?" +msgstr "Voulez-vous utiliser le filament par défaut ?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Ceci désactive toutes les fonctionnalités cloud, y compris la synchronisation des profils Orca Cloud. Les utilisateurs qui préfèrent travailler entièrement hors ligne peuvent activer cette option." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Remarque : lorsque le mode furtif est activé, vos profils utilisateur ne sont pas sauvegardés dans Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "Veuillez noter que ces plugins ne sont pas développés ou maintenus par OrcaSlicer. Ils doivent être utilisés à votre propre discrétion et à vos propres risques." + +msgid "Install Bambu Network plug-in" +msgstr "Installer le plugin Bambu Network" + msgid "[Action Required] " msgstr "[Action requise] " @@ -12873,6 +13171,14 @@ msgstr "G-code de changement du rôle de l’extrusion (filament)" msgid "No object can be printed. It may be too small." msgstr "Aucun objet ne peut être imprimé. Peut-être trop petit" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Votre impression est très proche des régions d’amorçage. Assurez-vous qu’il n’y a pas de collision." @@ -13045,6 +13351,26 @@ msgstr "échec de la validation" msgid "write callback failed" msgstr "échec du rappel d'écriture" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% est trop proche de la zone d'exclusion. Il peut y avoir des collisions lors de l'impression." @@ -13095,6 +13421,43 @@ msgstr "Si vous souhaitez tout de même imprimer, vous pouvez activer l’option msgid "No extrusions under current settings." msgstr "Aucune extrusion dans les paramètres actuels." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Un filament mixte avec dégradé est utilisé, mais « Sous-couche de couleur mixte » est désactivé. Le dégradé ne sera pas imprimé." @@ -13105,6 +13468,15 @@ msgstr "Le mode fluide du timelapse n'est pas pris en charge lorsque le mode d'i msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "La détection d'agglomération n'est pas prise en charge lorsque la séquence \"par objet\" est activée." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "L'activation simultanée de la hauteur Z précise et de la tour d'amorçage peut provoquer des erreurs de tranchage." @@ -13121,10 +13493,6 @@ msgstr "Le mode vase en spirale ne fonctionne pas lorsqu'un objet contient plusi msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Bien que l’objet %1% corresponde au volume de construction, il dépasse la hauteur maximale du volume de construction en raison de la compensation du rétrécissement du matériau." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "L’objet %1% dépasse la hauteur maximale du volume d’impression." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Bien que l’objet %1% s’adapte lui-même au volume d’impression, sa dernière couche dépasse la hauteur maximale du volume de construction." @@ -13132,6 +13500,10 @@ msgstr "Bien que l’objet %1% s’adapte lui-même au volume d’impression, sa msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Vous devez réduire la taille de votre modèle ou modifier les paramètres d’impression actuels et réessayer." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "L’objet %1% dépasse la hauteur maximale du volume d’impression." + msgid "Variable layer height is not supported with Organic supports." msgstr "La hauteur de couche variable n’est pas prise en charge avec les supports organiques." @@ -14082,12 +14454,39 @@ msgstr "Vitesse des ponts internes. Si la valeur est exprimée en pourcentage, e msgid "This is the distance from the model to the outermost brim line." msgstr "Distance du modèle à la ligne de bord la plus externe" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Type de bordure" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Cela permet de contrôler la génération de bordure extérieur et/ou intérieur des modèles. Auto signifie que la largeur de bordure est analysée et calculée automatiquement." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Écart bord-objet" @@ -15255,9 +15654,6 @@ msgstr "Coût du filament. Pour les statistiques uniquement" msgid "money/kg" msgstr "argent/kg" -msgid "Vendor" -msgstr "Fabricant" - msgid "Vendor of filament. For show only." msgstr "Vendeur du filament. Pour affichage uniquement" @@ -15327,6 +15723,66 @@ msgstr "Remplissage multiligne" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Utilisation de lignes multiples pour le motif de remplissage, si pris en charge par le motif." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Linéaire" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "Optimisation du biais de flambage en Z (expérimental)" @@ -17540,6 +17996,99 @@ msgstr "Multi-matériaux pour extrudeur unique" msgid "Use single nozzle to print multi filament." msgstr "Utiliser une seule buse pour imprimer plusieurs filaments" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Changement manuel du filament" @@ -17916,6 +18465,130 @@ msgstr "Chevauchement du seuil" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Si l’angle seuil est égal à zéro, le support sera généré pour les surplombs dont le chevauchement est inférieur au seuil. Plus cette valeur est petite, plus la pente du surplomb qui peut être imprimé sans support est importante." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Angle de branche support arborescent" @@ -18092,17 +18765,11 @@ msgstr "Le nombre de couches solides supérieures est augmenté lors du découpa msgid "Separated infills" msgstr "Remplissages séparés" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Centre le remplissage interne de chaque pièce sur elle-même, comme si elle était découpée seule, au lieu de sur l'ensemble de l'assemblage. Les pièces qui se touchent ou se chevauchent sont traitées comme un seul corps et partagent un centre ; les pièces séparées (ou des objets 3D distincts) en obtiennent chacune un.\n" -"Utile lorsqu'un assemblage regroupe plusieurs objets qui devraient chacun conserver un remplissage cohérent et centré sur lui-même.\n" -"Affecte les motifs en lignes et en grille et les remplissages à modèle de rotation.\n" -"Les motifs verrouillés sur les coordonnées globales (Gyroïde, Nid d'abeille, TPMS, ...) ne sont pas affectés." # AI Translated msgid "Center surface pattern on" @@ -18335,6 +19002,12 @@ msgstr "La purge après le changement de filament se fera à l'intérieur du sup msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Cet objet sera utilisé pour purger la buse après un changement de filament afin d'économiser du filament et de réduire le temps d'impression. Les couleurs des objets seront mélangées en conséquence. Cela ne prendra effet que si la tour d’amorçage est activée." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Distance de pont maximale" @@ -19213,8 +19886,8 @@ msgstr "Nom de l’imprimante physique utilisé pour la découpe." msgid "Layer number" msgstr "Numéro de couche" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Indice de la couche actuelle. Base unitaire (c’est-à-dire que la première couche porte le numéro 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Couche z" @@ -19358,9 +20031,6 @@ msgstr "Recalibration" msgid "Calibrate" msgstr "Calibrer" -msgid "Finish" -msgstr "Terminer" - msgid "How can I use calibration results?" msgstr "Comment utiliser le résultat de la calibration ?" @@ -19898,12 +20568,12 @@ msgstr "" "Les valeurs d'accélération doivent être supérieures aux valeurs de vitesse.\n" "Veuillez vérifier les entrées." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Calibration de Température" -msgid "Filament type" -msgstr "Filament" - msgid "PLA" msgstr "PLA" @@ -19925,6 +20595,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Modèle de test" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Temp. de début: " @@ -20050,9 +20726,6 @@ msgstr "Longueur de rétraction de début: " msgid "End retraction length: " msgstr "Longueur de rétraction de fin: " -msgid "Test model" -msgstr "Modèle de test" - msgid "Ringing Tower" msgstr "Tour de résonance" @@ -20479,9 +21152,6 @@ msgstr "par exemple : Basic, Matte, Silk, Marble" msgid "Filament Preset" msgstr "Préréglage du filament" -msgid "Create" -msgstr "Créer" - msgid "Vendor is not selected; please reselect vendor." msgstr "Le fournisseur n’est pas sélectionné, veuillez le sélectionner à nouveau." @@ -20788,6 +21458,9 @@ msgstr "" "Imprimante et tous les préréglages de filament et de traitement qui appartiennent à l’imprimante.\n" "Peut être partagé avec d’autres." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21493,9 +22166,6 @@ msgstr "Assigner manuellement le filament à la buse gauche ou droite" msgid "Global settings" msgstr "Paramètres globaux" -msgid "Video tutorial" -msgstr "Tutoriel vidéo" - msgid "(Sync with printer)" msgstr "(Synchroniser avec l'imprimante)" @@ -21893,6 +22563,33 @@ msgstr "Si activé, les valeurs ci-dessus sont stockées comme valeurs par défa msgid "PresetBundle" msgstr "Paquet de préréglages" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "Le dossier du paquet n’existe pas." @@ -21926,6 +22623,12 @@ msgstr "Se désabonner du paquet" msgid "ExportPresetBundle" msgstr "Exporter le paquet de préréglages" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "Enregistrer le paquet de préréglages" @@ -26035,214 +26738,6 @@ msgstr "Cette police n’a pas de contour pour ce texte" msgid "Size: %.1f × %.1f mm" msgstr "Taille : %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitive" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Maillage vide généré" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Boîte" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Rapide :" - -# AI Translated -msgid "Width (X)" -msgstr "Largeur (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Profondeur (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Hauteur (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R inférieur" - -# AI Translated -msgid "Top R" -msgstr "R supérieur" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "Grand R" - -# AI Translated -msgid "Minor R" -msgstr "Petit R" - -# AI Translated -msgid "All edges" -msgstr "Toutes les arêtes" - -# AI Translated -msgid "Top edges" -msgstr "Arêtes supérieures" - -# AI Translated -msgid "Bottom edges" -msgstr "Arêtes inférieures" - -# AI Translated -msgid "Lateral edges" -msgstr "Arêtes latérales" - -# AI Translated -msgid "Mesh resolution" -msgstr "Résolution du maillage" - -# AI Translated -msgid "Add Shape" -msgstr "Ajouter la forme" - -# AI Translated -msgid "No outer profile" -msgstr "Aucun profil extérieur" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Échec de la création de la face extérieure" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Échec de la création de la face avec trous" - -# AI Translated -msgid "Revolve failed" -msgstr "Échec de la révolution" - -# AI Translated -msgid "Profile" -msgstr "Profil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Commencer un nouveau profil (pour les trous)" - -# AI Translated -msgid "Segments" -msgstr "Segments" - -# AI Translated -msgid "Sides" -msgstr "Côtés" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Cliquez dans la vue pour dessiner" - -# AI Translated -msgid "Snap to grid" -msgstr "Aimanter à la grille" - -# AI Translated -msgid "Grid step" -msgstr "Pas de la grille" - -# AI Translated -msgid "Outer" -msgstr "Extérieur" - -# AI Translated -msgid "closed" -msgstr "fermé" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2% : %3% points %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Haut)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Avant)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Côté)" - -# AI Translated -msgid "Revolve deg" -msgstr "Révolution (°)" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "0 pour une extrusion, >0 pour une révolution" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Poche (enlèvement)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu profil fermé" -msgstr[1] "%zu profils fermés" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Dessinez un profil fermé pour activer" - -# AI Translated -msgid "Clear all" -msgstr "Tout effacer" - -# AI Translated -msgid "Empty result" -msgstr "Résultat vide" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Extrusion : %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Révolution : %1%" - -# AI Translated -msgid "No object selected" -msgstr "Aucun objet sélectionné" - -# AI Translated -msgid "Face failed" -msgstr "Échec de la face" - -# AI Translated -msgid "Face with holes failed" -msgstr "Échec de la face avec trous" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Maillage de l’outil vide" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Poche ajoutée (volume négatif)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Poche : %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -26358,6 +26853,9 @@ msgstr "Gizmo assembler" msgid "Gizmo brim ears" msgstr "Gizmo bordure à oreilles" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Haut" @@ -27335,10 +27833,6 @@ msgstr "Mes réglages" msgid "Custom Printer Setup" msgstr "Configuration d’une imprimante personnalisée" -# AI Translated -msgid "Custom Printer" -msgstr "Imprimante personnalisée" - # AI Translated msgid "Define a custom printer profile" msgstr "Définir un profil d’imprimante personnalisé" @@ -27983,9 +28477,8 @@ msgstr "Seuil d’angle - le remplissage s’arrête aux arêtes plus vives que msgid "Click a triangle to paint it" msgstr "Cliquez sur un triangle pour le peindre" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Nécessite que le calque actif soit mappé avec Dépliage (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -27999,17 +28492,15 @@ msgstr "Rapide - le relief est seulement ombré, pas construit, et uniquement po msgid "Checker" msgstr "Damier" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Damier - une grille de test à la place de la texture. Là où les carrés restent carrés, la texture n’est pas déformée ; là où ils s’étirent, elle le sera aussi" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Distorsion" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Distorsion - carte thermique de l’étirement, du bleu au rouge, sur le dépliage" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28125,24 +28616,11 @@ msgstr "Mélanger les filaments" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Entrelace deux filaments pour simuler les couleurs intermédiaires, afin qu’une poignée de filaments puisse reproduire une photo ou un dégradé. Une image en aplats de couleur s’imprime de la même façon dans les deux cas. Désactivé, un seul filament est utilisé par zone." -# AI Translated -msgid "Mix by" -msgstr "Mélanger par" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Surface" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Couches : les deux filaments alternent entre les couches d’impression, ce qui donne un mélange fluide sur les surfaces verticales mais disparaît sur les surfaces horizontales, où une couche entière forme une seule bande.\n" -"Surface : un fin damier sur la surface, qui fonctionne sous n’importe quel angle mais peut se lire comme une texture plutôt que comme un mélange.\n" -"Automatique : couches sur les faces verticales ; les faces horizontales prennent le filament unique le plus proche, car un damier y apparaîtrait comme un motif." # AI Translated #, boost-format @@ -28602,14 +29080,6 @@ msgstr "Nécessite environ %1% triangles, budget %2% - l’intégration simplifi msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Nombre de milliers de triangles que l’affinage peut ajouter au modèle. Le triangle le moins bien ajusté est toujours divisé en premier ; même une exécution qui épuise tout le budget l’a donc dépensé là où cela se voit le plus. Augmentez-le si le relief semble encore grossier." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Arrête l’intégration. Ce qui était déjà terminé reste sur le modèle et peut être annulé." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Ferme l’outil sans intégrer. Votre peinture, vos calques et vos réglages restent avec le modèle." - # AI Translated msgid "Preparing..." msgstr "Préparation..." @@ -28634,6 +29104,14 @@ msgstr "Transforme les cartes de hauteur peintes en géométrie réelle, en dép msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Transforme les cartes de hauteur peintes en géométrie réelle. Le maillage est d’abord remaillé à une densité uniforme et affiné là où la texture se courbe, afin que le détail ait des sommets sur lesquels se poser - le tout en une seule étape." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Arrête l’intégration. Ce qui était déjà terminé reste sur le modèle et peut être annulé." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Ferme l’outil sans intégrer. Votre peinture, vos calques et vos réglages restent avec le modèle." + # AI Translated #, boost-format msgid "%1% k" @@ -28843,6 +29321,28 @@ msgstr "Plugins de filament" msgid "Printer plugins" msgstr "Plugins d’imprimante" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Restaurer les valeurs par défaut" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "La configuration n’est pas un JSON valide. Vos modifications n’ont pas été enregistrées." @@ -28862,10 +29362,6 @@ msgstr "" "\n" "Cela supprime la surcharge du préréglage et utilise la configuration globale." -# AI Translated -msgid "Restore defaults" -msgstr "Restaurer les valeurs par défaut" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Utilisation de la configuration globale. Enregistrez le préréglage pour la conserver." @@ -28935,6 +29431,215 @@ msgstr "Installation du plugin" msgid "Installed \"%s\"." msgstr "« %s » installé." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29151,6 +29856,54 @@ msgstr "Échec du rechargement du plugin." msgid "Reloaded \"%s\"." msgstr "« %s » rechargé." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "Pas d'information sur le modèle" + +msgid "Edit Project Info" +msgstr "Modifier les informations du projet" + +msgid "Model Information" +msgstr "Informations sur le modèle" + +msgid "Accessories" +msgstr "Accessoires" + +msgid "Profile Information" +msgstr "Informations de profil" + +msgid "Model name" +msgstr "Nom du modèle" + +msgid "Created by" +msgstr "Créé par" + +msgid "Remixed by" +msgstr "Remixé par" + +msgid "Shared by" +msgstr "Partagé par" + +msgid "Model description" +msgstr "Description du modèle" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "Nom du profil" + +msgid "Profile Author" +msgstr "Auteur du profil" + +msgid "Profile description" +msgstr "Description du profil" + # AI Translated msgid "Purge Mode Settings" msgstr "Réglages du mode de purge" @@ -29175,6 +29928,16 @@ msgstr "Réduit les déchets d’amorçage et imprime plus vite. Peut provoquer msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Une commande est déjà en cours d’exécution." @@ -29441,6 +30204,9 @@ msgstr " | aimantation ACTIVÉE" msgid "Change texture - choose another one from the texture library" msgstr "Changer la texture - en choisir une autre dans la bibliothèque de textures" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Carte de hauteur - afficher la texture du calque sous les îlots" @@ -29473,17 +30239,14 @@ msgstr "Connecter les îlots" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Dispose le dépliage en patron connecté : les morceaux qui partagent une arête sont dépliés les uns à côté des autres (un cube devient un patron d’un seul tenant plutôt que six carrés séparés). Ils restent des îlots distincts, vous pouvez donc toujours déplacer chacun d’eux à la main ensuite." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Îlot - déplacer, pivoter et mettre à l’échelle des îlots entiers" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Sommet - faire glisser des sommets pour remodeler ; Maj/Ctrl pour la multisélection" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Arête - faire glisser des arêtes pour remodeler ; Maj/Ctrl pour la multisélection" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -29521,9 +30284,13 @@ msgstr "Effacer les modifications UV - annuler tous les déplacements manuels de msgid "Snap - stick islands together when dragging one against another" msgstr "Aimanter - coller les îlots entre eux lorsqu’on en fait glisser un contre un autre" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Cadrer tous les îlots (Début)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -29534,6 +30301,9 @@ msgstr "Aucun calque mappé avec Dépliage" msgid "%.1f mm tile" msgstr "tuile de %.1f mm" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Obsolète - la peinture, les coutures ou l’angle de couture ont changé depuis ce dépliage. Appuyez pour déplier à nouveau." @@ -29542,19 +30312,48 @@ msgstr "Obsolète - la peinture, les coutures ou l’angle de couture ont chang msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Aplatit la zone peinte en îlots UV. Le calcul n’a lieu que lorsque vous appuyez ici, pas à chaque modification - peignez, changez l’angle de couture ou marquez les coutures d’abord, puis appuyez sur Déplier." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d îlots, %s faces" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Le plug-in Bambu Network n'est pas détecté. Cliquez ici pour l'installer." + +msgid "Create new project" +msgstr "Créer un nouveau projet" + +msgid "Recently opened" +msgstr "Récemment ouvert" + +msgid "Open Containing Folder" +msgstr "Ouvrir le dossier contenant" + # AI Translated msgid "Forward" msgstr "Avancer" -# AI Translated -msgid "Tools" -msgstr "Outils" - # AI Translated msgid "View Source" msgstr "Afficher la source" @@ -29700,6 +30499,16 @@ msgstr "" "Le plugin « %s » demande à exécuter la ou les commandes suivantes :\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -29709,6 +30518,30 @@ msgstr "Le plugin « %s » demande l’autorisation pour l’événement d’aud msgid "Plugin permission request" msgstr "Demande d’autorisation d’un plugin" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "L’interface de configuration du plugin était vide. Affichage de l’éditeur par défaut." @@ -30295,6 +31128,310 @@ msgstr "" "Éviter la déformation\n" "Saviez-vous que lors de l’impression de matériaux susceptibles de se déformer, tels que l’ABS, une augmentation appropriée de la température du plateau chauffant peut réduire la probabilité de déformation?" +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Le runtime Microsoft WebView2 n’a pas pu être installé.\n" +#~ "Certaines fonctionnalités, dont l’assistant de configuration, peuvent apparaître vides tant qu’il n’est pas installé.\n" +#~ "Veuillez l’installer manuellement depuis https://developer.microsoft.com/microsoft-edge/webview2/ et redémarrer Orca Slicer." + +#~ msgid "Why this grouping" +#~ msgstr "Pourquoi ce regroupement" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Le logiciel ne prend pas en charge l'utilisation de buses de diamètres différents pour une même impression. Si les buses gauche et droite sont différentes, nous ne pouvons procéder qu'avec une impression à tête unique. Veuillez confirmer quelle buse vous souhaitez utiliser pour ce projet." + +#~ msgid "Switch diameter" +#~ msgstr "Changer le diamètre" + +#~ msgid "BambuStudio Project" +#~ msgstr "Projet BambuStudio" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "Le fichier 3MF a été créé par BambuStudio (version %s), plus récente que la version compatible %s. Paramètres non reconnus détectés :" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "Le fichier 3MF a été créé par BambuStudio (version %s), plus récente que la version compatible %s. Certains paramètres peuvent ne pas être totalement compatibles." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "Le fichier 3MF a été créé par BambuStudio. Certains paramètres peuvent différer de ceux d’OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Impossible d’annuler ou de rétablir pendant qu’une opération est en cours. Arrêtez-la d’abord." + +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s : %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Centre le remplissage interne de chaque pièce sur elle-même, comme si elle était découpée seule, au lieu de sur l'ensemble de l'assemblage. Les pièces qui se touchent ou se chevauchent sont traitées comme un seul corps et partagent un centre ; les pièces séparées (ou des objets 3D distincts) en obtiennent chacune un.\n" +#~ "Utile lorsqu'un assemblage regroupe plusieurs objets qui devraient chacun conserver un remplissage cohérent et centré sur lui-même.\n" +#~ "Affecte les motifs en lignes et en grille et les remplissages à modèle de rotation.\n" +#~ "Les motifs verrouillés sur les coordonnées globales (Gyroïde, Nid d'abeille, TPMS, ...) ne sont pas affectés." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Indice de la couche actuelle. Base unitaire (c’est-à-dire que la première couche porte le numéro 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Tutoriel vidéo" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitive" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Maillage vide généré" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Boîte" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Rapide :" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Largeur (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Profondeur (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Hauteur (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R inférieur" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R supérieur" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "Grand R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "Petit R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Toutes les arêtes" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Arêtes supérieures" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Arêtes inférieures" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Arêtes latérales" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Résolution du maillage" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Ajouter la forme" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Aucun profil extérieur" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Échec de la création de la face extérieure" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Échec de la création de la face avec trous" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Échec de la révolution" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Commencer un nouveau profil (pour les trous)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segments" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Côtés" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Cliquez dans la vue pour dessiner" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Aimanter à la grille" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Pas de la grille" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Extérieur" + +# AI Translated +#~ msgid "closed" +#~ msgstr "fermé" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2% : %3% points %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Haut)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Avant)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Côté)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Révolution (°)" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "0 pour une extrusion, >0 pour une révolution" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Poche (enlèvement)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu profil fermé" +#~ msgstr[1] "%zu profils fermés" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Dessinez un profil fermé pour activer" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Résultat vide" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Extrusion : %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Révolution : %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Aucun objet sélectionné" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Échec de la face" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Échec de la face avec trous" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Maillage de l’outil vide" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Poche ajoutée (volume négatif)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Poche : %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Nécessite que le calque actif soit mappé avec Dépliage (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Damier - une grille de test à la place de la texture. Là où les carrés restent carrés, la texture n’est pas déformée ; là où ils s’étirent, elle le sera aussi" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Distorsion - carte thermique de l’étirement, du bleu au rouge, sur le dépliage" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Mélanger par" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Surface" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Couches : les deux filaments alternent entre les couches d’impression, ce qui donne un mélange fluide sur les surfaces verticales mais disparaît sur les surfaces horizontales, où une couche entière forme une seule bande.\n" +#~ "Surface : un fin damier sur la surface, qui fonctionne sous n’importe quel angle mais peut se lire comme une texture plutôt que comme un mélange.\n" +#~ "Automatique : couches sur les faces verticales ; les faces horizontales prennent le filament unique le plus proche, car un damier y apparaîtrait comme un motif." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Îlot - déplacer, pivoter et mettre à l’échelle des îlots entiers" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Sommet - faire glisser des sommets pour remodeler ; Maj/Ctrl pour la multisélection" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Arête - faire glisser des arêtes pour remodeler ; Maj/Ctrl pour la multisélection" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Cadrer tous les îlots (Début)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Expérimental) Utiliser les agents d’imprimante au lieu des hôtes d’impression" @@ -30324,16 +31461,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Cliquez sur une face ou un plan de référence, puis choisissez un outil de dessin" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -30388,10 +31515,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Distance verticale" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Linéaire" - #~ msgid "Face recognition" #~ msgstr "Reconnaissance faciale" @@ -32061,9 +33184,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "sélection de pièce" -#~ msgid "°" -#~ msgstr "°" - #, c-format, boost-format #~ msgid "" #~ "Failed to connect to OrcaCloud.\n" diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index 951fa2edd1..7f3603a95b 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -2145,15 +2145,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"A Microsoft WebView2 Runtime telepítése nem sikerült.\n" -"Egyes funkciók, köztük a beállítási varázsló, üresen jelenhetnek meg a telepítéséig.\n" -"Kérlek, telepítsd kézzel innen: https://developer.microsoft.com/microsoft-edge/webview2/, majd indítsd újra az Orca Slicert." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4308,6 +4305,9 @@ msgstr "Ugrás a tálcára" msgid "AMS Materials Setting" msgstr "AMS anyagok beállítása" +msgid "Wiki Guide" +msgstr "Wiki útmutató" + msgid "Close" msgstr "Bezárás" @@ -4333,9 +4333,6 @@ msgstr "A megadott értéknek nagyobbnak kell lennie, mint %1% és kisebbnek, mi msgid "Factors of Flow Dynamics Calibration" msgstr "Áramlásdinamika-kalibrálás tényezői" -msgid "Wiki Guide" -msgstr "Wiki útmutató" - msgid "PA Profile" msgstr "PA-profil" @@ -4936,6 +4933,11 @@ msgstr "Szeretnéd automatikusan a határértékre (%g mm) igazítani?" msgid "Adjust" msgstr "Módosítás" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5777,9 +5779,6 @@ msgstr "Automatikus újraszeletelés az optimális filamentcsoportosítás alapj msgid "Filament Grouping" msgstr "Filamentcsoportosítás" -msgid "Why this grouping" -msgstr "Miért ez a csoportosítás" - msgid "Please place filaments on the printer based on grouping result." msgstr "Helyezd fel a filamenteket a nyomtatóra a csoportosítási eredmény alapján." @@ -5968,6 +5967,43 @@ msgstr "Szerkesztési terület növelése/csökkentése" msgid "Sequence" msgstr "Sorrend" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Térfogat" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Objektum kijelölés" @@ -6184,6 +6220,12 @@ msgstr "Rácsvonalak" msgid "Labels" msgstr "Címkék" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Metszősík mozgatása" @@ -6233,7 +6275,7 @@ msgid "Size:" msgstr "Méret:" # AI Translated -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "G-code útvonalütközés található a(z) %d. rétegen, Z = %.2lfmm. Helyezd távolabb egymástól az ütköző objektumokat (%s <-> %s)." @@ -6716,6 +6758,12 @@ msgstr "Rácsvonalak megjelenítése" msgid "Show Gridlines on plate" msgstr "Rácsvonalak megjelenítése a tálcán" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Ablakelrendezés visszaállítása" @@ -8411,6 +8459,61 @@ msgstr "Az összes objektum beállításainak megtekintése" msgid "Material settings" msgstr "Anyagbeállítások" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Eszközök" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Aktuális tálca eltávolítása (ha nem az utolsó)" @@ -8435,6 +8538,17 @@ msgstr "Aktuális tálcanév szerkesztése" msgid "Move plate to the front" msgstr "Tálca előre helyezése" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Aktuális tálca testreszabása" @@ -8501,12 +8615,6 @@ msgstr "AMS (1 férőhely)" msgid "Not installed" msgstr "Nincs telepítve" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "A szoftver nem támogatja eltérő fúvókaátmérők használatát egy nyomtatáson belül. Ha a bal és jobb fúvóka nem egyezik, csak egyfejes nyomtatás lehetséges. Erősítsd meg, melyik fúvókát szeretnéd használni ennél a projektnél." - -msgid "Switch diameter" -msgstr "Átmérő váltása" - msgid "Configuration incompatible" msgstr "Nem kompatibilis konfiguráció" @@ -8588,6 +8696,9 @@ msgstr "Kevert filament" msgid "Remove last mixed filament" msgstr "Utolsó kevert filament eltávolítása" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Kevert filament hozzáadása" @@ -8610,6 +8721,10 @@ msgstr "A kevert filament hibás összetevő-hivatkozásokat tartalmaz" msgid "Edit / Delete / Merge" msgstr "Szerkesztés / Törlés / Egyesítés" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "A cél kevert filament ezt a fizikai filamentet használja összetevőként. Az egyesítés eltávolítja ezt a fizikai filamentet, és a kevert filament érvénytelenné válhat. Folytatja?" @@ -8684,9 +8799,6 @@ msgstr "Fájl betöltése: %s" msgid "Load 3MF" msgstr "3MF betöltése" -msgid "BambuStudio Project" -msgstr "BambuStudio projekt" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "A 3MF fájlt az OrcaSlicer nem támogatja teljesen, csak a geometriai adatok töltődnek be." @@ -8716,17 +8828,6 @@ msgstr "Jobb lenne, ha frissítenéd a szoftvert.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "A 3MF fájl %s verziója újabb, mint a(z) %s verziója %s, javasolt a szoftver frissítése." -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "A 3MF-et a BambuStudio készítette (%s verzió), amely újabb, mint a %s kompatibilis verzió. Felismeretlen beállításokat találtunk:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "A 3MF-et a BambuStudio készítette (%s verzió), amely újabb, mint a %s kompatibilis verzió. Előfordulhat, hogy egyes beállítások nem teljesen kompatibilisek." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "A 3MF-et a BambuStudio készítette. Egyes beállítások eltérhetnek az OrcaSlicer-től." - msgid "Invalid values found in the 3MF:" msgstr "Érvénytelen értékek találhatók a 3MF-ben:" @@ -8901,6 +9002,12 @@ msgstr "Letiltja az Auto-Drop funkciót a Z pozicionálás megőrzéséhez?\n" msgid "Object with floating parts was detected" msgstr "Lebegő részeket tartalmazó tárgyat észleltünk" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Egy másik exportálási feladat is fut." @@ -8985,6 +9092,38 @@ msgstr "Érvénytelen adat" msgid "Slicing Canceled" msgstr "Szeletelés megszakítva" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "A hálózati bővítmény sikeresen átváltva." @@ -9017,9 +9156,8 @@ msgstr "" msgid "Sync now" msgstr "Szinkronizálás most" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Művelet futása közben nem lehet visszavonni vagy újra végrehajtani. Előbb állítsd le." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9090,6 +9228,11 @@ msgstr "Letöltés sikertelen, fájlméret kivétel." msgid "Project downloaded %d%%" msgstr "Projekt letöltve %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advance teszt" @@ -9117,6 +9260,13 @@ msgstr "Orca YOLO anyagáramlás-kalibrálás" msgid "Flowrate Test - Pass%d" msgstr "Anyagáramlás-teszt - %d. menet" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Fúvókahőmérséklet-teszt" @@ -11595,6 +11745,9 @@ msgstr "A különböző extruderhajtások vagy fúvókatérfogat-típusok szinkr msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "A paraméterek módosításának szinkronizálása egy másik extruder megfelelő paramétereire." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Kattints az összes beállítás utolsó mentett változatának visszaállításához." @@ -12015,6 +12168,12 @@ msgstr "Nyomtatási terület" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Válaszd ki a nyomtatóval való kommunikációhoz használt hálózati ügynököt. Az elérhető ügynököket indításkor regisztrálja a rendszer." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12141,9 +12300,24 @@ msgstr "Fúvóka átmérője" msgid "Wipe tower" msgstr "Törlőtorony" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Egyetlen extruder többanyagú paraméterei" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Ez egy egyextruderes többanyagú nyomtató, ezért az összes extruder átmérője az új értékre lesz állítva. Szeretnéd folytatni?" @@ -12153,6 +12327,18 @@ msgstr "Rétegmagasság limitek" msgid "Z-Hop" msgstr "Z-emelés" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12259,10 +12445,9 @@ msgstr "Folytatás" msgid "Don't warn again for this preset" msgstr "Ne legyen több figyelmeztetés ennél az előbeállításnál" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12690,9 +12875,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Összes tömörítés" -msgid "Volume" -msgstr "Térfogat" - msgid "Ramming line" msgstr "Tömörítési sor" @@ -12741,6 +12923,120 @@ msgstr "Sikertelen bejelentkezés. Próbáld újra." msgid "parse json failed" msgstr "a JSON feldolgozása sikertelen" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "Kész" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Egyedi nyomtató" + +msgid "Create" +msgstr "Létrehoz" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "Filament típusa" + +msgid "Vendor" +msgstr "Gyártó" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "Összes törlése" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Ez kikapcsolja az összes felhőfunkciót, beleértve az Orca Cloud profilszinkronizálást is. Azok a felhasználók kapcsolhatják be, akik teljesen offline szeretnének dolgozni." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Megjegyzés: ha a lopakodó mód be van kapcsolva, a felhasználói profiljaidról nem készül biztonsági mentés az Orca Cloudba." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + msgid "[Action Required] " msgstr "[Művelet szükséges] " @@ -13206,6 +13502,14 @@ msgstr "Filament változás extrudálási szerepkör G-code-ja" msgid "No object can be printed. It may be too small." msgstr "Objektum nem nyomtatható ki. Lehet, hogy túl kicsi." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "A nyomat nagyon közel van az előkészítő extrudálás területéhez. Ellenőrizd, hogy nem ütköznek-e." @@ -13382,6 +13686,26 @@ msgstr "sikertelen érvényesítés" msgid "write callback failed" msgstr "írás callback sikertelen" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% túl közel van a tiltott területhez, a nyomtatás során előfordulhatnak ütközések." @@ -13432,6 +13756,43 @@ msgstr "Ha továbbra is szeretnél nyomtatni, engedélyezheted az opciót itt: B msgid "No extrusions under current settings." msgstr "A jelenlegi beállításokkal nincsenek extrudálások." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Színátmenetes kevert filament van használatban, de a 'Kevert színű alréteg' ki van kapcsolva. A színátmenet nem lesz kinyomtatva." @@ -13442,6 +13803,15 @@ msgstr "A sima Timelapse nem használható, ha a nyomtatási sorrend \"Tárgyank msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "A csomósodásészlelés nem támogatott, ha a nyomtatási sorrend \"Tárgyanként\" értékre van állítva." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "A pontos Z magasság és a törlőtorony egyidejű engedélyezése szeletelési hibákat okozhat." @@ -13458,10 +13828,6 @@ msgstr "A spirál (váza) mód nem működik, ha egy objektum egynél több anya msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Bár a(z) %1% objektum önmagában belefér a nyomtatási térfogatba, az anyag zsugorodáskompenzációja miatt túllépi a maximális nyomtatási magasságot." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "A(z) %1% objektum túllépi a maximális nyomtatási magasságot." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Bár a(z) %1% objektum önmagában belefér a nyomtatási térfogatba, az utolsó rétege túllépi a maximális nyomtatási magasságot." @@ -13469,6 +13835,10 @@ msgstr "Bár a(z) %1% objektum önmagában belefér a nyomtatási térfogatba, a msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Próbáld meg csökkenteni a modell méretét vagy módosítani a jelenlegi nyomtatási beállításokat, majd próbáld újra." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "A(z) %1% objektum túllépi a maximális nyomtatási magasságot." + msgid "Variable layer height is not supported with Organic supports." msgstr "A változó rétegmagasság nem működik az organikus támaszokkal." @@ -14454,12 +14824,39 @@ msgstr "A belső hidak sebessége. Ha az érték százalékban van megadva, a br msgid "This is the distance from the model to the outermost brim line." msgstr "A modell és a legkülső peremvonal közötti távolság" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Perem típusa" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Ez a modellek külső és/vagy belső oldalán létrehozott perem generálását szabályozza. Az Automatikus azt jelenti, hogy a perem szélessége automatikusan van elemezve és kiszámítva." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Perem-tárgy közötti rés" @@ -15652,9 +16049,6 @@ msgstr "A filament ára, kizárólag statisztikai célokra." msgid "money/kg" msgstr "pénz/kg" -msgid "Vendor" -msgstr "Gyártó" - msgid "Vendor of filament. For show only." msgstr "Filamentgyártó." @@ -15728,6 +16122,66 @@ msgstr "Többvonalas kitöltés" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Több vonal használata a kitöltési mintához, ha azt a kitöltési minta támogatja." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Lineáris" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "Z-kihajlási torzítás optimalizálása (kísérleti)" @@ -17997,6 +18451,99 @@ msgstr "Egyextruder Többanyag" msgid "Use single nozzle to print multi filament." msgstr "Egyetlen fúvóka használata többféle filament nyomtatásához." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Kézi filamentcsere" @@ -18379,6 +18926,130 @@ msgstr "Átfedési küszöbérték" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Ha a küszöbszög nulla, támasz azoknál a túlnyúlásoknál jön létre, amelyek átfedése a küszöbérték alatt van. Minél kisebb ez az érték, annál meredekebb túlnyúlás nyomtatható támasz nélkül." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Fa típusú támasz ágainak szöge" @@ -18560,17 +19231,11 @@ msgstr "A felső szilárd rétegek száma szeleteléskor megnő, ha a felső hé msgid "Separated infills" msgstr "Különálló kitöltések" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Az egyes tárgyak belső kitöltését önmagukra igazítja, mintha külön lennének szeletelve, nem pedig a teljes összeállításra. Az egymáshoz érő vagy egymást átfedő tárgyak egy testként kezelődnek, és közös középpontot kapnak; a különálló tárgyak (vagy önálló 3D objektumok) mindegyike sajátot.\n" -"Akkor hasznos, ha egy összeállítás több objektumot fog össze, és mindegyiknek egységes, önmagára igazított kitöltést kell megtartania.\n" -"A vonalas és rácsos mintázatokra, valamint a forgatási sablont használó kitöltésekre van hatással.\n" -"A globális koordinátákhoz kötött mintázatokat (Gyroid, Méhsejt, TPMS, ...) nem érinti." # AI Translated msgid "Center surface pattern on" @@ -18804,6 +19469,12 @@ msgstr "A filamentcsere utáni öblítés az objektumok támaszain belül tört msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Ezt az objektumot használja a fúvóka öblítésére filamentcsere után, így filamentet és nyomtatási időt takarít meg. Emiatt az objektum színei keverednek. Ez a beállítás csak bekapcsolt törlőtoronnyal működik." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Maximális áthidalási távolság" @@ -19709,8 +20380,8 @@ msgstr "A szeleteléshez használt fizikai nyomtató neve." msgid "Layer number" msgstr "Rétegszám" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Az aktuális réteg indexe. Egytől számozott (azaz az első réteg száma 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Réteg Z" @@ -19855,9 +20526,6 @@ msgstr "Újrakalibrálás" msgid "Calibrate" msgstr "Kalibrálás" -msgid "Finish" -msgstr "Kész" - msgid "How can I use calibration results?" msgstr "Hogyan használjam a kalibrálási eredményeket?" @@ -20395,12 +21063,12 @@ msgstr "" "A gyorsulási értékeknek nagyobbaknak kell lenniük a sebességértékeknél.\n" "Ellenőrizd a megadott adatokat." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Hőmérséklet kalibrálás" -msgid "Filament type" -msgstr "Filament típusa" - msgid "PLA" msgstr "PLA" @@ -20422,6 +21090,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Tesztmodell" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Kezdőhőmérséklet: " @@ -20547,9 +21221,6 @@ msgstr "Kezdő visszahúzás hossza: " msgid "End retraction length: " msgstr "Befejező visszahúzási hossz: " -msgid "Test model" -msgstr "Tesztmodell" - msgid "Ringing Tower" msgstr "Rezonanciatorony" @@ -20994,9 +21665,6 @@ msgstr "pl.: Basic, Matt, Silk, Marble" msgid "Filament Preset" msgstr "Filamentbeállítás" -msgid "Create" -msgstr "Létrehoz" - # AI Translated msgid "Vendor is not selected; please reselect vendor." msgstr "Nincs kiválasztva gyártó; kérlek, válaszd ki újra a gyártót." @@ -21314,6 +21982,9 @@ msgstr "" "A nyomtató és az ahhoz tartozó összes filament- és folyamatbeállítás.\n" "Megosztható másokkal." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -22079,9 +22750,6 @@ msgstr "Filament kézi hozzárendelése a bal vagy jobb fúvókához" msgid "Global settings" msgstr "Globális beállítások" -msgid "Video tutorial" -msgstr "Videós útmutató" - msgid "(Sync with printer)" msgstr "(Szinkronizálás a nyomtatóval)" @@ -22520,6 +23188,33 @@ msgstr "Ha be van kapcsolva, a fenti értékek alapértelmezettként tárolódna msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "A csomagmappa nem létezik." @@ -22564,6 +23259,12 @@ msgstr "Leiratkozás a csomagról" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "Beállításcsomag mentése" @@ -27000,214 +27701,6 @@ msgstr "Ennek a betűtípusnak nincs körvonala ehhez a szöveghez" msgid "Size: %.1f × %.1f mm" msgstr "Méret: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitív" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Üres háló jött létre" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Téglatest" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Gyors:" - -# AI Translated -msgid "Width (X)" -msgstr "Szélesség (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Mélység (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Magasság (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "Alsó R" - -# AI Translated -msgid "Top R" -msgstr "Felső R" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "Fő R" - -# AI Translated -msgid "Minor R" -msgstr "Cső R" - -# AI Translated -msgid "All edges" -msgstr "Minden él" - -# AI Translated -msgid "Top edges" -msgstr "Felső élek" - -# AI Translated -msgid "Bottom edges" -msgstr "Alsó élek" - -# AI Translated -msgid "Lateral edges" -msgstr "Oldalélek" - -# AI Translated -msgid "Mesh resolution" -msgstr "Hálófelbontás" - -# AI Translated -msgid "Add Shape" -msgstr "Alakzat hozzáadása" - -# AI Translated -msgid "No outer profile" -msgstr "Nincs külső profil" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Nem sikerült létrehozni a külső lapot" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Nem sikerült létrehozni a lyukas lapot" - -# AI Translated -msgid "Revolve failed" -msgstr "A körbeforgatás sikertelen" - -# AI Translated -msgid "Profile" -msgstr "Profil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Új profil kezdése (lyukakhoz)" - -# AI Translated -msgid "Segments" -msgstr "Szakaszok" - -# AI Translated -msgid "Sides" -msgstr "Oldalak" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Kattints a vászonra a rajzoláshoz" - -# AI Translated -msgid "Snap to grid" -msgstr "Rácshoz illesztés" - -# AI Translated -msgid "Grid step" -msgstr "Rács lépésköze" - -# AI Translated -msgid "Outer" -msgstr "Külső" - -# AI Translated -msgid "closed" -msgstr "zárt" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% pont %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (felülnézet)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (elölnézet)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (oldalnézet)" - -# AI Translated -msgid "Revolve deg" -msgstr "Körbeforgatás (°)" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "0: extrudálás, >0: körbeforgatás" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Zseb (vágás)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu zárt profil" -msgstr[1] "%zu zárt profil" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Az engedélyezéshez rajzolj egy zárt profilt" - -# AI Translated -msgid "Clear all" -msgstr "Összes törlése" - -# AI Translated -msgid "Empty result" -msgstr "Üres eredmény" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Extrudálás: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Körbeforgatás: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Nincs kijelölt objektum" - -# AI Translated -msgid "Face failed" -msgstr "A lap létrehozása sikertelen" - -# AI Translated -msgid "Face with holes failed" -msgstr "A lyukas lap létrehozása sikertelen" - -# AI Translated -msgid "Tool mesh empty" -msgstr "A szerszámháló üres" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Zseb hozzáadva (negatív térfogat)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Zseb: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27329,6 +27822,9 @@ msgstr "Gizmo összeállítás" msgid "Gizmo brim ears" msgstr "Gizmo peremfülek" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Függőleges csúszka - Az aktív csúszka felfelé mozgatása" @@ -28311,10 +28807,6 @@ msgstr "Saját beállítások" msgid "Custom Printer Setup" msgstr "Egyedi nyomtató beállítása" -# AI Translated -msgid "Custom Printer" -msgstr "Egyedi nyomtató" - # AI Translated msgid "Define a custom printer profile" msgstr "Egyedi nyomtatóprofil létrehozása" @@ -28960,9 +29452,8 @@ msgstr "Szögküszöb - a kitöltés az ennél élesebb éleknél megáll" msgid "Click a triangle to paint it" msgstr "Kattints egy háromszögre a befestéséhez" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Az aktív réteghez Kiterítés (LSCM) hozzárendelés szükséges." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -28976,17 +29467,15 @@ msgstr "Gyors - a domborzat csak árnyékolással jelenik meg, nem épül fel, msgid "Checker" msgstr "Sakktábla" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Sakktábla - tesztrács a textúra helyett. Ahol a négyzetek négyzetek maradnak, a textúra torzításmentes; ahol megnyúlnak, ott a textúra is meg fog" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Torzítás" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Torzítás - kéktől pirosig terjedő nyúlási hőtérkép a kiterítésen" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -29102,24 +29591,11 @@ msgstr "Filamentek keverése" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Két filamentet váltakoztat a köztes színek imitálásához, így néhány filamenttel is lefedhető egy fotó vagy egy színátmenet. Egy egyszínű foltokból álló kép mindkét módon ugyanúgy nyomtatódik. Kikapcsolva területenként egy filamentet használ." -# AI Translated -msgid "Mix by" -msgstr "Keverés módja" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Felület" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Rétegek: a két filament a nyomtatási rétegek között váltakozik, ami függőleges felületeken simán összeolvad, de vízszintes felületeken eltűnik, ahol egy teljes réteg egyetlen sáv.\n" -"Felület: finom sakktáblaminta a felületen, ami bármilyen szögben működik, de keverék helyett inkább textúrának hathat.\n" -"Automatikus: függőleges felületeken rétegek; a vízszintes felületek a közelebbi egyetlen filamentet kapják, mivel ott a sakktábla mintázatként látszik." # AI Translated #, boost-format @@ -29579,14 +30055,6 @@ msgstr "Kb. %1% háromszög szükséges, a keret %2% - a beégetés visszaegysze msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Hány ezer háromszöget adhat hozzá a finomítás a modellhez. Mindig a legrosszabbul illeszkedő háromszöget osztja fel először, így még a teljes keretet elhasználó futás is ott költötte el, ahol a leginkább látszik. Növeld, ha a domborzat még mindig durvának tűnik." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Leállítja a beégetést. Amit már befejezett, az a modellen marad, és visszavonható." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Beégetés nélkül bezárja az eszközt. A festésed, a rétegek és a beállítások a modellnél maradnak." - # AI Translated msgid "Preparing..." msgstr "Előkészítés..." @@ -29611,6 +30079,14 @@ msgstr "A befestett magasságtérképeket valódi geometriává alakítja a már msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "A befestett magasságtérképeket valódi geometriává alakítja. A hálót előbb egyenletes sűrűségűre hálózza újra, és ott finomítja, ahol a textúra hajlik, hogy a részleteknek legyenek csúcsai - mindezt egy lépésben." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Leállítja a beégetést. Amit már befejezett, az a modellen marad, és visszavonható." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Beégetés nélkül bezárja az eszközt. A festésed, a rétegek és a beállítások a modellnél maradnak." + # AI Translated #, boost-format msgid "%1% k" @@ -29827,6 +30303,28 @@ msgstr "Filamentbővítmények" msgid "Printer plugins" msgstr "Nyomtatóbővítmények" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Alapértékek visszaállítása" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "A konfiguráció nem érvényes JSON. A módosításaid nem lettek mentve." @@ -29846,10 +30344,6 @@ msgstr "" "\n" "Ez elveti a beállítás felülírását, és a globális konfigurációt használja." -# AI Translated -msgid "Restore defaults" -msgstr "Alapértékek visszaállítása" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "A globális konfiguráció van használatban. A megőrzéséhez mentsd a beállítást." @@ -29919,6 +30413,215 @@ msgstr "Bővítmény telepítése" msgid "Installed \"%s\"." msgstr "\"%s\" telepítve." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -30135,6 +30838,54 @@ msgstr "Nem sikerült újratölteni a bővítményt." msgid "Reloaded \"%s\"." msgstr "\"%s\" újratöltve." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "Öblítési mód beállításai" @@ -30159,6 +30910,16 @@ msgstr "Csökkenti az előkészítési hulladékot, és gyorsabban nyomtat. Enyh msgid "Terminal" msgstr "Terminál" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Már fut egy parancs." @@ -30425,6 +31186,9 @@ msgstr " | illesztés BE" msgid "Change texture - choose another one from the texture library" msgstr "Textúra cseréje - válassz másikat a textúratárból" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Magasságtérkép - a réteg textúrájának megjelenítése a szigetek alatt" @@ -30457,17 +31221,14 @@ msgstr "Szigetek összekapcsolása" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "A kiterítést összefüggő hálóként rendezi el: a közös élű darabok egymás mellé hajtódnak ki (egy kocka hat különálló négyzet helyett összefüggő kiterített hálót ad). Különálló szigetek maradnak, így utána bármelyiket kézzel is mozgathatod." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Sziget - teljes szigetek mozgatása, forgatása és átméretezése" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Csúcs - csúcsok húzása az alakításhoz; Shift/Ctrl a többszörös kijelöléshez" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Él - élek húzása az alakításhoz; Shift/Ctrl a többszörös kijelöléshez" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30505,9 +31266,13 @@ msgstr "UV-módosítások törlése - az összes kézi csúcs- és élmozgatás msgid "Snap - stick islands together when dragging one against another" msgstr "Illesztés - a szigetek összetapadnak, amikor egyiket a másikhoz húzod" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Összes sziget a nézetben (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30518,6 +31283,9 @@ msgstr "Nincs Kiterítés hozzárendelésű réteg" msgid "%.1f mm tile" msgstr "%.1f mm-es csempe" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Elavult - a festés, a varratok vagy a varratszög megváltozott a kiterítés óta. Nyomd meg az újbóli kiterítéshez." @@ -30526,19 +31294,48 @@ msgstr "Elavult - a festés, a varratok vagy a varratszög megváltozott a kiter msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "A befestett területet UV-szigetekké teríti ki. Csak akkor számolódik ki, amikor ezt megnyomod, nem minden szerkesztéskor - ezért előbb fess, módosítsd a varratszöget vagy jelölj varratokat, majd nyomd meg a Kiterítés gombot." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d sziget, %s felület" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + # AI Translated msgid "Forward" msgstr "Előre" -# AI Translated -msgid "Tools" -msgstr "Eszközök" - # AI Translated msgid "View Source" msgstr "Forrás megtekintése" @@ -30684,6 +31481,16 @@ msgstr "" "A(z) \"%s\" bővítmény a következő parancs(ok) futtatását kéri:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30693,6 +31500,30 @@ msgstr "A(z) \"%s\" bővítmény engedélyt kér a(z) \"%s\" Python audit esemé msgid "Plugin permission request" msgstr "Bővítmény engedélykérése" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "A bővítmény konfigurációs felülete üres volt. Az alapértelmezett szerkesztő jelenik meg." @@ -31281,6 +32112,312 @@ msgstr "" "Kunkorodás elkerülése\n" "Tudtad, hogy a kunkorodásra hajlamos anyagok (például ABS) nyomtatásakor az asztal hőmérsékletének növelése csökkentheti a kunkorodás valószínűségét?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "A Microsoft WebView2 Runtime telepítése nem sikerült.\n" +#~ "Egyes funkciók, köztük a beállítási varázsló, üresen jelenhetnek meg a telepítéséig.\n" +#~ "Kérlek, telepítsd kézzel innen: https://developer.microsoft.com/microsoft-edge/webview2/, majd indítsd újra az Orca Slicert." + +#~ msgid "Why this grouping" +#~ msgstr "Miért ez a csoportosítás" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "A szoftver nem támogatja eltérő fúvókaátmérők használatát egy nyomtatáson belül. Ha a bal és jobb fúvóka nem egyezik, csak egyfejes nyomtatás lehetséges. Erősítsd meg, melyik fúvókát szeretnéd használni ennél a projektnél." + +#~ msgid "Switch diameter" +#~ msgstr "Átmérő váltása" + +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudio projekt" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "A 3MF-et a BambuStudio készítette (%s verzió), amely újabb, mint a %s kompatibilis verzió. Felismeretlen beállításokat találtunk:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "A 3MF-et a BambuStudio készítette (%s verzió), amely újabb, mint a %s kompatibilis verzió. Előfordulhat, hogy egyes beállítások nem teljesen kompatibilisek." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "A 3MF-et a BambuStudio készítette. Egyes beállítások eltérhetnek az OrcaSlicer-től." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Művelet futása közben nem lehet visszavonni vagy újra végrehajtani. Előbb állítsd le." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Az egyes tárgyak belső kitöltését önmagukra igazítja, mintha külön lennének szeletelve, nem pedig a teljes összeállításra. Az egymáshoz érő vagy egymást átfedő tárgyak egy testként kezelődnek, és közös középpontot kapnak; a különálló tárgyak (vagy önálló 3D objektumok) mindegyike sajátot.\n" +#~ "Akkor hasznos, ha egy összeállítás több objektumot fog össze, és mindegyiknek egységes, önmagára igazított kitöltést kell megtartania.\n" +#~ "A vonalas és rácsos mintázatokra, valamint a forgatási sablont használó kitöltésekre van hatással.\n" +#~ "A globális koordinátákhoz kötött mintázatokat (Gyroid, Méhsejt, TPMS, ...) nem érinti." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Az aktuális réteg indexe. Egytől számozott (azaz az első réteg száma 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Videós útmutató" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitív" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Üres háló jött létre" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Téglatest" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Gyors:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Szélesség (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Mélység (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Magasság (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "Alsó R" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "Felső R" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "Fő R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "Cső R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Minden él" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Felső élek" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Alsó élek" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Oldalélek" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Hálófelbontás" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Alakzat hozzáadása" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Nincs külső profil" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Nem sikerült létrehozni a külső lapot" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Nem sikerült létrehozni a lyukas lapot" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "A körbeforgatás sikertelen" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Új profil kezdése (lyukakhoz)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Szakaszok" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Oldalak" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Kattints a vászonra a rajzoláshoz" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Rácshoz illesztés" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Rács lépésköze" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Külső" + +# AI Translated +#~ msgid "closed" +#~ msgstr "zárt" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% pont %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (felülnézet)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (elölnézet)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (oldalnézet)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Körbeforgatás (°)" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "0: extrudálás, >0: körbeforgatás" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Zseb (vágás)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu zárt profil" +#~ msgstr[1] "%zu zárt profil" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Az engedélyezéshez rajzolj egy zárt profilt" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Üres eredmény" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Extrudálás: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Körbeforgatás: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Nincs kijelölt objektum" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "A lap létrehozása sikertelen" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "A lyukas lap létrehozása sikertelen" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "A szerszámháló üres" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Zseb hozzáadva (negatív térfogat)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Zseb: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Az aktív réteghez Kiterítés (LSCM) hozzárendelés szükséges." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Sakktábla - tesztrács a textúra helyett. Ahol a négyzetek négyzetek maradnak, a textúra torzításmentes; ahol megnyúlnak, ott a textúra is meg fog" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Torzítás - kéktől pirosig terjedő nyúlási hőtérkép a kiterítésen" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Keverés módja" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Felület" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Rétegek: a két filament a nyomtatási rétegek között váltakozik, ami függőleges felületeken simán összeolvad, de vízszintes felületeken eltűnik, ahol egy teljes réteg egyetlen sáv.\n" +#~ "Felület: finom sakktáblaminta a felületen, ami bármilyen szögben működik, de keverék helyett inkább textúrának hathat.\n" +#~ "Automatikus: függőleges felületeken rétegek; a vízszintes felületek a közelebbi egyetlen filamentet kapják, mivel ott a sakktábla mintázatként látszik." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Sziget - teljes szigetek mozgatása, forgatása és átméretezése" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Csúcs - csúcsok húzása az alakításhoz; Shift/Ctrl a többszörös kijelöléshez" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Él - élek húzása az alakításhoz; Shift/Ctrl a többszörös kijelöléshez" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Összes sziget a nézetben (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Kísérleti) Nyomtatóügynökök használata nyomtatókiszolgálók helyett" @@ -31314,16 +32451,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Kattints egy lapra vagy egy referenciasíkra, majd válassz egy rajzeszközt" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31380,10 +32507,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Függőleges távolság" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Lineáris" - #~ msgid "Face recognition" #~ msgstr "Arcfelismerés" @@ -32973,9 +34096,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "alkatrész kijelölés" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "Loading current beállítás" #~ msgstr "Jelenlegi beállítás betöltése" diff --git a/localization/i18n/it/OrcaSlicer_it.po b/localization/i18n/it/OrcaSlicer_it.po index 9c9f915319..176f23a419 100644 --- a/localization/i18n/it/OrcaSlicer_it.po +++ b/localization/i18n/it/OrcaSlicer_it.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -2151,15 +2151,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Impossibile installare il Microsoft WebView2 Runtime.\n" -"Alcune funzionalità, inclusa la configurazione guidata, potrebbero apparire vuote finché non viene installato.\n" -"Installalo manualmente da https://developer.microsoft.com/microsoft-edge/webview2/ e riavvia Orca Slicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4301,6 +4298,9 @@ msgstr "Vai al piatto" msgid "AMS Materials Setting" msgstr "Impostazione materiali AMS" +msgid "Wiki Guide" +msgstr "Guida Wiki" + msgid "Close" msgstr "Chiudi" @@ -4326,9 +4326,6 @@ msgstr "Il valore immesso deve essere maggiore di %1% e minore di %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "Fattori di calibrazione della dinamica del flusso" -msgid "Wiki Guide" -msgstr "Guida Wiki" - msgid "PA Profile" msgstr "Profilo AP" @@ -4419,7 +4416,7 @@ msgstr "Salva" msgctxt "Navigation" msgid "Back" -msgstr "Posteriore" +msgstr "Indietro" msgid "Example" msgstr "Esempio" @@ -4916,6 +4913,11 @@ msgstr "Regolarla automaticamente al limite (%g mm)?" msgid "Adjust" msgstr "Regola" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5750,9 +5752,6 @@ msgstr "Rielabora automaticamente in base al raggruppamento ottimale dei filamen msgid "Filament Grouping" msgstr "Raggruppamento filamenti" -msgid "Why this grouping" -msgstr "Perché questo raggruppamento" - msgid "Please place filaments on the printer based on grouping result." msgstr "Posizionare i filamenti sulla stampante in base al risultato del raggruppamento." @@ -5941,6 +5940,44 @@ msgstr "Aumenta/diminuisci l'area di modifica" msgid "Sequence" msgstr "Sequenza" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +# AI Translated +msgid "Volume" +msgstr "Volume" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Selezione oggetto" @@ -6157,6 +6194,12 @@ msgstr "Linee griglia" msgid "Labels" msgstr "Etichette" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Sposta il piano di sezione" @@ -6206,7 +6249,7 @@ msgstr "Volume:" msgid "Size:" msgstr "Dimensione:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Sono stati trovati conflitti di percorsi nel G-code sullo strato %d, Z = %.2lfmm. Si prega di separare gli oggetti in conflitto (%s <-> %s)." @@ -6678,6 +6721,12 @@ msgstr "Mostra linee griglia" msgid "Show Gridlines on plate" msgstr "Mostra linee griglia sulla piastra" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Ripristina disposizione finestra" @@ -8371,6 +8420,61 @@ msgstr "Visualizza tutte le impostazioni dell'oggetto" msgid "Material settings" msgstr "Impostazioni materiale" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Strumenti" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Rimuovi il piatto corrente (se non è l'ultimo)" @@ -8395,6 +8499,17 @@ msgstr "Modifica il nome del piatto corrente" msgid "Move plate to the front" msgstr "Sposta il piatto in avanti" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Personalizza il piatto corrente" @@ -8461,12 +8576,6 @@ msgstr "AMS (1 slot)" msgid "Not installed" msgstr "Non installato" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Il software non supporta l'uso di ugelli con diametri diversi per una singola stampa. Se gli ugelli sinistro e destro sono diversi, è possibile procedere solo con la stampa a testa singola. Confermare quale ugello si desidera utilizzare per questo progetto." - -msgid "Switch diameter" -msgstr "Cambia diametro" - msgid "Configuration incompatible" msgstr "Configurazione incompatibile" @@ -8548,6 +8657,9 @@ msgstr "Filamento misto" msgid "Remove last mixed filament" msgstr "Rimuovi l'ultimo filamento misto" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Aggiungi filamento misto" @@ -8570,6 +8682,10 @@ msgstr "Il filamento misto ha riferimenti a componenti non validi" msgid "Edit / Delete / Merge" msgstr "Modifica / Elimina / Unisci" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Il filamento misto di destinazione utilizza questo filamento fisico come componente. L'unione rimuoverà questo filamento fisico e potrebbe invalidare il filamento misto. Continuare?" @@ -8644,9 +8760,6 @@ msgstr "Caricamento file: %s" msgid "Load 3MF" msgstr "Carica 3MF" -msgid "BambuStudio Project" -msgstr "Progetto BambuStudio" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "Il formato 3MF non è supportato da OrcaSlicer. Saranno caricati solo i dati geometrici." @@ -8676,17 +8789,6 @@ msgstr "Devi aggiornare il software.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "Il 3MF versione %s è più recente di %s versione %s. Si consiglia di aggiornare il software." -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "Il file 3MF è stato creato da BambuStudio (versione %s), che è più recente della versione compatibile %s. Sono state trovate impostazioni non riconosciute:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "Il file 3MF è stato creato da BambuStudio (versione %s), che è più recente della versione compatibile %s. Alcune impostazioni potrebbero non essere pienamente compatibili." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "Il file 3MF è stato generato da una vecchia versione di OrcaSlicer. Saranno caricati solo i dati geometrici." - msgid "Invalid values found in the 3MF:" msgstr "Valori non validi trovati nell'3MF:" @@ -8853,6 +8955,12 @@ msgstr "Disabilitare la funzione di Rilascio automatico per preservare il posizi msgid "Object with floating parts was detected" msgstr "È stato rilevato un oggetto con parti fluttuanti" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "È in esecuzione un altro processo di esportazione." @@ -8937,6 +9045,38 @@ msgstr "Dati non validi" msgid "Slicing Canceled" msgstr "Elaborazone Annullata" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Modulo di rete cambiato con successo." @@ -8968,9 +9108,8 @@ msgstr "" msgid "Sync now" msgstr "Sincronizza ora" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Impossibile annullare o ripetere mentre è in corso un'operazione. Interrompila prima." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9041,6 +9180,11 @@ msgstr "Scaricamento non riuscito; errore dimensione file." msgid "Project downloaded %d%%" msgstr "Progetto scaricato %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Test Pressure Advance" @@ -9067,6 +9211,13 @@ msgstr "Calibrazione del flusso Orca YOLO" msgid "Flowrate Test - Pass%d" msgstr "Test del flusso - Passaggio %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Test temperatura dell'ugello" @@ -11553,6 +11704,9 @@ msgstr "La sincronizzazione di trasmissioni di estrusore diverse o di tipi di vo msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Sincronizza la modifica dei parametri con i parametri corrispondenti di un altro estrusore." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Clicca per ripristinare tutte le impostazioni dell'ultimo profilo salvato." @@ -11967,6 +12121,12 @@ msgstr "Spazio di stampa" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Selezionare l'implementazione dell'agente di rete per la comunicazione con la stampante. Gli agenti disponibili vengono registrati all'avvio." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12080,9 +12240,24 @@ msgstr "Diametro ugello" msgid "Wipe tower" msgstr "Torre di spurgo" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Parametri estrusore singolo multimateriale" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Questa è una stampante multimateriale a singolo estrusore. I diametri di tutti gli estrusori saranno impostati sul nuovo valore. Vuoi procedere?" @@ -12092,6 +12267,18 @@ msgstr "Limiti altezza strati" msgid "Z-Hop" msgstr "Sollevamento Z" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12198,10 +12385,9 @@ msgstr "Continua" msgid "Don't warn again for this preset" msgstr "Non inviare più avvisi per questo profilo" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12633,10 +12819,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Spinta totale" -# AI Translated -msgid "Volume" -msgstr "Volume" - msgid "Ramming line" msgstr "Linea di spinta" @@ -12686,6 +12868,119 @@ msgstr "Accesso non riuscito. Riprova." msgid "parse json failed" msgstr "analisi del JSON non riuscita" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "Benvenuti in OrcaSlicer" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "OrcaSlicer verrà configurato seguendo diversi passaggi. Cominciamo!" + +msgid "Get Started" +msgstr "Inizia" + +msgid "Please select your login region" +msgstr "Seleziona la tua regione di accesso" + +msgid "Finish" +msgstr "Fine" + +msgid "Printer Selection" +msgstr "Selezione della stampante" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Stampante personalizzata" + +msgid "Create" +msgstr "Crea" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "È necessario selezionare almeno una stampante." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Selezione del filamento" + +msgid "System Filaments" +msgstr "Filamenti di sistema" + +msgid "Custom Filaments" +msgstr "Filamenti personalizzati" + +msgid "Create New" +msgstr "Crea Nuovo" + +msgid "Filament type" +msgstr "Tipo filamento" + +msgid "Vendor" +msgstr "Produttore" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "Cancella tutto" + +msgid "At least one filament must be selected." +msgstr "È necessario selezionare almeno un filamento." + +msgid "Do you want to use the default filament?" +msgstr "Vuoi utilizzare il filamento predefinito?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Questo disabilita tutte le funzionalità cloud, inclusa la sincronizzazione dei profili di Orca Cloud. Gli utenti che preferiscono lavorare completamente offline possono abilitare questa opzione." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Nota: quando la Modalità Stealth è abilitata, i tuoi profili utente non verranno salvati come backup su Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "Abilita la modalità invisibile." + +msgid "Proprietary Plugins" +msgstr "Moduli proprietari" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "Le stampanti di alcuni produttori richiedono dei moduli proprietari per far in modo che la comunicazione abbia successo. Seleziona il modulo corrispondente se utilizzi tali stampanti." + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "Si prega di notare che questi moduli non sono sviluppati o mantenuti da OrcaSlicer. Dovrebbero essere utilizzati a proprio rischio e discrezione." + +msgid "Install Bambu Network plug-in" +msgstr "Installa il modulo di rete Bambu" + msgid "[Action Required] " msgstr "[Azione necessaria] " @@ -13149,6 +13444,14 @@ msgstr "G-code cambio ruolo estrusione filamento" msgid "No object can be printed. It may be too small." msgstr "Non è possibile stampare alcun oggetto. Potrebbe essere troppo piccolo" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "La stampa è molto vicina alle aree di preparazione. Assicurati che non vi siano collisioni." @@ -13321,6 +13624,26 @@ msgstr "convalida non riuscita" msgid "write callback failed" msgstr "ripristino della scrittura non riuscita" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% è troppo vicino all'area di esclusione e potrebbero verificarsi collisioni durante la stampa." @@ -13371,6 +13694,43 @@ msgstr "Se desideri comunque stampare, puoi abilitare l'opzione in Preferenze / msgid "No extrusions under current settings." msgstr "Nessuna estrusione con le impostazioni attuali." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "È in uso un filamento misto con gradiente, ma 'Sottostrato di colore misto' è disattivato. Il gradiente non verrà stampato." @@ -13381,6 +13741,15 @@ msgstr "La modalità fluida del timelapse non è supportata quando è abilitata msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Il rilevamento degli ammassi non è supportato quando la sequenza \"per oggetto\" è abilitata." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "L'abilitazione sia dell'altezza Z precisa che della torre di spurgo potrebbe causare errori di slicing." @@ -13397,10 +13766,6 @@ msgstr "La modalità Vaso a spirale non funziona quando un oggetto contiene più msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Sebbene l'oggetto %1% rientri nel volume di stampa, esso supera l'altezza massima del volume di stampa a causa della compensazione del restringimento del materiale." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "L'oggetto %1% supera l'altezza massima del volume di stampa." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Sebbene l'oggetto %1% rientri nel volume di stampa, il suo ultimo strato supera l'altezza massima del volume di stampa." @@ -13408,6 +13773,10 @@ msgstr "Sebbene l'oggetto %1% rientri nel volume di stampa, il suo ultimo strato msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "È possibile ridurre le dimensioni del modello o modificare le impostazioni di stampa correnti e riprovare." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "L'oggetto %1% supera l'altezza massima del volume di stampa." + msgid "Variable layer height is not supported with Organic supports." msgstr "Altezza strato adattiva non è compatibile con i Supporti organici." @@ -14385,12 +14754,39 @@ msgstr "Velocità dei ponti interni. Se il valore è espresso in percentuale, ve msgid "This is the distance from the model to the outermost brim line." msgstr "Questa è la distanza tra il modello e la linea più esterna della tesa." +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Tipo di tesa" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Controlla la generazione della tesa esterna e/o interna dei modelli. Se impostato ad Auto, la larghezza della tesa viene analizzata e calcolata automaticamente." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Spazio tesa-oggetto" @@ -15570,9 +15966,6 @@ msgstr "Prezzo del filamento, solo a fini statistici." msgid "money/kg" msgstr "soldi/kg" -msgid "Vendor" -msgstr "Produttore" - msgid "Vendor of filament. For show only." msgstr "Produttore del filamento. Solo per dettagli." @@ -15646,6 +16039,66 @@ msgstr "Riempimento multilinea" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Utilizzo di linee multiple per il pattern di riempimento, se supportato dal pattern di riempimento." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Lineare" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Ottimizzazione dello svergolamento in Z (sperimentale)" @@ -17887,6 +18340,99 @@ msgstr "Estrusore singolo multimateriale" msgid "Use single nozzle to print multi filament." msgstr "Usa un ugello singolo per stampare più filamenti." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Cambio manuale del filamento" @@ -18268,6 +18814,130 @@ msgstr "Soglia sovrapposizione" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Se l'angolo di soglia è zero, i supporti verranno generati per le sporgenze la cui sovrapposizione è al di sotto della soglia. Quanto più piccolo è questo valore, tanto più ripide saranno le sporgenze stampabili senza supporti." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Angolo rami supporti ad albero" @@ -18447,17 +19117,11 @@ msgstr "Il numero di strati solidi superiori viene aumentato durante l'elaborazi msgid "Separated infills" msgstr "Riempimenti separati" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Centra il riempimento interno di ogni parte su se stessa, come se fosse elaborata singolarmente, invece che sull'intero assieme. Le parti che si toccano o si sovrappongono vengono trattate come un unico corpo e condividono un centro; le parti separate (o oggetti 3D distinti) ne ottengono ciascuna uno proprio.\n" -"Utile quando un assieme raggruppa più oggetti che dovrebbero mantenere ciascuno un riempimento coerente e centrato su se stesso.\n" -"Influisce sui motivi a linee e a griglia e sui riempimenti a schema ruotato.\n" -"I motivi vincolati alle coordinate globali (Giroide, Nido d'ape, TPMS, ...) non ne sono influenzati." # AI Translated msgid "Center surface pattern on" @@ -18691,6 +19355,12 @@ msgstr "Lo spurgo dopo il cambio del filamento verrà eseguito all'interno del s msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Questo oggetto viene utilizzato per spurgare l'ugello dopo un cambio di filamento, per risparmiare filamento e ridurre il tempo di stampa. I colori degli oggetti saranno mescolati. Non avrà effetto, a meno che la torre di spurgo non sia abilitata." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Distanza massima di collegamento" @@ -19583,8 +20253,8 @@ msgstr "Nome della stampante fisica utilizzata per l'elaborazione." msgid "Layer number" msgstr "Numero dello strato" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Indice dello strato attuale. Basato su uno (cioè il primo livello è il numero 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Strato Z" @@ -19728,9 +20398,6 @@ msgstr "Ricalibrazione" msgid "Calibrate" msgstr "Calibra" -msgid "Finish" -msgstr "Fine" - msgid "How can I use calibration results?" msgstr "Come utilizzare il risultato della calibrazione?" @@ -20268,12 +20935,12 @@ msgstr "" "I valori di accelerazione devono essere maggiori dei valori di velocità.\n" "Verificare gli input." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Calibrazione della temperatura" -msgid "Filament type" -msgstr "Tipo filamento" - msgid "PLA" msgstr "PLA" @@ -20295,6 +20962,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Modello di test" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Temperatura Iniziale: " @@ -20420,9 +21093,6 @@ msgstr "Lunghezza di retrazione iniziale: " msgid "End retraction length: " msgstr "Lunghezza di retrazione finale: " -msgid "Test model" -msgstr "Modello di test" - msgid "Ringing Tower" msgstr "Torre Ringing" @@ -20867,9 +21537,6 @@ msgstr "ad esempio Base, Opaco, Seta, Marmo" msgid "Filament Preset" msgstr "Profilo filamento" -msgid "Create" -msgstr "Crea" - msgid "Vendor is not selected; please reselect vendor." msgstr "Il produttore non è stato selezionato, si prega di selezionare nuovamente il produttore." @@ -21180,6 +21847,9 @@ msgstr "" "Stampante e tutti profili di filamento e processo che appartengono alla stampante.\n" "Può essere condiviso con altri." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21947,10 +22617,6 @@ msgstr "Assegna manualmente il filamento all'ugello sinistro o destro" msgid "Global settings" msgstr "Impostazioni globali" -# AI Translated -msgid "Video tutorial" -msgstr "Video tutorial" - msgid "(Sync with printer)" msgstr "(Sincronizza con stampante)" @@ -22394,6 +23060,33 @@ msgstr "Se abilitata, i valori sopra riportati vengono memorizzati come valori p msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "La cartella del bundle non esiste." @@ -22438,6 +23131,12 @@ msgstr "Annulla sottoscrizione bundle" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "Salva bundle di profili" @@ -26874,214 +27573,6 @@ msgstr "Questo carattere non ha un contorno per questo testo" msgid "Size: %.1f × %.1f mm" msgstr "Dimensioni: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitiva" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Generata una mesh vuota" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Parallelepipedo" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Rapido:" - -# AI Translated -msgid "Width (X)" -msgstr "Larghezza (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Profondità (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Altezza (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R inferiore" - -# AI Translated -msgid "Top R" -msgstr "R superiore" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "R maggiore" - -# AI Translated -msgid "Minor R" -msgstr "R minore" - -# AI Translated -msgid "All edges" -msgstr "Tutti gli spigoli" - -# AI Translated -msgid "Top edges" -msgstr "Spigoli superiori" - -# AI Translated -msgid "Bottom edges" -msgstr "Spigoli inferiori" - -# AI Translated -msgid "Lateral edges" -msgstr "Spigoli laterali" - -# AI Translated -msgid "Mesh resolution" -msgstr "Risoluzione mesh" - -# AI Translated -msgid "Add Shape" -msgstr "Aggiungi forma" - -# AI Translated -msgid "No outer profile" -msgstr "Nessun profilo esterno" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Impossibile creare la faccia esterna" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Impossibile creare la faccia con i fori" - -# AI Translated -msgid "Revolve failed" -msgstr "Rivoluzione non riuscita" - -# AI Translated -msgid "Profile" -msgstr "Profilo" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Inizia un nuovo profilo (per i fori)" - -# AI Translated -msgid "Segments" -msgstr "Segmenti" - -# AI Translated -msgid "Sides" -msgstr "Lati" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Clicca nell'area di disegno per disegnare" - -# AI Translated -msgid "Snap to grid" -msgstr "Aggancia alla griglia" - -# AI Translated -msgid "Grid step" -msgstr "Passo griglia" - -# AI Translated -msgid "Outer" -msgstr "Esterno" - -# AI Translated -msgid "closed" -msgstr "chiuso" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% punti %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Superiore)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Frontale)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Laterale)" - -# AI Translated -msgid "Revolve deg" -msgstr "Gradi rivoluzione" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Imposta 0 per estrudere, >0 per rivoluzionare" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Tasca (taglio)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu profilo chiuso" -msgstr[1] "%zu profili chiusi" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Disegna un profilo chiuso per abilitare" - -# AI Translated -msgid "Clear all" -msgstr "Cancella tutto" - -# AI Translated -msgid "Empty result" -msgstr "Risultato vuoto" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Estrusione: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Rivoluzione: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Nessun oggetto selezionato" - -# AI Translated -msgid "Face failed" -msgstr "Creazione della faccia non riuscita" - -# AI Translated -msgid "Face with holes failed" -msgstr "Creazione della faccia con fori non riuscita" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Mesh dell'utensile vuota" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Tasca aggiunta (volume negativo)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Tasca: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27203,6 +27694,9 @@ msgstr "Gizmo assemblaggio" msgid "Gizmo brim ears" msgstr "Gizmo tese ad orecchio" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Cursore di scorrimento verticale - Solleva cursore attivo" @@ -28184,10 +28678,6 @@ msgstr "Le mie impostazioni" msgid "Custom Printer Setup" msgstr "Configurazione stampante personalizzata" -# AI Translated -msgid "Custom Printer" -msgstr "Stampante personalizzata" - # AI Translated msgid "Define a custom printer profile" msgstr "Definisci un profilo stampante personalizzato" @@ -28832,9 +29322,8 @@ msgstr "Soglia d'angolo - il riempimento si ferma agli spigoli più acuti di que msgid "Click a triangle to paint it" msgstr "Clicca un triangolo per dipingerlo" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Richiede che il livello attivo sia mappato con Sviluppo UV (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -28848,17 +29337,15 @@ msgstr "Rapido - il rilievo viene solo ombreggiato, non costruito, e solo per il msgid "Checker" msgstr "Scacchiera" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Scacchiera - una griglia di prova al posto della trama. Dove i quadrati restano quadrati la trama non è distorta; dove si allungano, si allungherà anche la trama" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Distorsione" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Distorsione - mappa di calore dell'allungamento, dal blu al rosso, sullo sviluppo UV" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28974,24 +29461,11 @@ msgstr "Mescola filamenti" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Alterna due filamenti per simulare i colori intermedi, così pochi filamenti possono riprodurre una foto o un gradiente. Un'immagine a colori uniformi viene stampata allo stesso modo in entrambi i casi. Se disattivato, usa un filamento per area." -# AI Translated -msgid "Mix by" -msgstr "Mescola per" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Superficie" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Strati: i due filamenti si alternano tra gli strati di stampa, il che dà una sfumatura uniforme sulle superfici verticali ma scompare su quelle orizzontali, dove un intero strato è un'unica fascia.\n" -"Superficie: una scacchiera fine sulla superficie, che funziona con qualsiasi angolazione ma può apparire come una trama anziché come una sfumatura.\n" -"Automatico: strati sulle facce verticali; le facce orizzontali prendono il singolo filamento più vicino, perché lì una scacchiera appare come un motivo." # AI Translated #, boost-format @@ -29451,14 +29925,6 @@ msgstr "Servono circa %1% triangoli, budget %2% - l'integrazione semplificherà msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Quante migliaia di triangoli l'affinamento può aggiungere al modello. Il triangolo che si adatta peggio viene sempre diviso per primo, quindi anche un'esecuzione che esaurisce il budget lo ha speso dove si vede di più. Aumentalo se il rilievo appare ancora grossolano." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Interrompe l'integrazione. Ciò che era già stato completato resta sul modello e può essere annullato." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Chiude lo strumento senza integrare. Pittura, livelli e impostazioni restano con il modello." - # AI Translated msgid "Preparing..." msgstr "Preparazione..." @@ -29483,6 +29949,14 @@ msgstr "Trasforma le mappe di altezza dipinte in geometria reale, spostando i ve msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Trasforma le mappe di altezza dipinte in geometria reale. La mesh viene prima ricostruita con densità uniforme e affinata dove la trama cambia pendenza, così il dettaglio ha vertici su cui posarsi - tutto in un solo passaggio." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Interrompe l'integrazione. Ciò che era già stato completato resta sul modello e può essere annullato." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Chiude lo strumento senza integrare. Pittura, livelli e impostazioni restano con il modello." + # AI Translated #, boost-format msgid "%1% k" @@ -29691,6 +30165,28 @@ msgstr "Plugin filamento" msgid "Printer plugins" msgstr "Plugin stampante" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Ripristina predefiniti" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "La configurazione non è un JSON valido. Le modifiche non sono state salvate." @@ -29710,10 +30206,6 @@ msgstr "" "\n" "Verrà scartata la personalizzazione del profilo e sarà usata la configurazione globale." -# AI Translated -msgid "Restore defaults" -msgstr "Ripristina predefiniti" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Uso della configurazione globale. Salva il profilo per renderla permanente." @@ -29783,6 +30275,215 @@ msgstr "Installazione plugin" msgid "Installed \"%s\"." msgstr "\"%s\" installato." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29999,6 +30700,54 @@ msgstr "Impossibile ricaricare il plugin." msgid "Reloaded \"%s\"." msgstr "\"%s\" ricaricato." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "Nessuna informazione sul modello" + +msgid "Edit Project Info" +msgstr "Modifica informazioni progetto" + +msgid "Model Information" +msgstr "Informazioni sul modello" + +msgid "Accessories" +msgstr "Accessori" + +msgid "Profile Information" +msgstr "Informazioni sul profilo" + +msgid "Model name" +msgstr "Nome del modello" + +msgid "Created by" +msgstr "Creato da" + +msgid "Remixed by" +msgstr "Modificato da" + +msgid "Shared by" +msgstr "Condiviso da" + +msgid "Model description" +msgstr "Descrizione del modello" + +msgid "BOM" +msgstr "Elenco dei materiali" + +msgid "Profile name" +msgstr "Nome del profilo" + +msgid "Profile Author" +msgstr "Autore del profilo" + +msgid "Profile description" +msgstr "Descrizione del profilo" + # AI Translated msgid "Purge Mode Settings" msgstr "Impostazioni modalità di spurgo" @@ -30023,6 +30772,16 @@ msgstr "Riduce lo scarto di spurgo e stampa più velocemente. Può causare una l msgid "Terminal" msgstr "Terminale" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Un comando è già in esecuzione." @@ -30289,6 +31048,9 @@ msgstr " | aggancio ATTIVO" msgid "Change texture - choose another one from the texture library" msgstr "Cambia trama - scegline un'altra dalla libreria delle trame" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Mappa di altezza - mostra la trama del livello sotto le isole" @@ -30321,17 +31083,14 @@ msgstr "Collega isole" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Disponi lo sviluppo UV come una rete collegata: i pezzi che condividono uno spigolo vengono aperti uno accanto all'altro (un cubo diventa una rete unita invece di sei quadrati separati). Restano isole separate, quindi puoi comunque spostarle a mano in seguito." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Isola - sposta, ruota e scala intere isole" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Vertice - trascina i vertici per modificare la forma; Maiusc/Ctrl per la selezione multipla" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Spigolo - trascina gli spigoli per modificare la forma; Maiusc/Ctrl per la selezione multipla" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30369,9 +31128,13 @@ msgstr "Cancella modifiche UV - scarta tutti gli spostamenti manuali di vertici/ msgid "Snap - stick islands together when dragging one against another" msgstr "Aggancia - unisce le isole quando ne trascini una contro un'altra" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Inquadra tutte le isole (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30382,6 +31145,9 @@ msgstr "Nessun livello mappato con Sviluppo UV" msgid "%.1f mm tile" msgstr "tessera da %.1f mm" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Non aggiornato - la pittura, i tagli UV o l'angolo di taglio sono cambiati da quando è stato creato questo sviluppo UV. Premi per sviluppare di nuovo." @@ -30390,19 +31156,48 @@ msgstr "Non aggiornato - la pittura, i tagli UV o l'angolo di taglio sono cambia msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Appiattisce l'area dipinta in isole UV. Viene calcolato solo quando premi questo pulsante, non a ogni modifica - quindi prima dipingi, cambia l'angolo di taglio o segna i tagli UV, poi premi Sviluppa." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d isole, %s facce" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Modulo di rete Bambu non rilevato. Fai clic qui per installarlo." + +msgid "Create new project" +msgstr "Crea un nuovo progetto" + +msgid "Recently opened" +msgstr "Aperti di recente" + +msgid "Open Containing Folder" +msgstr "Apri cartella con contenuto" + # AI Translated msgid "Forward" msgstr "Avanti" -# AI Translated -msgid "Tools" -msgstr "Strumenti" - # AI Translated msgid "View Source" msgstr "Visualizza sorgente" @@ -30548,6 +31343,16 @@ msgstr "" "Il plugin \"%s\" richiede di eseguire i seguenti comandi:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30557,6 +31362,30 @@ msgstr "Il plugin \"%s\" richiede l'autorizzazione per l'evento di audit Python msgid "Plugin permission request" msgstr "Richiesta di autorizzazione del plugin" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "L'interfaccia di configurazione del plugin era vuota. Viene mostrato l'editor predefinito." @@ -31144,6 +31973,313 @@ msgstr "" "Evita le deformazioni\n" "Sapevi che quando si stampano materiali soggetti a deformazioni come l'ABS, aumentare in modo appropriato la temperatura del piano riscaldato può ridurre la probabilità di deformazione?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Impossibile installare il Microsoft WebView2 Runtime.\n" +#~ "Alcune funzionalità, inclusa la configurazione guidata, potrebbero apparire vuote finché non viene installato.\n" +#~ "Installalo manualmente da https://developer.microsoft.com/microsoft-edge/webview2/ e riavvia Orca Slicer." + +#~ msgid "Why this grouping" +#~ msgstr "Perché questo raggruppamento" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Il software non supporta l'uso di ugelli con diametri diversi per una singola stampa. Se gli ugelli sinistro e destro sono diversi, è possibile procedere solo con la stampa a testa singola. Confermare quale ugello si desidera utilizzare per questo progetto." + +#~ msgid "Switch diameter" +#~ msgstr "Cambia diametro" + +#~ msgid "BambuStudio Project" +#~ msgstr "Progetto BambuStudio" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "Il file 3MF è stato creato da BambuStudio (versione %s), che è più recente della versione compatibile %s. Sono state trovate impostazioni non riconosciute:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "Il file 3MF è stato creato da BambuStudio (versione %s), che è più recente della versione compatibile %s. Alcune impostazioni potrebbero non essere pienamente compatibili." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "Il file 3MF è stato generato da una vecchia versione di OrcaSlicer. Saranno caricati solo i dati geometrici." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Impossibile annullare o ripetere mentre è in corso un'operazione. Interrompila prima." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Centra il riempimento interno di ogni parte su se stessa, come se fosse elaborata singolarmente, invece che sull'intero assieme. Le parti che si toccano o si sovrappongono vengono trattate come un unico corpo e condividono un centro; le parti separate (o oggetti 3D distinti) ne ottengono ciascuna uno proprio.\n" +#~ "Utile quando un assieme raggruppa più oggetti che dovrebbero mantenere ciascuno un riempimento coerente e centrato su se stesso.\n" +#~ "Influisce sui motivi a linee e a griglia e sui riempimenti a schema ruotato.\n" +#~ "I motivi vincolati alle coordinate globali (Giroide, Nido d'ape, TPMS, ...) non ne sono influenzati." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Indice dello strato attuale. Basato su uno (cioè il primo livello è il numero 1)." + +# AI Translated +#~ msgid "Video tutorial" +#~ msgstr "Video tutorial" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitiva" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Generata una mesh vuota" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Parallelepipedo" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Rapido:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Larghezza (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Profondità (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Altezza (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R inferiore" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R superiore" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "R maggiore" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "R minore" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Tutti gli spigoli" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Spigoli superiori" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Spigoli inferiori" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Spigoli laterali" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Risoluzione mesh" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Aggiungi forma" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Nessun profilo esterno" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Impossibile creare la faccia esterna" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Impossibile creare la faccia con i fori" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Rivoluzione non riuscita" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profilo" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Inizia un nuovo profilo (per i fori)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmenti" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Lati" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Clicca nell'area di disegno per disegnare" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Aggancia alla griglia" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Passo griglia" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Esterno" + +# AI Translated +#~ msgid "closed" +#~ msgstr "chiuso" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% punti %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Superiore)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Frontale)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Laterale)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Gradi rivoluzione" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Imposta 0 per estrudere, >0 per rivoluzionare" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Tasca (taglio)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu profilo chiuso" +#~ msgstr[1] "%zu profili chiusi" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Disegna un profilo chiuso per abilitare" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Risultato vuoto" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Estrusione: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Rivoluzione: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Nessun oggetto selezionato" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Creazione della faccia non riuscita" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Creazione della faccia con fori non riuscita" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Mesh dell'utensile vuota" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Tasca aggiunta (volume negativo)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Tasca: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Richiede che il livello attivo sia mappato con Sviluppo UV (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Scacchiera - una griglia di prova al posto della trama. Dove i quadrati restano quadrati la trama non è distorta; dove si allungano, si allungherà anche la trama" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Distorsione - mappa di calore dell'allungamento, dal blu al rosso, sullo sviluppo UV" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Mescola per" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Superficie" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Strati: i due filamenti si alternano tra gli strati di stampa, il che dà una sfumatura uniforme sulle superfici verticali ma scompare su quelle orizzontali, dove un intero strato è un'unica fascia.\n" +#~ "Superficie: una scacchiera fine sulla superficie, che funziona con qualsiasi angolazione ma può apparire come una trama anziché come una sfumatura.\n" +#~ "Automatico: strati sulle facce verticali; le facce orizzontali prendono il singolo filamento più vicino, perché lì una scacchiera appare come un motivo." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Isola - sposta, ruota e scala intere isole" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Vertice - trascina i vertici per modificare la forma; Maiusc/Ctrl per la selezione multipla" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Spigolo - trascina gli spigoli per modificare la forma; Maiusc/Ctrl per la selezione multipla" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Inquadra tutte le isole (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Sperimentale) Usa gli agenti stampante invece degli host di stampa" @@ -31177,16 +32313,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Clicca una faccia o un piano di riferimento, poi scegli uno strumento di disegno" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31243,10 +32369,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Distanza verticale" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Lineare" - #~ msgid "Face recognition" #~ msgstr "Riconoscimento faccia" @@ -32833,9 +33955,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "selezione parte" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "This disables all cloud services e.g. Orca Cloud and Bambu Cloud. This stops the transmission of data to Bambu's cloud services too. Users who don't use BBL machines or use LAN mode only can safely turn on this function." #~ msgstr "Questa opzione disabilita tutti i servizi cloud, ad esempio Orca Cloud e Bambu Cloud. Interrompe anche la trasmissione dei dati ai servizi cloud di Bambu. Gli utenti che non utilizzano macchine BBL o che utilizzano solo la modalità LAN, possono attivare questa opzione in tutta sicurezza." diff --git a/localization/i18n/ja/OrcaSlicer_ja.po b/localization/i18n/ja/OrcaSlicer_ja.po index 923b7122f4..d8e5bd4e07 100644 --- a/localization/i18n/ja/OrcaSlicer_ja.po +++ b/localization/i18n/ja/OrcaSlicer_ja.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -2141,15 +2141,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Microsoft WebView2 Runtimeをインストールできませんでした。\n" -"インストールされるまで、セットアップウィザードを含む一部の機能が空白で表示される場合があります。\n" -"https://developer.microsoft.com/microsoft-edge/webview2/ から手動でインストールし、Orca Slicerを再起動してください。" #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4307,6 +4304,9 @@ msgstr "プレートへ移動" msgid "AMS Materials Setting" msgstr "AMS素材設定" +msgid "Wiki Guide" +msgstr "Wikiガイド" + msgid "Close" msgstr "閉じる" @@ -4328,9 +4328,6 @@ msgstr "入力値範囲は %1% ~ %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "フローダイナミクスキャリブレーションの係数" -msgid "Wiki Guide" -msgstr "Wikiガイド" - msgid "PA Profile" msgstr "PAプロファイル" @@ -4420,7 +4417,7 @@ msgstr "保存" msgctxt "Navigation" msgid "Back" -msgstr "背面" +msgstr "戻る" msgid "Example" msgstr "例" @@ -4930,6 +4927,11 @@ msgstr "自動的に制限値 (%g mm) に調整しますか?" msgid "Adjust" msgstr "調整" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + # AI Translated msgid "" "Layer height too small\n" @@ -5772,9 +5774,6 @@ msgstr "最適なフィラメントグルーピングに従って自動的に再 msgid "Filament Grouping" msgstr "フィラメントグルーピング" -msgid "Why this grouping" -msgstr "なぜこのグルーピングか" - msgid "Please place filaments on the printer based on grouping result." msgstr "グルーピング結果に基づいてプリンターにフィラメントを配置してください。" @@ -5964,6 +5963,43 @@ msgstr "編集領域を拡大/縮小" msgid "Sequence" msgstr "順番" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "体積" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + # AI Translated msgid "Object selection" msgstr "オブジェクトの選択" @@ -6182,6 +6218,12 @@ msgstr "グリッドライン" msgid "Labels" msgstr "ラベル" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "断面平面を移動" @@ -6230,7 +6272,7 @@ msgstr "ボリューム" msgid "Size:" msgstr "サイズ:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "レイヤー%d、Z = %.2lfmmでG-codeパスの衝突が検出されました。衝突するオブジェクトをもっと離してください(%s <-> %s)。" @@ -6696,6 +6738,12 @@ msgstr "グリッドラインを表示" msgid "Show Gridlines on plate" msgstr "プレート上にグリッドラインを表示" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "ウィンドウレイアウトをリセット" @@ -8389,6 +8437,61 @@ msgstr "全てのオブジェクトの設定" msgid "Material settings" msgstr "材料設定" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "ツール" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "現在のプレートを削除(最後でない場合)" @@ -8413,6 +8516,17 @@ msgstr "現在のプレート名を編集" msgid "Move plate to the front" msgstr "プレートを前面に移動" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "現在のプレートをカスタマイズ" @@ -8479,12 +8593,6 @@ msgstr "AMS(1スロット)" msgid "Not installed" msgstr "未取り付け" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "ソフトウェアは1つの印刷で異なる径のノズルの使用をサポートしていません。左右のノズルが一致しない場合、シングルヘッド印刷のみ可能です。このプロジェクトに使用するノズルを確認してください。" - -msgid "Switch diameter" -msgstr "直径を切り替え" - msgid "Configuration incompatible" msgstr "構成ファイルは互換性がありません" @@ -8566,6 +8674,9 @@ msgstr "混合フィラメント" msgid "Remove last mixed filament" msgstr "最後の混合フィラメントを削除" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "混合フィラメントを追加" @@ -8588,6 +8699,10 @@ msgstr "混合フィラメントのコンポーネント参照が壊れていま msgid "Edit / Delete / Merge" msgstr "編集 / 削除 / 結合" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "対象の混合フィラメントはこの物理フィラメントをコンポーネントとして使用しています。結合するとこの物理フィラメントは削除され、混合フィラメントが無効になる可能性があります。続行しますか?" @@ -8662,10 +8777,6 @@ msgstr "ファイルを読込む: %s" msgid "Load 3MF" msgstr "3mfを読込み" -# AI Translated -msgid "BambuStudio Project" -msgstr "BambuStudioプロジェクト" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "この3mfファイルと互換性がありません、ジオメトリーデータのみ読込みます。" @@ -8697,20 +8808,6 @@ msgstr "ソフトウェアをアップデートする必要があります。\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "3mfのバージョン%sは%sの%sより新しい為、ソフトウェアを更新してください。" -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "この3MFはBambuStudio (バージョン%s) で作成されており、互換バージョン%sより新しいものです。認識できない設定が見つかりました:" - -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "この3MFはBambuStudio (バージョン%s) で作成されており、互換バージョン%sより新しいものです。一部の設定が完全には互換でない可能性があります。" - -# AI Translated -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "この3MFはBambuStudioで作成されています。一部の設定がOrcaSlicerと異なる場合があります。" - msgid "Invalid values found in the 3MF:" msgstr "3MFに無効な値が見つかりました:" @@ -8881,6 +8978,12 @@ msgstr "Z位置を維持するために自動ドロップを無効にします msgid "Object with floating parts was detected" msgstr "浮いているパーツを含むオブジェクトが検出されました" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "エクスポート中です" @@ -8965,6 +9068,38 @@ msgstr "無効なデータ" msgid "Slicing Canceled" msgstr "スライスを取消しました" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "ネットワークプラグインの切り替えに成功しました。" @@ -8996,9 +9131,8 @@ msgstr "" msgid "Sync now" msgstr "今すぐ同期" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "処理の実行中は元に戻す/やり直しを実行できません。先に処理を停止してください。" +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9070,6 +9204,11 @@ msgstr "ダウンロード失敗、ファイルサイズ例外。" msgid "Project downloaded %d%%" msgstr "プロジェクトをダウンロード %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advanceテスト" @@ -9096,6 +9235,13 @@ msgstr "Orca YOLO流量比キャリブレーション" msgid "Flowrate Test - Pass%d" msgstr "流量比テスト - パス%d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "ノズル温度テスト" @@ -11587,6 +11733,9 @@ msgstr "異なる押出機の駆動方式や内腔容積タイプの同期には msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "パラメータの変更を、もう一方の押出機の対応するパラメータに同期します。" +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "全ての変更をリセットします" @@ -11994,6 +12143,12 @@ msgstr "造形可能領域" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "プリンター通信用のネットワークエージェント実装を選択します。使用可能なエージェントは起動時に登録されます。" +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12109,9 +12264,24 @@ msgstr "ノズル直径" msgid "Wipe tower" msgstr "ワイプタワー" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "単一エクストルーダーのマルチマテリアルパラメーター" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "シングルエクストルーダーのマルチマテリアルプリンターです。すべてのエクストルーダーの径が新しい値に設定されます。続行しますか?" @@ -12121,6 +12291,18 @@ msgstr "積層ピッチの制限" msgid "Z-Hop" msgstr "Z-ホップ" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12233,10 +12415,9 @@ msgstr "続行" msgid "Don't warn again for this preset" msgstr "このプリセットでは今後警告しない" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12665,9 +12846,6 @@ msgstr "ms" msgid "Total ramming" msgstr "合計ラミング" -msgid "Volume" -msgstr "体積" - msgid "Ramming line" msgstr "ラミングライン" @@ -12718,6 +12896,120 @@ msgstr "ログインに失敗しました。もう一度お試しください。 msgid "parse json failed" msgstr "JSONの解析に失敗しました" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "完了" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "カスタムプリンター" + +msgid "Create" +msgstr "作成" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "フィラメントタイプ" + +msgid "Vendor" +msgstr "ベンダー" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "すべてクリア" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "クラウド機能をすべて無効にします (Orca Cloudのプロファイル同期を含む)。完全にオフラインで作業したいユーザーはこのオプションを有効にできます。" + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "注意: ステルスモードを有効にすると、ユーザープロファイルはOrca Cloudにバックアップされません。" + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + msgid "[Action Required] " msgstr "【対応が必要】 " @@ -13187,6 +13479,14 @@ msgstr "フィラメントの押出ロール変更G-code" msgid "No object can be printed. It may be too small." msgstr "造形できるオブジェクトがありません。小さすぎる可能性があります。" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "プリントはプライミング領域に非常に近いです。 衝突がないことを確認してください。" @@ -13360,6 +13660,26 @@ msgstr "アカウントの認証に失敗しました" msgid "write callback failed" msgstr "書込みコールバック失敗" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% は除外エリアに近すぎます。造形時に衝突の可能性があります。" @@ -13414,6 +13734,43 @@ msgstr "それでも印刷する場合は、環境設定 / 制御 / スライス msgid "No extrusions under current settings." msgstr "現在の設定では造形しません" +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "グラデーション付きの混合フィラメントが使用されていますが、「混色サブレイヤー」が無効です。グラデーションは印刷されません。" @@ -13424,6 +13781,15 @@ msgstr "オブジェクト順で造形するでは、この機能を使用でき msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "「オブジェクト別」シーケンスが有効な場合、クランピング検出はサポートされていません。" +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "正確なZ高さとプライムタワーの両方を有効にするとスライスエラーが発生する可能性があります。" @@ -13440,10 +13806,6 @@ msgstr "複数の素材の場合、スパイラルモードを使用できませ msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "オブジェクト %1% 自体はビルドボリュームに適合していますが、材料の収縮補正のため、ビルドボリュームの最大の高さを超えています。" -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "オブジェクト %1% がビルドボリュームの最大高さを超えています。" - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "オブジェクト %1% 自体はビルドボリュームに適合していますが、その最後のレイヤーはビルドボリュームの最大高さを超えてしまいます。" @@ -13451,6 +13813,10 @@ msgstr "オブジェクト %1% 自体はビルドボリュームに適合して msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "モデルのサイズを小さくするか、現在のプリント設定を変更してリトライしてください。" +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "オブジェクト %1% がビルドボリュームの最大高さを超えています。" + msgid "Variable layer height is not supported with Organic supports." msgstr "可変レイヤー高さはオーガニックサポートではサポートされていません。" @@ -14470,6 +14836,30 @@ msgstr "内部ブリッジの速度です。値を%で指定した場合、bridg msgid "This is the distance from the model to the outermost brim line." msgstr "一番外側のブリム線がモデルと距離です。" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "ブリムタイプ" @@ -14477,6 +14867,9 @@ msgstr "ブリムタイプ" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "モデルの外側および/または内側にブリムを生成する方法を制御します。自動を選ぶと、ブリム幅が解析されて自動的に計算されます。" +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "ブリムとオブジェクトの間隔" @@ -15701,9 +16094,6 @@ msgstr "フィラメントの価格です。統計目的にのみ使用されま msgid "money/kg" msgstr "USD/kg" -msgid "Vendor" -msgstr "ベンダー" - # AI Translated msgid "Vendor of filament. For show only." msgstr "フィラメントのメーカーです。表示専用です。" @@ -15783,6 +16173,66 @@ msgstr "マルチラインフィル" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "充填パターンが対応している場合は、複数のラインを使って充填します。" +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "直線状" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Z座屈バイアス最適化 (実験的)" @@ -18237,6 +18687,99 @@ msgstr "シングルエクストルーダー・マルチマテリアル" msgid "Use single nozzle to print multi filament." msgstr "1つのノズルで複数のフィラメントを印刷します。" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + # AI Translated msgid "Manual Filament Change" msgstr "手動フィラメント交換" @@ -18637,6 +19180,130 @@ msgstr "閾値の重複" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "しきい値角度がゼロの場合、オーバーラップがしきい値を下回るオーバーハングに対してサポートが生成されます。この値が小さいほど、サポートなしで印刷できるオーバーハングの角度が急になります。" +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "ツリーサポート枝アングル" @@ -18825,17 +19492,11 @@ msgstr "トップ面の厚さです、トップ面層数で決まった厚みが msgid "Separated infills" msgstr "インフィルを個別に配置" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"各パーツの内部インフィルを、アセンブリ全体ではなく、そのパーツ単体でスライスした場合のようにパーツ自身の中心に合わせます。接触または重なっているパーツは1つの本体として扱われ、中心を共有します。分離したパーツ (または別々の3Dオブジェクト) はそれぞれ独自の中心を持ちます。\n" -"アセンブリが複数のオブジェクトをまとめており、それぞれに一貫した自己中心のインフィルを保ちたい場合に便利です。\n" -"直線およびグリッドのパターンと、回転テンプレートのインフィルに影響します。\n" -"グローバル座標に固定されたパターン (ジャイロイド、ハニカム、TPMSなど) は影響を受けません。" # AI Translated msgid "Center surface pattern on" @@ -19080,6 +19741,12 @@ msgstr "フィラメント交換後のパージをオブジェクトのサポー msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "このオブジェクトは廃料で造形されます。時間とフィラメントの節約として有効的ですが、色の指定ができなくなります。プライムタワーが有効になる場合、この設定が無効になります。" +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "ブリッジ最大距離" @@ -20062,9 +20729,8 @@ msgstr "スライスに使用される物理プリンターの名前。" msgid "Layer number" msgstr "レイヤーナンバー" -# AI Translated -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "現在の層のインデックスです。1から始まります (つまり1層目は1です)。" +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "レイヤーZ" @@ -20211,9 +20877,6 @@ msgstr "再キャリブレーション" msgid "Calibrate" msgstr "キャリブレーション" -msgid "Finish" -msgstr "完了" - msgid "How can I use calibration results?" msgstr "キャリブレーション結果をどのように活用できますか?" @@ -20765,12 +21428,12 @@ msgstr "" "加速度の値は速度の値より大きくなければなりません。\n" "入力を確認してください。" +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "温度キャリブレーション" -msgid "Filament type" -msgstr "フィラメントタイプ" - msgid "PLA" msgstr "PLA" @@ -20792,6 +21455,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "テストモデル" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "開始温度: " @@ -20920,9 +21589,6 @@ msgstr "開始リトラクション長さ: " msgid "End retraction length: " msgstr "終了リトラクション長さ: " -msgid "Test model" -msgstr "テストモデル" - msgid "Ringing Tower" msgstr "リンギングタワー" @@ -21391,9 +22057,6 @@ msgstr "例: Basic, Matte, Silk, Marble" msgid "Filament Preset" msgstr "フィラメントプリセット" -msgid "Create" -msgstr "作成" - msgid "Vendor is not selected; please reselect vendor." msgstr "ベンダーが選択されていません。ベンダーを再選択してください。" @@ -21715,6 +22378,9 @@ msgstr "" "プリンターと、そのプリンターに属するすべてのフィラメントおよびプロセスのプリセットです。\n" "他のユーザーと共有できます。" +msgid "Include custom bed texture and model" +msgstr "" + # AI Translated msgid "" "User's filament preset set.\n" @@ -22482,9 +23148,6 @@ msgstr "手動でフィラメントを左または右のノズルに割り当て msgid "Global settings" msgstr "グローバル設定" -msgid "Video tutorial" -msgstr "ビデオチュートリアル" - msgid "(Sync with printer)" msgstr "(プリンターと同期)" @@ -22927,6 +23590,33 @@ msgstr "有効にすると、上記の値が今後のSTEPインポートで使 msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "バンドルフォルダが存在しません。" @@ -22971,6 +23661,12 @@ msgstr "バンドルの購読を解除" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "プリセットバンドルを保存" @@ -27395,213 +28091,6 @@ msgstr "このフォントにはこのテキストのアウトラインがあり msgid "Size: %.1f × %.1f mm" msgstr "サイズ: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "プリミティブ" - -# AI Translated -msgid "Empty mesh generated" -msgstr "空のメッシュが生成されました" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "ボックス" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "クイック:" - -# AI Translated -msgid "Width (X)" -msgstr "幅 (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "奥行き (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "高さ (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "底面半径" - -# AI Translated -msgid "Top R" -msgstr "上面半径" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "大半径" - -# AI Translated -msgid "Minor R" -msgstr "小半径" - -# AI Translated -msgid "All edges" -msgstr "すべてのエッジ" - -# AI Translated -msgid "Top edges" -msgstr "上面のエッジ" - -# AI Translated -msgid "Bottom edges" -msgstr "底面のエッジ" - -# AI Translated -msgid "Lateral edges" -msgstr "側面のエッジ" - -# AI Translated -msgid "Mesh resolution" -msgstr "メッシュ分解能" - -# AI Translated -msgid "Add Shape" -msgstr "形状を追加" - -# AI Translated -msgid "No outer profile" -msgstr "外側のプロファイルがありません" - -# AI Translated -msgid "Failed to make outer face" -msgstr "外側の面を作成できませんでした" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "穴のある面を作成できませんでした" - -# AI Translated -msgid "Revolve failed" -msgstr "回転押し出しに失敗しました" - -# AI Translated -msgid "Profile" -msgstr "プロファイル" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "新しいプロファイルを開始 (穴用)" - -# AI Translated -msgid "Segments" -msgstr "セグメント数" - -# AI Translated -msgid "Sides" -msgstr "辺数" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "キャンバスをクリックして描画" - -# AI Translated -msgid "Snap to grid" -msgstr "グリッドにスナップ" - -# AI Translated -msgid "Grid step" -msgstr "グリッド間隔" - -# AI Translated -msgid "Outer" -msgstr "外側" - -# AI Translated -msgid "closed" -msgstr "閉じています" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% 点 %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (上面)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (正面)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (側面)" - -# AI Translated -msgid "Revolve deg" -msgstr "回転押し出し角度" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "0で押し出し、0より大きい値で回転押し出し" - -# AI Translated -msgid "Pocket (cut)" -msgstr "ポケット (カット)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu個の閉じたプロファイル" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "有効にするには閉じたプロファイルを描画してください" - -# AI Translated -msgid "Clear all" -msgstr "すべてクリア" - -# AI Translated -msgid "Empty result" -msgstr "結果が空です" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "押し出し: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "回転押し出し: %1%" - -# AI Translated -msgid "No object selected" -msgstr "オブジェクトが選択されていません" - -# AI Translated -msgid "Face failed" -msgstr "面の作成に失敗しました" - -# AI Translated -msgid "Face with holes failed" -msgstr "穴のある面の作成に失敗しました" - -# AI Translated -msgid "Tool mesh empty" -msgstr "ツールメッシュが空です" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "ポケットを追加しました (マイナスボリューム)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "ポケット: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27724,6 +28213,9 @@ msgstr "組立てる" msgid "Gizmo brim ears" msgstr "ブリム" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "垂直スライダー" @@ -28705,10 +29197,6 @@ msgstr "マイ設定" msgid "Custom Printer Setup" msgstr "カスタムプリンターのセットアップ" -# AI Translated -msgid "Custom Printer" -msgstr "カスタムプリンター" - # AI Translated msgid "Define a custom printer profile" msgstr "カスタムプリンタープロファイルを定義" @@ -29352,9 +29840,8 @@ msgstr "角度しきい値 - これより鋭いエッジで塗りつぶしが止 msgid "Click a triangle to paint it" msgstr "三角形をクリックしてペイント" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "展開 (LSCM) でマッピングされたアクティブレイヤーが必要です。" +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -29368,17 +29855,15 @@ msgstr "高速 - 起伏は陰影で表示されるだけで実際には生成さ msgid "Checker" msgstr "チェッカー" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "チェッカー - テクスチャの代わりにテストグリッドを表示します。マス目が正方形のままの場所ではテクスチャは歪まず、引き伸ばされる場所ではテクスチャも引き伸ばされます" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "歪み" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "歪み - 展開による引き伸ばしを青から赤のヒートマップで表示" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -29494,24 +29979,11 @@ msgstr "フィラメントを混合" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "2つのフィラメントを交互に配置して中間色を擬似的に表現し、少数のフィラメントで写真やグラデーションを再現できるようにします。単色で構成された画像はどちらでも同じように印刷されます。オフの場合は、領域ごとに1つのフィラメントを使用します。" -# AI Translated -msgid "Mix by" -msgstr "混合方法" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "表面" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"積層: 2つのフィラメントを積層ごとに交互に使います。垂直に近い面では滑らかに混ざりますが、上や下を向いた面では1つの積層全体が1色の帯になるため効果がありません。\n" -"表面: 表面全体に細かい市松模様を配置します。どの角度でも機能しますが、混色ではなくテクスチャのように見えることがあります。\n" -"自動: 垂直に近い面には積層を使い、上や下を向いた面には近い方の単一フィラメントを使います。そこでは市松模様が模様として見えてしまうためです。" # AI Translated #, boost-format @@ -29971,14 +30443,6 @@ msgstr "約%1%個の三角形が必要ですが、上限数は%2%です - 焼付 msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "細分化でモデルに追加できる三角形の数 (千単位) です。最も合っていない三角形から常に先に分割されるため、上限まで使い切った場合でも、最も目立つ場所に使われています。起伏がまだ粗く見える場合は値を上げてください。" -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "焼付けを停止します。すでに完了した部分はモデルに残り、元に戻すことができます。" - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "焼付けせずにツールを閉じます。ペイント、レイヤー、設定はモデルに保持されます。" - # AI Translated msgid "Preparing..." msgstr "準備中..." @@ -30003,6 +30467,14 @@ msgstr "既存の頂点を動かして、ペイントしたハイトマップを msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "ペイントしたハイトマップを実際のジオメトリにします。メッシュは均一な密度にリメッシュされ、テクスチャが曲がる場所が先に細分化されるため、ディテールを表す頂点が確保されます - すべて1ステップで行われます。" +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "焼付けを停止します。すでに完了した部分はモデルに残り、元に戻すことができます。" + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "焼付けせずにツールを閉じます。ペイント、レイヤー、設定はモデルに保持されます。" + # AI Translated #, boost-format msgid "%1% k" @@ -30213,6 +30685,28 @@ msgstr "フィラメントプラグイン" msgid "Printer plugins" msgstr "プリンタープラグイン" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "デフォルトに戻す" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "設定が有効なJSONではありません。変更は保存されませんでした。" @@ -30232,10 +30726,6 @@ msgstr "" "\n" "プリセットでの上書き設定を破棄し、グローバル設定を使用します。" -# AI Translated -msgid "Restore defaults" -msgstr "デフォルトに戻す" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "グローバル設定を使用しています。保持するにはプリセットを保存してください。" @@ -30305,6 +30795,215 @@ msgstr "プラグインをインストール中" msgid "Installed \"%s\"." msgstr "「%s」をインストールしました。" +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -30521,6 +31220,54 @@ msgstr "プラグインの再読み込みに失敗しました。" msgid "Reloaded \"%s\"." msgstr "「%s」を再読み込みしました。" +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "フラッシュモードの設定" @@ -30545,6 +31292,16 @@ msgstr "プライムの廃材を減らし、より速く印刷します。わず msgid "Terminal" msgstr "ターミナル" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "コマンドはすでに実行中です。" @@ -30811,6 +31568,9 @@ msgstr " | スナップ オン" msgid "Change texture - choose another one from the texture library" msgstr "テクスチャを変更 - テクスチャライブラリから別のテクスチャを選択" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "ハイトマップ - アイランドの下にレイヤーのテクスチャを表示" @@ -30843,17 +31603,14 @@ msgstr "アイランドを接続" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "展開を連結した展開図としてレイアウトします: エッジを共有する部分が隣り合わせに展開されます (立方体はバラバラの6つの正方形ではなく、つながった展開図になります)。それぞれは別のアイランドのままなので、後から個別に手動で移動できます。" -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "アイランド - アイランド全体を移動、回転、拡大縮小" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "頂点 - 頂点をドラッグして形状を変更。Shift/Ctrlで複数選択" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "エッジ - エッジをドラッグして形状を変更。Shift/Ctrlで複数選択" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30891,9 +31648,13 @@ msgstr "UV編集をクリア - 頂点やエッジの手動移動をすべて破 msgid "Snap - stick islands together when dragging one against another" msgstr "スナップ - ドラッグ中のアイランドを他のアイランドに近づけると吸着させる" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "すべてのアイランドを全体表示 (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30904,6 +31665,9 @@ msgstr "「展開」でマッピングされたレイヤーがありません" msgid "%.1f mm tile" msgstr "%.1f mm タイル" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "最新ではありません - この展開の作成後に、ペイント、シーム、またはシーム角度が変更されました。押すと再展開します。" @@ -30912,19 +31676,48 @@ msgstr "最新ではありません - この展開の作成後に、ペイント msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "ペイント領域を平らに広げてUVアイランドにします。計算はこのボタンを押したときのみ行われ、編集のたびには行われません - 先にペイント、シーム角度の変更、シームのマークを行ってから「展開」を押してください。" +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "UVアイランド %d 個、面 %s 個" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + # AI Translated msgid "Forward" msgstr "進む" -# AI Translated -msgid "Tools" -msgstr "ツール" - # AI Translated msgid "View Source" msgstr "ソースを表示" @@ -31070,6 +31863,16 @@ msgstr "" "プラグイン「%s」が以下のコマンドの実行を要求しています:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -31079,6 +31882,30 @@ msgstr "プラグイン「%s」がPython監査イベント「%s」の許可を msgid "Plugin permission request" msgstr "プラグインの権限リクエスト" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "プラグインの設定UIが空でした。デフォルトのエディターを表示します。" @@ -31677,6 +32504,316 @@ msgstr "" "反りを避ける\n" "ABSのような反りやすい素材を印刷する場合、ヒートベッドの温度を適切に上げることで、反りが発生する確率を下げることができることをご存知ですか?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Microsoft WebView2 Runtimeをインストールできませんでした。\n" +#~ "インストールされるまで、セットアップウィザードを含む一部の機能が空白で表示される場合があります。\n" +#~ "https://developer.microsoft.com/microsoft-edge/webview2/ から手動でインストールし、Orca Slicerを再起動してください。" + +#~ msgid "Why this grouping" +#~ msgstr "なぜこのグルーピングか" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "ソフトウェアは1つの印刷で異なる径のノズルの使用をサポートしていません。左右のノズルが一致しない場合、シングルヘッド印刷のみ可能です。このプロジェクトに使用するノズルを確認してください。" + +#~ msgid "Switch diameter" +#~ msgstr "直径を切り替え" + +# AI Translated +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudioプロジェクト" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "この3MFはBambuStudio (バージョン%s) で作成されており、互換バージョン%sより新しいものです。認識できない設定が見つかりました:" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "この3MFはBambuStudio (バージョン%s) で作成されており、互換バージョン%sより新しいものです。一部の設定が完全には互換でない可能性があります。" + +# AI Translated +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "この3MFはBambuStudioで作成されています。一部の設定がOrcaSlicerと異なる場合があります。" + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "処理の実行中は元に戻す/やり直しを実行できません。先に処理を停止してください。" + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "各パーツの内部インフィルを、アセンブリ全体ではなく、そのパーツ単体でスライスした場合のようにパーツ自身の中心に合わせます。接触または重なっているパーツは1つの本体として扱われ、中心を共有します。分離したパーツ (または別々の3Dオブジェクト) はそれぞれ独自の中心を持ちます。\n" +#~ "アセンブリが複数のオブジェクトをまとめており、それぞれに一貫した自己中心のインフィルを保ちたい場合に便利です。\n" +#~ "直線およびグリッドのパターンと、回転テンプレートのインフィルに影響します。\n" +#~ "グローバル座標に固定されたパターン (ジャイロイド、ハニカム、TPMSなど) は影響を受けません。" + +# AI Translated +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "現在の層のインデックスです。1から始まります (つまり1層目は1です)。" + +#~ msgid "Video tutorial" +#~ msgstr "ビデオチュートリアル" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "プリミティブ" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "空のメッシュが生成されました" + +# AI Translated +#~ msgid "Box" +#~ msgstr "ボックス" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "クイック:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "幅 (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "奥行き (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "高さ (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "底面半径" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "上面半径" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "大半径" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "小半径" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "すべてのエッジ" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "上面のエッジ" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "底面のエッジ" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "側面のエッジ" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "メッシュ分解能" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "形状を追加" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "外側のプロファイルがありません" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "外側の面を作成できませんでした" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "穴のある面を作成できませんでした" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "回転押し出しに失敗しました" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "プロファイル" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "新しいプロファイルを開始 (穴用)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "セグメント数" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "辺数" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "キャンバスをクリックして描画" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "グリッドにスナップ" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "グリッド間隔" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "外側" + +# AI Translated +#~ msgid "closed" +#~ msgstr "閉じています" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% 点 %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (上面)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (正面)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (側面)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "回転押し出し角度" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "0で押し出し、0より大きい値で回転押し出し" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "ポケット (カット)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu個の閉じたプロファイル" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "有効にするには閉じたプロファイルを描画してください" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "結果が空です" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "押し出し: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "回転押し出し: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "オブジェクトが選択されていません" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "面の作成に失敗しました" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "穴のある面の作成に失敗しました" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "ツールメッシュが空です" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "ポケットを追加しました (マイナスボリューム)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "ポケット: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "展開 (LSCM) でマッピングされたアクティブレイヤーが必要です。" + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "チェッカー - テクスチャの代わりにテストグリッドを表示します。マス目が正方形のままの場所ではテクスチャは歪まず、引き伸ばされる場所ではテクスチャも引き伸ばされます" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "歪み - 展開による引き伸ばしを青から赤のヒートマップで表示" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "混合方法" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "表面" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "積層: 2つのフィラメントを積層ごとに交互に使います。垂直に近い面では滑らかに混ざりますが、上や下を向いた面では1つの積層全体が1色の帯になるため効果がありません。\n" +#~ "表面: 表面全体に細かい市松模様を配置します。どの角度でも機能しますが、混色ではなくテクスチャのように見えることがあります。\n" +#~ "自動: 垂直に近い面には積層を使い、上や下を向いた面には近い方の単一フィラメントを使います。そこでは市松模様が模様として見えてしまうためです。" + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "アイランド - アイランド全体を移動、回転、拡大縮小" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "頂点 - 頂点をドラッグして形状を変更。Shift/Ctrlで複数選択" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "エッジ - エッジをドラッグして形状を変更。Shift/Ctrlで複数選択" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "すべてのアイランドを全体表示 (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(実験的) プリントホストの代わりにプリンターエージェントを使用" @@ -31710,16 +32847,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "面または参照平面をクリックしてから、描画ツールを選択" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31776,10 +32903,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "垂直距離" -# AI Translated -#~ msgid "Linear" -#~ msgstr "直線状" - #~ msgid "Face recognition" #~ msgstr "外観認識" @@ -33378,9 +34501,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "パーツ選択" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index c6515d4bc4..68660b3b87 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2025-06-02 17:12+0900\n" "Last-Translator: crwusiz \n" "Language-Team: \n" @@ -2156,15 +2156,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 런타임" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Microsoft WebView2 Runtime을 설치할 수 없습니다.\n" -"설치하기 전까지는 설정 마법사를 포함한 일부 기능이 빈 화면으로 표시될 수 있습니다.\n" -"https://developer.microsoft.com/microsoft-edge/webview2/ 에서 수동으로 설치한 후 Orca Slicer를 다시 시작하십시오." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4330,6 +4327,9 @@ msgstr "플레이트로 이동" msgid "AMS Materials Setting" msgstr "AMS 재료 설정" +msgid "Wiki Guide" +msgstr "위키 가이드" + msgid "Close" msgstr "닫기" @@ -4353,9 +4353,6 @@ msgstr "입력 값은 %1%보다 크고 %2%보다 작아야 합니다" msgid "Factors of Flow Dynamics Calibration" msgstr "동적 압출량 교정 계수" -msgid "Wiki Guide" -msgstr "위키 가이드" - msgid "PA Profile" msgstr "PA 사전설정" @@ -4963,6 +4960,11 @@ msgstr "한도(%g mm)에 맞게 자동으로 조정할까요?" msgid "Adjust" msgstr "조정" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5805,9 +5807,6 @@ msgstr "최적의 필라멘트 그룹핑에 따라 자동으로 재슬라이싱 msgid "Filament Grouping" msgstr "필라멘트 그룹핑" -msgid "Why this grouping" -msgstr "이 그룹핑의 이유" - msgid "Please place filaments on the printer based on grouping result." msgstr "그룹핑 결과에 따라 프린터에 필라멘트를 배치하세요." @@ -5998,6 +5997,44 @@ msgstr "편집 영역 증가/감소" msgid "Sequence" msgstr "순서" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +# AI Translated +msgid "Volume" +msgstr "부피" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + # AI Translated msgid "Object selection" msgstr "객체 선택" @@ -6215,6 +6252,12 @@ msgstr "그리드 라인" msgid "Labels" msgstr "레이블" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "단면 평면 이동" @@ -6264,7 +6307,7 @@ msgid "Size:" msgstr "크기:" # AI Translated -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "레이어 %d, Z = %.2lf mm에서 G-code 경로 충돌이 발견되었습니다. 충돌하는 객체를 더 멀리 분리하세요 (%s <-> %s)." @@ -6738,6 +6781,12 @@ msgstr "그리드 라인 표시" msgid "Show Gridlines on plate" msgstr "플레이트에 그리드 라인 표시" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "창 레이아웃 재설정" @@ -8434,6 +8483,61 @@ msgstr "모든 객체 설정 보기" msgid "Material settings" msgstr "재료 설정" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "도구" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "현재 플레이트 제거(마지막 플레이트가 아닌 경우)" @@ -8458,6 +8562,17 @@ msgstr "현재 번호판 이름 수정" msgid "Move plate to the front" msgstr "플레이트를 앞쪽으로 이동" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "사용자 정의 플레이트" @@ -8524,13 +8639,6 @@ msgstr "AMS(1 슬롯)" msgid "Not installed" msgstr "설치되지 않음" -# AI Translated -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "이 소프트웨어는 한 번의 출력에 서로 다른 직경의 노즐을 사용하는 것을 지원하지 않습니다. 왼쪽과 오른쪽 노즐이 서로 다르면 단일 헤드 출력으로만 진행할 수 있습니다. 이 프로젝트에 사용할 노즐을 확인해 주십시오." - -msgid "Switch diameter" -msgstr "직경 스위치" - msgid "Configuration incompatible" msgstr "호환되지 않는 구성" @@ -8612,6 +8720,9 @@ msgstr "혼합 필라멘트" msgid "Remove last mixed filament" msgstr "마지막 혼합 필라멘트 제거" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "혼합 필라멘트 추가" @@ -8634,6 +8745,10 @@ msgstr "혼합 필라멘트의 구성 요소 참조가 손상되었습니다" msgid "Edit / Delete / Merge" msgstr "편집 / 삭제 / 병합" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "대상 혼합 필라멘트가 이 물리 필라멘트를 구성 요소로 사용합니다. 병합하면 이 물리 필라멘트가 제거되어 혼합 필라멘트가 무효가 될 수 있습니다. 계속할까요?" @@ -8711,10 +8826,6 @@ msgstr "파일 로드 중: %s" msgid "Load 3MF" msgstr "3mf 불러오기" -# AI Translated -msgid "BambuStudio Project" -msgstr "BambuStudio 프로젝트" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "이 3mf는 OrcaSlicer에서 지원되지 않습니다. 형상 데이터만 불러옵니다." @@ -8748,20 +8859,6 @@ msgstr "소프트웨어를 업그레이드하는 것이 좋습니다.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "3mf의 %s 버전이 %s의 %s 버전보다 최신입니다. 소프트웨어를 업그레이드 하십시오." -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "이 3MF는 BambuStudio(버전 %s)에서 생성되었으며, 이는 호환 버전 %s보다 최신입니다. 인식할 수 없는 설정을 찾았습니다:" - -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "이 3MF는 BambuStudio(버전 %s)에서 생성되었으며, 이는 호환 버전 %s보다 최신입니다. 일부 설정이 완전히 호환되지 않을 수 있습니다." - -# AI Translated -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "이 3MF는 BambuStudio에서 생성되었습니다. 일부 설정이 OrcaSlicer와 다를 수 있습니다." - msgid "Invalid values found in the 3MF:" msgstr "3mf에서 잘못된 값이 발견됨:" @@ -8940,6 +9037,12 @@ msgstr "Z 위치를 유지하기 위해 자동 내려놓기를 비활성화하 msgid "Object with floating parts was detected" msgstr "떠 있는 부품이 있는 객체가 감지되었습니다" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "다른 내보내기 작업이 실행 중입니다." @@ -9032,6 +9135,38 @@ msgstr "유효하지 않은 데이터" msgid "Slicing Canceled" msgstr "슬라이싱 취소됨" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + # AI Translated msgid "Network plug-in switched successfully." msgstr "네트워크 플러그인을 성공적으로 전환했습니다." @@ -9068,9 +9203,8 @@ msgstr "" msgid "Sync now" msgstr "지금 동기화" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "작업이 실행 중일 때는 실행 취소하거나 다시 실행할 수 없습니다. 먼저 작업을 중지하십시오." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9141,6 +9275,11 @@ msgstr "다운로드에 실패했습니다. 파일 크기 예외입니다." msgid "Project downloaded %d%%" msgstr "프로젝트 %d%% 다운로드됨" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advance 테스트" @@ -9167,6 +9306,13 @@ msgstr "Orca YOLO 압출량 교정" msgid "Flowrate Test - Pass%d" msgstr "압출량 테스트 - %d차" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "노즐 온도 테스트" @@ -11733,6 +11879,9 @@ msgstr "서로 다른 압출기 구동 방식이나 노즐 부피 유형 간의 msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "변경한 매개변수를 다른 압출기의 해당 매개변수에 동기화합니다." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "모든 설정을 마지막으로 저장한 사전 설정으로 되돌립니다." @@ -12159,6 +12308,12 @@ msgstr "출력 가능 공간" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "프린터 통신에 사용할 네트워크 에이전트 구현을 선택합니다. 사용 가능한 에이전트는 시작 시 등록됩니다." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12290,9 +12445,24 @@ msgstr "노즐 직경" msgid "Wipe tower" msgstr "프라임 타워" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "단일 압출기 다중 재료 매개변수" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "이것은 단일 압출기 다중 재료 프린터이며 모든 압출기의 직경이 새 값으로 설정됩니다. 계속 진행하시겠습니까?" @@ -12302,6 +12472,18 @@ msgstr "레이어 높이 한도" msgid "Z-Hop" msgstr "Z올리기" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12416,10 +12598,9 @@ msgstr "계속" msgid "Don't warn again for this preset" msgstr "이 사전 설정에 대해 다시 경고하지 않기" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12855,10 +13036,6 @@ msgstr "ms" msgid "Total ramming" msgstr "전체 채워넣기" -# AI Translated -msgid "Volume" -msgstr "부피" - # AI Translated msgid "Ramming line" msgstr "채워넣기 선" @@ -12911,6 +13088,120 @@ msgstr "로그인에 실패했습니다. 다시 시도하십시오." msgid "parse json failed" msgstr "JSON 구문 분석 실패" +msgid "Loading…" +msgstr "로딩 중……" + +msgid "Welcome to Orca Slicer" +msgstr "Orca Slicer에 오신 것을 환영합니다" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer는 여러 단계로 설정됩니다. 시작!" + +msgid "Get Started" +msgstr "시작" + +msgid "Please select your login region" +msgstr "로그인 지역을 선택해주세요" + +msgid "Finish" +msgstr "완료" + +msgid "Printer Selection" +msgstr "프린터 선택" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "사용자 정의 프린터" + +msgid "Create" +msgstr "생성" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "하나 이상의 프린터를 선택해야 합니다." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "필라멘트 선택" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "필라멘트 유형" + +msgid "Vendor" +msgstr "제조사" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "모두 지우기" + +msgid "At least one filament must be selected." +msgstr "하나 이상의 필라멘트를 선택해야 합니다." + +msgid "Do you want to use the default filament?" +msgstr "기본 필라멘트를 사용하시겠습니까?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "이 옵션은 Orca Cloud 프로필 동기화를 포함한 모든 클라우드 기능을 비활성화합니다. 완전히 오프라인으로 작업하려는 사용자는 이 옵션을 활성화할 수 있습니다." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "참고: 스텔스 모드를 활성화하면 사용자 프로필이 Orca Cloud에 백업되지 않습니다." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "Bambu 네트워크 플러그인 설치" + # AI Translated msgid "[Action Required] " msgstr "[조치 필요] " @@ -13382,6 +13673,14 @@ msgstr "필라멘트 압출 역할 변경 G-code" msgid "No object can be printed. It may be too small." msgstr "객체를 출력할 수 없습니다. 너무 작을 수 있습니다" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "출력물이 프라이밍 영역에 매우 가깝습니다. 충돌이 없는지 확인합니다." @@ -13561,6 +13860,26 @@ msgstr "검증에 실패했습니다" msgid "write callback failed" msgstr "쓰기 호출 실패" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% 이(가) 제외 영역에 너무 가깝습니다. 출력 시 충돌이 발생 할 수 있습니다." @@ -13614,6 +13933,43 @@ msgstr "그래도 출력하려면 기본 설정 / 제어 / 슬라이싱 / 혼합 msgid "No extrusions under current settings." msgstr "현재 설정에 압출기가 없습니다." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "그라데이션 혼합 필라멘트가 사용 중이지만 '혼색 서브레이어'가 비활성화되어 있습니다. 그라데이션은 출력되지 않습니다." @@ -13624,6 +13980,15 @@ msgstr "타임랩스의 유연 모드는 \"객체별\" 출력순서가 활성화 msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "\"객체별\" 시퀀스가 활성화된 경우 뭉침 감지가 지원되지 않습니다." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + # AI Translated msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "정밀 Z 높이와 프라임 타워를 함께 활성화하면 슬라이싱 오류가 발생할 수 있습니다." @@ -13642,10 +14007,6 @@ msgstr "객체에 둘 이상의 재료가 포함된 경우 나선형 꽃병 모 msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "객체 %1% 자체는 빌드 볼륨에 맞지만, 머티리얼 수축 보정 때문에 최대 빌드 볼륨 높이를 초과합니다." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "%1% 객체가 최대 빌드 부피 높이를 초과합니다." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "%1% 객체 자체가 빌드 부피에 맞지만 마지막 레이어가 최대 빌드 부피 높이를 초과합니다." @@ -13653,6 +14014,10 @@ msgstr "%1% 객체 자체가 빌드 부피에 맞지만 마지막 레이어가 msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "모델 크기를 줄이거나 현재 출력 설정을 변경하고 다시 시도할 수 있습니다." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "%1% 객체가 최대 빌드 부피 높이를 초과합니다." + msgid "Variable layer height is not supported with Organic supports." msgstr "유기체 서포트에서는 가변 레이어 높이가 지원되지 않습니다." @@ -14670,12 +15035,39 @@ msgstr "내부 브릿지의 속도. 값을 백분율로 표현하면 bridge_spee msgid "This is the distance from the model to the outermost brim line." msgstr "모델과 가장 바깥쪽 브림 선까지의 거리" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "브림 유형" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "모델의 외부 그리고/또는 내부에서 브림의 생성을 제어합니다. 자동은 브림너비가 자동으로 분석 및 계산됨을 의미합니다." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "브림-객체 간격" @@ -15894,9 +16286,6 @@ msgstr "필라멘트 가격. 통계 전용" msgid "money/kg" msgstr "가격/kg" -msgid "Vendor" -msgstr "제조사" - msgid "Vendor of filament. For show only." msgstr "필라멘트 제조사" @@ -15973,6 +16362,66 @@ msgstr "다중 선 채우기" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "채우기 패턴에서 지원되는 경우 채우기 패턴에 여러 줄을 사용합니다." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "선형" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Z축 좌굴 편향 최적화(실험적)" @@ -18313,6 +18762,99 @@ msgstr "단일 압출기 다중 재료" msgid "Use single nozzle to print multi filament." msgstr "단일 노즐을 사용하여 다중 필라멘트 출력" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "수동 필라멘트 교체" @@ -18701,6 +19243,130 @@ msgstr "임계값 중복" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "임계각이 0이면 오버행이 임계값 미만인 오버행에 대한 서포트가 생성됩니다. 이 값이 작을수록 서포트 없이 출력할 수 있는 오버행이 가파르게 됩니다." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "트리 서포트 가지 각도" @@ -18889,17 +19555,11 @@ msgstr "상단 쉘 레이어로 계산된 두께가 이 값보다 얇은 경우 msgid "Separated infills" msgstr "분리된 채우기" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"전체 어셈블리가 아니라 각 부품을 개별적으로 슬라이스한 것처럼 부품마다 내부 채우기를 자체 중심에 맞춥니다. 서로 닿거나 겹치는 부품은 하나의 몸체로 간주되어 중심을 공유하며, 분리된 부품(또는 별개의 3D 객체)은 각각 자체 중심을 갖습니다.\n" -"여러 객체를 묶은 어셈블리에서 각 객체가 자체 중심을 기준으로 일관된 채우기를 유지해야 할 때 유용합니다.\n" -"선 및 격자 패턴과 회전 템플릿 채우기에 영향을 줍니다.\n" -"전역 좌표에 고정된 패턴(자이로이드, 벌집, TPMS 등)은 영향을 받지 않습니다." # AI Translated msgid "Center surface pattern on" @@ -19142,6 +19802,12 @@ msgstr "필라멘트 변경 후 버리기는 객체의 서포트 내부에서 msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "이 객체는 필라멘트를 절약하고 출력 시간을 줄이기 위해 필라멘트 변경 후 노즐에 남은 잔류물을 제거하는 데 사용됩니다. 결과적으로 객체의 색상이 혼합됩니다. 기본 타워가 활성화되지 않으면 적용되지 않습니다." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "최대 브릿지 거리" @@ -20066,8 +20732,8 @@ msgstr "슬라이싱에 사용되는 실제 프린터의 이름입니다." msgid "Layer number" msgstr "레이어 번호" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "현재 레이어의 인덱스입니다. 1 기반(즉, 첫 번째 레이어가 1번입니다)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "레이어 z" @@ -20211,9 +20877,6 @@ msgstr "재교정" msgid "Calibrate" msgstr "교정" -msgid "Finish" -msgstr "완료" - msgid "How can I use calibration results?" msgstr "교정 결과를 어떻게 사용하나요?" @@ -20754,12 +21417,12 @@ msgstr "" "가속도 값은 속도 값보다 커야 합니다.\n" "입력값을 확인하십시오." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "온도 교정" -msgid "Filament type" -msgstr "필라멘트 유형" - msgid "PLA" msgstr "PLA" @@ -20781,6 +21444,13 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +# AI Translated +msgid "Test model" +msgstr "테스트 모델" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "시작 온도: " @@ -20907,10 +21577,6 @@ msgstr "후퇴 시작 길이: " msgid "End retraction length: " msgstr "후퇴 종료 길이: " -# AI Translated -msgid "Test model" -msgstr "테스트 모델" - # AI Translated msgid "Ringing Tower" msgstr "링잉 타워" @@ -21391,9 +22057,6 @@ msgstr "예를 들어 기본, 매트, 실크, 마블" msgid "Filament Preset" msgstr "필라멘트 사전 설정" -msgid "Create" -msgstr "생성" - msgid "Vendor is not selected; please reselect vendor." msgstr "공급업체가 선택되지 않았습니다. 공급업체를 다시 선택하세요." @@ -21709,6 +22372,9 @@ msgstr "" "프린터와 프린터에 속한 모든 필라멘트 및 프로세스 사전 설정.\n" "다른 사람과 공유할 수 있습니다." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -22474,9 +23140,6 @@ msgstr "필라멘트를 왼쪽 또는 오른쪽 노즐에 수동으로 할당합 msgid "Global settings" msgstr "글로벌 설정" -msgid "Video tutorial" -msgstr "비디오 자습서" - msgid "(Sync with printer)" msgstr "(프린터와 동기화)" @@ -22944,6 +23607,33 @@ msgstr "활성화하면 위의 값이 이후 STEP 가져오기에 사용되는 msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "번들 폴더가 존재하지 않습니다." @@ -22988,6 +23678,12 @@ msgstr "번들 구독 취소" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "사전 설정 번들 저장" @@ -27412,213 +28108,6 @@ msgstr "이 글꼴에는 이 텍스트의 외곽선이 없습니다" msgid "Size: %.1f × %.1f mm" msgstr "크기: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "기본 모델" - -# AI Translated -msgid "Empty mesh generated" -msgstr "빈 메시가 생성되었습니다" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "상자" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "빠른 선택:" - -# AI Translated -msgid "Width (X)" -msgstr "너비 (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "깊이 (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "높이 (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "하단 R" - -# AI Translated -msgid "Top R" -msgstr "상단 R" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "주 R" - -# AI Translated -msgid "Minor R" -msgstr "부 R" - -# AI Translated -msgid "All edges" -msgstr "모든 모서리" - -# AI Translated -msgid "Top edges" -msgstr "상단 모서리" - -# AI Translated -msgid "Bottom edges" -msgstr "하단 모서리" - -# AI Translated -msgid "Lateral edges" -msgstr "측면 모서리" - -# AI Translated -msgid "Mesh resolution" -msgstr "메시 해상도" - -# AI Translated -msgid "Add Shape" -msgstr "형상 추가" - -# AI Translated -msgid "No outer profile" -msgstr "외곽 프로파일 없음" - -# AI Translated -msgid "Failed to make outer face" -msgstr "외곽 면을 만들지 못했습니다" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "구멍이 있는 면을 만들지 못했습니다" - -# AI Translated -msgid "Revolve failed" -msgstr "회전 실패" - -# AI Translated -msgid "Profile" -msgstr "프로파일" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "새 프로파일 시작(구멍용)" - -# AI Translated -msgid "Segments" -msgstr "세그먼트 수" - -# AI Translated -msgid "Sides" -msgstr "변 수" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "캔버스를 클릭하여 그리기" - -# AI Translated -msgid "Snap to grid" -msgstr "격자에 스냅" - -# AI Translated -msgid "Grid step" -msgstr "격자 간격" - -# AI Translated -msgid "Outer" -msgstr "외곽" - -# AI Translated -msgid "closed" -msgstr "닫힘" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: 점 %3%개 %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (위)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (앞)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (측면)" - -# AI Translated -msgid "Revolve deg" -msgstr "회전 각도" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "돌출은 0, 회전은 0보다 큰 값으로 설정" - -# AI Translated -msgid "Pocket (cut)" -msgstr "포켓(잘라내기)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu개의 닫힌 프로파일" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "활성화하려면 닫힌 프로파일을 그리십시오" - -# AI Translated -msgid "Clear all" -msgstr "모두 지우기" - -# AI Translated -msgid "Empty result" -msgstr "결과가 비어 있음" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "돌출: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "회전: %1%" - -# AI Translated -msgid "No object selected" -msgstr "선택한 객체 없음" - -# AI Translated -msgid "Face failed" -msgstr "면 생성 실패" - -# AI Translated -msgid "Face with holes failed" -msgstr "구멍이 있는 면 생성 실패" - -# AI Translated -msgid "Tool mesh empty" -msgstr "도구 메시가 비어 있음" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "포켓 추가됨(비우기 부품)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "포켓: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27742,6 +28231,9 @@ msgstr "변형도구 병합" msgid "Gizmo brim ears" msgstr "변형도구 브림 귀" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "수직 슬라이더 - 활성 레이어 위로 이동" @@ -28724,10 +29216,6 @@ msgstr "내 설정" msgid "Custom Printer Setup" msgstr "사용자 정의 프린터 설정" -# AI Translated -msgid "Custom Printer" -msgstr "사용자 정의 프린터" - # AI Translated msgid "Define a custom printer profile" msgstr "사용자 정의 프린터 프로파일 정의" @@ -29371,9 +29859,8 @@ msgstr "각도 임계값 - 이보다 날카로운 모서리에서 채우기가 msgid "Click a triangle to paint it" msgstr "삼각형을 클릭하여 칠하십시오" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "활성 레이어가 펼치기(LSCM)로 매핑되어 있어야 합니다." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -29387,17 +29874,15 @@ msgstr "빠름 - 요철을 실제로 만들지 않고 음영으로만 표시하 msgid "Checker" msgstr "체커" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "체커 - 텍스처 대신 테스트 격자를 표시합니다. 정사각형이 정사각형으로 유지되는 곳은 텍스처가 왜곡되지 않으며, 늘어나는 곳은 텍스처도 늘어납니다" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "왜곡" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "왜곡 - 펼친 면 위에 늘어난 정도를 파랑에서 빨강으로 이어지는 히트맵으로 표시합니다" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -29513,24 +29998,11 @@ msgstr "필라멘트 혼합" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "두 필라멘트를 번갈아 배치하여 그 사이의 색상을 흉내 내므로, 적은 수의 필라멘트로도 사진이나 그라데이션을 표현할 수 있습니다. 단색 영역으로 이루어진 이미지는 어느 쪽이든 똑같이 출력됩니다. 끄면 영역마다 필라멘트 하나를 사용합니다." -# AI Translated -msgid "Mix by" -msgstr "혼합 방식" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "표면" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"레이어: 두 필라멘트가 출력 레이어마다 번갈아 사용됩니다. 수직면에서는 부드럽게 섞이지만, 레이어 하나가 하나의 띠가 되는 평평한 면에서는 효과가 사라집니다.\n" -"표면: 표면 전체에 촘촘한 체커보드를 만듭니다. 어떤 각도에서도 작동하지만 혼색이 아니라 질감처럼 보일 수 있습니다.\n" -"자동: 수직면에는 레이어를 사용하고, 평평한 면에서는 체커보드가 패턴으로 드러나므로 더 가까운 필라멘트 하나를 사용합니다." # AI Translated #, boost-format @@ -29990,14 +30462,6 @@ msgstr "삼각형이 약 %1%개 필요하지만 예산은 %2%입니다 - 굽기 msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "세분화로 모델에 추가할 수 있는 삼각형 수(천 개 단위)입니다. 가장 맞지 않는 삼각형부터 항상 먼저 분할하므로, 예산을 모두 쓰더라도 가장 눈에 띄는 곳에 쓰입니다. 요철이 여전히 거칠어 보이면 높이십시오." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "굽기를 중지합니다. 이미 완료된 부분은 모델에 남으며 실행 취소할 수 있습니다." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "굽지 않고 도구를 닫습니다. 칠, 레이어, 설정은 모델에 그대로 남습니다." - # AI Translated msgid "Preparing..." msgstr "준비 중..." @@ -30022,6 +30486,14 @@ msgstr "이미 있는 정점을 움직여 칠한 높이 맵을 실제 형상으 msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "칠한 높이 맵을 실제 형상으로 바꿉니다. 먼저 메시를 고른 밀도로 리메시하고 텍스처가 굽어지는 곳을 세분화하여 디테일이 놓일 정점을 확보합니다 - 이 모든 것을 한 단계로 처리합니다." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "굽기를 중지합니다. 이미 완료된 부분은 모델에 남으며 실행 취소할 수 있습니다." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "굽지 않고 도구를 닫습니다. 칠, 레이어, 설정은 모델에 그대로 남습니다." + # AI Translated #, boost-format msgid "%1% k" @@ -30231,6 +30703,28 @@ msgstr "필라멘트 플러그인" msgid "Printer plugins" msgstr "프린터 플러그인" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "기본값 복원" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "구성이 올바른 JSON이 아닙니다. 변경 사항이 저장되지 않았습니다." @@ -30250,10 +30744,6 @@ msgstr "" "\n" "사전 설정의 재정의를 버리고 전역 구성을 사용합니다." -# AI Translated -msgid "Restore defaults" -msgstr "기본값 복원" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "전역 구성을 사용합니다. 유지하려면 사전 설정을 저장하십시오." @@ -30323,6 +30813,215 @@ msgstr "플러그인 설치 중" msgid "Installed \"%s\"." msgstr "\"%s\"을(를) 설치했습니다." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -30539,6 +31238,54 @@ msgstr "플러그인을 다시 불러오지 못했습니다." msgid "Reloaded \"%s\"." msgstr "\"%s\"을(를) 다시 불러왔습니다." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "플러시 모드 설정" @@ -30563,6 +31310,16 @@ msgstr "프라임 낭비를 줄이고 더 빠르게 출력합니다. 색상이 msgid "Terminal" msgstr "터미널" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "명령이 이미 실행 중입니다." @@ -30829,6 +31586,9 @@ msgstr " | 스냅 켜짐" msgid "Change texture - choose another one from the texture library" msgstr "텍스처 변경 - 텍스처 라이브러리에서 다른 텍스처를 선택합니다" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "높이 맵 - 아일랜드 아래에 레이어의 텍스처를 표시합니다" @@ -30861,17 +31621,14 @@ msgstr "아일랜드 연결" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "펼친 결과를 연결된 전개도로 배치합니다: 모서리를 공유하는 조각을 서로 옆에 펼칩니다(정육면체가 흩어진 정사각형 6개가 아니라 이어진 전개도가 됩니다). 각 조각은 별개의 아일랜드로 남으므로, 나중에 어느 것이든 직접 옮길 수 있습니다." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "아일랜드 - 아일랜드 전체를 이동, 회전, 배율 조정합니다" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "정점 - 정점을 드래그하여 모양을 바꿉니다. Shift/Ctrl로 다중 선택" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "모서리 - 모서리를 드래그하여 모양을 바꿉니다. Shift/Ctrl로 다중 선택" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30909,9 +31666,13 @@ msgstr "UV 편집 지우기 - 수동으로 옮긴 정점/모서리를 모두 버 msgid "Snap - stick islands together when dragging one against another" msgstr "스냅 - 아일랜드를 다른 아일랜드에 대고 드래그하면 서로 붙입니다" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "모든 아일랜드 맞추기 (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30922,6 +31683,9 @@ msgstr "펼치기로 매핑된 레이어 없음" msgid "%.1f mm tile" msgstr "%.1f mm 타일" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "오래됨 - 이 펼치기를 만든 뒤 칠, 심 또는 심 각도가 변경되었습니다. 눌러서 다시 펼치십시오." @@ -30930,19 +31694,48 @@ msgstr "오래됨 - 이 펼치기를 만든 뒤 칠, 심 또는 심 각도가 msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "칠한 영역을 UV 아일랜드로 펼칩니다. 편집할 때마다가 아니라 이 버튼을 누를 때만 계산되므로, 먼저 칠하고 심 각도를 바꾸거나 심을 표시한 다음 펼치기를 누르십시오." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "아일랜드 %d개, 면 %s개" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Bambu 네트워크 플러그인이 감지되지 않습니다. 여기를 클릭 하여 설치하세요." + +msgid "Create new project" +msgstr "새 프로젝트 생성" + +msgid "Recently opened" +msgstr "최근 사용" + +msgid "Open Containing Folder" +msgstr "포함된 폴더 열기" + # AI Translated msgid "Forward" msgstr "앞으로" -# AI Translated -msgid "Tools" -msgstr "도구" - # AI Translated msgid "View Source" msgstr "소스 보기" @@ -31088,6 +31881,16 @@ msgstr "" "플러그인 \"%s\"이(가) 다음 명령 실행을 요청하고 있습니다:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -31097,6 +31900,30 @@ msgstr "플러그인 \"%s\"이(가) Python 감사 이벤트 \"%s\"에 대한 권 msgid "Plugin permission request" msgstr "플러그인 권한 요청" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "플러그인의 구성 UI가 비어 있습니다. 기본 편집기를 표시합니다." @@ -31686,6 +32513,316 @@ msgstr "" "뒤틀림 방지\n" "ABS와 같이 뒤틀림이 발생하기 쉬운 소재를 출력할 때, 히트베드 온도를 적절하게 높이면 뒤틀림 가능성을 줄일 수 있다는 사실을 알고 계셨나요?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Microsoft WebView2 Runtime을 설치할 수 없습니다.\n" +#~ "설치하기 전까지는 설정 마법사를 포함한 일부 기능이 빈 화면으로 표시될 수 있습니다.\n" +#~ "https://developer.microsoft.com/microsoft-edge/webview2/ 에서 수동으로 설치한 후 Orca Slicer를 다시 시작하십시오." + +#~ msgid "Why this grouping" +#~ msgstr "이 그룹핑의 이유" + +# AI Translated +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "이 소프트웨어는 한 번의 출력에 서로 다른 직경의 노즐을 사용하는 것을 지원하지 않습니다. 왼쪽과 오른쪽 노즐이 서로 다르면 단일 헤드 출력으로만 진행할 수 있습니다. 이 프로젝트에 사용할 노즐을 확인해 주십시오." + +#~ msgid "Switch diameter" +#~ msgstr "직경 스위치" + +# AI Translated +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudio 프로젝트" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "이 3MF는 BambuStudio(버전 %s)에서 생성되었으며, 이는 호환 버전 %s보다 최신입니다. 인식할 수 없는 설정을 찾았습니다:" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "이 3MF는 BambuStudio(버전 %s)에서 생성되었으며, 이는 호환 버전 %s보다 최신입니다. 일부 설정이 완전히 호환되지 않을 수 있습니다." + +# AI Translated +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "이 3MF는 BambuStudio에서 생성되었습니다. 일부 설정이 OrcaSlicer와 다를 수 있습니다." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "작업이 실행 중일 때는 실행 취소하거나 다시 실행할 수 없습니다. 먼저 작업을 중지하십시오." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "전체 어셈블리가 아니라 각 부품을 개별적으로 슬라이스한 것처럼 부품마다 내부 채우기를 자체 중심에 맞춥니다. 서로 닿거나 겹치는 부품은 하나의 몸체로 간주되어 중심을 공유하며, 분리된 부품(또는 별개의 3D 객체)은 각각 자체 중심을 갖습니다.\n" +#~ "여러 객체를 묶은 어셈블리에서 각 객체가 자체 중심을 기준으로 일관된 채우기를 유지해야 할 때 유용합니다.\n" +#~ "선 및 격자 패턴과 회전 템플릿 채우기에 영향을 줍니다.\n" +#~ "전역 좌표에 고정된 패턴(자이로이드, 벌집, TPMS 등)은 영향을 받지 않습니다." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "현재 레이어의 인덱스입니다. 1 기반(즉, 첫 번째 레이어가 1번입니다)." + +#~ msgid "Video tutorial" +#~ msgstr "비디오 자습서" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "기본 모델" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "빈 메시가 생성되었습니다" + +# AI Translated +#~ msgid "Box" +#~ msgstr "상자" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "빠른 선택:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "너비 (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "깊이 (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "높이 (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "하단 R" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "상단 R" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "주 R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "부 R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "모든 모서리" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "상단 모서리" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "하단 모서리" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "측면 모서리" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "메시 해상도" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "형상 추가" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "외곽 프로파일 없음" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "외곽 면을 만들지 못했습니다" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "구멍이 있는 면을 만들지 못했습니다" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "회전 실패" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "프로파일" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "새 프로파일 시작(구멍용)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "세그먼트 수" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "변 수" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "캔버스를 클릭하여 그리기" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "격자에 스냅" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "격자 간격" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "외곽" + +# AI Translated +#~ msgid "closed" +#~ msgstr "닫힘" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: 점 %3%개 %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (위)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (앞)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (측면)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "회전 각도" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "돌출은 0, 회전은 0보다 큰 값으로 설정" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "포켓(잘라내기)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu개의 닫힌 프로파일" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "활성화하려면 닫힌 프로파일을 그리십시오" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "결과가 비어 있음" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "돌출: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "회전: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "선택한 객체 없음" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "면 생성 실패" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "구멍이 있는 면 생성 실패" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "도구 메시가 비어 있음" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "포켓 추가됨(비우기 부품)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "포켓: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "활성 레이어가 펼치기(LSCM)로 매핑되어 있어야 합니다." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "체커 - 텍스처 대신 테스트 격자를 표시합니다. 정사각형이 정사각형으로 유지되는 곳은 텍스처가 왜곡되지 않으며, 늘어나는 곳은 텍스처도 늘어납니다" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "왜곡 - 펼친 면 위에 늘어난 정도를 파랑에서 빨강으로 이어지는 히트맵으로 표시합니다" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "혼합 방식" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "표면" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "레이어: 두 필라멘트가 출력 레이어마다 번갈아 사용됩니다. 수직면에서는 부드럽게 섞이지만, 레이어 하나가 하나의 띠가 되는 평평한 면에서는 효과가 사라집니다.\n" +#~ "표면: 표면 전체에 촘촘한 체커보드를 만듭니다. 어떤 각도에서도 작동하지만 혼색이 아니라 질감처럼 보일 수 있습니다.\n" +#~ "자동: 수직면에는 레이어를 사용하고, 평평한 면에서는 체커보드가 패턴으로 드러나므로 더 가까운 필라멘트 하나를 사용합니다." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "아일랜드 - 아일랜드 전체를 이동, 회전, 배율 조정합니다" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "정점 - 정점을 드래그하여 모양을 바꿉니다. Shift/Ctrl로 다중 선택" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "모서리 - 모서리를 드래그하여 모양을 바꿉니다. Shift/Ctrl로 다중 선택" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "모든 아일랜드 맞추기 (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(실험적) 출력 호스트 대신 프린터 에이전트 사용" @@ -31719,16 +32856,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "면이나 기준 평면을 클릭한 다음 그리기 도구를 선택하십시오" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31785,10 +32912,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "수직 거리" -# AI Translated -#~ msgid "Linear" -#~ msgstr "선형" - #~ msgid "Face recognition" #~ msgstr "바닥면 인식" @@ -33373,9 +34496,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "부품 선택" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/list.txt b/localization/i18n/list.txt index b1ebb54f5e..827686393e 100644 --- a/localization/i18n/list.txt +++ b/localization/i18n/list.txt @@ -164,6 +164,7 @@ src/slic3r/GUI/OptionsGroup.cpp src/slic3r/GUI/PrintOptionsDialog.cpp src/slic3r/GUI/SafetyOptionsDialog.cpp src/slic3r/GUI/ParamsPanel.cpp +src/slic3r/GUI/IMEXModesCtrl.cpp src/slic3r/GUI/PartPlate.cpp src/slic3r/GUI/Plater.cpp src/slic3r/GUI/Preferences.cpp @@ -212,6 +213,7 @@ src/libslic3r/ExtrusionEntity.cpp src/libslic3r/Flow.cpp src/libslic3r/Format/AMF.cpp src/libslic3r/miniz_extension.cpp +src/libslic3r/IMEXHelpers.cpp src/libslic3r/Preset.cpp src/libslic3r/Print.cpp src/libslic3r/PrintBase.cpp @@ -331,6 +333,8 @@ src/slic3r/GUI/OAuthDialog.cpp src/slic3r/GUI/PluginPickerDialog.cpp src/slic3r/GUI/PluginsConfigDialog.cpp src/slic3r/GUI/PluginsDialog.cpp +src/slic3r/GUI/PrinterWebView.cpp +src/slic3r/GUI/Project.cpp src/slic3r/GUI/PublishSettingsDialog.hpp src/slic3r/GUI/PurgeModeDialog.cpp src/slic3r/GUI/TerminalDialog.cpp @@ -339,7 +343,6 @@ src/slic3r/GUI/TextureLibrary.cpp src/slic3r/GUI/TextureProjectorFrame.cpp src/slic3r/GUI/UVEditorCanvas.cpp src/slic3r/GUI/UserManager.cpp -src/slic3r/GUI/WebDownPluginDlg.cpp src/slic3r/GUI/WebViewDialog.cpp src/slic3r/GUI/Widgets/AMSItem.cpp src/slic3r/GUI/Widgets/DialogButtons.cpp diff --git a/localization/i18n/lt/OrcaSlicer_lt.po b/localization/i18n/lt/OrcaSlicer_lt.po index 2531cae672..45abf3643a 100644 --- a/localization/i18n/lt/OrcaSlicer_lt.po +++ b/localization/i18n/lt/OrcaSlicer_lt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2026-07-02 14:13+0300\n" "Last-Translator: Gintaras Kučinskas \n" "Language-Team: \n" @@ -2145,14 +2145,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "„WebView2“ paleidimo terpė" +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Nepavyko įdiegti „Microsoft WebView2 Runtime“.\n" -"Kol tai nebus įdiegta, kai kurios funkcijos, įskaitant diegimo vedlį, gali būti tuščios.\n" -"Prašome įdiegti rankiniu būdu iš https://developer.microsoft.com/microsoft-edge/webview2/ ir iš naujo paleisti „Orca Slicer“." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4296,6 +4294,9 @@ msgstr "Eiti į plokštę" msgid "AMS Materials Setting" msgstr "AMS medžiagų nuostatos" +msgid "Wiki Guide" +msgstr "Wiki vadovas" + msgid "Close" msgstr "Uždaryti" @@ -4319,9 +4320,6 @@ msgstr "Įvesties reikšmė turi būti didesnė nei %1% ir mažesnė nei %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "Srauto dinamikos kalibravimo koeficientai" -msgid "Wiki Guide" -msgstr "Wiki vadovas" - msgid "PA Profile" msgstr "PA profilis" @@ -4922,6 +4920,11 @@ msgstr "Automatiškai sureguliuoti iki ribos (%g mm)?" msgid "Adjust" msgstr "Sureguliuoti" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5761,9 +5764,6 @@ msgstr "Automatiškai pjaustyti iš naujo pagal optimalų gijų grupavimą, o gr msgid "Filament Grouping" msgstr "Gijų grupavimas" -msgid "Why this grouping" -msgstr "Kodėl šis grupavimas" - msgid "Please place filaments on the printer based on grouping result." msgstr "Prašome sudėti gijas spausdintuve vadovaujantis grupavimo rezultatais." @@ -5952,6 +5952,43 @@ msgstr "Padidinti / sumažinti redagavimo plotą" msgid "Sequence" msgstr "Seka" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Tūris" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Objekto pasirinkimas" @@ -6170,6 +6207,12 @@ msgstr "Tinklelio linijos" msgid "Labels" msgstr "Etiketės (Užrašai)" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Perkelti pjūvio plokštumą" @@ -6219,7 +6262,7 @@ msgid "Size:" msgstr "Dydis:" # AI Translated -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Rasta G-code trajektorijų konfliktų %d sluoksnyje, Z = %.2lfmm. Prašome labiau atskirti konfliktuojančius objektus (%s <-> %s)." @@ -6700,6 +6743,12 @@ msgstr "Rodyti tinklelio linijas" msgid "Show Gridlines on plate" msgstr "Rodyti tinklelio linijas ant plokštės" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Atstatyti lango išdėstymą" @@ -8394,6 +8443,61 @@ msgstr "Matyti visus objekto nustatymus" msgid "Material settings" msgstr "Medžiagos nustatymai" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Įrankiai" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Pašalinti dabartinę plokštę (jei ji ne paskutinė)" @@ -8418,6 +8522,17 @@ msgstr "Taisyti dabartinės plokštės pavadinimą" msgid "Move plate to the front" msgstr "Perkelti plokštę į priekį" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Individualizuoti esamą plokštę" @@ -8492,12 +8607,6 @@ msgstr "AMS (1 lizdas)" msgid "Not installed" msgstr "Neįdiegta" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Programinė įranga nepalaiko skirtingo skersmens purkštukų naudojimo vienam spausdinimui. Jei kairysis ir dešinysis purkštukai skiriasi, galima spausdinti tik su viena galvute. Patvirtinkite, kurį purkštuką norite naudoti šiam projektui." - -msgid "Switch diameter" -msgstr "Pakeisti skersmenį" - msgid "Configuration incompatible" msgstr "Nesuderinama konfigūracija" @@ -8579,6 +8688,9 @@ msgstr "Mišri gija" msgid "Remove last mixed filament" msgstr "Pašalinti paskutinę mišrią giją" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Pridėti mišrią giją" @@ -8601,6 +8713,10 @@ msgstr "Mišri gija turi sugadintų komponentų nuorodų" msgid "Edit / Delete / Merge" msgstr "Redaguoti / Ištrinti / Sujungti" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Paskirties mišri gija naudoja šią fizinę giją kaip komponentą. Sujungus ši fizinė gija bus pašalinta ir mišri gija gali tapti netinkama. Tęsti?" @@ -8675,9 +8791,6 @@ msgstr "Įkeliamas failas: %s" msgid "Load 3MF" msgstr "Įkelti 3MF" -msgid "BambuStudio Project" -msgstr "„BambuStudio“ projektas" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "3MF nepalaikomas Orca Slicer. Įkeliami tik geometrijos duomenys." @@ -8707,17 +8820,6 @@ msgstr "Geriau jau atnaujinkite savo programinę įrangą\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "3MF failo versija %s yra naujesnė nei %s versija %s. Siūloma atnaujinti jūsų programinę įrangą." -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "3MF failą sukūrė „BambuStudio“ (versija %s), kuri yra naujesnė už suderinamą versiją %s. Rasta nepažįstamų nustatymų:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "3MF failą sukūrė „BambuStudio“ (versija %s), kuri yra naujesnė už suderinamą versiją %s. Kai kurie nustatymai gali būti nevisiškai suderinami." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "3MF failą sukūrė „BambuStudio“. Kai kurie nustatymai gali skirtis nuo „OrcaSlicer“ nustatymų." - msgid "Invalid values found in the 3MF:" msgstr "3MF rasti netinkami duomenys:" @@ -8890,6 +8992,12 @@ msgstr "Išjungti automatinį nuleidimą, kad būtų išsaugota Z pozicija?\n" msgid "Object with floating parts was detected" msgstr "Aptiktas objektas su ore kabančiomis dalimis" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Vyksta kitas eksportavimo procesas." @@ -8976,6 +9084,38 @@ msgstr "Netinkami duomenys" msgid "Slicing Canceled" msgstr "Sluoksniavimas atšauktas" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Tinklo įskiepis sėkmingai pakeistas." @@ -9008,9 +9148,8 @@ msgstr "" msgid "Sync now" msgstr "Sinchronizuoti dabar" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Negalima atšaukti ar perdaryti, kol vykdoma operacija. Pirmiausia ją sustabdykite." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9081,6 +9220,11 @@ msgstr "Atsisiųsti nepavyko. Failo dydžio išimtis." msgid "Project downloaded %d%%" msgstr "Projektas atsisiųstas %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advance testas" @@ -9107,6 +9251,13 @@ msgstr "Orca YOLO srauto kalibravimas" msgid "Flowrate Test - Pass%d" msgstr "Srauto testas – %d etapas" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Purkštuko temperatūros testas" @@ -11546,6 +11697,9 @@ msgstr "Skirtingų ekstruderių pavarų arba purkštukų tūrio tipų sinchroniz msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Sinchronizuoti parametrų pakeitimus su atitinkamais kito ekstruderio parametrais." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Paspauskite, norėdami atkurti visus nustatymus pagal paskutinį išsaugotą profilį." @@ -11965,6 +12119,12 @@ msgstr "Erdvė spausdinimui" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Pasirinkite tinklo agento modulį ryšiui su spausdintuvu palaikyti. Prieinami agentai užregistruojami paleidimo metu." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12091,9 +12251,24 @@ msgstr "Purkštuko skersmuo" msgid "Wipe tower" msgstr "Valymo bokštas" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Vieno ekstruderio kelių medžiagų parametrai" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Tai yra vieno ekstruderio ir kelių medžiagų spausdintuvas, todėl visų ekstruderių skersmenys bus nustatyti pagal naują vertę. Ar norite tęsti?" @@ -12103,6 +12278,18 @@ msgstr "Sluoksnio aukščio ribos" msgid "Z-Hop" msgstr "Z šuolis" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -12211,10 +12398,9 @@ msgstr "Tęsti" msgid "Don't warn again for this preset" msgstr "Daugiau neperspėti šiam profiliui" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" msgid "No modifications need to be copied." msgstr "Nereikia kopijuoti jokių modifikacijų" @@ -12637,9 +12823,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Bendras supresavimas (ramming)" -msgid "Volume" -msgstr "Tūris" - msgid "Ramming line" msgstr "Supresavimo (ramming) linija" @@ -12688,6 +12871,119 @@ msgstr "Prisijungti nepavyko. Bandykite dar kartą." msgid "parse json failed" msgstr "nepavyko išanalizuoti json" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "Pasisveikinkite su Orca Slicer" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer bus nustatyta per kelis žingsnius. Pradėkime!" + +msgid "Get Started" +msgstr "Pradėti" + +msgid "Please select your login region" +msgstr "Pasirinkite prisijungimo regioną" + +msgid "Finish" +msgstr "Baigti" + +msgid "Printer Selection" +msgstr "Spausdintuvo pasirinkimas" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Pasirinktinis spausdintuvas" + +msgid "Create" +msgstr "Sukurti" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "Turi būti pasirinktas bent vienas spausdintuvas." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Gijos pasirinkimas" + +msgid "System Filaments" +msgstr "Sistemos gijos" + +msgid "Custom Filaments" +msgstr "Pasirinktinės gijos" + +msgid "Create New" +msgstr "Sukurti naują" + +msgid "Filament type" +msgstr "Gijos tipas" + +msgid "Vendor" +msgstr "Prekės ženklas" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "Išvalyti visus" + +msgid "At least one filament must be selected." +msgstr "Turi būti pasirinkta bent viena gija." + +msgid "Do you want to use the default filament?" +msgstr "Ar norite naudoti numatytąją giją?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Išjungia visas debesijos funkcijas, įskaitant „Orca Cloud“ profilių sinchronizavimą. Naudotojai, kurie nori dirbti visiškai neprisijungę prie tinklo, gali įjungti šią parinktį." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Pastaba: kai įjungtas slaptas režimas, jūsų naudotojo profilių atsarginės kopijos nebus kuriamos „Orca Cloud“ debesyje." + +msgid "Enable Stealth Mode." +msgstr "Įjungti slaptą režimą." + +msgid "Proprietary Plugins" +msgstr "Patentuoti papildiniai" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "Kai kurie spausdintuvų gamintojai reikalauja patentuotų papildinių, kad būtų galima bendrauti su jų spausdintuvais. Jei naudojate tokius spausdintuvus, pasirinkite atitinkamą papildinį." + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "Atkreipkite dėmesį, kad OrcaSlicer šių papildinių nesukuria ir neprižiūri. Juos turėtumėte naudoti savo nuožiūra ir rizika." + +msgid "Install Bambu Network plug-in" +msgstr "Įdiegti Bambu tinklo papildinį" + msgid "[Action Required] " msgstr "[Reikalingas veiksmas] " @@ -13150,6 +13446,14 @@ msgstr "Gijos ekstruzijos vaidmens keitimo G-code" msgid "No object can be printed. It may be too small." msgstr "Negalima spausdinti jokio objekto. Jis gali būti per mažas." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Jūsų spaudinys yra labai arti valymo / paruošimo (priming) sričių. Įsitikinkite, kad nekils susidūrimo." @@ -13325,6 +13629,26 @@ msgstr "patvirtinimas nepavyko" msgid "write callback failed" msgstr "nepavyko vykdyti įrašymo atgalinio iškvietimo (write callback)" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% yra per arti uždraustos srities, spausdinant gali įvykti susidūrimų." @@ -13377,6 +13701,43 @@ msgstr "Jei vis tiek norite spausdinti, galite įjungti šią parinktį skiltyje msgid "No extrusions under current settings." msgstr "Pagal dabartinius nustatymus nėra išspaudimų." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Naudojama mišri gija su gradientu, tačiau 'Mišrios spalvos posluoksnis' yra išjungtas. Gradientas nebus atspausdintas." @@ -13387,6 +13748,15 @@ msgstr "Sklandus pakadrinio filmavimo (timelapse) režimas nepalaikomas, kai įj msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Sulipimo aptikimas (clumping detection) nepalaikomas, kai įjungta spausdinimo seka „pagal objektą“." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Vienu metu įjungus tikslų Z aukštį ir valymo bokštą, gali kilti pjaustymo klaidų." @@ -13403,10 +13773,6 @@ msgstr "Spiralinės vazos režimas neveikia, kai objekte yra daugiau nei viena m msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Nors pats objektas %1% telpa į surinkimo tūrį, jis viršija maksimalų surinkimo tūrio aukštį dėl medžiagos susitraukimo kompensavimo." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Objektas %1% viršija maksimalų galimą spausdinimo tūrio aukštį." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Nors pats objektas %1% telpa į spausdinimo tūrį, jo paskutinis sluoksnis viršija didžiausią spausdinimo tūrio aukštį." @@ -13414,6 +13780,10 @@ msgstr "Nors pats objektas %1% telpa į spausdinimo tūrį, jo paskutinis sluoks msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Galbūt norėsite sumažinti modelio dydį arba pakeisti esamus spausdinimo nustatymus ir bandyti dar kartą." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Objektas %1% viršija maksimalų galimą spausdinimo tūrio aukštį." + msgid "Variable layer height is not supported with Organic supports." msgstr "Kintamas sluoksnio aukštis nepalaikomas su \" Organinėmis atramomis\"." @@ -14368,12 +14738,39 @@ msgstr "Vidinių tiltelių spausdinimo greitis. Jei reikšmė nurodoma procentai msgid "This is the distance from the model to the outermost brim line." msgstr "Atstumas nuo modelio iki išorinės krašto linijos" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Apvado tipas" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Valdo apvado generavimą modelio išorinėje ir (arba) vidinėje pusėje. „Auto“ režimu apvado plotis išanalizuojamas ir apskaičiuojamas automatiškai." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Tarpas tarp apvado ir objekto" @@ -15553,9 +15950,6 @@ msgstr "Gijos kaina, tik statistikai." msgid "money/kg" msgstr "pinigų/kg" -msgid "Vendor" -msgstr "Prekės ženklas" - msgid "Vendor of filament. For show only." msgstr "Gijos prekės ženklas. Tik parodymui." @@ -15625,6 +16019,66 @@ msgstr "Užpildyti kelias eilutes" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Kelių linijų naudojimas užpildo raštui, jei tai palaiko pats užpildo raštas." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Linijinis" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "Z ašies išklumpavimo (buckling) optimizavimas (eksperimentinis)" @@ -17867,6 +18321,99 @@ msgstr "Vieno ekstruderio daugiamedžiagis spausdinimas (Multi-Material)" msgid "Use single nozzle to print multi filament." msgstr "Naudoti vieną purkštuką spausdinimui keliomis gijomis." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Rankinis gijų keitimas" @@ -18245,6 +18792,130 @@ msgstr "Slenksčio persidengimas" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Jei ribinis kampas lygus nuliui, atramos bus generuojamos iškyšoms, kurių persidengimas yra mažesnis už šią ribą. Kuo mažesnė ši reikšmė, tuo statesnes iškyšas galima atspausdinti be atramų." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Atraminio medžio šakos kampas" @@ -18426,17 +19097,11 @@ msgstr "Viršutinių vientisų sluoksnių skaičius pjaustymo metu padidinamas, msgid "Separated infills" msgstr "Atskirti užpildai" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Centruoja kiekvienos dalies vidinį užpildą pagal ją pačią, tarsi ji būtų supjaustyta atskirai, o ne pagal visą surinkinį. Besiliečiančios ar persidengiančios dalys traktuojamos kaip vienas kūnas ir dalijasi vienu centru; atskiros dalys (arba skirtingi 3D objektai) gauna savo centrą.\n" -"Naudinga, kai surinkinys sugrupuoja kelis objektus, kurių kiekvienas turi išlaikyti nuoseklų, į save centruotą užpildą.\n" -"Veikia linijų ir tinklelio raštus bei pasukimo šablonų užpildus.\n" -"Raštai, pririšti prie globalių koordinačių (Giroidas, Korys, TPMS, ...), nepaveikiami." # AI Translated msgid "Center surface pattern on" @@ -18669,6 +19334,12 @@ msgstr "Išplovimas pakeitus siūlelį bus atliekamas objektų atramų viduje. T msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Šis objektas bus naudojamas purkštuko pravalymui po gijos pakeitimo, siekiant sutaupyti medžiagos ir sutrumpinti spausdinimo laiką. Dėl šios priežasties pereinamieji gijos atspalviai bus sumaišyti pačiame objekte. Ši funkcija veikia tik tuomet, kai įjungtas valymo bokštelis." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Maksimalus tiltelio atstumas" @@ -19578,8 +20249,8 @@ msgstr "Fizinio spausdintuvo, naudojamo sluoksniavimui, pavadinimas." msgid "Layer number" msgstr "Sluoksnio numeris" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Dabartinio sluoksnio indeksas, skaičiuojamas nuo vieneto (t. y. pirmasis sluoksnis yra Nr. 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Sluoksnio Z aukštis" @@ -19723,9 +20394,6 @@ msgstr "Perkalibruoti" msgid "Calibrate" msgstr "Kalibruoti" -msgid "Finish" -msgstr "Baigti" - msgid "How can I use calibration results?" msgstr "Kaip galiu panaudoti kalibravimo rezultatus?" @@ -20266,12 +20934,12 @@ msgstr "" "Pagreičio reikšmės turi būti didesnės už greičio reikšmes.\n" "Patikrinkite įvesties duomenis." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Temperatūros kalibravimas" -msgid "Filament type" -msgstr "Gijos tipas" - msgid "PLA" msgstr "PLA" @@ -20293,6 +20961,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Bandomasis modelis" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Pradžios temp: " @@ -20418,9 +21092,6 @@ msgstr "Pradinis įtraukimo ilgis: " msgid "End retraction length: " msgstr "Galinis įtraukimo ilgis: " -msgid "Test model" -msgstr "Bandomasis modelis" - msgid "Ringing Tower" msgstr "Bangavimo bokštelis" @@ -20848,9 +21519,6 @@ msgstr "pvz., pagrindinis, matinis, šilkinis, marmurinis" msgid "Filament Preset" msgstr "Gijos profilis" -msgid "Create" -msgstr "Sukurti" - msgid "Vendor is not selected; please reselect vendor." msgstr "Prekės ženklas nepasirinktas; prašome pasirinkti prekės ženklą iš naujo." @@ -21160,6 +21828,9 @@ msgstr "" "Spausdintuvas ir visi jam priklausantys gijos bei proceso profiliai.\n" "Galima bendrinti su kitais." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21866,9 +22537,6 @@ msgstr "Rankiniu būdu priskirti giją kairiajam arba dešiniajam purkštukui" msgid "Global settings" msgstr "Visuotiniai nustatymai" -msgid "Video tutorial" -msgstr "Vaizdo pamoka" - msgid "(Sync with printer)" msgstr "(Sinchronizuoti su spausdintuvu)" @@ -22266,6 +22934,33 @@ msgstr "Jei įjungta, aukščiau nurodytos vertės yra išsaugomos kaip numatyto msgid "PresetBundle" msgstr "ProfiliųRinkinys" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "Rinkinio aplankas neegzistuoja." @@ -22299,6 +22994,12 @@ msgstr "Atsisakyti rinkinio prenumeratos" msgid "ExportPresetBundle" msgstr "EksportuotiProfiliųRinkinį" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "Išsaugoti profilių rinkinį" @@ -26733,215 +27434,6 @@ msgstr "Šis šriftas neturi šio teksto kontūro" msgid "Size: %.1f × %.1f mm" msgstr "Dydis: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primityvas" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Sugeneruotas tuščias poligoninis tinklas" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Dėžė" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Greitai:" - -# AI Translated -msgid "Width (X)" -msgstr "Plotis (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Gylis (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Aukštis (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "Apat. R" - -# AI Translated -msgid "Top R" -msgstr "Viršut. R" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "Didysis R" - -# AI Translated -msgid "Minor R" -msgstr "Mažasis R" - -# AI Translated -msgid "All edges" -msgstr "Visos briaunos" - -# AI Translated -msgid "Top edges" -msgstr "Viršutinės briaunos" - -# AI Translated -msgid "Bottom edges" -msgstr "Apatinės briaunos" - -# AI Translated -msgid "Lateral edges" -msgstr "Šoninės briaunos" - -# AI Translated -msgid "Mesh resolution" -msgstr "Tinklelio raiška" - -# AI Translated -msgid "Add Shape" -msgstr "Pridėti formą" - -# AI Translated -msgid "No outer profile" -msgstr "Nėra išorinio profilio" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Nepavyko sukurti išorinio paviršiaus" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Nepavyko sukurti paviršiaus su skylėmis" - -# AI Translated -msgid "Revolve failed" -msgstr "Apsukimas nepavyko" - -# AI Translated -msgid "Profile" -msgstr "Profilis" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Pradėti naują profilį (skylėms)" - -# AI Translated -msgid "Segments" -msgstr "Segmentai" - -# AI Translated -msgid "Sides" -msgstr "Kraštinės" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Spustelėkite drobėje, kad pieštumėte" - -# AI Translated -msgid "Snap to grid" -msgstr "Pritraukti prie tinklelio" - -# AI Translated -msgid "Grid step" -msgstr "Tinklelio žingsnis" - -# AI Translated -msgid "Outer" -msgstr "Išorinis" - -# AI Translated -msgid "closed" -msgstr "uždaras" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% tšk. %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (viršus)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (priekis)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (šonas)" - -# AI Translated -msgid "Revolve deg" -msgstr "Apsukimo kampas" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "0 – išspaudimas, >0 – apsukimas" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Įduba (pjūvis)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu uždaras profilis" -msgstr[1] "%zu uždari profiliai" -msgstr[2] "%zu uždarų profilių" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Nubrėžkite uždarą profilį, kad įjungtumėte" - -# AI Translated -msgid "Clear all" -msgstr "Išvalyti viską" - -# AI Translated -msgid "Empty result" -msgstr "Tuščias rezultatas" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Išspaudimas: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Apsukimas: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Nepasirinktas joks objektas" - -# AI Translated -msgid "Face failed" -msgstr "Nepavyko sukurti paviršiaus" - -# AI Translated -msgid "Face with holes failed" -msgstr "Nepavyko sukurti paviršiaus su skylėmis" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Įrankio tinklelis tuščias" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Įduba pridėta (neigiamas tūris)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Įduba: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27063,6 +27555,9 @@ msgstr "Surinkimo manipuliatorius" msgid "Gizmo brim ears" msgstr "Krašto „auselių“ (brim ears) manipuliatorius" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Vertikalus slankiklis – kelti aktyvų žymeklį aukštyn" @@ -28046,10 +28541,6 @@ msgstr "Mano nustatymai" msgid "Custom Printer Setup" msgstr "Pasirinktinio spausdintuvo sąranka" -# AI Translated -msgid "Custom Printer" -msgstr "Pasirinktinis spausdintuvas" - # AI Translated msgid "Define a custom printer profile" msgstr "Apibrėžti pasirinktinio spausdintuvo profilį" @@ -28696,9 +29187,8 @@ msgstr "Kampo slenkstis - užpildymas sustoja ties briaunomis, aštresnėmis už msgid "Click a triangle to paint it" msgstr "Spustelėkite trikampį, kad jį nupieštumėte" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Aktyviajam sluoksniui turi būti priskirtas išskleidimas (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -28712,17 +29202,15 @@ msgstr "Greitas - reljefas tik atvaizduojamas šešėliais, o ne sukuriamas, ir msgid "Checker" msgstr "Šachmatinis raštas" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Šachmatinis raštas - bandomasis tinklelis vietoj tekstūros. Kur kvadratai lieka kvadratais, tekstūra neiškraipyta; kur jie ištempti, bus ištempta ir tekstūra" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Iškraipymas" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Iškraipymas - išskleidimo ištempimo šiluminis žemėlapis nuo mėlynos iki raudonos" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28838,24 +29326,11 @@ msgstr "Maišyti gijas" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Pakaitomis naudoja dvi gijas, kad imituotų tarpines spalvas, todėl keliomis gijomis galima atkurti nuotrauką ar gradientą. Vienodų spalvų paveikslėlis abiem atvejais spausdinamas taip pat. Išjungus, kiekvienai sričiai naudojama viena gija." -# AI Translated -msgid "Mix by" -msgstr "Maišyti pagal" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Paviršius" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Sluoksniai: dvi gijos keičiasi spausdinimo sluoksniais; ant vertikalių paviršių spalvos sklandžiai susilieja, bet ant horizontalių išnyksta, nes ten visas sluoksnis yra viena juosta.\n" -"Paviršius: smulkus šachmatinis raštas paviršiuje; veikia bet kokiu kampu, bet gali atrodyti kaip tekstūra, o ne kaip spalvų mišinys.\n" -"Automatinis: vertikaliuose paviršiuose – sluoksniai; horizontaliems paviršiams naudojama artimiausia viena gija, nes šachmatinis raštas ten matytųsi kaip raštas." # AI Translated #, boost-format @@ -29315,14 +29790,6 @@ msgstr "Reikia apie %1% trikampių, biudžetas %2% - įkepimas supaprastins tink msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Kiek tūkstančių trikampių smulkinimas gali pridėti prie modelio. Visada pirmiausia dalijamas prasčiausiai atitinkantis trikampis, todėl net išnaudojus visą biudžetą jis panaudojamas ten, kur labiausiai matyti. Padidinkite, jei reljefas vis dar atrodo šiurkštus." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Sustabdo įkepimą. Tai, kas jau atlikta, lieka modelyje ir gali būti atšaukta." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Uždaro įrankį neįkepus. Jūsų piešinys, sluoksniai ir nustatymai lieka su modeliu." - # AI Translated msgid "Preparing..." msgstr "Ruošiama..." @@ -29347,6 +29814,14 @@ msgstr "Paverčia nupieštus aukščių žemėlapius tikra geometrija, perkeldam msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Paverčia nupieštus aukščių žemėlapius tikra geometrija. Pirmiausia tinklelis pertinklinamas iki tolygaus tankio ir smulkinamas ten, kur tekstūra lenkiasi, kad detalėms atsirastų viršūnių - viskas vienu žingsniu." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Sustabdo įkepimą. Tai, kas jau atlikta, lieka modelyje ir gali būti atšaukta." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Uždaro įrankį neįkepus. Jūsų piešinys, sluoksniai ir nustatymai lieka su modeliu." + # AI Translated #, boost-format msgid "%1% k" @@ -29563,6 +30038,28 @@ msgstr "Gijų papildiniai" msgid "Printer plugins" msgstr "Spausdintuvo papildiniai" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Atkurti numatytąsias reikšmes" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Konfigūracija nėra tinkamas JSON. Jūsų pakeitimai neišsaugoti." @@ -29582,10 +30079,6 @@ msgstr "" "\n" "Tai atmes profilyje perrašytą konfigūraciją ir bus naudojama bendroji konfigūracija." -# AI Translated -msgid "Restore defaults" -msgstr "Atkurti numatytąsias reikšmes" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Naudojama bendroji konfigūracija. Išsaugokite profilį, kad tai išliktų." @@ -29655,6 +30148,215 @@ msgstr "Diegiamas papildinys" msgid "Installed \"%s\"." msgstr "Įdiegta: „%s“." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29871,6 +30573,54 @@ msgstr "Nepavyko iš naujo įkelti papildinio." msgid "Reloaded \"%s\"." msgstr "Iš naujo įkelta: „%s“." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "Nėra informacijos apie modelį" + +msgid "Edit Project Info" +msgstr "Redaguoti projekto informaciją" + +msgid "Model Information" +msgstr "Modelio informacija" + +msgid "Accessories" +msgstr "Priedai" + +msgid "Profile Information" +msgstr "Profilio informacija" + +msgid "Model name" +msgstr "Modelio pavadinimas" + +msgid "Created by" +msgstr "Sukurta" + +msgid "Remixed by" +msgstr "Perkurta" + +msgid "Shared by" +msgstr "Pasidalinta" + +msgid "Model description" +msgstr "Modelio aprašymas" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "Profilio pavadinimas" + +msgid "Profile Author" +msgstr "Profilio autorius" + +msgid "Profile description" +msgstr "Profilio aprašymas" + # AI Translated msgid "Purge Mode Settings" msgstr "Pravalymo režimo nustatymai" @@ -29895,6 +30645,16 @@ msgstr "Sumažina pravalymo atliekas ir spausdina greičiau. Spalvos gali šiek msgid "Terminal" msgstr "Terminalas" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Komanda jau vykdoma." @@ -30161,6 +30921,9 @@ msgstr " | pritraukimas ĮJUNGTAS" msgid "Change texture - choose another one from the texture library" msgstr "Keisti tekstūrą - pasirinkite kitą iš tekstūrų bibliotekos" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Aukščių žemėlapis - rodyti sluoksnio tekstūrą po UV salomis" @@ -30193,17 +30956,14 @@ msgstr "Sujungti UV salas" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Išdėstyti išskleidimą kaip sujungtą išklotinę: dalys, turinčios bendrą briauną, išskleidžiamos greta viena kitos (kubas tampa sujungta išklotine, o ne šešiais atskirais kvadratais). Jos lieka atskiromis UV salomis, todėl vėliau bet kurią iš jų vis tiek galite perkelti rankiniu būdu." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "UV sala - perkelti, pasukti ir keisti ištisų UV salų mastelį" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Viršūnė - vilkite viršūnes, kad pakeistumėte formą; Shift/Ctrl – kelių pasirinkimas" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Briauna - vilkite briaunas, kad pakeistumėte formą; Shift/Ctrl – kelių pasirinkimas" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30241,9 +31001,13 @@ msgstr "Išvalyti UV pakeitimus - atmesti visus rankinius viršūnių / briaunų msgid "Snap - stick islands together when dragging one against another" msgstr "Pritraukimas - vilkdami vieną UV salą prie kitos, sulipdyti jas" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Sutalpinti visas UV salas (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30254,6 +31018,9 @@ msgstr "Nėra sluoksnio, kuriam priskirtas išskleidimas" msgid "%.1f mm tile" msgstr "%.1f mm plytelė" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Pasenęs - nuo šio išskleidimo pasikeitė piešinys, UV siūlės arba UV siūlės kampas. Paspauskite, kad išskleistumėte iš naujo." @@ -30262,19 +31029,48 @@ msgstr "Pasenęs - nuo šio išskleidimo pasikeitė piešinys, UV siūlės arba msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Ištiesinti nupieštą sritį į UV salas. Skaičiuojama tik paspaudus šį mygtuką, o ne po kiekvieno pakeitimo - todėl pirmiausia pieškite, keiskite UV siūlės kampą ar žymėkite UV siūles, tada paspauskite „Išskleisti“." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "UV salų: %d, paviršių: %s" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "Neprisiregistruota" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Neaptiktas Bambu tinklo papildinys. Spustelėkite čia jo diegimui." + +msgid "Create new project" +msgstr "Sukurti naują projektą" + +msgid "Recently opened" +msgstr "Neseniai atidaryti" + +msgid "Open Containing Folder" +msgstr "Atidaryti katalogą, kuriame yra" + # AI Translated msgid "Forward" msgstr "Pirmyn" -# AI Translated -msgid "Tools" -msgstr "Įrankiai" - # AI Translated msgid "View Source" msgstr "Rodyti šaltinį" @@ -30420,6 +31216,16 @@ msgstr "" "Papildinys „%s“ prašo leidimo vykdyti šias komandas:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30429,6 +31235,30 @@ msgstr "Papildinys „%s“ prašo leidimo Python audito įvykiui „%s“." msgid "Plugin permission request" msgstr "Papildinio leidimo užklausa" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Papildinio konfigūracijos sąsaja tuščia. Rodomas numatytasis redaktorius." @@ -31016,6 +31846,312 @@ msgstr "" "Venkite deformacijų (warping)\n" "Ar žinojote, kad spausdinant medžiagas, kurios yra linkusios trauktis ir riestis (pvz., ABS), tinkamas kaitinamojo pagrindo temperatūros padidinimas gali sumažinti deformacijų (warping) tikimybę?" +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Nepavyko įdiegti „Microsoft WebView2 Runtime“.\n" +#~ "Kol tai nebus įdiegta, kai kurios funkcijos, įskaitant diegimo vedlį, gali būti tuščios.\n" +#~ "Prašome įdiegti rankiniu būdu iš https://developer.microsoft.com/microsoft-edge/webview2/ ir iš naujo paleisti „Orca Slicer“." + +#~ msgid "Why this grouping" +#~ msgstr "Kodėl šis grupavimas" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Programinė įranga nepalaiko skirtingo skersmens purkštukų naudojimo vienam spausdinimui. Jei kairysis ir dešinysis purkštukai skiriasi, galima spausdinti tik su viena galvute. Patvirtinkite, kurį purkštuką norite naudoti šiam projektui." + +#~ msgid "Switch diameter" +#~ msgstr "Pakeisti skersmenį" + +#~ msgid "BambuStudio Project" +#~ msgstr "„BambuStudio“ projektas" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "3MF failą sukūrė „BambuStudio“ (versija %s), kuri yra naujesnė už suderinamą versiją %s. Rasta nepažįstamų nustatymų:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "3MF failą sukūrė „BambuStudio“ (versija %s), kuri yra naujesnė už suderinamą versiją %s. Kai kurie nustatymai gali būti nevisiškai suderinami." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "3MF failą sukūrė „BambuStudio“. Kai kurie nustatymai gali skirtis nuo „OrcaSlicer“ nustatymų." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Negalima atšaukti ar perdaryti, kol vykdoma operacija. Pirmiausia ją sustabdykite." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Centruoja kiekvienos dalies vidinį užpildą pagal ją pačią, tarsi ji būtų supjaustyta atskirai, o ne pagal visą surinkinį. Besiliečiančios ar persidengiančios dalys traktuojamos kaip vienas kūnas ir dalijasi vienu centru; atskiros dalys (arba skirtingi 3D objektai) gauna savo centrą.\n" +#~ "Naudinga, kai surinkinys sugrupuoja kelis objektus, kurių kiekvienas turi išlaikyti nuoseklų, į save centruotą užpildą.\n" +#~ "Veikia linijų ir tinklelio raštus bei pasukimo šablonų užpildus.\n" +#~ "Raštai, pririšti prie globalių koordinačių (Giroidas, Korys, TPMS, ...), nepaveikiami." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Dabartinio sluoksnio indeksas, skaičiuojamas nuo vieneto (t. y. pirmasis sluoksnis yra Nr. 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Vaizdo pamoka" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primityvas" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Sugeneruotas tuščias poligoninis tinklas" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Dėžė" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Greitai:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Plotis (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Gylis (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Aukštis (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "Apat. R" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "Viršut. R" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "Didysis R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "Mažasis R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Visos briaunos" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Viršutinės briaunos" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Apatinės briaunos" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Šoninės briaunos" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Tinklelio raiška" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Pridėti formą" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Nėra išorinio profilio" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Nepavyko sukurti išorinio paviršiaus" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Nepavyko sukurti paviršiaus su skylėmis" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Apsukimas nepavyko" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profilis" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Pradėti naują profilį (skylėms)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmentai" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Kraštinės" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Spustelėkite drobėje, kad pieštumėte" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Pritraukti prie tinklelio" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Tinklelio žingsnis" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Išorinis" + +# AI Translated +#~ msgid "closed" +#~ msgstr "uždaras" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% tšk. %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (viršus)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (priekis)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (šonas)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Apsukimo kampas" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "0 – išspaudimas, >0 – apsukimas" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Įduba (pjūvis)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu uždaras profilis" +#~ msgstr[1] "%zu uždari profiliai" +#~ msgstr[2] "%zu uždarų profilių" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Nubrėžkite uždarą profilį, kad įjungtumėte" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Tuščias rezultatas" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Išspaudimas: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Apsukimas: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Nepasirinktas joks objektas" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Nepavyko sukurti paviršiaus" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Nepavyko sukurti paviršiaus su skylėmis" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Įrankio tinklelis tuščias" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Įduba pridėta (neigiamas tūris)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Įduba: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Aktyviajam sluoksniui turi būti priskirtas išskleidimas (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Šachmatinis raštas - bandomasis tinklelis vietoj tekstūros. Kur kvadratai lieka kvadratais, tekstūra neiškraipyta; kur jie ištempti, bus ištempta ir tekstūra" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Iškraipymas - išskleidimo ištempimo šiluminis žemėlapis nuo mėlynos iki raudonos" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Maišyti pagal" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Paviršius" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Sluoksniai: dvi gijos keičiasi spausdinimo sluoksniais; ant vertikalių paviršių spalvos sklandžiai susilieja, bet ant horizontalių išnyksta, nes ten visas sluoksnis yra viena juosta.\n" +#~ "Paviršius: smulkus šachmatinis raštas paviršiuje; veikia bet kokiu kampu, bet gali atrodyti kaip tekstūra, o ne kaip spalvų mišinys.\n" +#~ "Automatinis: vertikaliuose paviršiuose – sluoksniai; horizontaliems paviršiams naudojama artimiausia viena gija, nes šachmatinis raštas ten matytųsi kaip raštas." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "UV sala - perkelti, pasukti ir keisti ištisų UV salų mastelį" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Viršūnė - vilkite viršūnes, kad pakeistumėte formą; Shift/Ctrl – kelių pasirinkimas" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Briauna - vilkite briaunas, kad pakeistumėte formą; Shift/Ctrl – kelių pasirinkimas" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Sutalpinti visas UV salas (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Eksperimentinė) Naudoti spausdintuvo agentus vietoj spausdinimo serverių" @@ -31049,16 +32185,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Spustelėkite paviršių arba atskaitos plokštumą, tada pasirinkite piešimo įrankį" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31115,10 +32241,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Vertikalus atstumas" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Linijinis" - #~ msgid "Face recognition" #~ msgstr "Paviršių atpažinimas" diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index 205c67235b..64acba6bc5 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -2340,15 +2340,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"De Microsoft WebView2 Runtime kon niet worden geïnstalleerd.\n" -"Sommige functies, waaronder de installatiewizard, kunnen leeg blijven totdat deze is geïnstalleerd.\n" -"Installeer deze handmatig via https://developer.microsoft.com/microsoft-edge/webview2/ en start Orca Slicer opnieuw." # AI Translated #, c-format, boost-format @@ -4666,6 +4663,10 @@ msgstr "Naar printbed gaan" msgid "AMS Materials Setting" msgstr "AMS Materiaal instellingen" +# AI Translated +msgid "Wiki Guide" +msgstr "Wiki-handleiding" + msgid "Close" msgstr "Sluiten" @@ -4691,10 +4692,6 @@ msgstr "De invoerwaarde moet groter zijn dan %1% en kleiner dan %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "Factoren van Flow Dynamics Calibration" -# AI Translated -msgid "Wiki Guide" -msgstr "Wiki-handleiding" - msgid "PA Profile" msgstr "PA-profiel" @@ -4792,7 +4789,7 @@ msgstr "Bewaar" msgctxt "Navigation" msgid "Back" -msgstr "Achterzijde" +msgstr "Terug" msgid "Example" msgstr "Voorbeeld" @@ -5323,6 +5320,11 @@ msgstr "Automatisch aanpassen naar de limiet (%g mm)?" msgid "Adjust" msgstr "Aanpassen" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -6252,10 +6254,6 @@ msgstr "Slice automatisch opnieuw volgens de optimale filamentgroepering; de gro msgid "Filament Grouping" msgstr "Filamentgroepering" -# AI Translated -msgid "Why this grouping" -msgstr "Waarom deze groepering" - # AI Translated msgid "Please place filaments on the printer based on grouping result." msgstr "Plaats de filamenten in de printer op basis van het groeperingsresultaat." @@ -6462,6 +6460,44 @@ msgstr "Bewerkingsgebied vergroten/verkleinen" msgid "Sequence" msgstr "Reeks" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +# AI Translated +msgid "Volume" +msgstr "Volume" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + # AI Translated msgid "Object selection" msgstr "Objectselectie" @@ -6693,6 +6729,12 @@ msgstr "Rasterlijnen" msgid "Labels" msgstr "Labels" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Doorsnedevlak verplaatsen" @@ -6743,7 +6785,7 @@ msgid "Size:" msgstr "Maat:" # AI Translated -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Er zijn conflicten tussen G-code-paden gevonden op laag %d, Z = %.2lfmm. Plaats de conflicterende objecten verder uit elkaar (%s <-> %s)." @@ -7248,6 +7290,12 @@ msgstr "Rasterlijnen tonen" msgid "Show Gridlines on plate" msgstr "Rasterlijnen op het printbed tonen" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + # AI Translated msgid "Reset Window Layout" msgstr "Vensterindeling terugzetten" @@ -9057,6 +9105,61 @@ msgstr "Alle instellingen van het object weergeven" msgid "Material settings" msgstr "Materiaalinstellingen" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Extra" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + # AI Translated msgid "Remove current plate (if not last one)" msgstr "Huidig printbed verwijderen (als het niet het laatste is)" @@ -9089,6 +9192,17 @@ msgstr "Naam van het huidige printbed bewerken" msgid "Move plate to the front" msgstr "Printbed naar voren verplaatsen" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + # AI Translated msgid "Customize current plate" msgstr "Huidig printbed aanpassen" @@ -9167,14 +9281,6 @@ msgstr "AMS(1 slot)" msgid "Not installed" msgstr "Niet geïnstalleerd" -# AI Translated -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "De software ondersteunt het gebruik van mondstukken met verschillende diameters voor één print niet. Als het linker- en rechtermondstuk verschillen, kan er alleen met één printkop worden geprint. Bevestig welk mondstuk u voor dit project wilt gebruiken." - -# AI Translated -msgid "Switch diameter" -msgstr "Diameter wisselen" - msgid "Configuration incompatible" msgstr "De configuratie is niet geschikt" @@ -9262,6 +9368,9 @@ msgstr "Gemengd filament" msgid "Remove last mixed filament" msgstr "Laatste gemengde filament verwijderen" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Gemengd filament toevoegen" @@ -9285,6 +9394,10 @@ msgstr "Het gemengde filament bevat ongeldige componentverwijzingen" msgid "Edit / Delete / Merge" msgstr "Bewerken / Verwijderen / Samenvoegen" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Het gemengde doelfilament gebruikt dit fysieke filament als component. Bij het samenvoegen wordt dit fysieke filament verwijderd en kan het gemengde filament ongeldig worden. Doorgaan?" @@ -9366,10 +9479,6 @@ msgstr "Bestand laden: %s" msgid "Load 3MF" msgstr "Laad 3MF" -# AI Translated -msgid "BambuStudio Project" -msgstr "BambuStudio-project" - # AI Translated msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "De 3MF wordt niet ondersteund door OrcaSlicer; alleen de geometriegegevens worden geladen." @@ -9405,20 +9514,6 @@ msgstr "U dient de software te upgraden.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "Versie %s van de 3MF is nieuwer dan versie %s van %s. Wij stellen voor om uw software te upgraden." -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "Het 3MF-bestand is gemaakt door BambuStudio (versie %s), dat nieuwer is dan de compatibele versie %s. Er zijn niet-herkende instellingen gevonden:" - -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "Het 3MF-bestand is gemaakt door BambuStudio (versie %s), dat nieuwer is dan de compatibele versie %s. Sommige instellingen zijn mogelijk niet volledig compatibel." - -# AI Translated -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "Het 3MF-bestand is gemaakt door BambuStudio. Sommige instellingen kunnen afwijken van OrcaSlicer." - # AI Translated msgid "Invalid values found in the 3MF:" msgstr "Ongeldige waarden gevonden in het 3MF-bestand:" @@ -9599,6 +9694,12 @@ msgstr "Automatisch laten vallen uitschakelen om de Z-positie te behouden?\n" msgid "Object with floating parts was detected" msgstr "Er is een object met zwevende onderdelen gedetecteerd" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Er is reeds een export taak actief." @@ -9691,6 +9792,38 @@ msgstr "Interne solide vulling (infill)" msgid "Slicing Canceled" msgstr "Slicing Geannuleerd" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + # AI Translated msgid "Network plug-in switched successfully." msgstr "De netwerkplug-in is met succes gewisseld." @@ -9726,9 +9859,8 @@ msgstr "" msgid "Sync now" msgstr "Nu synchroniseren" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Ongedaan maken of opnieuw doen is niet mogelijk terwijl een bewerking bezig is. Stop deze eerst." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9802,6 +9934,11 @@ msgstr "Downloaden mislukt; uitzondering in bestandsgrootte." msgid "Project downloaded %d%%" msgstr "Project %d%% gedownload" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advance-test" @@ -9831,6 +9968,13 @@ msgstr "Orca YOLO-flowkalibratie" msgid "Flowrate Test - Pass%d" msgstr "Flowrate-test - ronde %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Temperatuurtest mondstuk" @@ -12489,6 +12633,9 @@ msgstr "Synchronisatie van verschillende extruderaandrijvingen of typen mondstuk msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Synchroniseer de wijziging van parameters met de overeenkomstige parameters van een andere extruder." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Klik om alle instellingen terug te zetten naar de laatst opgeslagen voorinstelling." @@ -12920,6 +13067,12 @@ msgstr "Ruimte waarbinnen geprint kan worden" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Selecteer de implementatie van de netwerkagent voor de communicatie met de printer. Beschikbare agenten worden bij het opstarten geregistreerd." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + # AI Translated #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format @@ -13047,9 +13200,24 @@ msgstr "Mondstuk diameter" msgid "Wipe tower" msgstr "Afveegblok" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Parameter voor multi-material met één extruder" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + # AI Translated msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Dit is een multi-materialprinter met één extruder; de diameters van alle extruders worden op de nieuwe waarde ingesteld. Wilt u doorgaan?" @@ -13060,6 +13228,18 @@ msgstr "Limieten voor laaghoogte" msgid "Z-Hop" msgstr "Z-hop" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -13177,10 +13357,9 @@ msgstr "Doorgaan" msgid "Don't warn again for this preset" msgstr "Niet meer waarschuwen voor deze voorinstelling" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -13659,10 +13838,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Totale ramming" -# AI Translated -msgid "Volume" -msgstr "Volume" - # AI Translated msgid "Ramming line" msgstr "Ramminglijn" @@ -13716,6 +13891,120 @@ msgstr "Inloggen mislukt. Probeer het opnieuw." msgid "parse json failed" msgstr "json parsen mislukt" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "Klaar" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Aangepaste printer" + +msgid "Create" +msgstr "Creëren" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "Filamenttype" + +msgid "Vendor" +msgstr "Leverancier" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "Alles wissen" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Hiermee worden alle cloudfuncties uitgeschakeld, inclusief het synchroniseren van Orca Cloud-profielen. Gebruikers die volledig offline willen werken, kunnen deze optie inschakelen." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Let op: wanneer de Stealth-modus is ingeschakeld, worden uw gebruikersprofielen niet geback-upt naar Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + # AI Translated msgid "[Action Required] " msgstr "[Actie vereist] " @@ -14208,6 +14497,14 @@ msgstr "Filament-G-code bij wijzigen van extrusietype" msgid "No object can be printed. It may be too small." msgstr "Er kunnen geen objecten geprint worden. Het kan zijn dat ze te klein zijn." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Uw print is dichtbij de afveeggebieden. Let op dat dit geen botsingen veroorzaakt." @@ -14385,6 +14682,26 @@ msgstr "Valideren is mislukt" msgid "write callback failed" msgstr "callback schrijven is mislukt" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% bevindt zich te dicht bij het uitsluitingsgebied. Er kunnen botsingen optreden tijdens het afdrukken." @@ -14440,6 +14757,43 @@ msgstr "Als u toch wilt printen, kunt u de optie inschakelen via Voorkeuren / Be msgid "No extrusions under current settings." msgstr "Geen extrusion onder de huidige instellingen" +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Er wordt een gemengd filament met verloop gebruikt, maar 'Sublaag met gemengde kleur' is uitgeschakeld. Het verloop wordt niet geprint." @@ -14451,6 +14805,15 @@ msgstr "Vloeiende modus van timelapse wordt niet ondersteund wanneer \"per objec msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Klontdetectie wordt niet ondersteund wanneer de volgorde \"per object\" is ingeschakeld." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Het inschakelen van zowel precieze Z-hoogte als de spoeltoren kan slicefouten veroorzaken." @@ -14469,11 +14832,6 @@ msgstr "Spiraal (vaas) modus werkt niet als een object meer dan 1 filament beval msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Hoewel object %1% zelf binnen het bouwvolume past, overschrijdt het de maximale hoogte van het bouwvolume vanwege de compensatie voor materiaalkrimp." -# AI Translated -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Object %1% overschrijdt de maximale hoogte van het bouwvolume." - # AI Translated #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." @@ -14483,6 +14841,11 @@ msgstr "Hoewel object %1% zelf binnen het bouwvolume past, overschrijdt de laats msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Verklein eventueel uw model of wijzig de huidige printinstellingen en probeer het opnieuw." +# AI Translated +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Object %1% overschrijdt de maximale hoogte van het bouwvolume." + msgid "Variable layer height is not supported with Organic supports." msgstr "Variabele laaghoogte wordt niet ondersteund met organische steunen." @@ -15551,6 +15914,30 @@ msgstr "Snelheid van interne bruggen. Als de waarde als percentage wordt uitgedr msgid "This is the distance from the model to the outermost brim line." msgstr "Dit is de afstand van het model tot de buitenste randlijn." +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Rand type" @@ -15558,6 +15945,9 @@ msgstr "Rand type" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Dit regelt het genereren van de rand aan de buiten- en/of binnenzijde van modellen. Auto betekent dat de randbreedte automatisch wordt geanalyseerd en berekend." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Ruimte tussen rand en object" @@ -16864,9 +17254,6 @@ msgstr "Filament prijs. Alleen voor statistieken" msgid "money/kg" msgstr "Prijs per KG" -msgid "Vendor" -msgstr "Leverancier" - msgid "Vendor of filament. For show only." msgstr "Verkoper van filament. Alleen voor show" @@ -16948,6 +17335,66 @@ msgstr "Vulling met meerdere lijnen" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Meerdere lijnen gebruiken voor het vulpatroon, als het vulpatroon dit ondersteunt." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Lineair" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Optimalisatie van de Z-knikbelasting (experimenteel)" @@ -19476,6 +19923,99 @@ msgstr "Multi-material met één extruder" msgid "Use single nozzle to print multi filament." msgstr "Gebruik één mondstuk om met meerdere filamenten te printen." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + # AI Translated msgid "Manual Filament Change" msgstr "Handmatige filamentwissel" @@ -19885,6 +20425,130 @@ msgstr "Drempeloverlap" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Als de drempelhoek nul is, wordt er ondersteuning gegenereerd voor overhangen waarvan de overlap onder de drempelwaarde ligt. Hoe kleiner deze waarde is, hoe steiler de overhang die zonder ondersteuning kan worden geprint." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Tree support vertakkingshoek" @@ -20088,17 +20752,11 @@ msgstr "Het aantal bovenste solide lagen wordt verhoogd tijdens het slicen als d msgid "Separated infills" msgstr "Gescheiden vullingen" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Centreert de interne vulling van elk onderdeel op zichzelf, alsof het afzonderlijk was geslicet, in plaats van op het geheel. Onderdelen die elkaar raken of overlappen worden als één lichaam behandeld en delen een middelpunt; losse onderdelen (of afzonderlijke 3D-objecten) krijgen elk hun eigen middelpunt.\n" -"Nuttig wanneer een samenstelling meerdere objecten groepeert die elk een consistente, op zichzelf gecentreerde vulling moeten houden.\n" -"Heeft invloed op lijn- en rasterpatronen en op vullingen met rotatiesjablonen.\n" -"Patronen die aan globale coördinaten vastzitten (Gyroide, Honeycomb, TPMS, ...) worden niet beïnvloed." # AI Translated msgid "Center surface pattern on" @@ -20357,6 +21015,12 @@ msgstr "Het purgen na het verwisselen van het filament vindt plaats in de onders msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Dit object wordt gebruikt om het mondstuk te reinigen nadat het filament is vervangen om filament te besparen en de printtijd te verkorten. Als resultaat worden de kleuren van de objecten gemengd. Het wordt niet van kracht tenzij de prime toren is ingeschakeld." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Maximale brugafstand" @@ -21398,9 +22062,8 @@ msgstr "Naam van de fysieke printer die voor het slicen is gebruikt." msgid "Layer number" msgstr "Laagnummer" -# AI Translated -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Index van de huidige laag. Eengebaseerd (de eerste laag is dus nummer 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" # AI Translated msgid "Layer Z" @@ -21571,9 +22234,6 @@ msgstr "Herkalibratie" msgid "Calibrate" msgstr "Kalibreren" -msgid "Finish" -msgstr "Klaar" - msgid "How can I use calibration results?" msgstr "Hoe kan ik kalibratieresultaten gebruiken?" @@ -22138,12 +22798,12 @@ msgstr "" "Versnellingswaarden moeten groter zijn dan snelheidswaarden.\n" "Controleer de invoer." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Temperatuurkalibratie" -msgid "Filament type" -msgstr "Filamenttype" - msgid "PLA" msgstr "PLA" @@ -22165,6 +22825,13 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +# AI Translated +msgid "Test model" +msgstr "Testmodel" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Starttemp:" @@ -22293,10 +22960,6 @@ msgstr "Begin terugtreklengte:" msgid "End retraction length: " msgstr "Beëindig terugtreklengte: " -# AI Translated -msgid "Test model" -msgstr "Testmodel" - # AI Translated msgid "Ringing Tower" msgstr "Ringing-toren" @@ -22786,9 +23449,6 @@ msgstr "bijv. Basic, Mat, Zijde, Marmer" msgid "Filament Preset" msgstr "Filament voorinstelling" -msgid "Create" -msgstr "Creëren" - # AI Translated msgid "Vendor is not selected; please reselect vendor." msgstr "Er is geen leverancier geselecteerd; selecteer de leverancier opnieuw." @@ -23117,6 +23777,9 @@ msgstr "" "De printer en alle filament- en procesvoorinstellingen die bij de printer horen.\n" "Kan met anderen worden gedeeld." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -23944,9 +24607,6 @@ msgstr "Wijs filament handmatig toe aan het linker- of rechtermondstuk" msgid "Global settings" msgstr "Globale instellingen" -msgid "Video tutorial" -msgstr "Instructie video" - # AI Translated msgid "(Sync with printer)" msgstr "(Synchroniseren met printer)" @@ -24442,6 +25102,33 @@ msgstr "Indien ingeschakeld worden de bovenstaande waarden opgeslagen als standa msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "De bundelmap bestaat niet." @@ -24486,6 +25173,12 @@ msgstr "Abonnement op bundel opzeggen" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "Voorinstellingenbundel opslaan" @@ -28928,214 +29621,6 @@ msgstr "Dit lettertype heeft geen omtrek voor deze tekst" msgid "Size: %.1f × %.1f mm" msgstr "Grootte: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitief" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Lege mesh gegenereerd" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Blok" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Snel:" - -# AI Translated -msgid "Width (X)" -msgstr "Breedte (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Diepte (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Hoogte (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R onder" - -# AI Translated -msgid "Top R" -msgstr "R boven" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "Grote R" - -# AI Translated -msgid "Minor R" -msgstr "Kleine R" - -# AI Translated -msgid "All edges" -msgstr "Alle randen" - -# AI Translated -msgid "Top edges" -msgstr "Bovenranden" - -# AI Translated -msgid "Bottom edges" -msgstr "Onderranden" - -# AI Translated -msgid "Lateral edges" -msgstr "Zijranden" - -# AI Translated -msgid "Mesh resolution" -msgstr "Meshresolutie" - -# AI Translated -msgid "Add Shape" -msgstr "Vorm toevoegen" - -# AI Translated -msgid "No outer profile" -msgstr "Geen buitenprofiel" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Kan het buitenvlak niet maken" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Kan het vlak met gaten niet opbouwen" - -# AI Translated -msgid "Revolve failed" -msgstr "Wentelen mislukt" - -# AI Translated -msgid "Profile" -msgstr "Profiel" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Nieuw profiel beginnen (voor gaten)" - -# AI Translated -msgid "Segments" -msgstr "Segmenten" - -# AI Translated -msgid "Sides" -msgstr "Zijden" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Klik op het canvas om te tekenen" - -# AI Translated -msgid "Snap to grid" -msgstr "Uitlijnen op raster" - -# AI Translated -msgid "Grid step" -msgstr "Rasterstap" - -# AI Translated -msgid "Outer" -msgstr "Buiten" - -# AI Translated -msgid "closed" -msgstr "gesloten" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% punten %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (boven)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (voor)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (zijkant)" - -# AI Translated -msgid "Revolve deg" -msgstr "Wentelhoek (°)" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Zet op 0 om te extruderen, >0 om te wentelen" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Uitsparing (snijden)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu gesloten profiel" -msgstr[1] "%zu gesloten profielen" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Teken een gesloten profiel om dit in te schakelen" - -# AI Translated -msgid "Clear all" -msgstr "Alles wissen" - -# AI Translated -msgid "Empty result" -msgstr "Leeg resultaat" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Extruderen: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Wentelen: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Geen object geselecteerd" - -# AI Translated -msgid "Face failed" -msgstr "Vlak mislukt" - -# AI Translated -msgid "Face with holes failed" -msgstr "Vlak met gaten mislukt" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Gereedschapsmesh leeg" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Uitsparing toegevoegd (negatief volume)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Uitsparing: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -29260,6 +29745,9 @@ msgstr "Gizmo monteren" msgid "Gizmo brim ears" msgstr "Gizmo rand oren" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Verticale schuifregelaar - Actieve thumb omhoog bewegen" @@ -30246,10 +30734,6 @@ msgstr "Mijn instellingen" msgid "Custom Printer Setup" msgstr "Aangepaste printer instellen" -# AI Translated -msgid "Custom Printer" -msgstr "Aangepaste printer" - # AI Translated msgid "Define a custom printer profile" msgstr "Een aangepast printerprofiel definiëren" @@ -30894,9 +31378,8 @@ msgstr "Hoekdrempel - het vullen stopt bij randen die scherper zijn dan deze waa msgid "Click a triangle to paint it" msgstr "Klik op een driehoek om deze te schilderen" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Vereist dat de actieve laag is toegewezen met Uitvouwen (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -30910,17 +31393,15 @@ msgstr "Snel - het reliëf wordt alleen met belichting weergegeven, niet opgebou msgid "Checker" msgstr "Dambord" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Dambord - een testraster in plaats van de textuur. Waar de vakjes vierkant blijven, is de textuur niet vervormd; waar ze uitrekken, rekt de textuur ook uit" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Vervorming" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Vervorming - heatmap van blauw tot rood die de uitrekking over de uitvouwing toont" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -31036,24 +31517,11 @@ msgstr "Filamenten mengen" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Wisselt twee filamenten af om de tussenliggende kleuren na te bootsen, zodat een handvol filamenten een foto of kleurverloop kan weergeven. Een afbeelding met egale kleuren print hoe dan ook hetzelfde. Uit gebruikt één filament per gebied." -# AI Translated -msgid "Mix by" -msgstr "Mengen per" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Oppervlak" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Lagen: de twee filamenten wisselen elkaar af tussen printlagen, wat vloeiend mengt op staande oppervlakken maar verdwijnt op horizontale oppervlakken, waar een hele laag één band is.\n" -"Oppervlak: een fijn dambordpatroon over het oppervlak, dat onder elke hoek werkt maar eerder als textuur dan als menging kan overkomen.\n" -"Automatisch: lagen op staande vlakken; horizontale vlakken krijgen het dichtstbijzijnde enkele filament, omdat een dambordpatroon daar als patroon zichtbaar wordt." # AI Translated #, boost-format @@ -31513,14 +31981,6 @@ msgstr "Vereist ongeveer %1% driehoeken, budget %2% - het bakken vereenvoudigt d msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Hoeveel duizend driehoeken de verfijning aan het model mag toevoegen. De driehoek die het slechtst past, wordt altijd eerst gesplitst, dus zelfs een run die alles opmaakt, heeft het besteed waar het het meest zichtbaar is. Verhoog het als het reliëf nog grof oogt." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Stopt het bakken. Wat al klaar was, blijft op het model en kan ongedaan worden gemaakt." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Sluit het gereedschap zonder te bakken. Uw schilderwerk, lagen en instellingen blijven bij het model." - # AI Translated msgid "Preparing..." msgstr "Voorbereiden..." @@ -31545,6 +32005,14 @@ msgstr "Zet de geschilderde hoogtekaarten om in echte geometrie door de bestaand msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Zet de geschilderde hoogtekaarten om in echte geometrie. De mesh wordt eerst geremesht tot een gelijkmatige dichtheid en verfijnd waar de textuur buigt, zodat het detail hoekpunten heeft om op te landen - alles in één stap." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Stopt het bakken. Wat al klaar was, blijft op het model en kan ongedaan worden gemaakt." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Sluit het gereedschap zonder te bakken. Uw schilderwerk, lagen en instellingen blijven bij het model." + # AI Translated #, boost-format msgid "%1% k" @@ -31761,6 +32229,28 @@ msgstr "Filamentplug-ins" msgid "Printer plugins" msgstr "Printerplug-ins" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Standaardwaarden herstellen" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "De configuratie is geen geldige JSON. Uw wijzigingen zijn niet opgeslagen." @@ -31780,10 +32270,6 @@ msgstr "" "\n" "Hiermee wordt de overschrijving in de voorinstelling verworpen en wordt de globale configuratie gebruikt." -# AI Translated -msgid "Restore defaults" -msgstr "Standaardwaarden herstellen" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Globale configuratie wordt gebruikt. Sla de voorinstelling op om dit permanent te maken." @@ -31853,6 +32339,215 @@ msgstr "Plug-in wordt geïnstalleerd" msgid "Installed \"%s\"." msgstr "\"%s\" geïnstalleerd." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -32069,6 +32764,54 @@ msgstr "Herladen van de plug-in is mislukt." msgid "Reloaded \"%s\"." msgstr "\"%s\" herladen." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "Instellingen spoelmodus" @@ -32093,6 +32836,16 @@ msgstr "Vermindert prime-afval en print sneller. Kan lichte kleurvermenging of k msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Er wordt al een opdracht uitgevoerd." @@ -32359,6 +33112,9 @@ msgstr " | snappen AAN" msgid "Change texture - choose another one from the texture library" msgstr "Textuur wijzigen - kies een andere uit de textuurbibliotheek" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Hoogtekaart - toon de textuur van de laag onder de eilanden" @@ -32391,17 +33147,14 @@ msgstr "Eilanden verbinden" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Leg de uitvouwing uit als een verbonden net: stukken die een rand delen, worden naast elkaar uitgevouwen (een kubus wordt een samenhangende uitslag in plaats van zes losse vierkanten). Het blijven afzonderlijke eilanden, dus u kunt ze daarna nog steeds met de hand verplaatsen." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Eiland - verplaats, roteer en schaal hele eilanden" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Hoekpunt - sleep hoekpunten om de vorm te wijzigen; Shift/Ctrl voor meervoudige selectie" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Rand - sleep randen om de vorm te wijzigen; Shift/Ctrl voor meervoudige selectie" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -32439,9 +33192,13 @@ msgstr "UV-bewerkingen wissen - verwerp alle handmatige verplaatsingen van hoekp msgid "Snap - stick islands together when dragging one against another" msgstr "Snappen - laat eilanden aan elkaar vastklikken wanneer u er een tegen een ander sleept" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Alle eilanden in beeld brengen (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -32452,6 +33209,9 @@ msgstr "Geen laag toegewezen met Uitvouwen" msgid "%.1f mm tile" msgstr "%.1f mm-tegel" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Verouderd - het schilderwerk, de naden of de naadhoek zijn gewijzigd sinds deze uitvouwing is gemaakt. Druk hierop om opnieuw uit te vouwen." @@ -32460,19 +33220,48 @@ msgstr "Verouderd - het schilderwerk, de naden of de naadhoek zijn gewijzigd sin msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Vouw het geschilderde gebied uit tot UV-eilanden. Dit wordt alleen berekend wanneer u hierop drukt, niet bij elke bewerking - schilder dus eerst, wijzig de naadhoek of markeer naden, en druk daarna op Uitvouwen." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d eilanden, %s vlakken" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + # AI Translated msgid "Forward" msgstr "Vooruit" -# AI Translated -msgid "Tools" -msgstr "Extra" - # AI Translated msgid "View Source" msgstr "Bron weergeven" @@ -32618,6 +33407,16 @@ msgstr "" "Plug-in \"%s\" vraagt om de volgende opdracht(en) uit te voeren:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -32627,6 +33426,30 @@ msgstr "Plug-in \"%s\" vraagt toestemming voor de Python-auditgebeurtenis \"%s\" msgid "Plugin permission request" msgstr "Toestemmingsverzoek van plug-in" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "De configuratie-UI van de plug-in was leeg. De standaardeditor wordt getoond." @@ -33214,6 +34037,320 @@ msgstr "" "Kromtrekken voorkomen\n" "Wist je dat bij het printen van materialen die gevoelig zijn voor kromtrekken, zoals ABS, een juiste verhoging van de temperatuur van het warmtebed de kans op kromtrekken kan verkleinen?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "De Microsoft WebView2 Runtime kon niet worden geïnstalleerd.\n" +#~ "Sommige functies, waaronder de installatiewizard, kunnen leeg blijven totdat deze is geïnstalleerd.\n" +#~ "Installeer deze handmatig via https://developer.microsoft.com/microsoft-edge/webview2/ en start Orca Slicer opnieuw." + +# AI Translated +#~ msgid "Why this grouping" +#~ msgstr "Waarom deze groepering" + +# AI Translated +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "De software ondersteunt het gebruik van mondstukken met verschillende diameters voor één print niet. Als het linker- en rechtermondstuk verschillen, kan er alleen met één printkop worden geprint. Bevestig welk mondstuk u voor dit project wilt gebruiken." + +# AI Translated +#~ msgid "Switch diameter" +#~ msgstr "Diameter wisselen" + +# AI Translated +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudio-project" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "Het 3MF-bestand is gemaakt door BambuStudio (versie %s), dat nieuwer is dan de compatibele versie %s. Er zijn niet-herkende instellingen gevonden:" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "Het 3MF-bestand is gemaakt door BambuStudio (versie %s), dat nieuwer is dan de compatibele versie %s. Sommige instellingen zijn mogelijk niet volledig compatibel." + +# AI Translated +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "Het 3MF-bestand is gemaakt door BambuStudio. Sommige instellingen kunnen afwijken van OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Ongedaan maken of opnieuw doen is niet mogelijk terwijl een bewerking bezig is. Stop deze eerst." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Centreert de interne vulling van elk onderdeel op zichzelf, alsof het afzonderlijk was geslicet, in plaats van op het geheel. Onderdelen die elkaar raken of overlappen worden als één lichaam behandeld en delen een middelpunt; losse onderdelen (of afzonderlijke 3D-objecten) krijgen elk hun eigen middelpunt.\n" +#~ "Nuttig wanneer een samenstelling meerdere objecten groepeert die elk een consistente, op zichzelf gecentreerde vulling moeten houden.\n" +#~ "Heeft invloed op lijn- en rasterpatronen en op vullingen met rotatiesjablonen.\n" +#~ "Patronen die aan globale coördinaten vastzitten (Gyroide, Honeycomb, TPMS, ...) worden niet beïnvloed." + +# AI Translated +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Index van de huidige laag. Eengebaseerd (de eerste laag is dus nummer 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Instructie video" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitief" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Lege mesh gegenereerd" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Blok" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Snel:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Breedte (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Diepte (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Hoogte (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R onder" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R boven" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "Grote R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "Kleine R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Alle randen" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Bovenranden" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Onderranden" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Zijranden" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Meshresolutie" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Vorm toevoegen" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Geen buitenprofiel" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Kan het buitenvlak niet maken" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Kan het vlak met gaten niet opbouwen" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Wentelen mislukt" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profiel" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Nieuw profiel beginnen (voor gaten)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmenten" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Zijden" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Klik op het canvas om te tekenen" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Uitlijnen op raster" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Rasterstap" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Buiten" + +# AI Translated +#~ msgid "closed" +#~ msgstr "gesloten" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% punten %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (boven)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (voor)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (zijkant)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Wentelhoek (°)" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Zet op 0 om te extruderen, >0 om te wentelen" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Uitsparing (snijden)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu gesloten profiel" +#~ msgstr[1] "%zu gesloten profielen" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Teken een gesloten profiel om dit in te schakelen" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Leeg resultaat" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Extruderen: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Wentelen: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Geen object geselecteerd" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Vlak mislukt" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Vlak met gaten mislukt" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Gereedschapsmesh leeg" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Uitsparing toegevoegd (negatief volume)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Uitsparing: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Vereist dat de actieve laag is toegewezen met Uitvouwen (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Dambord - een testraster in plaats van de textuur. Waar de vakjes vierkant blijven, is de textuur niet vervormd; waar ze uitrekken, rekt de textuur ook uit" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Vervorming - heatmap van blauw tot rood die de uitrekking over de uitvouwing toont" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Mengen per" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Oppervlak" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Lagen: de twee filamenten wisselen elkaar af tussen printlagen, wat vloeiend mengt op staande oppervlakken maar verdwijnt op horizontale oppervlakken, waar een hele laag één band is.\n" +#~ "Oppervlak: een fijn dambordpatroon over het oppervlak, dat onder elke hoek werkt maar eerder als textuur dan als menging kan overkomen.\n" +#~ "Automatisch: lagen op staande vlakken; horizontale vlakken krijgen het dichtstbijzijnde enkele filament, omdat een dambordpatroon daar als patroon zichtbaar wordt." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Eiland - verplaats, roteer en schaal hele eilanden" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Hoekpunt - sleep hoekpunten om de vorm te wijzigen; Shift/Ctrl voor meervoudige selectie" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Rand - sleep randen om de vorm te wijzigen; Shift/Ctrl voor meervoudige selectie" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Alle eilanden in beeld brengen (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Experimenteel) Printeragents gebruiken in plaats van printhosts" @@ -33247,16 +34384,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Klik op een vlak of een referentievlak en kies daarna een tekengereedschap" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -33313,10 +34440,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Verticale afstand" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Lineair" - #~ msgid "Face recognition" #~ msgstr "Gezichtsherkenning" @@ -34896,9 +36019,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "onderdeel selectie" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/pl/OrcaSlicer_pl.po b/localization/i18n/pl/OrcaSlicer_pl.po index 66bd86e2e6..704d351e22 100644 --- a/localization/i18n/pl/OrcaSlicer_pl.po +++ b/localization/i18n/pl/OrcaSlicer_pl.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer 2.3.0-rc\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: \n" "Last-Translator: Krzysztof Morga <>\n" "Language-Team: \n" @@ -2172,15 +2172,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Nie udało się zainstalować Microsoft WebView2 Runtime.\n" -"Niektóre funkcje, w tym kreator konfiguracji, mogą być puste do czasu jego zainstalowania.\n" -"Zainstaluj go ręcznie ze strony https://developer.microsoft.com/microsoft-edge/webview2/ i uruchom ponownie Orca Slicer." # AI Translated #, c-format, boost-format @@ -4388,6 +4385,10 @@ msgstr "Przejdź do płyty" msgid "AMS Materials Setting" msgstr "Ustawienia filamentów AMS" +# AI Translated +msgid "Wiki Guide" +msgstr "Przewodnik Wiki" + msgid "Close" msgstr "Zamknij" @@ -4413,10 +4414,6 @@ msgstr "Wartość wejściowa powinna być większa niż %1% i mniejsza niż %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "współczynnik kalibracji dynamiki przepływu" -# AI Translated -msgid "Wiki Guide" -msgstr "Przewodnik Wiki" - msgid "PA Profile" msgstr "Profil PA" @@ -4507,7 +4504,7 @@ msgstr "Zapisz" msgctxt "Navigation" msgid "Back" -msgstr "Tył" +msgstr "Wstecz" msgid "Example" msgstr "Przykład" @@ -5014,6 +5011,11 @@ msgstr "Dostosować ją automatycznie do limitu (%g mm)?" msgid "Adjust" msgstr "Dostosuj" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5869,9 +5871,6 @@ msgstr "Automatyczne ponowne cięcie zgodnie z optymalnym grupowaniem filamentu, msgid "Filament Grouping" msgstr "Grupowanie filamentów" -msgid "Why this grouping" -msgstr "Dlaczego tak jest zgrupowane" - msgid "Please place filaments on the printer based on grouping result." msgstr "Umieść filamenty w drukarce zgodnie z wynikiem grupowania." @@ -6062,6 +6061,43 @@ msgstr "Zwiększ/zmniejsz obszar edycji" msgid "Sequence" msgstr "Kolejność" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Objętość" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + # AI Translated msgid "Object selection" msgstr "Wybór obiektu" @@ -6290,6 +6326,12 @@ msgstr "Linie siatki" msgid "Labels" msgstr "Etykiety" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Przesuń płaszczyznę przekroju" @@ -6338,7 +6380,7 @@ msgstr "Objętość:" msgid "Size:" msgstr "Rozmiar:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Wykryto konflikty ścieżek G-code na warstwie %d, Z = %.2lfmm. Proszę oddalić od siebie obiekty będące w konflikcie (%s <-> %s)." @@ -6820,6 +6862,12 @@ msgstr "Pokaż linie siatki" msgid "Show Gridlines on plate" msgstr "Pokaż linie siatki na płycie" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Przywróć układ okna" @@ -8546,6 +8594,61 @@ msgstr "Wyświetl wszystkie ustawienia obiektów" msgid "Material settings" msgstr "Ustawienia materiału" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Narzędzia" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Usuń bieżący stół (jeśli nie jest ostatnim)" @@ -8570,6 +8673,17 @@ msgstr "Edytuj aktualną nazwę płyty" msgid "Move plate to the front" msgstr "Umieść płytę jako pierwszą" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Dostosuj bieżący stół" @@ -8636,13 +8750,6 @@ msgstr "AMS(1 gniazdo)" msgid "Not installed" msgstr "Nie zainstalowano" -# AI Translated -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Oprogramowanie nie obsługuje używania dysz o różnych średnicach w jednym druku. Jeśli lewa i prawa dysza są niezgodne, możemy kontynuować tylko druk jednogłowicowy. Potwierdź, której dyszy chcesz użyć w tym projekcie." - -msgid "Switch diameter" -msgstr "Zmiana średnicy" - msgid "Configuration incompatible" msgstr "Niekompatybilna konfiguracja" @@ -8724,6 +8831,9 @@ msgstr "Filament mieszany" msgid "Remove last mixed filament" msgstr "Usuń ostatni filament mieszany" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Dodaj filament mieszany" @@ -8746,6 +8856,10 @@ msgstr "Filament mieszany ma uszkodzone odwołania do składników" msgid "Edit / Delete / Merge" msgstr "Edytuj / Usuń / Scal" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Docelowy filament mieszany używa tego fizycznego filamentu jako składnika. Scalenie usunie ten fizyczny filament i może unieważnić filament mieszany. Kontynuować?" @@ -8823,10 +8937,6 @@ msgstr "Wczytywanie pliku: %s" msgid "Load 3MF" msgstr "Wczytaj 3MF" -# AI Translated -msgid "BambuStudio Project" -msgstr "Projekt BambuStudio" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "Plik 3MF nie jest obsługiwany przez OrcaSlicer, wczytuj tylko dane geometrii." @@ -8860,20 +8970,6 @@ msgstr "Lepiej zaktualizuj swoje oprogramowanie.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "Wersja 3MF %s jest nowsza niż wersja %s %s, sugeruje się aktualizację oprogramowania." -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "Plik 3MF został utworzony przez BambuStudio (wersja %s), która jest nowsza niż zgodna wersja %s. Znaleziono nierozpoznane ustawienia:" - -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "Plik 3MF został utworzony przez BambuStudio (wersja %s), która jest nowsza niż zgodna wersja %s. Niektóre ustawienia mogą nie być w pełni zgodne." - -# AI Translated -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "Plik 3MF został utworzony przez BambuStudio. Niektóre ustawienia mogą różnić się od OrcaSlicer." - msgid "Invalid values found in the 3MF:" msgstr "Znaleziono nieprawidłowe wartości w pliku 3MF:" @@ -9046,6 +9142,12 @@ msgstr "Wyłączyć automatyczne opuszczanie, aby zachować pozycję Z?\n" msgid "Object with floating parts was detected" msgstr "Wykryto obiekt z unoszącymi się częściami" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Trwa inne eksportowanie." @@ -9138,6 +9240,38 @@ msgstr "Nieprawidłowe dane" msgid "Slicing Canceled" msgstr "Anulowano cięcie" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + # AI Translated msgid "Network plug-in switched successfully." msgstr "Wtyczka sieciowa została przełączona pomyślnie." @@ -9173,9 +9307,8 @@ msgstr "" msgid "Sync now" msgstr "Synchronizuj teraz" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Nie można cofnąć ani ponowić, gdy trwa operacja. Najpierw ją zatrzymaj." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9246,6 +9379,11 @@ msgstr "Nie udało się pobrać. Wyjątek rozmiaru pliku." msgid "Project downloaded %d%%" msgstr "Projekt pobrany w %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Test Pressure Advance" @@ -9273,6 +9411,13 @@ msgstr "Kalibracja przepływu Orca YOLO" msgid "Flowrate Test - Pass%d" msgstr "Test natężenia przepływu - przebieg %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Test temperatury dyszy" @@ -11837,6 +11982,9 @@ msgstr "Synchronizacja różnych napędów ekstrudera lub typów objętości dys msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Zsynchronizuj zmianę parametrów z odpowiadającymi parametrami drugiego ekstrudera." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Proszę kliknąć, aby przywrócić wszystkie ustawienia do ostatnio zapisanego profilu." @@ -12267,6 +12415,12 @@ msgstr "Przestrzeń do druku" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Wybierz implementację agenta sieciowego do komunikacji z drukarką. Dostępni agenci są rejestrowani przy uruchamianiu." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12387,9 +12541,24 @@ msgstr "Średnica dyszy" msgid "Wipe tower" msgstr "Wieża czyszcząca" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Parametry pojedynczego extrudera wielomateriałowego" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "To jest drukarka wielomateriałowa z jednym ekstruderem. Średnice wszystkich ekstruderów zostaną ustawione na nową wartość. Czy kontynuować?" @@ -12399,6 +12568,18 @@ msgstr "Ograniczenia wysokości warstwy" msgid "Z-Hop" msgstr "Z-Hop" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12516,10 +12697,9 @@ msgstr "Kontynuacja" msgid "Don't warn again for this preset" msgstr "Nie ostrzegaj ponownie dla tego profilu" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12954,9 +13134,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Całkowite ramming" -msgid "Volume" -msgstr "Objętość" - # AI Translated msgid "Ramming line" msgstr "Linia ramming" @@ -13009,6 +13186,118 @@ msgstr "Logowanie nie powiodło się. Spróbuj ponownie." msgid "parse json failed" msgstr "analiza pliku json nie powiodła się" +msgid "Loading…" +msgstr "Ładowanie trwa…" + +msgid "Welcome to Orca Slicer" +msgstr "Witamy w Orca Slicer" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer zostanie skonfigurowany w kilku krokach. Zacznijmy!" + +msgid "Get Started" +msgstr "Rozpocznij" + +msgid "Please select your login region" +msgstr "Proszę wybrać swój region logowania" + +msgid "Finish" +msgstr "Zakończ" + +msgid "Printer Selection" +msgstr "Wybór drukarki" + +msgid "Vendors" +msgstr "" + +msgid "Custom Printer" +msgstr "Niestandardowa drukarka" + +msgid "Create" +msgstr "Utwórz" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "Przynajmniej jedna drukarka musi być wybrana." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Wybór filamentu" + +msgid "System Filaments" +msgstr "Systemowe filamenty" + +msgid "Custom Filaments" +msgstr "Niestandardowe filamenty" + +msgid "Create New" +msgstr "Utwórz nowy" + +msgid "Filament type" +msgstr "Rodzaj filamentu" + +msgid "Vendor" +msgstr "Dostawca" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "Wyczyść wszystko" + +msgid "At least one filament must be selected." +msgstr "Przynajmniej jeden filament musi być wybrany." + +msgid "Do you want to use the default filament?" +msgstr "Czy chcesz użyć domyślnego filamentu?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Wyłącza wszystkie funkcje chmurowe, w tym synchronizację profili Orca Cloud. Użytkownicy, którzy wolą pracować całkowicie offline, mogą włączyć tę opcję." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Uwaga: gdy tryb Stealth jest włączony, Twoje profile użytkownika nie będą kopiowane do Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "Włącz tryb «Niewidzialny»" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "Niektórzy dostawcy drukarek wymagają własnych wtyczek do komunikacji ze swoimi drukarkami. Proszę wybrać odpowiednią wtyczkę, jeśli korzystasz z takich drukarek." + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "Proszę mieć świadomość, że te wtyczki nie są rozwijane ani utrzymywane przez OrcaSlicer. Powinny być używane na własne ryzyko i z rozwagą." + +msgid "Install Bambu Network plug-in" +msgstr "Zainstaluj wtyczkę Bambu Network" + # AI Translated msgid "[Action Required] " msgstr "[Wymagane działanie] " @@ -13479,6 +13768,14 @@ msgstr "G-code zmiany trybu ekstruzji (filament)" msgid "No object can be printed. It may be too small." msgstr "Żaden obiekt nie może być wydrukowany. Może jest za mały" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Twój wydruk znajduje się bardzo blisko obszaru czyszczenia dyszy. Upewnij się, że nie dojdzie do kolizji." @@ -13654,6 +13951,26 @@ msgstr "niepowodzenie weryfikacji" msgid "write callback failed" msgstr "błąd zapisu funkcji zwrotnej" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% jest zbyt blisko obszaru wykluczenia, mogą wystąpić kolizje podczas drukowania." @@ -13707,6 +14024,43 @@ msgstr "Jeśli mimo to chcesz drukować, możesz włączyć opcję w Preferencje msgid "No extrusions under current settings." msgstr "Brak ekstruzji przy obecnych ustawieniach." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Używany jest filament mieszany z gradientem, ale opcja 'Podwarstwa mieszanego koloru' jest wyłączona. Gradient nie zostanie wydrukowany." @@ -13717,6 +14071,15 @@ msgstr "Tryb „Wygładzony” timelapse nie jest obsługiwany, gdy włączona j msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "W trybie drukowania \"według obiektu\" funkcja wykrywania zalepienia dyszy nie działa." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + # AI Translated msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Jednoczesne włączenie precyzyjnej wysokości Z i wieży czyszczącej może powodować błędy cięcia." @@ -13735,10 +14098,6 @@ msgstr "Tryb „Wazy” nie działa, gdy obiekt zawiera więcej niż jeden filam msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Chociaż obiekt %1% mieści się w objętości roboczej, przekracza maksymalną jej wysokość z powodu kompensacji skurczu materiału." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Obiekt %1% przekracza maksymalną wysokość objętości budowy." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Podczas gdy sam obiekt %1% mieści się w przestrzeni roboczej, jego ostatnia warstwa przekracza maksymalną wysokość przestrzeni roboczej." @@ -13746,6 +14105,10 @@ msgstr "Podczas gdy sam obiekt %1% mieści się w przestrzeni roboczej, jego ost msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Może być konieczne zmniejszenie rozmiaru modelu lub zmiana bieżących ustawień druku i ponowienie próby." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Obiekt %1% przekracza maksymalną wysokość objętości budowy." + msgid "Variable layer height is not supported with Organic supports." msgstr "Zmienna wysokość warstwy nie jest dostępna w przypadku podpór organicznych." @@ -14757,12 +15120,39 @@ msgstr "Prędkość wewnętrznych mostów. Jeśli wartość jest wyrażona w pro msgid "This is the distance from the model to the outermost brim line." msgstr "Odległość od modelu do najbardziej zewnętrznej linii brimu" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Rodzaj brimu" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "To kontroluje generowanie brimu na zewnętrznej i/lub wewnętrznej stronie modeli. Auto oznacza, że szerokość Brimu jest analizowana i obliczana automatycznie." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Odstęp brimu od obiektu" @@ -15966,9 +16356,6 @@ msgstr "Cena filamentu. Tylko do celów statystycznych" msgid "money/kg" msgstr "zł/kg" -msgid "Vendor" -msgstr "Dostawca" - msgid "Vendor of filament. For show only." msgstr "Dostawca filamentu. Tylko do celów prezentacyjnych" @@ -16045,6 +16432,66 @@ msgstr "Wypełnienie wielolinijkowe" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Wypełnienie przy użyciu wielu linii, jeśli jest to obsługiwane przez wybrany wzór wypełnienia." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Liniowy" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Optymalizacja odporności na wyboczenie w osi Z (eksperymentalne)" @@ -18367,6 +18814,99 @@ msgstr "Pojedynczy extruder wielomateriałowy" msgid "Use single nozzle to print multi filament." msgstr "Użyj pojedynczej dyszy do drukowania wieloma filamentami" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Ręczna zmiana filamentu" @@ -18758,6 +19298,130 @@ msgstr "Próg nakładania" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Ustala próg nakładania się obwodów dla generowania podpór. Jeśli „Kąt progowy podpory” wynosi zero, podpory będą tworzone dla wiszących obszarów, gdzie górny obwód opiera się na dolnym w mniej niż zadanym procencie szerokości. Im mniejsza wartość tego parametru, tym ostrzejsze nawisy można wydrukować bez podpór." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Kąt nachylenia gałęzi" @@ -18944,17 +19608,11 @@ msgstr "Liczba górnych zwartych warstw jest zwiększana podczas cięcia, jeśli msgid "Separated infills" msgstr "Oddzielne wypełnienia" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Centruje wewnętrzne wypełnienie każdej części na niej samej, tak jakby była cięta osobno, zamiast na całym złożeniu. Części stykające się lub nakładające są traktowane jako jedna bryła i mają wspólny środek; oddzielne części (lub odrębne obiekty 3D) mają własne środki.\n" -"Przydatne, gdy złożenie grupuje kilka obiektów, z których każdy powinien zachować spójne, wycentrowane względem siebie wypełnienie.\n" -"Dotyczy wzorów liniowych i siatkowych oraz wypełnień z szablonem obrotu.\n" -"Wzory powiązane ze współrzędnymi globalnymi (Gyroidalny, Plaster miodu, TPMS, ...) pozostają bez zmian." # AI Translated msgid "Center surface pattern on" @@ -19197,6 +19855,12 @@ msgstr "Po zmianie filamentu oczyszczanie odbywa się wewnątrz podpór obiektó msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "To jest obiekt wykorzystywany do oczyszczenia dyszy po zmianie filamentu, co pozwala zaoszczędzić filament i skrócić czas druku. W wyniku tego procesu kolory filamentów mogą się wymieszać." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Maksymalna odległość mostów" @@ -20110,8 +20774,8 @@ msgstr "Nazwa fizycznej drukarki używanej do przygotowywania pliku do druku." msgid "Layer number" msgstr "Numer warstwy" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Indeks aktualnej warstwy uwzględniający zero (pierwsza warstwa ma wartość 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Warstwa Z" @@ -20255,9 +20919,6 @@ msgstr "Rekalibracja" msgid "Calibrate" msgstr "Kalibruj" -msgid "Finish" -msgstr "Zakończ" - msgid "How can I use calibration results?" msgstr "Jak używać wyniku kalibracji?" @@ -20800,12 +21461,12 @@ msgstr "" "Wartości przyspieszenia muszą być większe niż wartości prędkości.\n" "Sprawdź wprowadzone dane." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Kalibracja temperatury" -msgid "Filament type" -msgstr "Rodzaj filamentu" - msgid "PLA" msgstr "PLA" @@ -20827,6 +21488,13 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +# AI Translated +msgid "Test model" +msgstr "Model testowy" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Temp. początkowa: " @@ -20953,10 +21621,6 @@ msgstr "Długość retrakcji na początku: " msgid "End retraction length: " msgstr "Długość retrakcji na końcu: " -# AI Translated -msgid "Test model" -msgstr "Model testowy" - # AI Translated msgid "Ringing Tower" msgstr "Ringing Tower" @@ -21441,9 +22105,6 @@ msgstr "np. Basic, Matte, Silk, Marble" msgid "Filament Preset" msgstr "Ustawienie profilu filamentu" -msgid "Create" -msgstr "Utwórz" - msgid "Vendor is not selected; please reselect vendor." msgstr "Dostawca nie jest wybrany, proszę ponownie wybrać producenta." @@ -21756,6 +22417,9 @@ msgstr "" "Profil drukarki oraz wszystkie ustawienia filamentu i procesu, które do niej należą.\n" "Można je udostępniać innym osobom." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -22525,9 +23189,6 @@ msgstr "Ręcznie przypisz filament do lewej lub prawej dyszy" msgid "Global settings" msgstr "Ustawienia globalne" -msgid "Video tutorial" -msgstr "Samouczek wideo" - msgid "(Sync with printer)" msgstr "(Synchronizuj z drukarką)" @@ -22995,6 +23656,33 @@ msgstr "Jeśli opcja jest włączona, powyższe wartości są zapisywane jako do msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "Folder pakietu nie istnieje." @@ -23039,6 +23727,12 @@ msgstr "Anuluj subskrypcję pakietu" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "Zapisz pakiet profili" @@ -27480,215 +28174,6 @@ msgstr "Ta czcionka nie ma konturu dla tego tekstu" msgid "Size: %.1f × %.1f mm" msgstr "Rozmiar: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Prymityw" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Wygenerowano pustą siatkę" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Prostopadłościan" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Szybki wybór:" - -# AI Translated -msgid "Width (X)" -msgstr "Szerokość (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Głębokość (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Wysokość (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R dolny" - -# AI Translated -msgid "Top R" -msgstr "R górny" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "R większy" - -# AI Translated -msgid "Minor R" -msgstr "R mniejszy" - -# AI Translated -msgid "All edges" -msgstr "Wszystkie krawędzie" - -# AI Translated -msgid "Top edges" -msgstr "Górne krawędzie" - -# AI Translated -msgid "Bottom edges" -msgstr "Dolne krawędzie" - -# AI Translated -msgid "Lateral edges" -msgstr "Boczne krawędzie" - -# AI Translated -msgid "Mesh resolution" -msgstr "Rozdzielczość siatki" - -# AI Translated -msgid "Add Shape" -msgstr "Dodaj kształt" - -# AI Translated -msgid "No outer profile" -msgstr "Brak profilu zewnętrznego" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Nie udało się utworzyć powierzchni zewnętrznej" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Nie udało się zbudować powierzchni z otworami" - -# AI Translated -msgid "Revolve failed" -msgstr "Obrót nie powiódł się" - -# AI Translated -msgid "Profile" -msgstr "Profil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Rozpocznij nowy profil (dla otworów)" - -# AI Translated -msgid "Segments" -msgstr "Segmenty" - -# AI Translated -msgid "Sides" -msgstr "Boki" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Kliknij w widoku, aby rysować" - -# AI Translated -msgid "Snap to grid" -msgstr "Przyciągaj do siatki" - -# AI Translated -msgid "Grid step" -msgstr "Krok siatki" - -# AI Translated -msgid "Outer" -msgstr "Zewnętrzny" - -# AI Translated -msgid "closed" -msgstr "zamknięty" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% pkt %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (góra)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (przód)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (bok)" - -# AI Translated -msgid "Revolve deg" -msgstr "Obrót (°)" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Ustaw 0 dla wyciągnięcia, >0 dla obrotu" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Kieszeń (wycięcie)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu zamknięty profil" -msgstr[1] "%zu zamknięte profile" -msgstr[2] "%zu zamkniętych profili" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Narysuj zamknięty profil, aby włączyć" - -# AI Translated -msgid "Clear all" -msgstr "Wyczyść wszystko" - -# AI Translated -msgid "Empty result" -msgstr "Pusty wynik" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Wyciągnięcie: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Obrót: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Nie wybrano obiektu" - -# AI Translated -msgid "Face failed" -msgstr "Nie udało się utworzyć powierzchni" - -# AI Translated -msgid "Face with holes failed" -msgstr "Nie udało się utworzyć powierzchni z otworami" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Siatka narzędzia jest pusta" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Dodano kieszeń (objętość ujemna)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Kieszeń: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27811,6 +28296,9 @@ msgstr "Gizmo montować" msgid "Gizmo brim ears" msgstr "Gizmo uszy brim" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Pionowy suwak - Przesuń aktywny punkt w górę" @@ -28766,9 +29254,6 @@ msgstr "Moje ustawienia" msgid "Custom Printer Setup" msgstr "Ustawienie Własnej Drukarki" -msgid "Custom Printer" -msgstr "Niestandardowa drukarka" - msgid "Define a custom printer profile" msgstr "Zdefiniuj własny profil drukarki" @@ -29369,9 +29854,8 @@ msgstr "Próg kąta - wypełnianie zatrzymuje się na krawędziach ostrzejszych msgid "Click a triangle to paint it" msgstr "Kliknij trójkąt, aby go pomalować" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Wymaga aktywnej warstwy z mapowaniem Rozwinięcie (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -29385,17 +29869,15 @@ msgstr "Szybki - relief jest tylko cieniowany, a nie budowany, i tylko dla edyto msgid "Checker" msgstr "Szachownica" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Szachownica - siatka testowa zamiast tekstury. Tam, gdzie kwadraty pozostają kwadratowe, tekstura nie jest zniekształcona; tam, gdzie się rozciągają, tekstura również się rozciągnie" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Zniekształcenie" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Zniekształcenie - mapa cieplna rozciągnięcia (od niebieskiego do czerwonego) na rozwinięciu" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -29511,24 +29993,11 @@ msgstr "Mieszaj filamenty" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Przeplata dwa filamenty, aby imitować kolory pośrednie, dzięki czemu kilka filamentów może odwzorować zdjęcie lub gradient. Obraz z jednolitymi kolorami drukuje się tak samo w obu przypadkach. Po wyłączeniu każdy obszar używa jednego filamentu." -# AI Translated -msgid "Mix by" -msgstr "Mieszaj według" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Powierzchnia" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Warstwy: dwa filamenty zmieniają się co warstwę druku, co daje płynne przejście na pionowych powierzchniach, ale zanika na powierzchniach skierowanych płasko, gdzie cała warstwa jest jednym pasem.\n" -"Powierzchnia: drobna szachownica na powierzchni, która działa pod każdym kątem, ale może być odbierana jako tekstura, a nie jako mieszanie kolorów.\n" -"Automatyczny: warstwy na pionowych ścianach; ściany skierowane płasko otrzymują najbliższy pojedynczy filament, ponieważ szachownica jest tam widoczna jako wzór." # AI Translated #, boost-format @@ -29988,14 +30457,6 @@ msgstr "Wymaga ok. %1% trójkątów, budżet %2% - wypiekanie uprości siatkę i msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Ile tysięcy trójkątów zagęszczanie może dodać do modelu. Najgorzej dopasowany trójkąt jest zawsze dzielony jako pierwszy, więc nawet przebieg, który wykorzysta cały budżet, wyda go tam, gdzie jest to najbardziej widoczne. Zwiększ, jeśli relief nadal wygląda zgrubnie." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Zatrzymuje wypiekanie. To, co zostało już ukończone, pozostaje na modelu i można to cofnąć." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Zamyka narzędzie bez wypiekania. Malowanie, warstwy i ustawienia pozostają przy modelu." - # AI Translated msgid "Preparing..." msgstr "Przygotowywanie..." @@ -30020,6 +30481,14 @@ msgstr "Zamienia pomalowane mapy wysokości w rzeczywistą geometrię, przesuwaj msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Zamienia pomalowane mapy wysokości w rzeczywistą geometrię. Siatka jest najpierw przebudowywana do równomiernej gęstości i zagęszczana tam, gdzie tekstura się zagina, aby szczegóły miały wierzchołki, na których mogą się oprzeć - wszystko w jednym kroku." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Zatrzymuje wypiekanie. To, co zostało już ukończone, pozostaje na modelu i można to cofnąć." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Zamyka narzędzie bez wypiekania. Malowanie, warstwy i ustawienia pozostają przy modelu." + # AI Translated #, boost-format msgid "%1% k" @@ -30229,6 +30698,28 @@ msgstr "Wtyczki filamentu" msgid "Printer plugins" msgstr "Wtyczki drukarki" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Przywróć domyślne" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Konfiguracja nie jest prawidłowym JSON. Zmiany nie zostały zapisane." @@ -30248,10 +30739,6 @@ msgstr "" "\n" "Spowoduje to odrzucenie nadpisania z profilu i użycie konfiguracji globalnej." -# AI Translated -msgid "Restore defaults" -msgstr "Przywróć domyślne" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Używana jest konfiguracja globalna. Zapisz profil, aby to zachować." @@ -30321,6 +30808,215 @@ msgstr "Instalowanie wtyczki" msgid "Installed \"%s\"." msgstr "Zainstalowano „%s”." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -30537,6 +31233,54 @@ msgstr "Nie udało się ponownie wczytać wtyczki." msgid "Reloaded \"%s\"." msgstr "Ponownie wczytano „%s”." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "Brak informacji o modelu" + +msgid "Edit Project Info" +msgstr "Edytuj informacje o projekcie" + +msgid "Model Information" +msgstr "Informacje o modelu" + +msgid "Accessories" +msgstr "Akcesoria" + +msgid "Profile Information" +msgstr "Informacje o profilu" + +msgid "Model name" +msgstr "Nazwa modelu" + +msgid "Created by" +msgstr "Utworzone przez" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "Opis modelu" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "Nazwa profilu" + +msgid "Profile Author" +msgstr "Autor profilu" + +msgid "Profile description" +msgstr "Opis profilu" + # AI Translated msgid "Purge Mode Settings" msgstr "Ustawienia trybu płukania" @@ -30561,6 +31305,16 @@ msgstr "Zmniejsza ilość odpadu z płukania i przyspiesza druk. Może powodowa msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Polecenie jest już uruchomione." @@ -30827,6 +31581,9 @@ msgstr " | przyciąganie WŁ." msgid "Change texture - choose another one from the texture library" msgstr "Zmień teksturę - wybierz inną z biblioteki tekstur" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Mapa wysokości - pokaż teksturę warstwy pod wyspami" @@ -30859,17 +31616,14 @@ msgstr "Połącz wyspy" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Układa rozwinięcie jako połączoną siatkę bryły: fragmenty, które dzielą krawędź, są rozkładane obok siebie (sześcian staje się połączoną siatką zamiast sześciu luźnych kwadratów). Pozostają osobnymi wyspami, więc nadal możesz później ręcznie przesunąć każdą z nich." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Wyspa - przesuwaj, obracaj i skaluj całe wyspy" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Wierzchołek - przeciągaj wierzchołki, aby zmienić kształt; Shift/Ctrl, aby zaznaczyć wiele" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Krawędź - przeciągaj krawędzie, aby zmienić kształt; Shift/Ctrl, aby zaznaczyć wiele" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30907,9 +31661,13 @@ msgstr "Wyczyść edycje UV - odrzuć wszystkie ręczne przesunięcia wierzchoł msgid "Snap - stick islands together when dragging one against another" msgstr "Przyciąganie - sklejaj wyspy podczas przeciągania jednej do drugiej" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Pokaż wszystkie wyspy (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30920,6 +31678,9 @@ msgstr "Brak warstwy z mapowaniem Rozwinięcie" msgid "%.1f mm tile" msgstr "Kafelek %.1f mm" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Nieaktualne - malowanie, szwy lub kąt szwu zmieniły się od utworzenia tego rozwinięcia. Naciśnij, aby rozwinąć ponownie." @@ -30928,19 +31689,48 @@ msgstr "Nieaktualne - malowanie, szwy lub kąt szwu zmieniły się od utworzenia msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Spłaszcz pomalowany obszar do wysp UV. Jest to obliczane tylko po naciśnięciu tego przycisku, a nie przy każdej edycji - więc najpierw maluj, zmień kąt szwu lub oznacz szwy, a następnie naciśnij Rozwiń." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "Wyspy: %d, ściany: %s" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Wtyczka Bambu Network nie wykryta. Kliknij tutaj aby zainstalować." + +msgid "Create new project" +msgstr "Utwórz nowy projekt" + +msgid "Recently opened" +msgstr "Ostatnio otwarte" + +msgid "Open Containing Folder" +msgstr "Otwórz folder zawierający" + # AI Translated msgid "Forward" msgstr "Dalej" -# AI Translated -msgid "Tools" -msgstr "Narzędzia" - msgid "View Source" msgstr "Zobacz źródło" @@ -31072,6 +31862,16 @@ msgstr "" "Wtyczka „%s” prosi o uruchomienie następujących poleceń:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -31081,6 +31881,30 @@ msgstr "Wtyczka „%s” prosi o uprawnienie do zdarzenia audytu Pythona „%s msgid "Plugin permission request" msgstr "Prośba wtyczki o uprawnienia" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Interfejs konfiguracji wtyczki był pusty. Wyświetlany jest domyślny edytor." @@ -31667,6 +32491,318 @@ msgstr "" "Unikaj odkształceń\n" "Czy wiesz, że podczas drukowania filamentami podatnymi na odkształcenia, takimi jak ABS, odpowiednie zwiększenie temperatury podgrzewanej płyty może zmniejszyć prawdopodobieństwo odkształceń?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Nie udało się zainstalować Microsoft WebView2 Runtime.\n" +#~ "Niektóre funkcje, w tym kreator konfiguracji, mogą być puste do czasu jego zainstalowania.\n" +#~ "Zainstaluj go ręcznie ze strony https://developer.microsoft.com/microsoft-edge/webview2/ i uruchom ponownie Orca Slicer." + +#~ msgid "Why this grouping" +#~ msgstr "Dlaczego tak jest zgrupowane" + +# AI Translated +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Oprogramowanie nie obsługuje używania dysz o różnych średnicach w jednym druku. Jeśli lewa i prawa dysza są niezgodne, możemy kontynuować tylko druk jednogłowicowy. Potwierdź, której dyszy chcesz użyć w tym projekcie." + +#~ msgid "Switch diameter" +#~ msgstr "Zmiana średnicy" + +# AI Translated +#~ msgid "BambuStudio Project" +#~ msgstr "Projekt BambuStudio" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "Plik 3MF został utworzony przez BambuStudio (wersja %s), która jest nowsza niż zgodna wersja %s. Znaleziono nierozpoznane ustawienia:" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "Plik 3MF został utworzony przez BambuStudio (wersja %s), która jest nowsza niż zgodna wersja %s. Niektóre ustawienia mogą nie być w pełni zgodne." + +# AI Translated +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "Plik 3MF został utworzony przez BambuStudio. Niektóre ustawienia mogą różnić się od OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Nie można cofnąć ani ponowić, gdy trwa operacja. Najpierw ją zatrzymaj." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Centruje wewnętrzne wypełnienie każdej części na niej samej, tak jakby była cięta osobno, zamiast na całym złożeniu. Części stykające się lub nakładające są traktowane jako jedna bryła i mają wspólny środek; oddzielne części (lub odrębne obiekty 3D) mają własne środki.\n" +#~ "Przydatne, gdy złożenie grupuje kilka obiektów, z których każdy powinien zachować spójne, wycentrowane względem siebie wypełnienie.\n" +#~ "Dotyczy wzorów liniowych i siatkowych oraz wypełnień z szablonem obrotu.\n" +#~ "Wzory powiązane ze współrzędnymi globalnymi (Gyroidalny, Plaster miodu, TPMS, ...) pozostają bez zmian." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Indeks aktualnej warstwy uwzględniający zero (pierwsza warstwa ma wartość 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Samouczek wideo" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Prymityw" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Wygenerowano pustą siatkę" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Prostopadłościan" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Szybki wybór:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Szerokość (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Głębokość (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Wysokość (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R dolny" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R górny" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "R większy" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "R mniejszy" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Wszystkie krawędzie" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Górne krawędzie" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Dolne krawędzie" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Boczne krawędzie" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Rozdzielczość siatki" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Dodaj kształt" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Brak profilu zewnętrznego" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Nie udało się utworzyć powierzchni zewnętrznej" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Nie udało się zbudować powierzchni z otworami" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Obrót nie powiódł się" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Rozpocznij nowy profil (dla otworów)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmenty" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Boki" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Kliknij w widoku, aby rysować" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Przyciągaj do siatki" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Krok siatki" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Zewnętrzny" + +# AI Translated +#~ msgid "closed" +#~ msgstr "zamknięty" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% pkt %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (góra)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (przód)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (bok)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Obrót (°)" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Ustaw 0 dla wyciągnięcia, >0 dla obrotu" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Kieszeń (wycięcie)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu zamknięty profil" +#~ msgstr[1] "%zu zamknięte profile" +#~ msgstr[2] "%zu zamkniętych profili" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Narysuj zamknięty profil, aby włączyć" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Pusty wynik" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Wyciągnięcie: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Obrót: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Nie wybrano obiektu" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Nie udało się utworzyć powierzchni" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Nie udało się utworzyć powierzchni z otworami" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Siatka narzędzia jest pusta" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Dodano kieszeń (objętość ujemna)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Kieszeń: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Wymaga aktywnej warstwy z mapowaniem Rozwinięcie (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Szachownica - siatka testowa zamiast tekstury. Tam, gdzie kwadraty pozostają kwadratowe, tekstura nie jest zniekształcona; tam, gdzie się rozciągają, tekstura również się rozciągnie" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Zniekształcenie - mapa cieplna rozciągnięcia (od niebieskiego do czerwonego) na rozwinięciu" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Mieszaj według" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Powierzchnia" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Warstwy: dwa filamenty zmieniają się co warstwę druku, co daje płynne przejście na pionowych powierzchniach, ale zanika na powierzchniach skierowanych płasko, gdzie cała warstwa jest jednym pasem.\n" +#~ "Powierzchnia: drobna szachownica na powierzchni, która działa pod każdym kątem, ale może być odbierana jako tekstura, a nie jako mieszanie kolorów.\n" +#~ "Automatyczny: warstwy na pionowych ścianach; ściany skierowane płasko otrzymują najbliższy pojedynczy filament, ponieważ szachownica jest tam widoczna jako wzór." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Wyspa - przesuwaj, obracaj i skaluj całe wyspy" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Wierzchołek - przeciągaj wierzchołki, aby zmienić kształt; Shift/Ctrl, aby zaznaczyć wiele" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Krawędź - przeciągaj krawędzie, aby zmienić kształt; Shift/Ctrl, aby zaznaczyć wiele" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Pokaż wszystkie wyspy (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Eksperymentalne) Używaj agentów drukarki zamiast serwerów druku" @@ -31700,16 +32836,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Kliknij powierzchnię lub płaszczyznę odniesienia, a następnie wybierz narzędzie rysowania" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31766,10 +32892,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Odległość pionowa" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Liniowy" - #~ msgid "Face recognition" #~ msgstr "Rozpoznawanie twarzy" @@ -33327,9 +34449,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "wybór części" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po index affa2aced8..57860cf67d 100644 --- a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po +++ b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2026-07-26 11:14-0300\n" "Last-Translator: Alexandre Folle de Menezes\n" "Language-Team: Portuguese, Brazilian\n" @@ -2068,14 +2068,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "Tempo de execução WebView2" +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Não foi possível instalar o Microsoft WebView2 Runtime.\n" -"Alguns recursos, incluindo o assistente de instalação, podem aparecer em branco até que ele seja instalado.\n" -"Por favor, instale-o manualmente de https://developer.microsoft.com/microsoft-edge/webview2/ e reinicie o OrcaSlicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4137,6 +4135,9 @@ msgstr "Ir para Placa" msgid "AMS Materials Setting" msgstr "Configuração de Materiais AMS" +msgid "Wiki Guide" +msgstr "Guia Wiki" + msgid "Close" msgstr "Fechar" @@ -4160,9 +4161,6 @@ msgstr "O valor de entrada deve ser maior que %1% e menor que %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "Fatores de Calibração de Dinâmica de Fluxo" -msgid "Wiki Guide" -msgstr "Guia Wiki" - msgid "PA Profile" msgstr "Perfil PA" @@ -4745,6 +4743,11 @@ msgstr "Ajustar automaticamente para o limite (%g mm)?" msgid "Adjust" msgstr "Ajustar" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5567,9 +5570,6 @@ msgstr "Refatiar automaticamente de acordo com o agrupamento ideal de filamentos msgid "Filament Grouping" msgstr "Agrupamento de Filamento" -msgid "Why this grouping" -msgstr "Motivo desse agrupamento" - msgid "Please place filaments on the printer based on grouping result." msgstr "Coloque os filamentos na impressora de acordo com o resultado do agrupamento." @@ -5754,6 +5754,43 @@ msgstr "Aumentar/diminuir área de edição" msgid "Sequence" msgstr "Sequência" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Volume" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Seleção de objeto" @@ -5964,6 +6001,12 @@ msgstr "Linhas da Grade" msgid "Labels" msgstr "Etiquetas" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Mover plano de seção" @@ -6012,7 +6055,7 @@ msgstr "Volume:" msgid "Size:" msgstr "Tamanho:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Foram encontrados conflitos de caminhos de G-code na camada %d, Z = %.2lfmm. Por favor, separe mais os objetos em conflito (%s <-> %s)." @@ -6478,6 +6521,12 @@ msgstr "Mostrar Linhas da Grade" msgid "Show Gridlines on plate" msgstr "Mostrar Linhas da Grade na placa" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Redefinir Layout da Janela" @@ -8099,6 +8148,61 @@ msgstr "Ver todas as configurações do objeto" msgid "Material settings" msgstr "Configurações de material" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Ferramentas" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Remover a placa atual (se não for o última)" @@ -8123,6 +8227,17 @@ msgstr "Editar nome da placa atual" msgid "Move plate to the front" msgstr "Mover placa para frente" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Personalizar a placa atual" @@ -8188,12 +8303,6 @@ msgstr "AMS(1 espaço)" msgid "Not installed" msgstr "Não instalado" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "O software não suporta o uso de bicos de diâmetros diferentes para uma mesma impressão. Se os bicos esquerdo e direito forem incompatíveis, só é possível prosseguir com a impressão com um único bico. Confirme qual bico você gostaria de usar para este projeto." - -msgid "Switch diameter" -msgstr "Trocar diâmetro" - msgid "Configuration incompatible" msgstr "Configuração incompatível" @@ -8269,6 +8378,9 @@ msgstr "Filamento Misto" msgid "Remove last mixed filament" msgstr "Remover o último filamento misto" +msgid "Remove all mixed filaments" +msgstr "" + msgid "Add mixed filament" msgstr "Adicionar filamento misto" @@ -8287,6 +8399,10 @@ msgstr "O filamento misto tem referências de componentes quebradas" msgid "Edit / Delete / Merge" msgstr "Editar / Excluir / Mesclar" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "O filamento misto de destino usa este filamento físico como componente. Mesclar removerá este filamento físico e poderá invalidar o filamento misto. Continuar?" @@ -8360,9 +8476,6 @@ msgstr "Carregando arquivo: %s" msgid "Load 3MF" msgstr "Carregar 3MF" -msgid "BambuStudio Project" -msgstr "Projeto Bambu Studio" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "O 3MF não é suportado pelo OrcaSlicer, carregando apenas dados de geometria." @@ -8392,17 +8505,6 @@ msgstr "Você deveria atualizar o seu software.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "A versão do 3MF %s é mais recente do que a versão do %s %s, sugerimos atualizar seu software." -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "O arquivo 3MF foi criado pelo Bambu Studio (versão %s), que é mais recente que a versão compatível %s. Configurações não reconhecidas encontradas:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "O arquivo 3MF foi criado pelo Bambu Studio (versão %s), que é mais recente que a versão compatível %s. Algumas configurações podem não ser compatíveis." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "O arquivo 3MF foi criado pelo Bambu Studio. Algumas configurações podem ser diferentes do OrcaSlicer." - msgid "Invalid values found in the 3MF:" msgstr "Valores inválidos encontrados no 3MF:" @@ -8565,6 +8667,12 @@ msgstr "Desativar a Soltura Automática para preservar o posicionamento Z?\n" msgid "Object with floating parts was detected" msgstr "Foi detectado um objeto com partes flutuantes" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Outro trabalho de exportação está em execução." @@ -8647,6 +8755,38 @@ msgstr "Dados inválidos" msgid "Slicing Canceled" msgstr "Fatiamento Cancelado" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Plug-in de rede alterado com sucesso." @@ -8678,9 +8818,8 @@ msgstr "" msgid "Sync now" msgstr "Sincronizar agora" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Não é possível desfazer ou refazer enquanto uma operação está em andamento. Interrompa-a primeiro." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -8747,6 +8886,11 @@ msgstr "Baixar falhou, erro no tamanho do arquivo." msgid "Project downloaded %d%%" msgstr "Projeto baixado %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Teste de Pressure Advance" @@ -8773,6 +8917,13 @@ msgstr "Calibração de fluxo Orca YOLO" msgid "Flowrate Test - Pass%d" msgstr "Teste de taxa de fluxo - Passo %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Teste de temperatura do bico" @@ -11117,6 +11268,9 @@ msgstr "A sincronização de diferentes acionamentos de extrusora ou tipos de vo msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Sincroniza a modificação de parâmetros com os parâmetros correspondentes de outra extrusora." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Clique para redefinir todas as configurações para a última predefinição salva." @@ -11521,6 +11675,12 @@ msgstr "Espaço de impressão" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Selecione a implementação do agente de rede para comunicação com a impressora. Os agentes disponíveis são registrados na inicialização." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -11634,9 +11794,24 @@ msgstr "Diâmetro do bico" msgid "Wipe tower" msgstr "Torre de purga" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Parâmetros multimateriais de extrusora única" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Esta é uma impressora multimaterial de extrusora única, os diâmetros de todas as extrusoras serão definidos para o novo valor. Você deseja prosseguir?" @@ -11646,6 +11821,18 @@ msgstr "Limites de altura da camada" msgid "Z-Hop" msgstr "Z-Hop" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -11752,8 +11939,8 @@ msgid "Don't warn again for this preset" msgstr "Não avisar novamente para essa predifinição" #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" msgid "No modifications need to be copied." msgstr "Nenhuma modificação precisa ser copiada." @@ -12173,9 +12360,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Moldeamento total" -msgid "Volume" -msgstr "Volume" - msgid "Ramming line" msgstr "Linha de moldeamento" @@ -12223,6 +12407,119 @@ msgstr "Falha no login. Tente novamente." msgid "parse json failed" msgstr "falha ao processar o json" +msgid "Loading…" +msgstr "Carregamento em andamento…" + +msgid "Welcome to Orca Slicer" +msgstr "Bem-vindo ao Orca Slicer" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer será configurado em várias etapas. Vamos começar!" + +msgid "Get Started" +msgstr "Vamos Começar" + +msgid "Please select your login region" +msgstr "Por favor, selecione sua região de login" + +msgid "Finish" +msgstr "Terminar" + +msgid "Printer Selection" +msgstr "Seleção de Impressora" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Impressora Personalizada" + +msgid "Create" +msgstr "Criar" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "Pelo menos uma impressora deve ser selecionada." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Seleção de Filamento" + +msgid "System Filaments" +msgstr "Filamentos do Sistema" + +msgid "Custom Filaments" +msgstr "Filamentos Personalizados" + +msgid "Create New" +msgstr "Criar Novo" + +msgid "Filament type" +msgstr "Tipo de Filamento" + +msgid "Vendor" +msgstr "Fornecedor" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "Limpar tudo" + +msgid "At least one filament must be selected." +msgstr "Pelo menos um filamento deve ser selecionado." + +msgid "Do you want to use the default filament?" +msgstr "Você deseja usar o filamento padrão?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Isso desativa todos os recursos da nuvem, incluindo a sincronização de perfis do Orca Cloud. Usuários que preferem trabalhar totalmente offline podem ativar esta opção." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Nota: quando o Modo Furtivo está ativado, seus perfis de usuário não serão copiados para o Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "Habilita Modo Furtivo." + +msgid "Proprietary Plugins" +msgstr "Plugins Proprietários" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "Algumass fabricantes de impressoras exigem plugins proprietários para comunicação com suas impressoras. Se você utiliza tais impressoras, selecione o plug-in correspondente." + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "Por favor seja cuidadoso estes plugins não são desenvolvidos ou mantidos por OrcaSlicer. Eles devem ser usados por sua conta e risco." + +msgid "Install Bambu Network plug-in" +msgstr "Instalar Bambu Network plug-in" + msgid "[Action Required] " msgstr "[Ação Necessária] " @@ -12669,6 +12966,14 @@ msgstr "G-code de mudança de tipo de extrusão do filamento" msgid "No object can be printed. It may be too small." msgstr "Nenhum objeto pode ser impresso. Talvez seja muito pequeno." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Sua impressão está muito próxima das regiões de preparação. Certifique-se de que não haverá colisão." @@ -12838,6 +13143,26 @@ msgstr "validação falhou" msgid "write callback failed" msgstr "falha na chamada de escrita" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% está muito perto de área de exclusão. Pode haver colisões durante a impressão." @@ -12886,6 +13211,43 @@ msgstr "Se ainda assim desejar imprimir, você pode ativar a opção em Preferê msgid "No extrusions under current settings." msgstr "Nenhuma extrusão com as configurações atuais." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Um filamento misto com gradiente está em uso, mas 'Subcamada de cor mista' está desativado. O gradiente não será impresso." @@ -12895,6 +13257,15 @@ msgstr "O modo suave do timelapse não é suportado quando a sequência \"por ob msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "A detecção de aglomeração não é suportada quando a sequência \"por objeto\" está ativada." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Habilitar a altura Z precisa e a torre de preparação juntas pode causar erros de fatiamento." @@ -12911,10 +13282,6 @@ msgstr "O modo espiral (vaso) não funciona quando um objeto contém mais de um msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Embora o objeto %1% caiba no volume de construção, ele excede a altura máxima do volume de construção devido à compensação de contração do material." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "O objeto %1% excede a altura máxima do volume de impressão." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Embora o objeto %1% em si se ajuste ao volume de impressão, sua última camada excede a altura máxima do volume de impressão." @@ -12922,6 +13289,10 @@ msgstr "Embora o objeto %1% em si se ajuste ao volume de impressão, sua última msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Você pode querer reduzir o tamanho do seu modelo ou alterar as configurações de impressão atuais e tentar novamente." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "O objeto %1% excede a altura máxima do volume de impressão." + msgid "Variable layer height is not supported with Organic supports." msgstr "A altura de camada variável não é suportada com suportes Orgânicos." @@ -13874,12 +14245,39 @@ msgstr "Velocidade de pontes internas. Se o valor for expresso como uma porcenta msgid "This is the distance from the model to the outermost brim line." msgstr "Essa é a distância do modelo até a linha da borda mais externa." +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Tipo de borda" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Isso controla a geração da borda no lado externo e/ou interno dos modelos. Automático significa que a largura da borda é analisada e calculada automaticamente." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Espaço entre a borda e objeto" @@ -15014,9 +15412,6 @@ msgstr "Preço do filamento, para propósito estatístico apenas." msgid "money/kg" msgstr "dinheiro/kg" -msgid "Vendor" -msgstr "Fornecedor" - msgid "Vendor of filament. For show only." msgstr "Fornecedor do filamento. Apenas para mostrar." @@ -15084,6 +15479,66 @@ msgstr "Multilinhas de Preenchimento" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Usar múltiplas linhas para o padrão de preenchimento, se suportado pelo padrão de preenchimento." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Linear" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "Otimização de tendência à flambagem em Z (experimental)" @@ -17272,6 +17727,99 @@ msgstr "Multimaterial com Extrusora Única" msgid "Use single nozzle to print multi filament." msgstr "Usar um único bico para imprimir múltiplos filamentos." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Troca Manual de Filamento" @@ -17640,6 +18188,130 @@ msgstr "Sobreposição de limiar" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Se o ângulo limiar for zero, o suporte será gerado para saliências cuja sobreposição estiver abaixo do limiar. Quanto menor for esse valor, mais íngreme será a saliência que pode ser impressa sem suporte." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Ângulo da ramificação da árvore de suporte" @@ -17817,13 +18489,8 @@ msgstr "Preenchimentos separados" msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Centraliza o preenchimento interno de cada peça em si mesma, como se fosse fatiada isoladamente, em vez de no conjunto inteiro. Peças que se tocam ou se sobrepõem são tratadas como um único corpo e compartilham um centro; peças separadas (ou objetos 3D distintos) recebem cada uma o seu próprio.\n" -"Útil quando um conjunto agrupa vários objetos que devem manter, cada um, um preenchimento consistente e autocentrado.\n" -"Afeta os padrões de linha e grade e os preenchimentos com gabarito de rotação.\n" -"Os padrões fixados em coordenadas globais (Giroide, Favo de mel, TPMS, …) não são afetados." msgid "Center surface pattern on" msgstr "Centralizar padrão de superfície em" @@ -18045,6 +18712,12 @@ msgstr "A purga após a troca de filamento será feita dentro do suporte dos obj msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Este objeto será usado para purgar o bico após uma troca de filamento para economizar filamento e diminuir o tempo de impressão. As cores dos objetos serão misturadas como resultado. Isso não terá efeito a menos que a torre de purga esteja ativa." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Distância máxima de ponte" @@ -18915,8 +19588,8 @@ msgstr "Nome da impressora física utilizada para fatiar." msgid "Layer number" msgstr "Número da camada" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Índice da camada atual. Baseado em um (ou seja, a primeira camada é o número 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Camada Z" @@ -19059,9 +19732,6 @@ msgstr "Recalibração" msgid "Calibrate" msgstr "Calibrar" -msgid "Finish" -msgstr "Terminar" - msgid "How can I use calibration results?" msgstr "Como posso usar o resultado da calibração?" @@ -19597,12 +20267,12 @@ msgstr "" "Os valores de aceleração devem ser maiores que os valores de velocidade.\n" "Por favor, verifique as entradas." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Calibração de Temperatura" -msgid "Filament type" -msgstr "Tipo de Filamento" - msgid "PLA" msgstr "PLA" @@ -19624,6 +20294,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Modelo de teste" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Temp. inicial: " @@ -19741,9 +20417,6 @@ msgstr "Distância de Retração Inicial: " msgid "End retraction length: " msgstr "Distância de Retração Final: " -msgid "Test model" -msgstr "Modelo de teste" - msgid "Ringing Tower" msgstr "Torre de Anéis" @@ -20170,9 +20843,6 @@ msgstr "Ex.: Básico, Fosco, Seda, Mármore" msgid "Filament Preset" msgstr "Predefinição de Filamento" -msgid "Create" -msgstr "Criar" - msgid "Vendor is not selected; please reselect vendor." msgstr "O fornecedor não está selecionado, por favor reselecione o fornecedor." @@ -20479,6 +21149,9 @@ msgstr "" "Predefinições de impressora e todos os filamentos e processos que pertencem à impressora.\n" "Pode ser compartilhado com outros." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21182,9 +21855,6 @@ msgstr "Atribuir manualmente o filamento ao bico esquerdo ou direito" msgid "Global settings" msgstr "Definições globais" -msgid "Video tutorial" -msgstr "Tutorial em vídeo" - msgid "(Sync with printer)" msgstr "(Sinc. com impressora)" @@ -21574,6 +22244,33 @@ msgstr "Se ativado, os valores acima são armazenados como os padrões usados pa msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "A pasta do pacote não existe." @@ -21607,6 +22304,12 @@ msgstr "Cancelar inscrição do Pacote" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "Salvar pacote de predefinições" @@ -25968,214 +26671,6 @@ msgstr "Esta fonte não tem contorno para este texto" msgid "Size: %.1f × %.1f mm" msgstr "Tamanho: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitivo" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Malha vazia gerada" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Caixa" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Rápido:" - -# AI Translated -msgid "Width (X)" -msgstr "Largura (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Profundidade (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Altura (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R inferior" - -# AI Translated -msgid "Top R" -msgstr "R superior" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "R maior" - -# AI Translated -msgid "Minor R" -msgstr "R menor" - -# AI Translated -msgid "All edges" -msgstr "Todas as arestas" - -# AI Translated -msgid "Top edges" -msgstr "Arestas superiores" - -# AI Translated -msgid "Bottom edges" -msgstr "Arestas inferiores" - -# AI Translated -msgid "Lateral edges" -msgstr "Arestas laterais" - -# AI Translated -msgid "Mesh resolution" -msgstr "Resolução da malha" - -# AI Translated -msgid "Add Shape" -msgstr "Adicionar forma" - -# AI Translated -msgid "No outer profile" -msgstr "Nenhum perfil externo" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Falha ao criar a face externa" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Falha ao construir a face com furos" - -# AI Translated -msgid "Revolve failed" -msgstr "Falha na revolução" - -# AI Translated -msgid "Profile" -msgstr "Perfil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Iniciar novo perfil (para furos)" - -# AI Translated -msgid "Segments" -msgstr "Segmentos" - -# AI Translated -msgid "Sides" -msgstr "Lados" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Clique na tela para desenhar" - -# AI Translated -msgid "Snap to grid" -msgstr "Ajustar à grade" - -# AI Translated -msgid "Grid step" -msgstr "Passo da grade" - -# AI Translated -msgid "Outer" -msgstr "Externo" - -# AI Translated -msgid "closed" -msgstr "fechado" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% pontos %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Topo)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Frente)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Lateral)" - -# AI Translated -msgid "Revolve deg" -msgstr "Revolução (graus)" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Defina como 0 para extrusão, >0 para revolução" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Cavidade (corte)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu perfil fechado" -msgstr[1] "%zu perfis fechados" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Desenhe um perfil fechado para ativar" - -# AI Translated -msgid "Clear all" -msgstr "Limpar tudo" - -# AI Translated -msgid "Empty result" -msgstr "Resultado vazio" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Extrusão: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Revolução: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Nenhum objeto selecionado" - -# AI Translated -msgid "Face failed" -msgstr "Falha na face" - -# AI Translated -msgid "Face with holes failed" -msgstr "Falha na face com furos" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Malha da ferramenta vazia" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Cavidade adicionada (volume negativo)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Cavidade: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -26291,6 +26786,9 @@ msgstr "Gizmo montar" msgid "Gizmo brim ears" msgstr "Gizmo orelhas da borda" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Controle deslizante vertical - Mover o polegar ativo para cima" @@ -27271,10 +27769,6 @@ msgstr "Minhas configurações" msgid "Custom Printer Setup" msgstr "Configuração de Impressora Personalizada" -# AI Translated -msgid "Custom Printer" -msgstr "Impressora Personalizada" - # AI Translated msgid "Define a custom printer profile" msgstr "Definir um perfil de impressora personalizado" @@ -27920,9 +28414,8 @@ msgstr "Limiar de ângulo - o preenchimento para em arestas mais acentuadas que msgid "Click a triangle to paint it" msgstr "Clique em um triângulo para pintá-lo" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Requer a camada ativa mapeada com Desdobrar (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -27936,17 +28429,15 @@ msgstr "Rápido - o relevo é apenas sombreado, não construído, e só para a c msgid "Checker" msgstr "Xadrez" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Xadrez - uma grade de teste no lugar da textura. Onde os quadrados continuam quadrados, a textura não está distorcida; onde eles esticam, ela também vai esticar" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Distorção" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Distorção - mapa de calor de estiramento, de azul a vermelho, sobre o desdobramento" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28062,24 +28553,11 @@ msgstr "Misturar filamentos" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Intercala dois filamentos para simular as cores intermediárias, de modo que poucos filamentos consigam cobrir uma foto ou um gradiente. Uma imagem de cores chapadas é impressa da mesma forma em ambos os casos. Desativado, usa um filamento por área." -# AI Translated -msgid "Mix by" -msgstr "Misturar por" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Superfície" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Camadas: os dois filamentos se alternam entre as camadas de impressão, o que mistura suavemente em superfícies verticais, mas desaparece nas horizontais, onde uma camada inteira é uma única faixa.\n" -"Superfície: um xadrez fino sobre a superfície, que funciona em qualquer ângulo, mas pode parecer textura em vez de mistura.\n" -"Automático: camadas nas faces verticais; as faces horizontais recebem o filamento único mais próximo, já que ali um xadrez aparece como padrão." # AI Translated #, boost-format @@ -28539,14 +29017,6 @@ msgstr "Precisa de cerca de %1% triângulos, orçamento de %2% - o assamento vai msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Quantos milhares de triângulos o refinamento pode adicionar ao modelo. O triângulo que se ajusta pior é sempre dividido primeiro, então mesmo uma execução que gaste tudo terá gasto onde mais aparece. Aumente se o relevo ainda parecer grosseiro." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Interrompe o assamento. O que já tiver sido concluído permanece no modelo e pode ser desfeito." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Fecha a ferramenta sem assar. Sua pintura, camadas e configurações permanecem com o modelo." - # AI Translated msgid "Preparing..." msgstr "Preparando..." @@ -28571,6 +29041,14 @@ msgstr "Transforma os mapas de altura pintados em geometria real, movendo os vé msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Transforma os mapas de altura pintados em geometria real. Primeiro a malha é remalhada para uma densidade uniforme e refinada onde a textura se curva, para que o detalhe tenha vértices onde cair - tudo em uma etapa." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Interrompe o assamento. O que já tiver sido concluído permanece no modelo e pode ser desfeito." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Fecha a ferramenta sem assar. Sua pintura, camadas e configurações permanecem com o modelo." + # AI Translated #, boost-format msgid "%1% k" @@ -28787,6 +29265,28 @@ msgstr "Plugins de filamento" msgid "Printer plugins" msgstr "Plugins de impressora" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Restaurar padrões" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "A configuração não é um JSON válido. Suas alterações não foram salvas." @@ -28806,10 +29306,6 @@ msgstr "" "\n" "Isso descarta a substituição da predefinição e usa a configuração global." -# AI Translated -msgid "Restore defaults" -msgstr "Restaurar padrões" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Usando a configuração global. Salve a predefinição para mantê-la." @@ -28879,6 +29375,215 @@ msgstr "Instalando plugin" msgid "Installed \"%s\"." msgstr "\"%s\" instalado." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29095,6 +29800,54 @@ msgstr "Falha ao recarregar o plugin." msgid "Reloaded \"%s\"." msgstr "\"%s\" recarregado." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "Sem informação do modelo" + +msgid "Edit Project Info" +msgstr "Editar Info do Projeto" + +msgid "Model Information" +msgstr "Informações do Modelo" + +msgid "Accessories" +msgstr "Acessórios" + +msgid "Profile Information" +msgstr "Informações do Perfil" + +msgid "Model name" +msgstr "Nome do Modelo" + +msgid "Created by" +msgstr "Criado por" + +msgid "Remixed by" +msgstr "Remixado por" + +msgid "Shared by" +msgstr "Compartilhado por" + +msgid "Model description" +msgstr "Descrição do Modelo" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "Nome do Perfil" + +msgid "Profile Author" +msgstr "Autor do Perfil" + +msgid "Profile description" +msgstr "Descrição do Perfil" + # AI Translated msgid "Purge Mode Settings" msgstr "Configurações do Modo de Purga" @@ -29119,6 +29872,16 @@ msgstr "Reduz o desperdício de purga e imprime mais rápido. Pode causar leve m msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Um comando já está em execução." @@ -29385,6 +30148,9 @@ msgstr " | encaixe ATIVO" msgid "Change texture - choose another one from the texture library" msgstr "Alterar textura - escolha outra na biblioteca de texturas" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Mapa de altura - mostra a textura da camada sob as ilhas" @@ -29417,17 +30183,14 @@ msgstr "Conectar ilhas" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Dispõe o desdobramento como uma planificação conectada: pedaços que compartilham uma aresta são desdobrados lado a lado (um cubo vira uma planificação unida em vez de seis quadrados soltos). Eles continuam sendo ilhas separadas, então você ainda pode mover qualquer uma delas manualmente depois." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Ilha - mover, girar e escalar ilhas inteiras" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Vértice - arraste vértices para remodelar; Shift/Ctrl para seleção múltipla" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Aresta - arraste arestas para remodelar; Shift/Ctrl para seleção múltipla" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -29465,9 +30228,13 @@ msgstr "Limpar edições UV - descarta todos os movimentos manuais de vértices/ msgid "Snap - stick islands together when dragging one against another" msgstr "Encaixar - prende as ilhas umas às outras ao arrastar uma contra a outra" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Enquadrar todas as ilhas (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -29478,6 +30245,9 @@ msgstr "Nenhuma camada mapeada com Desdobrar" msgid "%.1f mm tile" msgstr "ladrilho de %.1f mm" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Desatualizado - a pintura, as emendas ou o ângulo de emenda mudaram desde que este desdobramento foi feito. Pressione para desdobrar novamente." @@ -29486,19 +30256,48 @@ msgstr "Desatualizado - a pintura, as emendas ou o ângulo de emenda mudaram des msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Achata a área pintada em ilhas UV. Só é calculado quando você pressiona isto, não a cada edição - então pinte, altere o ângulo de emenda ou marque emendas primeiro e depois pressione Desdobrar." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d ilhas, %s faces" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Bambu Network plug-in não detectado. Clique aqui para instalar isto." + +msgid "Create new project" +msgstr "Criar Novo Projeto" + +msgid "Recently opened" +msgstr "Aberto Recentemente" + +msgid "Open Containing Folder" +msgstr "Abrir pasta de Conteúdo" + # AI Translated msgid "Forward" msgstr "Avançar" -# AI Translated -msgid "Tools" -msgstr "Ferramentas" - # AI Translated msgid "View Source" msgstr "Ver Código-Fonte" @@ -29644,6 +30443,16 @@ msgstr "" "O plugin \"%s\" está solicitando executar o(s) seguinte(s) comando(s):\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -29653,6 +30462,30 @@ msgstr "O plugin \"%s\" está solicitando permissão para o evento de auditoria msgid "Plugin permission request" msgstr "Solicitação de permissão do plugin" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "A interface de configuração do plugin estava vazia. Exibindo o editor padrão." @@ -30239,6 +31072,309 @@ msgstr "" "Evitar empenamento\n" "Você sabia que ao imprimir materiais propensos ao empenamento como ABS, aumentar adequadamente a temperatura da mesa aquecida pode reduzir a probabilidade de empenamento?" +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Não foi possível instalar o Microsoft WebView2 Runtime.\n" +#~ "Alguns recursos, incluindo o assistente de instalação, podem aparecer em branco até que ele seja instalado.\n" +#~ "Por favor, instale-o manualmente de https://developer.microsoft.com/microsoft-edge/webview2/ e reinicie o OrcaSlicer." + +#~ msgid "Why this grouping" +#~ msgstr "Motivo desse agrupamento" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "O software não suporta o uso de bicos de diâmetros diferentes para uma mesma impressão. Se os bicos esquerdo e direito forem incompatíveis, só é possível prosseguir com a impressão com um único bico. Confirme qual bico você gostaria de usar para este projeto." + +#~ msgid "Switch diameter" +#~ msgstr "Trocar diâmetro" + +#~ msgid "BambuStudio Project" +#~ msgstr "Projeto Bambu Studio" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "O arquivo 3MF foi criado pelo Bambu Studio (versão %s), que é mais recente que a versão compatível %s. Configurações não reconhecidas encontradas:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "O arquivo 3MF foi criado pelo Bambu Studio (versão %s), que é mais recente que a versão compatível %s. Algumas configurações podem não ser compatíveis." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "O arquivo 3MF foi criado pelo Bambu Studio. Algumas configurações podem ser diferentes do OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Não é possível desfazer ou refazer enquanto uma operação está em andamento. Interrompa-a primeiro." + +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Centraliza o preenchimento interno de cada peça em si mesma, como se fosse fatiada isoladamente, em vez de no conjunto inteiro. Peças que se tocam ou se sobrepõem são tratadas como um único corpo e compartilham um centro; peças separadas (ou objetos 3D distintos) recebem cada uma o seu próprio.\n" +#~ "Útil quando um conjunto agrupa vários objetos que devem manter, cada um, um preenchimento consistente e autocentrado.\n" +#~ "Afeta os padrões de linha e grade e os preenchimentos com gabarito de rotação.\n" +#~ "Os padrões fixados em coordenadas globais (Giroide, Favo de mel, TPMS, …) não são afetados." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Índice da camada atual. Baseado em um (ou seja, a primeira camada é o número 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Tutorial em vídeo" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitivo" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Malha vazia gerada" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Caixa" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Rápido:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Largura (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Profundidade (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Altura (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R inferior" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R superior" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "R maior" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "R menor" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Todas as arestas" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Arestas superiores" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Arestas inferiores" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Arestas laterais" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Resolução da malha" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Adicionar forma" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Nenhum perfil externo" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Falha ao criar a face externa" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Falha ao construir a face com furos" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Falha na revolução" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Perfil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Iniciar novo perfil (para furos)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmentos" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Lados" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Clique na tela para desenhar" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Ajustar à grade" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Passo da grade" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Externo" + +# AI Translated +#~ msgid "closed" +#~ msgstr "fechado" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% pontos %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Topo)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Frente)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Lateral)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Revolução (graus)" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Defina como 0 para extrusão, >0 para revolução" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Cavidade (corte)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu perfil fechado" +#~ msgstr[1] "%zu perfis fechados" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Desenhe um perfil fechado para ativar" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Resultado vazio" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Extrusão: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Revolução: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Nenhum objeto selecionado" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Falha na face" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Falha na face com furos" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Malha da ferramenta vazia" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Cavidade adicionada (volume negativo)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Cavidade: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Requer a camada ativa mapeada com Desdobrar (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Xadrez - uma grade de teste no lugar da textura. Onde os quadrados continuam quadrados, a textura não está distorcida; onde eles esticam, ela também vai esticar" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Distorção - mapa de calor de estiramento, de azul a vermelho, sobre o desdobramento" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Misturar por" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Superfície" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Camadas: os dois filamentos se alternam entre as camadas de impressão, o que mistura suavemente em superfícies verticais, mas desaparece nas horizontais, onde uma camada inteira é uma única faixa.\n" +#~ "Superfície: um xadrez fino sobre a superfície, que funciona em qualquer ângulo, mas pode parecer textura em vez de mistura.\n" +#~ "Automático: camadas nas faces verticais; as faces horizontais recebem o filamento único mais próximo, já que ali um xadrez aparece como padrão." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Ilha - mover, girar e escalar ilhas inteiras" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Vértice - arraste vértices para remodelar; Shift/Ctrl para seleção múltipla" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Aresta - arraste arestas para remodelar; Shift/Ctrl para seleção múltipla" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Enquadrar todas as ilhas (Home)" + #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Experimental) Usar agentes de impressora em vez de hosts de impressão" @@ -30271,16 +31407,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Clique em uma face ou em um plano de referência e depois escolha uma ferramenta de desenho" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -30337,10 +31463,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Distância vertical" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Linear" - #~ msgid "Face recognition" #~ msgstr "Reconhecimento facial" diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index f9225f8bc1..d1b8d05b61 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer V2.5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2026-02-25 13:38+0300\n" "Last-Translator: Felix14_v2\n" "Language-Team: Felix14_v2 (ДС/ТГ: @felix14_v2, почта: aleks111001@list.ru), Andylg \n" @@ -2134,14 +2134,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Не удалось установить среду выполнения WebView2.\n" -"Некоторые страницы (такие как мастер настройки) будут недоступны до момента установки.\n" -"Необходимо выполнить установку в ручном режиме с https://developer.microsoft.com/microsoft-edge/webview2 и перезапустить OrcaSlicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4272,6 +4270,9 @@ msgstr "Перейти к столу" msgid "AMS Materials Setting" msgstr "Настройка материалов AMS" +msgid "Wiki Guide" +msgstr "Руководство" + msgid "Close" msgstr "Закрыть" @@ -4295,9 +4296,6 @@ msgstr "Введённое значение должно быть больше % msgid "Factors of Flow Dynamics Calibration" msgstr "Коэф. калиб. динам. потока" -msgid "Wiki Guide" -msgstr "Руководство" - msgid "PA Profile" msgstr "Профиль PA" @@ -4891,6 +4889,11 @@ msgstr "Автоматически подстроить под предел (%g msgid "Adjust" msgstr "Подстроиться" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5762,9 +5765,6 @@ msgstr "Выполнить нарезку в соответствии с опт msgid "Filament Grouping" msgstr "Группировка материалов" -msgid "Why this grouping" -msgstr "Подробнее" - msgid "Please place filaments on the printer based on grouping result." msgstr "Заправьте принтер в соответствии с группировкой." @@ -5967,6 +5967,43 @@ msgstr "Изменить размер инструмента" msgid "Sequence" msgstr "Последовательность" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Объём" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Выбрать объект" @@ -6182,6 +6219,12 @@ msgstr "Разметка" msgid "Labels" msgstr "Имена моделей" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Перемещение секущей плоскости" @@ -6230,7 +6273,7 @@ msgstr "Объём:" msgid "Size:" msgstr "Размер:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "В G-code на %d слое (z = %.2lf мм) обнаружен конфликт путей. Пожалуйста, разместите конфликтующие модели дальше друг от друга (%s <-> %s)." @@ -6736,6 +6779,12 @@ msgstr "Показать разметку" msgid "Show Gridlines on plate" msgstr "Показать разметку стола" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Сбросить макет интерфейса" @@ -8413,6 +8462,61 @@ msgstr "Сводка настроек моделей" msgid "Material settings" msgstr "Настройки материала" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Инструменты" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Удалить стол (кроме последнего)" @@ -8437,6 +8541,17 @@ msgstr "Переименовать стол" msgid "Move plate to the front" msgstr "Переместить стол в начало" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Настроить стол" @@ -8510,12 +8625,6 @@ msgstr "AMS (1 слот)" msgid "Not installed" msgstr "Не подключена" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "ПО не поддерживает печать разными диаметрами сопел в рамках одной печати. Выберите экструдер для синхронизации диаметров сопел:" - -msgid "Switch diameter" -msgstr "Переключение диаметра" - msgid "Configuration incompatible" msgstr "Несовместимый профиль" @@ -8596,6 +8705,9 @@ msgstr "Смешанный материал" msgid "Remove last mixed filament" msgstr "Удалить последний смешанный материал" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Добавить смешанный материал" @@ -8618,6 +8730,10 @@ msgstr "У смешанного материала нарушены ссылки msgid "Edit / Delete / Merge" msgstr "Изменить / Удалить / Объединить" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Целевой смешанный материал использует этот физический материал в качестве компонента. Объединение удалит этот физический материал и может сделать смешанный материал недействительным. Продолжить?" @@ -8691,9 +8807,6 @@ msgstr "Загрузка файла: %s" msgid "Load 3MF" msgstr "Загрузка 3mf" -msgid "BambuStudio Project" -msgstr "Проект BambuStudio" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "Этот 3MF не поддерживается OrcaSlicer, поэтому загрузятся только данные геометрии." @@ -8724,17 +8837,6 @@ msgstr "Рекомендуется обновить программу.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "Этот файл 3MF был сохранён в более новой версии OrcaSlicer %s (сейчас установлен %s %s). Рекомендуется обновить программу." -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "Этот файл 3MF был создан в BambuStudio (версии %s), которая новее совместимой с ней версией OrcaSlicer %s. Обнаружены следующие нераспознанные настройки:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "Этот файл 3MF был создан в BambuStudio (версии %s), которая новее совместимой с ней версией OrcaSlicer %s. Некоторые настройки могут не поддерживаться." - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "Этот файл 3MF был создан в BambuStudio. Некоторые настройки могут отличаться от OrcaSlicer." - msgid "Invalid values found in the 3MF:" msgstr "В файле 3MF найдены недопустимые значения:" @@ -8911,6 +9013,12 @@ msgstr "Отключить притягивание компонентов к с msgid "Object with floating parts was detected" msgstr "Обнаружен объект с парящими элементами" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Уже идёт другой процесс экспорта." @@ -8995,6 +9103,38 @@ msgstr "Неверные данные" msgid "Slicing Canceled" msgstr "Нарезка отменена" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Сетевой плагин успешно переключён." @@ -9026,9 +9166,8 @@ msgstr "" msgid "Sync now" msgstr "Синхронизировать" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Невозможно отменить или повторить действие во время выполнения операции. Сначала остановите её." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9099,6 +9238,11 @@ msgstr "Загрузка не удалась, ошибка размера фай msgid "Project downloaded %d%%" msgstr "Проект загружен %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Тест Pressure Advance" @@ -9125,6 +9269,13 @@ msgstr "Калибровка потока Orca YOLO" msgid "Flowrate Test - Pass%d" msgstr "Тест потока - проход %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Тест температуры сопла" @@ -11549,6 +11700,9 @@ msgstr "Синхронизация разных приводов экструд msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Перенести изменения в настройки другого экструдера." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Сбросить все изменения" @@ -11995,6 +12149,12 @@ msgstr "Область печати" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Реализация сетевого агента для обмена информацией с принтером. Доступные реализации определяются при запуске." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12108,9 +12268,24 @@ msgstr "Диаметр сопла" msgid "Wipe tower" msgstr "Черновая башня" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Настройки комбинированной печати одним экструдером" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "У этого принтера есть только одно сопло для комбинированной печати, диаметры всех сопел будут установлены на новое значение. Продолжить?" @@ -12123,6 +12298,18 @@ msgstr "Ограничение высоты слоя" msgid "Z-Hop" msgstr "Подъём головы при откате" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -12239,8 +12426,8 @@ msgid "Don't warn again for this preset" msgstr "Больше не спрашивать для этого профиля" #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" msgid "No modifications need to be copied." msgstr "Перенос изменений не требуется." @@ -12651,9 +12838,6 @@ msgstr "мс" msgid "Total ramming" msgstr "Полный рэмминг" -msgid "Volume" -msgstr "Объём" - msgid "Ramming line" msgstr "Линия рэмминга" @@ -12701,6 +12885,119 @@ msgstr "Ошибка входа. Попробуйте ещё раз." msgid "parse json failed" msgstr "не удалось обработать JSON" +msgid "Loading…" +msgstr "Загрузка..." + +msgid "Welcome to Orca Slicer" +msgstr "Приветствуем в Orca Slicer!" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Для настройки Orca Slicer необходимо пройти несколько этапов. Давайте начнём!" + +msgid "Get Started" +msgstr "Начать" + +msgid "Please select your login region" +msgstr "Выбор региона" + +msgid "Finish" +msgstr "Завершить" + +msgid "Printer Selection" +msgstr "Выбор принтера" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Пользовательский принтер" + +msgid "Create" +msgstr "Создать" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "Должен быть выбран хотя бы один принтер." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Выбор материала" + +msgid "System Filaments" +msgstr "Системные материалы" + +msgid "Custom Filaments" +msgstr "Пользовательские материалы" + +msgid "Create New" +msgstr "Создать новый" + +msgid "Filament type" +msgstr "Тип материала" + +msgid "Vendor" +msgstr "Производитель" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "Очистить" + +msgid "At least one filament must be selected." +msgstr "Должен быть выбран хотя бы один материал." + +msgid "Do you want to use the default filament?" +msgstr "Выбрать материалы по умолчанию?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "" + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "" + +msgid "Enable Stealth Mode." +msgstr "Включить режим конфиденциальности" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "Для связи с некоторыми моделями принтеров требуются проприетарные плагины. Выберите соответствующий плагин, если у вас такой принтер." + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "Имейте в виду, что эти плагины не разрабатываются и не поддерживаются OrcaSlicer. Используйте их на свой страх и риск." + +msgid "Install Bambu Network plug-in" +msgstr "Установить сетевой плагин Bambu" + msgid "[Action Required] " msgstr "[Требуется действие] " @@ -13159,6 +13456,14 @@ msgstr "G-code при смене типа линии с этим материа msgid "No object can be printed. It may be too small." msgstr "Печать моделей невозможна. Возможно, они слишком маленькие." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Модель(-и) находится очень близко к области предзарядки (область подготовки экструдера). Убедитесь, что не произойдёт столкновения." @@ -13324,6 +13629,26 @@ msgstr "ошибка проверки" msgid "write callback failed" msgstr "ошибка записи функции обратного вызова" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% находится слишком близко к области исключения, что может привести к столкновению при печати." @@ -13375,6 +13700,43 @@ msgstr "Если вас это не пугает, эту проверку мож msgid "No extrusions under current settings." msgstr "При текущих настройках экструзия отсутствует." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Используется смешанный материал с градиентом, но параметр «Подслой смешанного цвета» отключён. Градиент не будет напечатан." @@ -13385,6 +13747,15 @@ msgstr "Плавный режим таймлапса не поддерживае msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Обнаружение налипаний не поддерживается при печати моделей по очереди." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Совместное использование точной высоты Z и черновой башни может вызвать ошибки нарезки." @@ -13401,10 +13772,6 @@ msgstr "Режим вазы не работает, когда модель пе msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "После применения компенсации усадки модель %1% начинает превышать максимальную высоту области печати." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Высота модели «%1%» превышает максимально допустимую высоту области печати." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Хотя сама модель %1% вписывается в область построения, её последний слой превышает максимальную высоту области построения." @@ -13412,6 +13779,10 @@ msgstr "Хотя сама модель %1% вписывается в облас msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Попробуйте уменьшить размер модели или изменить текущие настройки печати и повторить попытку." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Высота модели «%1%» превышает максимально допустимую высоту области печати." + # Organic supports воспринимается как неправильный перевод древовидных # поддержек, лучше написать развёрнуто msgid "Variable layer height is not supported with Organic supports." @@ -14385,12 +14756,39 @@ msgstr "Скорость печати внутреннего моста. Мож msgid "This is the distance from the model to the outermost brim line." msgstr "Расстояние от модели до внешней линии каймы." +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Тип каймы" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Этот параметр управляет формированием каймы на внешней/внутренней стороне моделей. Авто означает, что ширина каймы анализируется и рассчитывается автоматически." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Смещение каймы" @@ -15660,9 +16058,6 @@ msgstr "Стоимость материала. Используется при msgid "money/kg" msgstr "цена за кг" -msgid "Vendor" -msgstr "Производитель" - msgid "Vendor of filament. For show only." msgstr "Производитель материала. Информационный параметр." @@ -15732,6 +16127,66 @@ msgstr "" "Использовать несколько линий для шаблона заполнения, если он это поддерживает.\n" "Внимание: плотность заполнения будет скорректирована для сохранения того же расхода материала." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Линейный" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "Оптимизация CRAMP (beta)" @@ -18221,6 +18676,99 @@ msgstr "Общий экструдер" msgid "Use single nozzle to print multi filament." msgstr "Использовать общий экструдер для комбинированной печати несколькими цветами/материалами." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Ручная смена прутка" @@ -18652,6 +19200,130 @@ msgstr "" "\n" "Например, при значении 15% поддержка добавится, если верхний периметр лежит на нижнем меньше чем на 15% своей ширины, что при ширине линии 0.4 мм составляет 0.06 мм." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + # Angle=Наклон в данном случае, т.к. именно здесь угол расчитывается от # вертикали, а не от горизонтали. msgid "Tree support branch angle" @@ -18833,15 +19505,11 @@ msgstr "Минимальная толщина оболочки сверху в msgid "Separated infills" msgstr "Независимые шаблоны" -# Тут сразу несколько изменений. 1 - на Вики речь идёт в целом даже про отдельные куски одного меша, а не только про части в составе сборки. 2 - логически переупорядочил предложения. 3 - touch and overlap заменено на "прямой контакт". 4 - не вижу смысла приводить примеры, не давая полного списка шаблонов. Какой-то логики по структуре шаблонов тут нет, т.к. ограничение исходит из алгоритма центровки, так что это только будет путать. msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Разделить шаблоны заполнения у независимых частей модели/сборки. Это позволяет получать симметричное расположение шаблона в случаях, когда отдельные части вызывают его смещение относительно центра модели.\n" -"Примечание: не влияет на части с прямым контактом между собой и не затрагивает шаблоны с жёсткой привязкой к координатам стола." msgid "Center surface pattern on" msgstr "Центровать шаблон по" @@ -19094,6 +19762,12 @@ msgstr "Прочистка сопла после смены материала msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Использовать эту модель для очистки сопла после смены материала для его экономии и сокращения времени печати. В результате цвета будут смешиваться. Требуется включить черновую башню." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Максимальная длина моста" @@ -20059,8 +20733,8 @@ msgstr "Имя физического принтера, используемог msgid "Layer number" msgstr "Номер слоя" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Номер текущего слоя, начиная с единицы (т.е. первый слой имеет номер 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Высота слоя над столом" @@ -20210,9 +20884,6 @@ msgstr "Перекалибровка" msgid "Calibrate" msgstr "Калибровка" -msgid "Finish" -msgstr "Завершить" - msgid "How can I use calibration results?" msgstr "Как использовать результаты калибровки?" @@ -20758,12 +21429,12 @@ msgid "" "Please verify the inputs." msgstr "Значения ускорений должны быть больше ограничений скорости. Проверьте введённые значения." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Калибровка температуры" -msgid "Filament type" -msgstr "Тип материала" - msgid "PLA" msgstr "PLA" @@ -20785,6 +21456,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Тестовая модель" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Начальная температура: " @@ -20908,9 +21585,6 @@ msgstr "Начальная длина отката: " msgid "End retraction length: " msgstr "Конечная длина отката: " -msgid "Test model" -msgstr "Тестовая модель" - msgid "Ringing Tower" msgstr "Полный тест (Ringing Tower)" @@ -21349,9 +22023,6 @@ msgstr "например обычная, матовая, шёлковая, мр msgid "Filament Preset" msgstr "Профиль материала" -msgid "Create" -msgstr "Создать" - msgid "Vendor is not selected; please reselect vendor." msgstr "Производитель не выбран; пожалуйста, выберите его заново." @@ -21666,6 +22337,9 @@ msgstr "" "и настроек печати, связанные с выбранным принтером.\n" "Этими файлами можно поделиться с другими пользователями." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -22385,9 +23059,6 @@ msgstr "Режим ручного назначения материала к н msgid "Global settings" msgstr "Глобальные настройки" -msgid "Video tutorial" -msgstr "Видеоурок" - msgid "(Sync with printer)" msgstr " (состояние принтера)" @@ -22786,6 +23457,33 @@ msgstr "Активируйте для сохранения настроек им msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "Хранилище пакета профилей не найдено." @@ -22822,6 +23520,12 @@ msgstr "Ошибка" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "Сохранить пакет профилей" @@ -27231,215 +27935,6 @@ msgstr "В этом шрифте нет контуров символов это msgid "Size: %.1f × %.1f mm" msgstr "Размер: %.1f × %.1f мм" -# AI Translated -msgid "Primitive" -msgstr "Фигура" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Создана пустая сетка" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Параллелепипед" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Быстрый выбор:" - -# AI Translated -msgid "Width (X)" -msgstr "Ширина (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Глубина (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Высота (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "Нижний R" - -# AI Translated -msgid "Top R" -msgstr "Верхний R" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "Большой R" - -# AI Translated -msgid "Minor R" -msgstr "Малый R" - -# AI Translated -msgid "All edges" -msgstr "Все рёбра" - -# AI Translated -msgid "Top edges" -msgstr "Верхние рёбра" - -# AI Translated -msgid "Bottom edges" -msgstr "Нижние рёбра" - -# AI Translated -msgid "Lateral edges" -msgstr "Боковые рёбра" - -# AI Translated -msgid "Mesh resolution" -msgstr "Разрешение сетки" - -# AI Translated -msgid "Add Shape" -msgstr "Добавить фигуру" - -# AI Translated -msgid "No outer profile" -msgstr "Нет внешнего профиля" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Не удалось создать внешнюю грань" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Не удалось построить грань с отверстиями" - -# AI Translated -msgid "Revolve failed" -msgstr "Ошибка вращения" - -# AI Translated -msgid "Profile" -msgstr "Профиль" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Начать новый профиль (для отверстий)" - -# AI Translated -msgid "Segments" -msgstr "Сегменты" - -# AI Translated -msgid "Sides" -msgstr "Стороны" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Щёлкайте в рабочем пространстве, чтобы рисовать" - -# AI Translated -msgid "Snap to grid" -msgstr "Привязка к сетке" - -# AI Translated -msgid "Grid step" -msgstr "Шаг сетки" - -# AI Translated -msgid "Outer" -msgstr "Внешний" - -# AI Translated -msgid "closed" -msgstr "замкнутый" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2% (точек: %3%) %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (сверху)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (спереди)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (сбоку)" - -# AI Translated -msgid "Revolve deg" -msgstr "Угол вращения, °" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "0 — выдавливание, >0 — вращение" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Карман (вырез)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu замкнутый профиль" -msgstr[1] "%zu замкнутых профиля" -msgstr[2] "%zu замкнутых профилей" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Нарисуйте замкнутый профиль, чтобы включить" - -# AI Translated -msgid "Clear all" -msgstr "Очистить всё" - -# AI Translated -msgid "Empty result" -msgstr "Пустой результат" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Выдавливание: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Вращение: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Модель не выбрана" - -# AI Translated -msgid "Face failed" -msgstr "Ошибка построения грани" - -# AI Translated -msgid "Face with holes failed" -msgstr "Ошибка построения грани с отверстиями" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Сетка инструмента пуста" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Карман добавлен (вырез)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Карман: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27556,6 +28051,9 @@ msgstr "Размещение частей сборки" msgid "Gizmo brim ears" msgstr "Размещение «мышиных ушек»" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вверх" @@ -28538,10 +29036,6 @@ msgstr "Мои настройки" msgid "Custom Printer Setup" msgstr "Настройка пользовательского принтера" -# AI Translated -msgid "Custom Printer" -msgstr "Пользовательский принтер" - # AI Translated msgid "Define a custom printer profile" msgstr "Задать профиль пользовательского принтера" @@ -29187,9 +29681,8 @@ msgstr "Пороговый угол - заливка останавливает msgid "Click a triangle to paint it" msgstr "Щёлкните треугольник, чтобы закрасить его" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Требуется, чтобы активный слой использовал наложение «Развёртка (LSCM)»." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -29203,17 +29696,15 @@ msgstr "Быстрый - рельеф только имитируется зат msgid "Checker" msgstr "Шахматный узор" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Шахматный узор - тестовая клетка вместо текстуры. Где клетки остаются квадратными, текстура не искажена; где они растягиваются, растянется и она" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Искажение" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Искажение - тепловая карта растяжения развёртки, от синего к красному" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -29329,24 +29820,11 @@ msgstr "Смешивать материалы" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Чередует два материала, имитируя промежуточные цвета, так что небольшим набором материалов можно передать фотографию или градиент. Изображение из сплошных цветов печатается одинаково в обоих случаях. Если выключено, на каждую область используется один материал." -# AI Translated -msgid "Mix by" -msgstr "Способ смешивания" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "На поверхности" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Слои: два материала чередуются между слоями печати; это даёт плавный переход на вертикальных поверхностях, но пропадает на обращённых вверх или вниз, где весь слой - одна полоса.\n" -"На поверхности: мелкая шахматная клетка по поверхности; работает под любым углом, но может восприниматься как текстура, а не как смешение.\n" -"Автоматически: слои на вертикальных гранях; горизонтальные грани получают ближайший один материал, поскольку шахматная клетка на них выглядит как узор." # AI Translated #, boost-format @@ -29806,14 +30284,6 @@ msgstr "Требуется треугольников: около %1%, бюдж msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Сколько тысяч треугольников уточнение может добавить к модели. Хуже всего вписывающийся треугольник всегда делится первым, поэтому даже израсходованный целиком бюджет потрачен там, где это заметнее всего. Увеличьте, если рельеф всё ещё выглядит грубым." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Останавливает запекание. Всё, что уже выполнено, остаётся на модели и может быть отменено." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Закрывает инструмент без запекания. Ваш рисунок, слои и настройки сохраняются в модели." - # AI Translated msgid "Preparing..." msgstr "Подготовка..." @@ -29838,6 +30308,14 @@ msgstr "Превращает нарисованные карты высот в msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Превращает нарисованные карты высот в реальную геометрию. Сетка перестраивается до равномерной плотности и сначала уточняется там, где меняется текстура, чтобы деталям было на что лечь - всё за один шаг." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Останавливает запекание. Всё, что уже выполнено, остаётся на модели и может быть отменено." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Закрывает инструмент без запекания. Ваш рисунок, слои и настройки сохраняются в модели." + # AI Translated #, boost-format msgid "%1% k" @@ -30054,6 +30532,28 @@ msgstr "Плагины материалов" msgid "Printer plugins" msgstr "Плагины принтеров" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Восстановить по умолчанию" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Конфигурация не является допустимым JSON. Изменения не сохранены." @@ -30073,10 +30573,6 @@ msgstr "" "\n" "Переопределение в профиле будет отменено, и будет использоваться глобальная конфигурация." -# AI Translated -msgid "Restore defaults" -msgstr "Восстановить по умолчанию" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Используется глобальная конфигурация. Сохраните профиль, чтобы закрепить изменения." @@ -30146,6 +30642,215 @@ msgstr "Установка плагина" msgid "Installed \"%s\"." msgstr "Плагин «%s» установлен." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -30362,6 +31067,54 @@ msgstr "Не удалось перезагрузить плагин." msgid "Reloaded \"%s\"." msgstr "«%s» перезагружен." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "Информация отсутствует" + +msgid "Edit Project Info" +msgstr "Изменить информацию" + +msgid "Model Information" +msgstr "Информация о модели" + +msgid "Accessories" +msgstr "Прикреплённые файлы" + +msgid "Profile Information" +msgstr "Информация о профиле" + +msgid "Model name" +msgstr "Имя модели" + +msgid "Created by" +msgstr "Автор" + +msgid "Remixed by" +msgstr "Модифицировано" + +msgid "Shared by" +msgstr "Поделиться" + +msgid "Model description" +msgstr "Описание модели" + +msgid "BOM" +msgstr "Список материалов" + +msgid "Profile name" +msgstr "Имя профиля" + +msgid "Profile Author" +msgstr "Профиль автора" + +msgid "Profile description" +msgstr "Описание профиля" + # AI Translated msgid "Purge Mode Settings" msgstr "Настройки режима прочистки" @@ -30386,6 +31139,16 @@ msgstr "Уменьшает отходы прочистки и ускоряет msgid "Terminal" msgstr "Консоль" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Команда уже выполняется." @@ -30652,6 +31415,9 @@ msgstr " | привязка ВКЛ" msgid "Change texture - choose another one from the texture library" msgstr "Сменить текстуру - выберите другую из библиотеки текстур" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Карта высот - показать текстуру слоя под островами" @@ -30684,17 +31450,14 @@ msgstr "Соединять острова" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Раскладывать развёртку связной сеткой: части с общим ребром разворачиваются рядом друг с другом (куб становится соединённой развёрткой, а не шестью отдельными квадратами). Они остаются отдельными островами, поэтому любой из них потом можно переместить вручную." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Остров - перемещение, поворот и масштабирование целых островов" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Вершина - перетаскивание вершин для изменения формы; Shift/Ctrl - множественный выбор" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Ребро - перетаскивание рёбер для изменения формы; Shift/Ctrl - множественный выбор" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30732,9 +31495,13 @@ msgstr "Сбросить правки UV - отменить все ручные msgid "Snap - stick islands together when dragging one against another" msgstr "Привязка - склеивать острова при перетаскивании одного к другому" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Вписать все острова (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30745,6 +31512,9 @@ msgstr "Нет слоёв с наложением «Развёртка (LSCM)»" msgid "%.1f mm tile" msgstr "плитка %.1f мм" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Устарело - рисунок, швы или угол шва изменились после создания этой развёртки. Нажмите, чтобы развернуть заново." @@ -30753,19 +31523,48 @@ msgstr "Устарело - рисунок, швы или угол шва изм msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Развернуть нарисованную область в UV-острова. Вычисляется только при нажатии этой кнопки, а не при каждом изменении - поэтому сначала нарисуйте, измените угол шва или пометьте швы, а затем нажмите «Развернуть»." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "Островов: %d, граней: %s" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Сетевой плагин Bambu не обнаружен. Нажмите здесь, чтобы установить его." + +msgid "Create new project" +msgstr "Создать новый проект" + +msgid "Recently opened" +msgstr "Недавно открытые" + +msgid "Open Containing Folder" +msgstr "Открыть папку с файлом" + # AI Translated msgid "Forward" msgstr "Вперёд" -# AI Translated -msgid "Tools" -msgstr "Инструменты" - # AI Translated msgid "View Source" msgstr "Исходный код" @@ -30911,6 +31710,16 @@ msgstr "" "Плагин «%s» запрашивает выполнение следующих команд:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30920,6 +31729,30 @@ msgstr "Плагин «%s» запрашивает разрешение на с msgid "Plugin permission request" msgstr "Запрос разрешения плагина" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Интерфейс настройки плагина пуст. Показан редактор по умолчанию." @@ -31504,6 +32337,309 @@ msgstr "" "Предотвращение коробления материала\n" "Знаете ли вы, что при печати материалами, склонными к короблению, таких как ABS, повышение температуры подогреваемого стола может снизить эту вероятность?" +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Не удалось установить среду выполнения WebView2.\n" +#~ "Некоторые страницы (такие как мастер настройки) будут недоступны до момента установки.\n" +#~ "Необходимо выполнить установку в ручном режиме с https://developer.microsoft.com/microsoft-edge/webview2 и перезапустить OrcaSlicer." + +#~ msgid "Why this grouping" +#~ msgstr "Подробнее" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "ПО не поддерживает печать разными диаметрами сопел в рамках одной печати. Выберите экструдер для синхронизации диаметров сопел:" + +#~ msgid "Switch diameter" +#~ msgstr "Переключение диаметра" + +#~ msgid "BambuStudio Project" +#~ msgstr "Проект BambuStudio" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "Этот файл 3MF был создан в BambuStudio (версии %s), которая новее совместимой с ней версией OrcaSlicer %s. Обнаружены следующие нераспознанные настройки:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "Этот файл 3MF был создан в BambuStudio (версии %s), которая новее совместимой с ней версией OrcaSlicer %s. Некоторые настройки могут не поддерживаться." + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "Этот файл 3MF был создан в BambuStudio. Некоторые настройки могут отличаться от OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Невозможно отменить или повторить действие во время выполнения операции. Сначала остановите её." + +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# Тут сразу несколько изменений. 1 - на Вики речь идёт в целом даже про отдельные куски одного меша, а не только про части в составе сборки. 2 - логически переупорядочил предложения. 3 - touch and overlap заменено на "прямой контакт". 4 - не вижу смысла приводить примеры, не давая полного списка шаблонов. Какой-то логики по структуре шаблонов тут нет, т.к. ограничение исходит из алгоритма центровки, так что это только будет путать. +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Разделить шаблоны заполнения у независимых частей модели/сборки. Это позволяет получать симметричное расположение шаблона в случаях, когда отдельные части вызывают его смещение относительно центра модели.\n" +#~ "Примечание: не влияет на части с прямым контактом между собой и не затрагивает шаблоны с жёсткой привязкой к координатам стола." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Номер текущего слоя, начиная с единицы (т.е. первый слой имеет номер 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Видеоурок" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Фигура" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Создана пустая сетка" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Параллелепипед" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Быстрый выбор:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Ширина (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Глубина (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Высота (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "Нижний R" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "Верхний R" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "Большой R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "Малый R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Все рёбра" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Верхние рёбра" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Нижние рёбра" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Боковые рёбра" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Разрешение сетки" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Добавить фигуру" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Нет внешнего профиля" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Не удалось создать внешнюю грань" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Не удалось построить грань с отверстиями" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Ошибка вращения" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Профиль" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Начать новый профиль (для отверстий)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Сегменты" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Стороны" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Щёлкайте в рабочем пространстве, чтобы рисовать" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Привязка к сетке" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Шаг сетки" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Внешний" + +# AI Translated +#~ msgid "closed" +#~ msgstr "замкнутый" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2% (точек: %3%) %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (сверху)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (спереди)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (сбоку)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Угол вращения, °" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "0 — выдавливание, >0 — вращение" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Карман (вырез)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu замкнутый профиль" +#~ msgstr[1] "%zu замкнутых профиля" +#~ msgstr[2] "%zu замкнутых профилей" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Нарисуйте замкнутый профиль, чтобы включить" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Пустой результат" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Выдавливание: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Вращение: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Модель не выбрана" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Ошибка построения грани" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Ошибка построения грани с отверстиями" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Сетка инструмента пуста" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Карман добавлен (вырез)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Карман: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Требуется, чтобы активный слой использовал наложение «Развёртка (LSCM)»." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Шахматный узор - тестовая клетка вместо текстуры. Где клетки остаются квадратными, текстура не искажена; где они растягиваются, растянется и она" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Искажение - тепловая карта растяжения развёртки, от синего к красному" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Способ смешивания" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "На поверхности" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Слои: два материала чередуются между слоями печати; это даёт плавный переход на вертикальных поверхностях, но пропадает на обращённых вверх или вниз, где весь слой - одна полоса.\n" +#~ "На поверхности: мелкая шахматная клетка по поверхности; работает под любым углом, но может восприниматься как текстура, а не как смешение.\n" +#~ "Автоматически: слои на вертикальных гранях; горизонтальные грани получают ближайший один материал, поскольку шахматная клетка на них выглядит как узор." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Остров - перемещение, поворот и масштабирование целых островов" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Вершина - перетаскивание вершин для изменения формы; Shift/Ctrl - множественный выбор" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Ребро - перетаскивание рёбер для изменения формы; Shift/Ctrl - множественный выбор" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Вписать все острова (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Экспериментально) Использовать агентов принтера вместо хостов печати" @@ -31537,16 +32673,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Щёлкните грань или опорную плоскость, затем выберите инструмент рисования" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31603,10 +32729,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Расстояние по вертикали" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Линейный" - #~ msgid "Face recognition" #~ msgstr "Распознавание граней" @@ -33212,9 +34334,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "Выбрать часть" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/sv/OrcaSlicer_sv.po b/localization/i18n/sv/OrcaSlicer_sv.po index a31a633246..d136b67516 100644 --- a/localization/i18n/sv/OrcaSlicer_sv.po +++ b/localization/i18n/sv/OrcaSlicer_sv.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -2423,15 +2423,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Microsoft WebView2 Runtime kunde inte installeras.\n" -"Vissa funktioner, bland annat installationsguiden, kan visas tomma tills den är installerad.\n" -"Installera den manuellt från https://developer.microsoft.com/microsoft-edge/webview2/ och starta om Orca Slicer." # AI Translated #, c-format, boost-format @@ -4734,6 +4731,10 @@ msgstr "Gå till platta" msgid "AMS Materials Setting" msgstr "AMS Material Inställning" +# AI Translated +msgid "Wiki Guide" +msgstr "Wiki-guide" + msgid "Close" msgstr "Stäng" @@ -4759,10 +4760,6 @@ msgstr "Inmatningsvärdet ska vara större än %1% och mindre än %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "Faktorer för kalibrering av flödesdynamik" -# AI Translated -msgid "Wiki Guide" -msgstr "Wiki-guide" - msgid "PA Profile" msgstr "PA profil" @@ -5396,6 +5393,11 @@ msgstr "Justera automatiskt till gränsvärdet (%g mm)?" msgid "Adjust" msgstr "Justera" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -6342,10 +6344,6 @@ msgstr "Bered automatiskt om enligt den optimala filamentgrupperingen. Grupperin msgid "Filament Grouping" msgstr "Filamentgruppering" -# AI Translated -msgid "Why this grouping" -msgstr "Varför denna gruppering" - # AI Translated msgid "Please place filaments on the printer based on grouping result." msgstr "Placera filamenten i skrivaren enligt grupperingsresultatet." @@ -6554,6 +6552,43 @@ msgstr "Öka/minska redigeringsområdet" msgid "Sequence" msgstr "Sekvens" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Volym" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + # AI Translated msgid "Object selection" msgstr "Objektval" @@ -6787,6 +6822,12 @@ msgstr "Rutnät" msgid "Labels" msgstr "Etiketter" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Flytta sektionsplanet" @@ -6837,7 +6878,7 @@ msgid "Size:" msgstr "Storlek:" # AI Translated -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Konflikter mellan G-code-banor hittades på lager %d, Z = %.2lfmm. Placera de objekt som krockar längre ifrån varandra (%s <-> %s)." @@ -7349,6 +7390,12 @@ msgstr "Visa rutnätslinjer" msgid "Show Gridlines on plate" msgstr "Visa rutnätslinjer på plattan" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + # AI Translated msgid "Reset Window Layout" msgstr "Återställ fönsterlayout" @@ -9167,6 +9214,61 @@ msgstr "Se alla objektens inställningar" msgid "Material settings" msgstr "Materialinställningar" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Verktyg" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + # AI Translated msgid "Remove current plate (if not last one)" msgstr "Ta bort aktuell platta (om den inte är den sista)" @@ -9199,6 +9301,17 @@ msgstr "Redigera den aktuella plattans namn" msgid "Move plate to the front" msgstr "Flytta plattan längst fram" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + # AI Translated msgid "Customize current plate" msgstr "Anpassa aktuell platta" @@ -9276,14 +9389,6 @@ msgstr "AMS (1 plats)" msgid "Not installed" msgstr "Inte installerad" -# AI Translated -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Programmet stöder inte att olika nozzeldiametrar används i samma utskrift. Om vänster och höger nozzel skiljer sig åt kan vi bara fortsätta med utskrift med ett huvud. Bekräfta vilken nozzel du vill använda för det här projektet." - -# AI Translated -msgid "Switch diameter" -msgstr "Byt diameter" - msgid "Configuration incompatible" msgstr "Ej kompatibel konfiguration" @@ -9372,6 +9477,9 @@ msgstr "Blandat filament" msgid "Remove last mixed filament" msgstr "Ta bort det senaste blandade filamentet" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Lägg till blandat filament" @@ -9395,6 +9503,10 @@ msgstr "Det blandade filamentet har trasiga komponentreferenser" msgid "Edit / Delete / Merge" msgstr "Redigera / Radera / Slå ihop" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Det blandade målfilamentet använder detta fysiska filament som komponent. Sammanslagningen tar bort det fysiska filamentet och kan göra det blandade filamentet ogiltigt. Fortsätt?" @@ -9478,10 +9590,6 @@ msgstr "Laddar fil: %s" msgid "Load 3MF" msgstr "Ladda 3MF" -# AI Translated -msgid "BambuStudio Project" -msgstr "BambuStudio-projekt" - # AI Translated msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "3MF stöds inte av OrcaSlicer, laddar endast geometri data." @@ -9517,20 +9625,6 @@ msgstr "Uppdatera mjukvaran.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "3mf:s version %s är nyare än %s version %s, Föreslår att du uppdaterar din programvara." -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "3MF-filen skapades av BambuStudio (version %s), som är nyare än den kompatibla versionen %s. Okända inställningar hittades:" - -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "3MF-filen skapades av BambuStudio (version %s), som är nyare än den kompatibla versionen %s. Vissa inställningar kanske inte är helt kompatibla." - -# AI Translated -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "3MF-filen skapades av BambuStudio. Vissa inställningar kan skilja sig från OrcaSlicer." - msgid "Invalid values found in the 3MF:" msgstr "Ogiltiga värden hittades i 3MF:" @@ -9708,6 +9802,12 @@ msgstr "Vill du avaktivera automatiskt nedsläpp för att behålla Z-positionen? msgid "Object with floating parts was detected" msgstr "Ett objekt med svävande delar upptäcktes" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "En annan exportering pågår." @@ -9800,6 +9900,38 @@ msgstr "Ogiltlig data" msgid "Slicing Canceled" msgstr "Beredning avbruten" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + # AI Translated msgid "Network plug-in switched successfully." msgstr "Nätverkets insticksmodul byttes utan problem." @@ -9836,9 +9968,8 @@ msgstr "" msgid "Sync now" msgstr "Synkronisera nu" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Det går inte att ångra eller göra om medan en åtgärd pågår. Stoppa den först." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9912,6 +10043,11 @@ msgstr "Nedladdningen misslyckades; fel på filstorleken." msgid "Project downloaded %d%%" msgstr "Projektet har laddats ned %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advance-test" @@ -9941,6 +10077,13 @@ msgstr "Orca YOLO flödeskalibrering" msgid "Flowrate Test - Pass%d" msgstr "Flödestest - omgång %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Test av nozzeltemperatur" @@ -12640,6 +12783,9 @@ msgstr "Synkronisering mellan olika extruderdrivningar eller typer av Nozzle vol msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Synkronisera ändringen av parametrar till motsvarande parametrar för den andra extrudern." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Klicka för att återställa alla inställningar till den senast sparade förinställningen." @@ -13111,6 +13257,12 @@ msgstr "Utskriftsbar yta" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Välj vilken nätverksagentimplementation som ska användas för kommunikation med skrivaren. Tillgängliga agenter registreras vid start." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + # AI Translated #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format @@ -13251,10 +13403,25 @@ msgstr "Nozzel diameter" msgid "Wipe tower" msgstr "Prime torn" +msgid "Belt purge tower" +msgstr "" + # AI Translated msgid "Single extruder multi-material parameters" msgstr "Parametrar för multimaterial med en extruder" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + # AI Translated msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Det här är en multimaterialskrivare med en extruder, alla extrudrars diametrar ställs in på det nya värdet. Vill du fortsätta?" @@ -13265,6 +13432,18 @@ msgstr "Lagerhöjds begränsning" msgid "Z-Hop" msgstr "Z-Hop" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -13383,10 +13562,9 @@ msgstr "Fortsätt" msgid "Don't warn again for this preset" msgstr "Varna inte igen för den här förinställningen" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -13866,9 +14044,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Total ramming" -msgid "Volume" -msgstr "Volym" - # AI Translated msgid "Ramming line" msgstr "Ramming-linje" @@ -13922,6 +14097,120 @@ msgstr "Inloggningen misslyckades. Försök igen." msgid "parse json failed" msgstr "det gick inte att tolka json" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "Slutför" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Anpassad skrivare" + +msgid "Create" +msgstr "Skapa" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "Filament typ" + +msgid "Vendor" +msgstr "Leverantör" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "Rensa alla" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Detta stänger av alla molnfunktioner, inklusive profilsynkronisering med Orca Cloud. Användare som föredrar att arbeta helt offline kan aktivera det här alternativet." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Obs! När Stealth-läget är aktiverat säkerhetskopieras inte dina användarprofiler till Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + # AI Translated msgid "[Action Required] " msgstr "[Åtgärd krävs] " @@ -14413,6 +14702,14 @@ msgstr "G-code vid byte av extruderingstyp för filament" msgid "No object can be printed. It may be too small." msgstr "Inget objekt kan skrivas ut. Det kan vara för litet" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + # AI Translated msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Din utskrift ligger mycket nära primingområdena. Kontrollera att det inte blir någon kollision." @@ -14594,6 +14891,26 @@ msgstr "validering misslyckad" msgid "write callback failed" msgstr "skriv återuppringning misslyckad" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% är för nära undantagsområde. Det kan förekomma kollisioner vid utskrift." @@ -14649,6 +14966,43 @@ msgstr "Om du ändå vill skriva ut kan du aktivera alternativet i Inställninga msgid "No extrusions under current settings." msgstr "Nuvarande inställning har ingen extrudering." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Ett blandat filament med gradient används, men 'Underlager med blandad färg' är inaktiverat. Gradienten kommer inte att skrivas ut." @@ -14660,6 +15014,15 @@ msgstr "Smooth läge för timelapse stöds inte när ”per objekt” -sekvens msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Klumpdetektering stöds inte när utskriftssekvensen \"objekt för objekt\" är aktiverad." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Att aktivera både exakt Z-höjd och rengöringstornet kan orsaka skärningsfel." @@ -14678,11 +15041,6 @@ msgstr "Spiral Vase läge fungerar inte när objektet innehåller mer än ett ma msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Även om objektet %1% i sig ryms i byggvolymen överskrider det byggvolymens maximala höjd på grund av kompensation för materialkrympning." -# AI Translated -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Objektet %1% överskrider byggvolymens maximala höjd." - # AI Translated #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." @@ -14692,6 +15050,11 @@ msgstr "Även om objektet %1% i sig ryms i byggvolymen överskrider dess sista l msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Du kan behöva minska modellens storlek eller ändra de aktuella utskriftsinställningarna och försöka igen." +# AI Translated +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Objektet %1% överskrider byggvolymens maximala höjd." + msgid "Variable layer height is not supported with Organic supports." msgstr "Variabel lagerhöjd stöds inte med organiska support." @@ -15776,12 +16139,39 @@ msgstr "Hastighet för inre bridges. Om värdet anges i procent beräknas det ut msgid "This is the distance from the model to the outermost brim line." msgstr "Avståndet från modellen till yttersta brim linjen" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Brim typ" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Detta styr genereringen av brim på modellens yttre och/eller inre sida. Auto innebär att brim bredd analyseras och beräknas automatiskt." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Avstånd mellan brim och modell" @@ -17113,9 +17503,6 @@ msgstr "Filament pris, endast för statistiska ändamål" msgid "money/kg" msgstr "pris/kg" -msgid "Vendor" -msgstr "Leverantör" - msgid "Vendor of filament. For show only." msgstr "Försäljare av filament. Endast för visning" @@ -17197,6 +17584,66 @@ msgstr "Flerlinjig fyllning" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Använder flera linjer för ifyllnadsmönstret, om mönstret stöder det." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Linjär" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Optimering av Z-knäckningsbias (experimentell)" @@ -19772,6 +20219,99 @@ msgstr "Multimaterial med en extruder" msgid "Use single nozzle to print multi filament." msgstr "Använd en enda nozzel för att skriva ut med flera filament." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + # AI Translated msgid "Manual Filament Change" msgstr "Manuellt filamentbyte" @@ -20179,6 +20719,130 @@ msgstr "Tröskel för överlappning" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Om tröskelvinkeln är noll genereras stöd för överhäng vars överlappning är under tröskeln. Ju mindre detta värde är, desto brantare är det överhäng som kan skrivas ut utan stöd." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Tree support grenarnas vinkel" @@ -20382,17 +21046,11 @@ msgstr "Antal solida övre lager ökas när tjockleken kalkyleras och övre skal msgid "Separated infills" msgstr "Separerade ifyllnader" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Centrerar varje dels inre ifyllnad på sig själv, som om den bereddes ensam, i stället för på hela sammansättningen. Delar som rör vid eller överlappar varandra behandlas som en kropp och delar mittpunkt; separata delar (eller distinkta 3D-objekt) får var sin.\n" -"Användbart när en sammansättning grupperar flera objekt som var och ett ska behålla en konsekvent, självcentrerad ifyllnad.\n" -"Påverkar linje- och rutnätsmönster samt ifyllnader med rotationsmall.\n" -"Mönster som är låsta till globala koordinater (Gyroid, Bikaka, TPMS, ...) påverkas inte." # AI Translated msgid "Center surface pattern on" @@ -20655,6 +21313,12 @@ msgstr "Rensning efter filamentbyte kommer att göras inuti objektens support. D msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Det här objektet används för att rensa nozzeln efter ett filamentbyte för att spara filament och minska utskriftstiden. Färgerna i objekten kommer att blandas som ett resultat. Det kommer inte att få effekt om inte prime tower är aktiverat." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + # AI Translated msgid "Maximal bridging distance" msgstr "Maximalt bridging-avstånd" @@ -21710,9 +22374,8 @@ msgstr "Namn på den fysiska skrivare som används vid beredningen." msgid "Layer number" msgstr "Lagernummer" -# AI Translated -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Det aktuella lagrets index. Ettbaserat (alltså är första lagret nummer 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" # AI Translated msgid "Layer Z" @@ -21867,9 +22530,6 @@ msgstr "Omkalibrering" msgid "Calibrate" msgstr "Kalibrera" -msgid "Finish" -msgstr "Slutför" - msgid "How can I use calibration results?" msgstr "Hur kan jag använda kalibreringsresultaten?" @@ -22442,12 +23102,12 @@ msgstr "" "Accelerationsvärdena måste vara större än hastighetsvärdena.\n" "Kontrollera dina inmatningar." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Kalibrering av temperatur" -msgid "Filament type" -msgstr "Filament typ" - msgid "PLA" msgstr "PLA" @@ -22469,6 +23129,13 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +# AI Translated +msgid "Test model" +msgstr "Testmodell" + +msgid "Overhang" +msgstr "" + # AI Translated msgid "Start temp: " msgstr "Starttemp: " @@ -22598,10 +23265,6 @@ msgstr "Starta retraktion längd: " msgid "End retraction length: " msgstr "Slutets indragnings längd: " -# AI Translated -msgid "Test model" -msgstr "Testmodell" - # AI Translated msgid "Ringing Tower" msgstr "Ringing torn" @@ -23098,9 +23761,6 @@ msgstr "t.ex. Basic, Matt, Silke, Marmor" msgid "Filament Preset" msgstr "Filament inställning" -msgid "Create" -msgstr "Skapa" - # AI Translated msgid "Vendor is not selected; please reselect vendor." msgstr "Ingen tillverkare är vald; välj tillverkare igen." @@ -23430,6 +24090,9 @@ msgstr "" "Skrivaren och alla filament- och processförinställningar som hör till skrivaren.\n" "Kan delas med andra." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -24270,9 +24933,6 @@ msgstr "Tilldela filament manuellt till vänster eller höger nozzel" msgid "Global settings" msgstr "Globala inställningar" -msgid "Video tutorial" -msgstr "Videohandledning" - # AI Translated msgid "(Sync with printer)" msgstr "(Synka med skrivaren)" @@ -24785,6 +25445,33 @@ msgstr "Om detta är aktiverat sparas värdena ovan som standard för framtida S msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "Paketmappen finns inte." @@ -24829,6 +25516,12 @@ msgstr "Avprenumerera på paket" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "Spara förinställningspaket" @@ -29271,214 +29964,6 @@ msgstr "Det här teckensnittet har ingen kontur för den här texten" msgid "Size: %.1f × %.1f mm" msgstr "Storlek: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Primitiv" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Tom mesh genererades" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Låda" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Förval:" - -# AI Translated -msgid "Width (X)" -msgstr "Bredd (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Djup (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Höjd (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "Nedre R" - -# AI Translated -msgid "Top R" -msgstr "Övre R" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "Stor R" - -# AI Translated -msgid "Minor R" -msgstr "Liten R" - -# AI Translated -msgid "All edges" -msgstr "Alla kanter" - -# AI Translated -msgid "Top edges" -msgstr "Övre kanter" - -# AI Translated -msgid "Bottom edges" -msgstr "Nedre kanter" - -# AI Translated -msgid "Lateral edges" -msgstr "Sidokanter" - -# AI Translated -msgid "Mesh resolution" -msgstr "Meshupplösning" - -# AI Translated -msgid "Add Shape" -msgstr "Lägg till form" - -# AI Translated -msgid "No outer profile" -msgstr "Ingen yttre profil" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Det gick inte att skapa den yttre ytan" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Det gick inte att skapa en yta med hål" - -# AI Translated -msgid "Revolve failed" -msgstr "Rotationen misslyckades" - -# AI Translated -msgid "Profile" -msgstr "Profil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Starta ny profil (för hål)" - -# AI Translated -msgid "Segments" -msgstr "Segment" - -# AI Translated -msgid "Sides" -msgstr "Sidor" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Klicka i vyn för att rita" - -# AI Translated -msgid "Snap to grid" -msgstr "Fäst mot rutnät" - -# AI Translated -msgid "Grid step" -msgstr "Rutnätssteg" - -# AI Translated -msgid "Outer" -msgstr "Yttre" - -# AI Translated -msgid "closed" -msgstr "sluten" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% punkter %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Topp)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Front)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Sida)" - -# AI Translated -msgid "Revolve deg" -msgstr "Rotationsvinkel" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Ange 0 för extrudering, >0 för rotation" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Ficka (skär)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu sluten profil" -msgstr[1] "%zu slutna profiler" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Rita en sluten profil för att aktivera" - -# AI Translated -msgid "Clear all" -msgstr "Rensa alla" - -# AI Translated -msgid "Empty result" -msgstr "Tomt resultat" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Extrudera: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Rotera: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Inget objekt valt" - -# AI Translated -msgid "Face failed" -msgstr "Det gick inte att skapa ytan" - -# AI Translated -msgid "Face with holes failed" -msgstr "Det gick inte att skapa ytan med hål" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Verktygets mesh är tom" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Ficka tillagd (negativ volym)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Ficka: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -29603,6 +30088,9 @@ msgstr "Gizmo montera" msgid "Gizmo brim ears" msgstr "Gizmo brätte öron" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Vertikal reglage - Flytta aktivt tryck Upp" @@ -30587,10 +31075,6 @@ msgstr "Mina inställningar" msgid "Custom Printer Setup" msgstr "Konfiguration av anpassad skrivare" -# AI Translated -msgid "Custom Printer" -msgstr "Anpassad skrivare" - # AI Translated msgid "Define a custom printer profile" msgstr "Definiera en anpassad skrivarprofil" @@ -31235,9 +31719,8 @@ msgstr "Vinkeltröskel - fyllningen stannar vid kanter som är skarpare än dett msgid "Click a triangle to paint it" msgstr "Klicka på en triangel för att måla den" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Kräver att det aktiva lagret är mappat med Veckla ut (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -31251,17 +31734,15 @@ msgstr "Snabb - reliefen skuggas bara på, byggs inte, och bara för lagret du r msgid "Checker" msgstr "Schackmönster" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Schackmönster - ett testrutnät i stället för texturen. Där rutorna förblir kvadratiska är texturen oförvrängd; där de sträcks ut blir även den det" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Förvrängning" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Förvrängning - värmekarta från blått till rött över utsträckningen i UV-utvecklingen" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -31377,24 +31858,11 @@ msgstr "Blanda filament" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Varvar två filament för att efterlikna färgerna däremellan, så att en handfull filament kan återge ett foto eller en gradient. En bild med enhetliga färger skrivs ut likadant i båda fallen. Av använder ett filament per område." -# AI Translated -msgid "Mix by" -msgstr "Blanda efter" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Yta" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Lager: de två filamenten växlar mellan utskriftslager, vilket blandas jämnt på stående ytor men försvinner på plana ytor, där ett helt lager är ett enda band.\n" -"Yta: ett fint schackmönster över ytan, som fungerar i alla vinklar men kan uppfattas som textur snarare än som en blandning.\n" -"Automatisk: lager på stående ytor; plana ytor får det närmaste enskilda filamentet, eftersom ett schackmönster där syns som ett mönster." # AI Translated #, boost-format @@ -31854,14 +32322,6 @@ msgstr "Kräver cirka %1% trianglar, budget %2% - inbakningen förenklar tillbak msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Hur många tusen trianglar förfiningen får lägga till i modellen. Den triangel som passar sämst delas alltid först, så även en körning som förbrukar allt har använt dem där det syns mest. Höj värdet om reliefen fortfarande ser grov ut." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Stoppar inbakningen. Det som redan hade slutförts finns kvar på modellen och kan ångras." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Stänger verktyget utan att baka in. Din målning, dina lager och dina inställningar stannar kvar på modellen." - # AI Translated msgid "Preparing..." msgstr "Förbereder..." @@ -31886,6 +32346,14 @@ msgstr "Gör om de målade höjdkartorna till verklig geometri genom att flytta msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Gör om de målade höjdkartorna till verklig geometri. Meshen byggs först om till en jämn täthet och förfinas där texturen böjer sig, så att detaljerna har hörn att landa på - allt i ett steg." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Stoppar inbakningen. Det som redan hade slutförts finns kvar på modellen och kan ångras." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Stänger verktyget utan att baka in. Din målning, dina lager och dina inställningar stannar kvar på modellen." + # AI Translated #, boost-format msgid "%1% k" @@ -32095,6 +32563,28 @@ msgstr "Filamentinsticksmoduler" msgid "Printer plugins" msgstr "Skrivarinsticksmoduler" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Återställ standardvärden" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Konfigurationen är inte giltig JSON. Dina ändringar sparades inte." @@ -32114,10 +32604,6 @@ msgstr "" "\n" "Detta förkastar förinställningens åsidosättning och använder den globala konfigurationen." -# AI Translated -msgid "Restore defaults" -msgstr "Återställ standardvärden" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Använder den globala konfigurationen. Spara förinställningen för att behålla den." @@ -32187,6 +32673,215 @@ msgstr "Installerar insticksmodul" msgid "Installed \"%s\"." msgstr "\"%s\" har installerats." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -32403,6 +33098,54 @@ msgstr "Det gick inte att läsa in insticksmodulen igen." msgid "Reloaded \"%s\"." msgstr "\"%s\" har lästs in igen." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "Inställningar för rensningsläge" @@ -32427,6 +33170,16 @@ msgstr "Minskar spillet från priming och skriver ut snabbare. Kan orsaka lätt msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Ett kommando körs redan." @@ -32693,6 +33446,9 @@ msgstr " | fästning PÅ" msgid "Change texture - choose another one from the texture library" msgstr "Byt textur - välj en annan från texturbiblioteket" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Höjdkarta - visa lagrets textur under öarna" @@ -32725,17 +33481,14 @@ msgstr "Koppla ihop öar" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Lägg ut UV-utvecklingen som ett sammanhängande nät: bitar som delar en kant vecklas ut bredvid varandra (en kub blir ett sammanhängande nät i stället för sex lösa kvadrater). De förblir separata öar, så du kan fortfarande flytta vilken som helst av dem för hand efteråt." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Ö - flytta, rotera och skala hela öar" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Hörn - dra hörn för att ändra formen; Skift/Ctrl för flerval" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Kant - dra kanter för att ändra formen; Skift/Ctrl för flerval" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -32773,9 +33526,13 @@ msgstr "Rensa UV-ändringar - förkasta alla manuella förflyttningar av hörn/k msgid "Snap - stick islands together when dragging one against another" msgstr "Fäst - fäst öar mot varandra när du drar en mot en annan" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Visa alla öar (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -32786,6 +33543,9 @@ msgstr "Inget lager mappat med Veckla ut" msgid "%.1f mm tile" msgstr "%.1f mm ruta" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Inaktuell - målningen, sömmarna eller sömvinkeln har ändrats sedan den här utvecklingen gjordes. Tryck för att veckla ut igen." @@ -32794,19 +33554,48 @@ msgstr "Inaktuell - målningen, sömmarna eller sömvinkeln har ändrats sedan d msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Plana ut det målade området till UV-öar. Det beräknas bara när du trycker här, inte vid varje ändring - så måla, ändra sömvinkeln eller markera sömmar först, och tryck sedan på Veckla ut." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d öar, %s ytor" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + # AI Translated msgid "Forward" msgstr "Framåt" -# AI Translated -msgid "Tools" -msgstr "Verktyg" - # AI Translated msgid "View Source" msgstr "Visa källkod" @@ -32952,6 +33741,16 @@ msgstr "" "Insticksmodulen \"%s\" begär att få köra följande kommando(n):\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -32961,6 +33760,30 @@ msgstr "Insticksmodulen \"%s\" begär behörighet för Python-granskningshändel msgid "Plugin permission request" msgstr "Behörighetsbegäran från insticksmodul" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Insticksmodulens konfigurationsgränssnitt var tomt. Standardredigeraren visas." @@ -33562,6 +34385,320 @@ msgstr "" "Undvik vridning\n" "Visste du att när du skriver ut material som är benägna att vrida, såsom ABS, kan en lämplig ökning av värmebäddens temperatur minska sannolikheten för vridning?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Microsoft WebView2 Runtime kunde inte installeras.\n" +#~ "Vissa funktioner, bland annat installationsguiden, kan visas tomma tills den är installerad.\n" +#~ "Installera den manuellt från https://developer.microsoft.com/microsoft-edge/webview2/ och starta om Orca Slicer." + +# AI Translated +#~ msgid "Why this grouping" +#~ msgstr "Varför denna gruppering" + +# AI Translated +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Programmet stöder inte att olika nozzeldiametrar används i samma utskrift. Om vänster och höger nozzel skiljer sig åt kan vi bara fortsätta med utskrift med ett huvud. Bekräfta vilken nozzel du vill använda för det här projektet." + +# AI Translated +#~ msgid "Switch diameter" +#~ msgstr "Byt diameter" + +# AI Translated +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudio-projekt" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "3MF-filen skapades av BambuStudio (version %s), som är nyare än den kompatibla versionen %s. Okända inställningar hittades:" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "3MF-filen skapades av BambuStudio (version %s), som är nyare än den kompatibla versionen %s. Vissa inställningar kanske inte är helt kompatibla." + +# AI Translated +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "3MF-filen skapades av BambuStudio. Vissa inställningar kan skilja sig från OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Det går inte att ångra eller göra om medan en åtgärd pågår. Stoppa den först." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Centrerar varje dels inre ifyllnad på sig själv, som om den bereddes ensam, i stället för på hela sammansättningen. Delar som rör vid eller överlappar varandra behandlas som en kropp och delar mittpunkt; separata delar (eller distinkta 3D-objekt) får var sin.\n" +#~ "Användbart när en sammansättning grupperar flera objekt som var och ett ska behålla en konsekvent, självcentrerad ifyllnad.\n" +#~ "Påverkar linje- och rutnätsmönster samt ifyllnader med rotationsmall.\n" +#~ "Mönster som är låsta till globala koordinater (Gyroid, Bikaka, TPMS, ...) påverkas inte." + +# AI Translated +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Det aktuella lagrets index. Ettbaserat (alltså är första lagret nummer 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Videohandledning" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Primitiv" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Tom mesh genererades" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Låda" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Förval:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Bredd (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Djup (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Höjd (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "Nedre R" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "Övre R" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "Stor R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "Liten R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Alla kanter" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Övre kanter" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Nedre kanter" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Sidokanter" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Meshupplösning" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Lägg till form" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Ingen yttre profil" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Det gick inte att skapa den yttre ytan" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Det gick inte att skapa en yta med hål" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Rotationen misslyckades" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Starta ny profil (för hål)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segment" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Sidor" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Klicka i vyn för att rita" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Fäst mot rutnät" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Rutnätssteg" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Yttre" + +# AI Translated +#~ msgid "closed" +#~ msgstr "sluten" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% punkter %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Topp)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Front)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Sida)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Rotationsvinkel" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Ange 0 för extrudering, >0 för rotation" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Ficka (skär)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu sluten profil" +#~ msgstr[1] "%zu slutna profiler" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Rita en sluten profil för att aktivera" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Tomt resultat" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Extrudera: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Rotera: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Inget objekt valt" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Det gick inte att skapa ytan" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Det gick inte att skapa ytan med hål" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Verktygets mesh är tom" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Ficka tillagd (negativ volym)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Ficka: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Kräver att det aktiva lagret är mappat med Veckla ut (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Schackmönster - ett testrutnät i stället för texturen. Där rutorna förblir kvadratiska är texturen oförvrängd; där de sträcks ut blir även den det" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Förvrängning - värmekarta från blått till rött över utsträckningen i UV-utvecklingen" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Blanda efter" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Yta" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Lager: de två filamenten växlar mellan utskriftslager, vilket blandas jämnt på stående ytor men försvinner på plana ytor, där ett helt lager är ett enda band.\n" +#~ "Yta: ett fint schackmönster över ytan, som fungerar i alla vinklar men kan uppfattas som textur snarare än som en blandning.\n" +#~ "Automatisk: lager på stående ytor; plana ytor får det närmaste enskilda filamentet, eftersom ett schackmönster där syns som ett mönster." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Ö - flytta, rotera och skala hela öar" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Hörn - dra hörn för att ändra formen; Skift/Ctrl för flerval" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Kant - dra kanter för att ändra formen; Skift/Ctrl för flerval" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Visa alla öar (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Experimentellt) Använd skrivaragenter i stället för utskriftsvärdar" @@ -33595,16 +34732,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Klicka på en yta eller ett referensplan och välj sedan ett ritverktyg" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -33661,10 +34788,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Vertikalt avstånd" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Linjär" - #~ msgid "Face recognition" #~ msgstr "Ansiktsigenkänning" @@ -35252,9 +36375,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "val av delar" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/th/OrcaSlicer_th.po b/localization/i18n/th/OrcaSlicer_th.po index 7631bd1f50..52028d6322 100644 --- a/localization/i18n/th/OrcaSlicer_th.po +++ b/localization/i18n/th/OrcaSlicer_th.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2026-06-19 13:40+0700\n" "Last-Translator: Icezaza\n" "Language-Team: Thai\n" @@ -2146,15 +2146,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "รันไทม์ WebView2" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"ไม่สามารถติดตั้ง Microsoft WebView2 Runtime ได้\n" -"ฟีเจอร์บางอย่าง รวมถึงตัวช่วยตั้งค่า อาจแสดงเป็นหน้าว่างจนกว่าจะติดตั้ง\n" -"โปรดติดตั้งด้วยตนเองจาก https://developer.microsoft.com/microsoft-edge/webview2/ แล้วรีสตาร์ท Orca Slicer" #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4285,6 +4282,9 @@ msgstr "ไปที่ฐานพิมพ์" msgid "AMS Materials Setting" msgstr "การตั้งค่าวัสดุ AMS" +msgid "Wiki Guide" +msgstr "คู่มือวิกิ" + msgid "Close" msgstr "ปิด" @@ -4308,9 +4308,6 @@ msgstr "ค่าอินพุตควรมากกว่า %1% และ msgid "Factors of Flow Dynamics Calibration" msgstr "ปัจจัยของการสอบเทียบโฟลว์ไดนามิกส์" -msgid "Wiki Guide" -msgstr "คู่มือวิกิ" - msgid "PA Profile" msgstr "โปรไฟล์ PA" @@ -4897,6 +4894,11 @@ msgstr "ปรับเป็นค่าขีดจำกัด (%g mm) โด msgid "Adjust" msgstr "ปรับ" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5733,9 +5735,6 @@ msgstr "สไลซ์ใหม่โดยอัตโนมัติตาม msgid "Filament Grouping" msgstr "การจัดกลุ่มเส้นพลาสติก" -msgid "Why this grouping" -msgstr "ทำไมถึงจัดกลุ่มแบบนี้." - msgid "Please place filaments on the printer based on grouping result." msgstr "กรุณาวางฟิลาเมนต์บนเครื่องพิมพ์ตามผลการจัดกลุ่ม" @@ -5924,6 +5923,43 @@ msgstr "เพิ่ม/ลดพื้นที่แก้ไข" msgid "Sequence" msgstr "ลำดับ" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "ปริมาณ" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "การเลือกวัตถุ" @@ -6140,6 +6176,12 @@ msgstr "เส้นกริด" msgid "Labels" msgstr "ป้ายชื่อ" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "ย้ายระนาบภาคตัด" @@ -6189,7 +6231,7 @@ msgid "Size:" msgstr "ขนาด:" # AI Translated -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "พบความขัดแย้งของเส้นทาง G-code ที่เลเยอร์ %d, Z = %.2lfmm โปรดแยกวัตถุที่ขัดแย้งกันให้ไกลออกไป (%s <-> %s)" @@ -6661,6 +6703,12 @@ msgstr "แสดงเส้นกริด" msgid "Show Gridlines on plate" msgstr "แสดงเส้นตารางบนจาน" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "รีเซ็ตเค้าโครงหน้าต่าง" @@ -8334,6 +8382,61 @@ msgstr "ดูการตั้งค่าของวัตถุทั้ง msgid "Material settings" msgstr "การตั้งค่าวัสดุ" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "เครื่องมือ" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "ลบแผ่นปัจจุบัน (ถ้าไม่ใช่แผ่นสุดท้าย)" @@ -8358,6 +8461,17 @@ msgstr "แก้ไขชื่อป้ายทะเบียนปัจจ msgid "Move plate to the front" msgstr "ย้ายจานไปด้านหน้า" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "ปรับแต่งแผ่นปัจจุบัน" @@ -8424,12 +8538,6 @@ msgstr "AMS(1 ช่อง)" msgid "Not installed" msgstr "ไม่ได้ติดตั้ง" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "ซอฟต์แวร์ไม่รองรับการใช้หัวฉีดที่มีเส้นผ่านศูนย์กลางต่างกันในการพิมพ์ครั้งเดียว หากหัวฉีดด้านซ้ายและขวาไม่สอดคล้องกัน เราสามารถดำเนินการพิมพ์แบบหัวเดียวเท่านั้น โปรดยืนยันว่าคุณต้องการใช้หัวฉีดใดสำหรับโปรเจ็กต์นี้" - -msgid "Switch diameter" -msgstr "สลับเส้นผ่านศูนย์กลาง" - msgid "Configuration incompatible" msgstr "การกำหนดค่าเข้ากันไม่ได้" @@ -8511,6 +8619,9 @@ msgstr "เส้นพลาสติกผสม" msgid "Remove last mixed filament" msgstr "ลบเส้นพลาสติกผสมล่าสุด" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "เพิ่มเส้นพลาสติกผสม" @@ -8533,6 +8644,10 @@ msgstr "เส้นพลาสติกผสมมีการอ้างอ msgid "Edit / Delete / Merge" msgstr "แก้ไข / ลบ / รวม" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "เส้นพลาสติกผสมปลายทางใช้เส้นพลาสติกจริงนี้เป็นส่วนประกอบ การรวมจะลบเส้นพลาสติกจริงนี้และอาจทำให้เส้นพลาสติกผสมใช้ไม่ได้ ดำเนินการต่อหรือไม่?" @@ -8607,9 +8722,6 @@ msgstr "กำลังโหลดไฟล์: %s" msgid "Load 3MF" msgstr "โหลด 3MF" -msgid "BambuStudio Project" -msgstr "โครงการแบมบูสตูดิโอ" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "OrcaSlicer ไม่รองรับ 3MF โดยจะโหลดข้อมูลเรขาคณิตเท่านั้น" @@ -8639,17 +8751,6 @@ msgstr "คุณควรอัพเกรดซอฟต์แวร์ขอ msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "ไฟล์ 3MF เวอร์ชัน %s ใหม่กว่าเวอร์ชัน %s ของ %s เราขอแนะนำให้อัปเกรดซอฟต์แวร์ของคุณ" -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "3MF ถูกสร้างขึ้นโดย BambuStudio (เวอร์ชัน %s) ซึ่งใหม่กว่าเวอร์ชัน %s ที่เข้ากันได้ พบการตั้งค่าที่ไม่รู้จัก:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "3MF ถูกสร้างขึ้นโดย BambuStudio (เวอร์ชัน %s) ซึ่งใหม่กว่าเวอร์ชัน %s ที่เข้ากันได้ การตั้งค่าบางอย่างอาจเข้ากันไม่ได้อย่างสมบูรณ์" - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "3MF ถูกสร้างขึ้นโดย BambuStudio การตั้งค่าบางอย่างอาจแตกต่างจาก OrcaSlicer" - msgid "Invalid values found in the 3MF:" msgstr "พบค่าที่ไม่ถูกต้องใน 3MF:" @@ -8818,6 +8919,12 @@ msgstr "ปิดการใช้งานการวางอัตโนม msgid "Object with floating parts was detected" msgstr "ตรวจพบวัตถุที่มีชิ้นส่วนลอยอยู่" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "งานส่งออกอื่นกำลังทำงานอยู่" @@ -8902,6 +9009,38 @@ msgstr "ข้อมูลไม่ถูกต้อง" msgid "Slicing Canceled" msgstr "ยกเลิกการสไลซ์แล้ว" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "สลับปลั๊กอินเครือข่ายสำเร็จแล้ว" @@ -8933,9 +9072,8 @@ msgstr "" msgid "Sync now" msgstr "ซิงค์เลย" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "ไม่สามารถเลิกทำหรือทำซ้ำได้ขณะที่มีการดำเนินการอยู่ โปรดหยุดการดำเนินการก่อน" +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9006,6 +9144,11 @@ msgstr "ดาวน์โหลดล้มเหลว มีข้อยก msgid "Project downloaded %d%%" msgstr "ดาวน์โหลดโครงการแล้ว %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "การทดสอบ Pressure Advance" @@ -9032,6 +9175,13 @@ msgstr "ปรับเทียบอัตราการไหล Orca YOLO" msgid "Flowrate Test - Pass%d" msgstr "การทดสอบอัตราการไหล - รอบ %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "การทดสอบอุณหภูมิหัวฉีด" @@ -11479,6 +11629,9 @@ msgstr "ไม่รองรับการซิงโครไนซ์ปร msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "ซิงโครไนซ์การแก้ไขพารามิเตอร์ไปยังพารามิเตอร์ที่สอดคล้องกันของชุดดันเส้นอีกตัวหนึ่ง" +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "คลิกเพื่อรีเซ็ตการตั้งค่าทั้งหมดเป็นค่าที่ตั้งไว้ล่วงหน้าที่บันทึกไว้ล่าสุด" @@ -11889,6 +12042,12 @@ msgstr "พื้นที่ที่สามารถพิมพ์ได้ msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "เลือกการใช้งานตัวแทนเครือข่ายสำหรับการสื่อสารของเครื่องพิมพ์ ตัวแทนที่มีอยู่จะได้รับการลงทะเบียนเมื่อเริ่มต้น" +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12005,9 +12164,24 @@ msgstr "เส้นผ่านศูนย์กลางหัวฉีด" msgid "Wipe tower" msgstr "Wipe Tower" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "พารามิเตอร์วัสดุหลายชุดดันเส้นเดี่ยว" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "นี่คือเครื่องพิมพ์หลายวัสดุที่ใช้ชุดดันเส้นเดี่ยว โดยเส้นผ่านศูนย์กลางของชุดดันเส้นทั้งหมดจะถูกตั้งค่าเป็นค่าใหม่ คุณต้องการดำเนินการต่อหรือไม่?" @@ -12017,6 +12191,18 @@ msgstr "การจำกัดความสูงของเลเยอร msgid "Z-Hop" msgstr "ยกแกน Z" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -12119,10 +12305,9 @@ msgstr "ดำเนินการต่อ" msgid "Don't warn again for this preset" msgstr "ไม่ต้องเตือนอีกสำหรับค่าที่กำหนดล่วงหน้านี้" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12549,9 +12734,6 @@ msgstr "มิลลิวินาที" msgid "Total ramming" msgstr "การอัดกระแทกเส้นทั้งหมด" -msgid "Volume" -msgstr "ปริมาณ" - msgid "Ramming line" msgstr "เส้นราม" @@ -12600,6 +12782,120 @@ msgstr "การเข้าสู่ระบบล้มเหลว โป msgid "parse json failed" msgstr "แยกวิเคราะห์ json ไม่สำเร็จ" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "เสร็จ" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "เครื่องพิมพ์แบบกำหนดเอง" + +msgid "Create" +msgstr "สร้าง" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "ชนิดเส้นพลาสติก" + +msgid "Vendor" +msgstr "ผู้ขาย" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "ล้างทั้งหมด" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "ตัวเลือกนี้จะปิดการใช้งานฟีเจอร์คลาวด์ทั้งหมด รวมถึงการซิงก์โปรไฟล์ Orca Cloud ผู้ใช้ที่ต้องการทำงานแบบออฟไลน์ทั้งหมดสามารถเปิดตัวเลือกนี้ได้" + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "หมายเหตุ: เมื่อเปิดโหมดซ่อนตัว โปรไฟล์ผู้ใช้ของคุณจะไม่ถูกสำรองไปยัง Orca Cloud" + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + msgid "[Action Required] " msgstr "[ต้องดำเนินการ]" @@ -13059,6 +13355,14 @@ msgstr "เส้นพลาสติกเปลี่ยนประเภท msgid "No object can be printed. It may be too small." msgstr "ไม่สามารถพิมพ์วัตถุได้ อาจจะเล็กเกินไป" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "งานพิมพ์ของคุณอยู่ใกล้กับบริเวณรองพื้นมาก ตรวจสอบให้แน่ใจว่าไม่มีการชนกัน" @@ -13231,6 +13535,26 @@ msgstr "การตรวจสอบล้มเหลว" msgid "write callback failed" msgstr "การเขียนการโทรกลับล้มเหลว" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% อยู่ใกล้พื้นที่แยกมากเกินไป อาจเกิดการชนกันเมื่อพิมพ์" @@ -13281,6 +13605,43 @@ msgstr "หากคุณยังต้องการพิมพ์ คุ msgid "No extrusions under current settings." msgstr "ไม่มีการอัดขึ้นรูปภายใต้การตั้งค่าปัจจุบัน" +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "มีการใช้เส้นพลาสติกผสมแบบเกรเดียนต์ แต่ 'ซับเลเยอร์สีผสม' ถูกปิดใช้งาน เกรเดียนต์จะไม่ถูกพิมพ์" @@ -13291,6 +13652,15 @@ msgstr "ไม่รองรับโหมดไทม์แลปส์แบ msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "ไม่รองรับการตรวจจับการจับกันเป็นก้อนเมื่อเปิดใช้งานลำดับ \"ตามวัตถุ\"" +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "การเปิดใช้งานทั้งความสูง Z ที่แม่นยำและ Prime Tower อาจทำให้เกิดข้อผิดพลาดในการแบ่งส่วน" @@ -13307,10 +13677,6 @@ msgstr "โหมดแจกันเกลียวจะไม่ทำงา msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "แม้ว่าวัตถุ %1% จะพอดีกับปริมาตรการพิมพ์ แต่วัตถุนั้นเกินความสูงของปริมาตรการพิมพ์สูงสุดเนื่องจากการชดเชยการหดตัวของวัสดุ" -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "วัตถุ %1% เกินความสูงของปริมาตรการพิมพ์สูงสุด" - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "แม้ว่าวัตถุ %1% จะพอดีกับปริมาตรการพิมพ์ แต่วัตถุนั้นเกินความสูงของปริมาตรการพิมพ์สูงสุด" @@ -13318,6 +13684,10 @@ msgstr "แม้ว่าวัตถุ %1% จะพอดีกับปร msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "คุณอาจต้องการลดขนาดแบบจำลองของคุณหรือเปลี่ยนการตั้งค่าการพิมพ์ปัจจุบันแล้วลองอีกครั้ง" +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "วัตถุ %1% เกินความสูงของปริมาตรการพิมพ์สูงสุด" + msgid "Variable layer height is not supported with Organic supports." msgstr "ไม่รองรับความสูงของเลเยอร์ที่แปรผันได้ด้วยการรองรับแบบออร์แกนิก" @@ -14269,12 +14639,39 @@ msgstr "ความเร็วของสะพานภายใน หา msgid "This is the distance from the model to the outermost brim line." msgstr "ระยะห่างจากแบบจำลองถึงเส้นขอบยึดชิ้นงานด้านนอกสุด" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "ชนิด ขอบยึดชิ้นงาน" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "วิธีนี้จะควบคุมการสร้างขอบยึดชิ้นงานที่ด้านนอกและ/หรือด้านในของรุ่น อัตโนมัติหมายถึงความกว้างของขอบยึดชิ้นงานได้รับการวิเคราะห์และคำนวณโดยอัตโนมัติ" +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "ช่องว่าง ขอบยึดชิ้นงาน กับชิ้นงาน" @@ -15445,9 +15842,6 @@ msgstr "ราคาเส้นพลาสติก. สำหรับสถ msgid "money/kg" msgstr "เงิน/กก." -msgid "Vendor" -msgstr "ผู้ขาย" - msgid "Vendor of filament. For show only." msgstr "ผู้จำหน่ายเส้นพลาสติก. สำหรับการแสดงเท่านั้น" @@ -15521,6 +15915,66 @@ msgstr "ไส้ในหลายบรรทัด" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "การใช้หลายบรรทัดสำหรับรูปแบบ ไส้ใน หากรองรับโดยรูปแบบ ไส้ใน" +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "เชิงเส้น" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "การปรับชดเชยการโก่งตัวตามแกน Z ให้เหมาะสม (ทดลอง)" @@ -17748,6 +18202,99 @@ msgstr "ชุดดันเส้นเดี่ยวหลายวัสด msgid "Use single nozzle to print multi filament." msgstr "ใช้หัวฉีดเดี่ยวเพื่อพิมพ์เส้นพลาสติกหลายเส้น" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "การเปลี่ยนเส้นพลาสติกด้วยตนเอง" @@ -18120,6 +18667,130 @@ msgstr "การทับซ้อนกันของเกณฑ์" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "หากมุมเกณฑ์เป็นศูนย์ ระบบจะสร้างส่วนรองรับสำหรับส่วนยื่นที่มีการทับซ้อนกันต่ำกว่าเกณฑ์ ยิ่งค่านี้น้อยลง ระยะยื่นที่สามารถพิมพ์โดยไม่ต้องรองรับก็จะยิ่งชันมากขึ้น" +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "มุมกิ่งกิ่งรองรับต้นไม้" @@ -18299,17 +18970,11 @@ msgstr "จำนวนชั้นทึบด้านบนจะเพิ่ msgid "Separated infills" msgstr "ไส้ในแบบแยก" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"จัดกึ่งกลางไส้ในภายในของแต่ละชิ้นส่วนบนตัวมันเอง เสมือนว่าถูกสไลซ์แยกเดี่ยว แทนที่จะอิงกับชุดประกอบทั้งหมด ชิ้นส่วนที่สัมผัสหรือซ้อนทับกันจะถือเป็นวัตถุเดียวและใช้จุดศูนย์กลางร่วมกัน ส่วนชิ้นส่วนแยก (หรือวัตถุ 3D ที่แยกจากกัน) จะได้จุดศูนย์กลางของตัวเอง\n" -"มีประโยชน์เมื่อชุดประกอบรวมหลายวัตถุที่แต่ละชิ้นควรคงไส้ในที่จัดกึ่งกลางตัวเองอย่างสม่ำเสมอ\n" -"ส่งผลต่อลวดลายเส้นและตาราง และไส้ในแบบเทมเพลตหมุน\n" -"ลวดลายที่ล็อกกับพิกัดสากล (Gyroid, Honeycomb, TPMS, ...) จะไม่ได้รับผลกระทบ" # AI Translated msgid "Center surface pattern on" @@ -18545,6 +19210,12 @@ msgstr "การล้างข้อมูลหลังจากเปลี msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "วัตถุนี้จะใช้ในการล้างหัวฉีดหลังจากเปลี่ยนเส้นพลาสติกเพื่อประหยัดเส้นพลาสติกและลดเวลาในการพิมพ์ สีของวัตถุจะผสมกัน มันจะไม่มีผลเว้นแต่จะเปิดใช้งาน Prime Tower" +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "ระยะเชื่อมต่อสูงสุด" @@ -19449,8 +20120,8 @@ msgstr "ชื่อของเครื่องพิมพ์ฟิสิค msgid "Layer number" msgstr "หมายเลขเลเยอร์" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "ดัชนีของเลเยอร์ปัจจุบัน แบบอิงเดียว (เช่น เลเยอร์แรกคือหมายเลข 1)" +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "เลเยอร์ Z" @@ -19594,9 +20265,6 @@ msgstr "การปรับเทียบใหม่" msgid "Calibrate" msgstr "ปรับเทียบ" -msgid "Finish" -msgstr "เสร็จ" - msgid "How can I use calibration results?" msgstr "จะใช้ผลการสอบเทียบได้อย่างไร?" @@ -20137,12 +20805,12 @@ msgstr "" "ค่าความเร่งต้องมากกว่าค่าความเร็ว\n" "โปรดตรวจสอบอินพุต" +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "การปรับเทียบอุณหภูมิ" -msgid "Filament type" -msgstr "ชนิดเส้นพลาสติก" - msgid "PLA" msgstr "PLA" @@ -20164,6 +20832,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "แบบทดสอบ" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "อุณหภูมิเริ่มต้น:" @@ -20289,9 +20963,6 @@ msgstr "เริ่มต้นความยาวการดึงกลั msgid "End retraction length: " msgstr "ความยาวการดึงกลับสุดท้าย:" -msgid "Test model" -msgstr "แบบทดสอบ" - msgid "Ringing Tower" msgstr "ริงกิ้งทาวเวอร์" @@ -20718,9 +21389,6 @@ msgstr "เช่น พื้นฐาน, เนื้อด้าน, ไห msgid "Filament Preset" msgstr "พรีเซ็ตเส้นพลาสติก" -msgid "Create" -msgstr "สร้าง" - msgid "Vendor is not selected; please reselect vendor." msgstr "ไม่ได้เลือกผู้ขาย โปรดเลือกผู้ขายอีกครั้ง" @@ -21024,6 +21692,9 @@ msgstr "" "เครื่องพิมพ์และเส้นพลาสติกและค่าที่ตั้งล่วงหน้ากระบวนการทั้งหมดที่เป็นของเครื่องพิมพ์\n" "สามารถแบ่งปันกับผู้อื่นได้" +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21772,9 +22443,6 @@ msgstr "กำหนดเส้นพลาสติกให้กับหั msgid "Global settings" msgstr "การตั้งค่าส่วนกลาง" -msgid "Video tutorial" -msgstr "วิดีโอสอน" - msgid "(Sync with printer)" msgstr "(ซิงค์กับเครื่องพิมพ์)" @@ -22174,6 +22842,33 @@ msgstr "หากเปิดใช้งาน ค่าด้านบนจ msgid "PresetBundle" msgstr "ชุดค่าที่ตั้งไว้ล่วงหน้า" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "ไม่มีโฟลเดอร์ชุด" @@ -22207,6 +22902,12 @@ msgstr "ยกเลิกการติดตามชุด" msgid "ExportPresetBundle" msgstr "ส่งออกชุดค่าที่ตั้งไว้ล่วงหน้า" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "บันทึกชุดค่าที่ตั้งไว้ล่วงหน้า" @@ -26617,213 +27318,6 @@ msgstr "แบบอักษรนี้ไม่มีเส้นขอบส msgid "Size: %.1f × %.1f mm" msgstr "ขนาด: %.1f × %.1f มม." -# AI Translated -msgid "Primitive" -msgstr "รูปทรงพื้นฐาน" - -# AI Translated -msgid "Empty mesh generated" -msgstr "สร้างเมชว่างเปล่า" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "กล่อง" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "ขนาดด่วน:" - -# AI Translated -msgid "Width (X)" -msgstr "ความกว้าง (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "ความลึก (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "ความสูง (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R ล่าง" - -# AI Translated -msgid "Top R" -msgstr "R บน" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "R หลัก" - -# AI Translated -msgid "Minor R" -msgstr "R รอง" - -# AI Translated -msgid "All edges" -msgstr "ขอบทั้งหมด" - -# AI Translated -msgid "Top edges" -msgstr "ขอบบน" - -# AI Translated -msgid "Bottom edges" -msgstr "ขอบล่าง" - -# AI Translated -msgid "Lateral edges" -msgstr "ขอบด้านข้าง" - -# AI Translated -msgid "Mesh resolution" -msgstr "ความละเอียดเมช" - -# AI Translated -msgid "Add Shape" -msgstr "เพิ่มรูปทรง" - -# AI Translated -msgid "No outer profile" -msgstr "ไม่มีโปรไฟล์ด้านนอก" - -# AI Translated -msgid "Failed to make outer face" -msgstr "ไม่สามารถสร้างผิวหน้าด้านนอกได้" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "ไม่สามารถสร้างผิวหน้าที่มีรูได้" - -# AI Translated -msgid "Revolve failed" -msgstr "หมุนขึ้นรูปล้มเหลว" - -# AI Translated -msgid "Profile" -msgstr "โปรไฟล์" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "เริ่มโปรไฟล์ใหม่ (สำหรับรู)" - -# AI Translated -msgid "Segments" -msgstr "เซกเมนต์" - -# AI Translated -msgid "Sides" -msgstr "ด้าน" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "คลิกบนพื้นที่วาดเพื่อวาด" - -# AI Translated -msgid "Snap to grid" -msgstr "สแน็ปกับกริด" - -# AI Translated -msgid "Grid step" -msgstr "ระยะกริด" - -# AI Translated -msgid "Outer" -msgstr "ด้านนอก" - -# AI Translated -msgid "closed" -msgstr "แบบปิด" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% จุด %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (บน)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (ด้านหน้า)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (ด้านข้าง)" - -# AI Translated -msgid "Revolve deg" -msgstr "องศาหมุนขึ้นรูป" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "ตั้งเป็น 0 เพื่อยืดขึ้นรูป, >0 เพื่อหมุนขึ้นรูป" - -# AI Translated -msgid "Pocket (cut)" -msgstr "ช่องเว้า (ตัด)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "โปรไฟล์ปิด %zu รายการ" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "วาดโปรไฟล์ปิดเพื่อเปิดใช้งาน" - -# AI Translated -msgid "Clear all" -msgstr "ล้างทั้งหมด" - -# AI Translated -msgid "Empty result" -msgstr "ผลลัพธ์ว่างเปล่า" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "ยืดขึ้นรูป: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "หมุนขึ้นรูป: %1%" - -# AI Translated -msgid "No object selected" -msgstr "ไม่ได้เลือกวัตถุ" - -# AI Translated -msgid "Face failed" -msgstr "สร้างผิวหน้าล้มเหลว" - -# AI Translated -msgid "Face with holes failed" -msgstr "สร้างผิวหน้าที่มีรูล้มเหลว" - -# AI Translated -msgid "Tool mesh empty" -msgstr "เมชเครื่องมือว่างเปล่า" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "เพิ่มช่องเว้าแล้ว (วอลลุ่มเชิงลบ)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "ช่องเว้า: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -26945,6 +27439,9 @@ msgstr "กิสโมประกอบ" msgid "Gizmo brim ears" msgstr "Gizmo หูขอบยึดชิ้นงาน (Brim Ears)" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "แถบเลื่อนแนวตั้ง - เลื่อนนิ้วโป้งที่ใช้งานอยู่ขึ้น" @@ -27928,10 +28425,6 @@ msgstr "การตั้งค่าของฉัน" msgid "Custom Printer Setup" msgstr "ตั้งค่าเครื่องพิมพ์แบบกำหนดเอง" -# AI Translated -msgid "Custom Printer" -msgstr "เครื่องพิมพ์แบบกำหนดเอง" - # AI Translated msgid "Define a custom printer profile" msgstr "กำหนดโปรไฟล์เครื่องพิมพ์แบบกำหนดเอง" @@ -28576,9 +29069,8 @@ msgstr "เกณฑ์มุม - การเติมจะหยุดที msgid "Click a triangle to paint it" msgstr "คลิกสามเหลี่ยมเพื่อระบาย" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "ต้องให้เลเยอร์ที่ใช้งานอยู่แมปด้วย คลี่ UV (LSCM)" +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -28592,17 +29084,15 @@ msgstr "เร็ว - ลายนูนแสดงด้วยการแร msgid "Checker" msgstr "ตาหมากรุก" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "ตาหมากรุก - ตารางทดสอบแทนพื้นผิว บริเวณที่ช่องยังเป็นสี่เหลี่ยมจัตุรัส พื้นผิวจะไม่บิดเบี้ยว บริเวณที่ช่องยืด พื้นผิวก็จะยืดเช่นกัน" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "ความบิดเบี้ยว" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "ความบิดเบี้ยว - แผนที่ความร้อนแสดงการยืดจากสีน้ำเงินถึงสีแดงบนผลการคลี่ UV" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28718,24 +29208,11 @@ msgstr "ผสมเส้นพลาสติก" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "สลับใช้เส้นพลาสติกสองเส้นเพื่อจำลองสีที่อยู่ระหว่างกัน ทำให้เส้นพลาสติกเพียงไม่กี่สีครอบคลุมภาพถ่ายหรือการไล่ระดับสีได้ ภาพที่เป็นสีเรียบจะพิมพ์ออกมาเหมือนกันไม่ว่าแบบใด เมื่อปิดจะใช้เส้นพลาสติกหนึ่งเส้นต่อหนึ่งบริเวณ" -# AI Translated -msgid "Mix by" -msgstr "ผสมตาม" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "ผิว" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"เลเยอร์: เส้นพลาสติกทั้งสองสลับกันระหว่างเลเยอร์การพิมพ์ ซึ่งผสมกลมกลืนบนผิวที่ตั้งตรง แต่จะหายไปบนผิวในแนวราบ เพราะทั้งเลเยอร์เป็นแถบสีเดียว\n" -"ผิว: ลายตาหมากรุกละเอียดทั่วผิว ใช้ได้ทุกมุม แต่อาจดูเป็นลวดลายแทนที่จะเป็นการผสมสี\n" -"อัตโนมัติ: ใช้เลเยอร์บนผิวที่ตั้งตรง ส่วนผิวในแนวราบจะใช้เส้นพลาสติกเดียวที่ใกล้เคียงกว่า เนื่องจากลายตาหมากรุกบนผิวนั้นจะเห็นเป็นลวดลาย" # AI Translated #, boost-format @@ -29195,14 +29672,6 @@ msgstr "ต้องใช้สามเหลี่ยมประมาณ %1 msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "จำนวนสามเหลี่ยม (หน่วยพัน) ที่การเพิ่มความละเอียดเพิ่มให้โมเดลได้ สามเหลี่ยมที่ตรงกับรูปทรงน้อยที่สุดจะถูกแบ่งก่อนเสมอ ดังนั้นแม้จะใช้งบประมาณจนหมด ก็ใช้ไปในจุดที่เห็นผลชัดที่สุด เพิ่มค่าหากลายนูนยังดูหยาบ" -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "หยุดการอบ ส่วนที่เสร็จแล้วจะคงอยู่บนโมเดล และสามารถเลิกทำได้" - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "ปิดเครื่องมือโดยไม่อบ การระบาย เลเยอร์ และการตั้งค่าจะยังคงอยู่กับโมเดล" - # AI Translated msgid "Preparing..." msgstr "กำลังเตรียม..." @@ -29227,6 +29696,14 @@ msgstr "เปลี่ยนแผนที่ความสูงที่ร msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "เปลี่ยนแผนที่ความสูงที่ระบายไว้ให้เป็นเรขาคณิตจริง เมชจะถูกรีเมชให้มีความหนาแน่นสม่ำเสมอและเพิ่มความละเอียดในบริเวณที่พื้นผิวมีการเปลี่ยนแปลงก่อน เพื่อให้รายละเอียดมีจุดยอดรองรับ - ทั้งหมดในขั้นตอนเดียว" +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "หยุดการอบ ส่วนที่เสร็จแล้วจะคงอยู่บนโมเดล และสามารถเลิกทำได้" + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "ปิดเครื่องมือโดยไม่อบ การระบาย เลเยอร์ และการตั้งค่าจะยังคงอยู่กับโมเดล" + # AI Translated #, boost-format msgid "%1% k" @@ -29443,6 +29920,28 @@ msgstr "ปลั๊กอินเส้นพลาสติก" msgid "Printer plugins" msgstr "ปลั๊กอินเครื่องพิมพ์" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "คืนค่าเริ่มต้น" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "การกำหนดค่าไม่ใช่ JSON ที่ถูกต้อง การเปลี่ยนแปลงของคุณไม่ได้รับการบันทึก" @@ -29462,10 +29961,6 @@ msgstr "" "\n" "การดำเนินการนี้จะทิ้งค่าที่พรีเซ็ตแทนที่ไว้และใช้การกำหนดค่าส่วนกลาง" -# AI Translated -msgid "Restore defaults" -msgstr "คืนค่าเริ่มต้น" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "กำลังใช้การกำหนดค่าส่วนกลาง บันทึกพรีเซ็ตเพื่อเก็บการเปลี่ยนแปลงไว้" @@ -29535,6 +30030,215 @@ msgstr "กำลังติดตั้งปลั๊กอิน" msgid "Installed \"%s\"." msgstr "ติดตั้ง \"%s\" แล้ว" +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29751,6 +30455,54 @@ msgstr "ไม่สามารถโหลดปลั๊กอินใหม msgid "Reloaded \"%s\"." msgstr "โหลด \"%s\" ใหม่แล้ว" +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "การตั้งค่าโหมดไล่เส้น" @@ -29775,6 +30527,16 @@ msgstr "ลดเส้นพลาสติกที่เสียจากก msgid "Terminal" msgstr "เทอร์มินัล" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "มีคำสั่งกำลังทำงานอยู่แล้ว" @@ -30041,6 +30803,9 @@ msgstr " | สแนป เปิด" msgid "Change texture - choose another one from the texture library" msgstr "เปลี่ยนพื้นผิว - เลือกพื้นผิวอื่นจากคลังพื้นผิว" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "แผนที่ความสูง - แสดงพื้นผิวของเลเยอร์ใต้เกาะ" @@ -30073,17 +30838,14 @@ msgstr "เชื่อมเกาะ" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "จัดวางผลการคลี่ UV เป็นรูปคลี่ที่เชื่อมต่อกัน: ชิ้นที่ใช้ขอบร่วมกันจะถูกคลี่ออกติดกัน (ลูกบาศก์จะกลายเป็นรูปคลี่ที่ต่อกันแทนที่จะเป็นสี่เหลี่ยมหกชิ้นแยกกัน) ชิ้นเหล่านี้ยังคงเป็นเกาะแยกกัน คุณจึงยังย้ายชิ้นใดก็ได้ด้วยตนเองภายหลัง" -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "เกาะ - ย้าย หมุน และปรับสเกลทั้งเกาะ" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "จุดยอด - ลากจุดยอดเพื่อปรับรูปทรง; Shift/Ctrl เพื่อเลือกหลายรายการ" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "ขอบ - ลากขอบเพื่อปรับรูปทรง; Shift/Ctrl เพื่อเลือกหลายรายการ" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30121,9 +30883,13 @@ msgstr "ล้างการแก้ไข UV - ทิ้งการย้า msgid "Snap - stick islands together when dragging one against another" msgstr "สแนป - ให้เกาะติดกันเมื่อลากเกาะหนึ่งชิดอีกเกาะ" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "จัดเกาะทั้งหมดให้พอดีกรอบ (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30134,6 +30900,9 @@ msgstr "ไม่มีเลเยอร์ที่แมปด้วย ค msgid "%.1f mm tile" msgstr "ไทล์ %.1f มม." +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "ล้าสมัย - การระบาย เส้นตัด หรือมุมเส้นตัดมีการเปลี่ยนแปลงหลังจากคลี่ UV ครั้งนี้ กดเพื่อคลี่ UV อีกครั้ง" @@ -30142,19 +30911,48 @@ msgstr "ล้าสมัย - การระบาย เส้นตัด msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "แผ่บริเวณที่ระบายให้แบนเป็นเกาะ UV ระบบจะคำนวณเฉพาะเมื่อคุณกดปุ่มนี้ ไม่ใช่ทุกครั้งที่แก้ไข - ดังนั้นให้ระบาย เปลี่ยนมุมเส้นตัด หรือทำเครื่องหมายเส้นตัดก่อน แล้วจึงกด คลี่ UV" +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d เกาะ, %s ผิวหน้า" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + # AI Translated msgid "Forward" msgstr "ไปข้างหน้า" -# AI Translated -msgid "Tools" -msgstr "เครื่องมือ" - # AI Translated msgid "View Source" msgstr "ดูซอร์ส" @@ -30300,6 +31098,16 @@ msgstr "" "ปลั๊กอิน \"%s\" กำลังขอเรียกใช้คำสั่งต่อไปนี้:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30309,6 +31117,30 @@ msgstr "ปลั๊กอิน \"%s\" กำลังขอสิทธิ์ msgid "Plugin permission request" msgstr "คำขอสิทธิ์ของปลั๊กอิน" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "UI การกำหนดค่าของปลั๊กอินว่างเปล่า กำลังแสดงตัวแก้ไขเริ่มต้น" @@ -30895,6 +31727,311 @@ msgstr "" "หลีกเลี่ยงการบิดเบี้ยว\n" "คุณรู้หรือไม่ว่าเมื่อพิมพ์วัสดุที่มีแนวโน้มที่จะเกิดการบิดเบี้ยว เช่น ABS การเพิ่มอุณหภูมิฐานพิมพ์อย่างเหมาะสมสามารถลดความน่าจะเป็นของการบิดเบี้ยวได้" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "ไม่สามารถติดตั้ง Microsoft WebView2 Runtime ได้\n" +#~ "ฟีเจอร์บางอย่าง รวมถึงตัวช่วยตั้งค่า อาจแสดงเป็นหน้าว่างจนกว่าจะติดตั้ง\n" +#~ "โปรดติดตั้งด้วยตนเองจาก https://developer.microsoft.com/microsoft-edge/webview2/ แล้วรีสตาร์ท Orca Slicer" + +#~ msgid "Why this grouping" +#~ msgstr "ทำไมถึงจัดกลุ่มแบบนี้." + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "ซอฟต์แวร์ไม่รองรับการใช้หัวฉีดที่มีเส้นผ่านศูนย์กลางต่างกันในการพิมพ์ครั้งเดียว หากหัวฉีดด้านซ้ายและขวาไม่สอดคล้องกัน เราสามารถดำเนินการพิมพ์แบบหัวเดียวเท่านั้น โปรดยืนยันว่าคุณต้องการใช้หัวฉีดใดสำหรับโปรเจ็กต์นี้" + +#~ msgid "Switch diameter" +#~ msgstr "สลับเส้นผ่านศูนย์กลาง" + +#~ msgid "BambuStudio Project" +#~ msgstr "โครงการแบมบูสตูดิโอ" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "3MF ถูกสร้างขึ้นโดย BambuStudio (เวอร์ชัน %s) ซึ่งใหม่กว่าเวอร์ชัน %s ที่เข้ากันได้ พบการตั้งค่าที่ไม่รู้จัก:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "3MF ถูกสร้างขึ้นโดย BambuStudio (เวอร์ชัน %s) ซึ่งใหม่กว่าเวอร์ชัน %s ที่เข้ากันได้ การตั้งค่าบางอย่างอาจเข้ากันไม่ได้อย่างสมบูรณ์" + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "3MF ถูกสร้างขึ้นโดย BambuStudio การตั้งค่าบางอย่างอาจแตกต่างจาก OrcaSlicer" + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "ไม่สามารถเลิกทำหรือทำซ้ำได้ขณะที่มีการดำเนินการอยู่ โปรดหยุดการดำเนินการก่อน" + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "จัดกึ่งกลางไส้ในภายในของแต่ละชิ้นส่วนบนตัวมันเอง เสมือนว่าถูกสไลซ์แยกเดี่ยว แทนที่จะอิงกับชุดประกอบทั้งหมด ชิ้นส่วนที่สัมผัสหรือซ้อนทับกันจะถือเป็นวัตถุเดียวและใช้จุดศูนย์กลางร่วมกัน ส่วนชิ้นส่วนแยก (หรือวัตถุ 3D ที่แยกจากกัน) จะได้จุดศูนย์กลางของตัวเอง\n" +#~ "มีประโยชน์เมื่อชุดประกอบรวมหลายวัตถุที่แต่ละชิ้นควรคงไส้ในที่จัดกึ่งกลางตัวเองอย่างสม่ำเสมอ\n" +#~ "ส่งผลต่อลวดลายเส้นและตาราง และไส้ในแบบเทมเพลตหมุน\n" +#~ "ลวดลายที่ล็อกกับพิกัดสากล (Gyroid, Honeycomb, TPMS, ...) จะไม่ได้รับผลกระทบ" + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "ดัชนีของเลเยอร์ปัจจุบัน แบบอิงเดียว (เช่น เลเยอร์แรกคือหมายเลข 1)" + +#~ msgid "Video tutorial" +#~ msgstr "วิดีโอสอน" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "รูปทรงพื้นฐาน" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "สร้างเมชว่างเปล่า" + +# AI Translated +#~ msgid "Box" +#~ msgstr "กล่อง" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "ขนาดด่วน:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "ความกว้าง (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "ความลึก (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "ความสูง (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R ล่าง" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R บน" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "R หลัก" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "R รอง" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "ขอบทั้งหมด" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "ขอบบน" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "ขอบล่าง" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "ขอบด้านข้าง" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "ความละเอียดเมช" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "เพิ่มรูปทรง" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "ไม่มีโปรไฟล์ด้านนอก" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "ไม่สามารถสร้างผิวหน้าด้านนอกได้" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "ไม่สามารถสร้างผิวหน้าที่มีรูได้" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "หมุนขึ้นรูปล้มเหลว" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "โปรไฟล์" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "เริ่มโปรไฟล์ใหม่ (สำหรับรู)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "เซกเมนต์" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "ด้าน" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "คลิกบนพื้นที่วาดเพื่อวาด" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "สแน็ปกับกริด" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "ระยะกริด" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "ด้านนอก" + +# AI Translated +#~ msgid "closed" +#~ msgstr "แบบปิด" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% จุด %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (บน)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (ด้านหน้า)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (ด้านข้าง)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "องศาหมุนขึ้นรูป" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "ตั้งเป็น 0 เพื่อยืดขึ้นรูป, >0 เพื่อหมุนขึ้นรูป" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "ช่องเว้า (ตัด)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "โปรไฟล์ปิด %zu รายการ" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "วาดโปรไฟล์ปิดเพื่อเปิดใช้งาน" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "ผลลัพธ์ว่างเปล่า" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "ยืดขึ้นรูป: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "หมุนขึ้นรูป: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "ไม่ได้เลือกวัตถุ" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "สร้างผิวหน้าล้มเหลว" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "สร้างผิวหน้าที่มีรูล้มเหลว" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "เมชเครื่องมือว่างเปล่า" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "เพิ่มช่องเว้าแล้ว (วอลลุ่มเชิงลบ)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "ช่องเว้า: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "ต้องให้เลเยอร์ที่ใช้งานอยู่แมปด้วย คลี่ UV (LSCM)" + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "ตาหมากรุก - ตารางทดสอบแทนพื้นผิว บริเวณที่ช่องยังเป็นสี่เหลี่ยมจัตุรัส พื้นผิวจะไม่บิดเบี้ยว บริเวณที่ช่องยืด พื้นผิวก็จะยืดเช่นกัน" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "ความบิดเบี้ยว - แผนที่ความร้อนแสดงการยืดจากสีน้ำเงินถึงสีแดงบนผลการคลี่ UV" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "ผสมตาม" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "ผิว" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "เลเยอร์: เส้นพลาสติกทั้งสองสลับกันระหว่างเลเยอร์การพิมพ์ ซึ่งผสมกลมกลืนบนผิวที่ตั้งตรง แต่จะหายไปบนผิวในแนวราบ เพราะทั้งเลเยอร์เป็นแถบสีเดียว\n" +#~ "ผิว: ลายตาหมากรุกละเอียดทั่วผิว ใช้ได้ทุกมุม แต่อาจดูเป็นลวดลายแทนที่จะเป็นการผสมสี\n" +#~ "อัตโนมัติ: ใช้เลเยอร์บนผิวที่ตั้งตรง ส่วนผิวในแนวราบจะใช้เส้นพลาสติกเดียวที่ใกล้เคียงกว่า เนื่องจากลายตาหมากรุกบนผิวนั้นจะเห็นเป็นลวดลาย" + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "เกาะ - ย้าย หมุน และปรับสเกลทั้งเกาะ" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "จุดยอด - ลากจุดยอดเพื่อปรับรูปทรง; Shift/Ctrl เพื่อเลือกหลายรายการ" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "ขอบ - ลากขอบเพื่อปรับรูปทรง; Shift/Ctrl เพื่อเลือกหลายรายการ" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "จัดเกาะทั้งหมดให้พอดีกรอบ (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(ทดลอง) ใช้เอเจนต์เครื่องพิมพ์แทนโฮสต์การพิมพ์" @@ -30928,16 +32065,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "คลิกผิวหน้าหรือระนาบอ้างอิง แล้วเลือกเครื่องมือวาด" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -30994,10 +32121,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "ระยะแนวตั้ง" -# AI Translated -#~ msgid "Linear" -#~ msgstr "เชิงเส้น" - #~ msgid "Face recognition" #~ msgstr "การจดจำผิวหน้า" @@ -32685,9 +33808,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "การเลือกชิ้นส่วน" -#~ msgid "°" -#~ msgstr "°" - #, c-format, boost-format #~ msgid "" #~ "Failed to connect to OrcaCloud.\n" diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index 44a8586724..9630ad69f8 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2026-08-21 23:18+0300\n" "Last-Translator: GlauTech\n" "Language-Team: \n" @@ -2151,15 +2151,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Çalışma Zamanı" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Microsoft WebView2 Runtime yüklenemedi.\n" -"Kurulum sihirbazı dahil bazı özellikler, yüklenene kadar boş görünebilir.\n" -"Lütfen https://developer.microsoft.com/microsoft-edge/webview2/ adresinden elle yükleyin ve Orca Slicer'ı yeniden başlatın." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4337,6 +4334,9 @@ msgstr "Plakaya Git" msgid "AMS Materials Setting" msgstr "AMS Malzeme Ayarı" +msgid "Wiki Guide" +msgstr "Viki Kılavuzu" + msgid "Close" msgstr "Kapat" @@ -4360,9 +4360,6 @@ msgstr "Giriş değeri %1%'den büyük ve %2%'den küçük olmalıdır" msgid "Factors of Flow Dynamics Calibration" msgstr "Akış Dinamiği Kalibrasyonunun Faktörleri" -msgid "Wiki Guide" -msgstr "Viki Kılavuzu" - msgid "PA Profile" msgstr "PA Profili" @@ -4453,7 +4450,7 @@ msgstr "Kaydet" msgctxt "Navigation" msgid "Back" -msgstr "Arka" +msgstr "Geri" msgid "Example" msgstr "Örnek" @@ -4957,6 +4954,11 @@ msgstr "Otomatik olarak sınır değerine (%g mm) ayarlansın mı?" msgid "Adjust" msgstr "Ayarla" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5796,9 +5798,6 @@ msgstr "Optimum filament gruplamasına göre otomatik olarak yeniden dilimleyin msgid "Filament Grouping" msgstr "Filament Gruplaması" -msgid "Why this grouping" -msgstr "Neden bu gruplama" - msgid "Please place filaments on the printer based on grouping result." msgstr "Lütfen filamentleri gruplama sonucuna göre yazıcıya yerleştirin." @@ -5988,6 +5987,43 @@ msgstr "Düzenleme alanını artır/azalt" msgid "Sequence" msgstr "Sekans" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Hacim" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + # AI Translated msgid "Object selection" msgstr "Nesne seçimi" @@ -6207,6 +6243,12 @@ msgstr "Kılavuz çizgileri" msgid "Labels" msgstr "Etiketler" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Kesit düzlemini taşı" @@ -6255,7 +6297,7 @@ msgstr "Hacim:" msgid "Size:" msgstr "Boyut:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "%d katmanında G-code yollarında çakışmalar bulundu, Z = %.2lfmm. Lütfen çakışan nesneleri daha uzağa ayırın (%s <-> %s)." @@ -6726,6 +6768,12 @@ msgstr "Kılavuz çizgilerini göster" msgid "Show Gridlines on plate" msgstr "Kılavuz Çizgilerini plaka üzerinde göster" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Pencere düzenini sıfırla" @@ -8421,6 +8469,61 @@ msgstr "Nesnenin tüm ayarları" msgid "Material settings" msgstr "Malzeme ayarları" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Araçlar" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Mevcut plakayı kaldırın (eğer sonuncusu değilse)" @@ -8445,6 +8548,17 @@ msgstr "Mevcut plaka adını düzenle" msgid "Move plate to the front" msgstr "Plakayı öne doğru hareket ettirin" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Mevcut plakayı özelleştir" @@ -8511,12 +8625,6 @@ msgstr "AMS(1 yuva)" msgid "Not installed" msgstr "Kurulu değil" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Yazılım, bir baskı için farklı çaptaki püskürtme uçlarının kullanılmasını desteklemez. Eğer sol ve sağ püskürtme uçları tutarsız ise yalnızca tek kafalı baskıya geçebiliriz. Lütfen bu proje için hangi nozulu kullanmak istediğinizi onaylayın." - -msgid "Switch diameter" -msgstr "Anahtar çapı" - msgid "Configuration incompatible" msgstr "Yapılandırma uyumsuz" @@ -8598,6 +8706,9 @@ msgstr "Karışık Filament" msgid "Remove last mixed filament" msgstr "Son karışık filamenti kaldır" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Karışık filament ekle" @@ -8620,6 +8731,10 @@ msgstr "Karışık filamentin bileşen referansları bozuk" msgid "Edit / Delete / Merge" msgstr "Düzenle / Sil / Birleştir" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Hedef karışık filament bu fiziksel filamenti bileşen olarak kullanıyor. Birleştirme bu fiziksel filamenti kaldıracak ve karışık filamenti geçersiz kılabilir. Devam edilsin mi?" @@ -8694,10 +8809,6 @@ msgstr "Dosya yükleniyor: %s" msgid "Load 3MF" msgstr "3MF yükle" -# AI Translated -msgid "BambuStudio Project" -msgstr "BambuStudio Projesi" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "OrcaSlicer, 3MF formatını desteklememektedir. Sadece geometri verilerini yükle." @@ -8729,20 +8840,6 @@ msgstr "Yazılımınızı yükseltseniz iyi olur.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "3mf'nin %s sürümü, %s'in %s sürümünden daha yeni, Yazılımınızı yükseltmenizi öneririz." -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "3MF, BambuStudio (sürüm %s) ile oluşturulmuş; bu sürüm, uyumlu sürüm %s'ten daha yeni. Tanınmayan ayarlar bulundu:" - -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "3MF, BambuStudio (sürüm %s) ile oluşturulmuş; bu sürüm, uyumlu sürüm %s'ten daha yeni. Bazı ayarlar tam olarak uyumlu olmayabilir." - -# AI Translated -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "3MF, BambuStudio ile oluşturulmuş. Bazı ayarlar OrcaSlicer'dakinden farklı olabilir." - msgid "Invalid values found in the 3MF:" msgstr "3mf'de geçersiz değerler bulundu:" @@ -8911,6 +9008,12 @@ msgstr "Z konumunu korumak için Otomatik düşürme devre dışı bırakılsın msgid "Object with floating parts was detected" msgstr "Havada duran parçalara sahip nesne algılandı" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Başka bir ihracat işi yürütülüyor." @@ -8995,6 +9098,38 @@ msgstr "Geçersiz veri" msgid "Slicing Canceled" msgstr "Dilimleme İptal Edildi" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Ağ eklentisi başarıyla değiştirildi." @@ -9026,9 +9161,8 @@ msgstr "" msgid "Sync now" msgstr "Şimdi senkronize et" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Bir işlem sürerken geri alma veya ileri alma yapılamaz. Önce işlemi durdurun." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9099,6 +9233,11 @@ msgstr "İndirme başarısız oldu, Dosya boyutu sorunlu." msgid "Project downloaded %d%%" msgstr "Proje %d%% indirildi" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advance Testi" @@ -9125,6 +9264,13 @@ msgstr "Orca YOLO Akış Kalibrasyonu" msgid "Flowrate Test - Pass%d" msgstr "Akış Hızı Testi - %d. Geçiş" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Nozul sıcaklığı testi" @@ -11623,6 +11769,9 @@ msgstr "Farklı ekstruder tahrikleri veya nozul hacmi tipleri arasında eşitlem msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Parametre değişikliklerini diğer ekstruderin ilgili parametreleriyle eşitleyin." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Tüm ayarları en son kaydedilen ön ayara sıfırlamak için tıklayın." @@ -12044,6 +12193,12 @@ msgstr "Plaka Ayarı" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Yazıcı iletişimi için ağ aracısı uygulamasını seçin. Kullanılabilir aracılar başlangıçta kaydedilir." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12162,9 +12317,24 @@ msgstr "Nozul çapı" msgid "Wipe tower" msgstr "Silme kulesi" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Tek Ekstruder Çoklu Malzeme Parametreleri" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Bu tek ekstruderli çok malzemeli bir yazıcıdır, tüm ekstruderlerin çapları yeni değere ayarlanacaktır. Devam etmek istiyor musunuz?" @@ -12174,6 +12344,18 @@ msgstr "Katman Yüksekliği Sınırları" msgid "Z-Hop" msgstr "Z Sıçraması" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12287,10 +12469,9 @@ msgstr "Devam etmek" msgid "Don't warn again for this preset" msgstr "Bu ön ayar için bir daha uyarma" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12721,9 +12902,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Toplam çarpma" -msgid "Volume" -msgstr "Hacim" - msgid "Ramming line" msgstr "Çarpma hattı" @@ -12774,6 +12952,119 @@ msgstr "Giriş başarısız oldu. Lütfen yeniden deneyin." msgid "parse json failed" msgstr "json ayrıştırma başarısız oldu" +msgid "Loading…" +msgstr "Yükleme devam ediyor…" + +msgid "Welcome to Orca Slicer" +msgstr "Orca Slicer'a hoş geldiniz" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Dilimleyici birkaç adımda kurulacaktır. Hadi başlayalım!" + +msgid "Get Started" +msgstr "Başla" + +msgid "Please select your login region" +msgstr "Lütfen giriş bölgenizi seçin" + +msgid "Finish" +msgstr "Bitir" + +msgid "Printer Selection" +msgstr "Yazıcı Seçimi" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Özel Yazıcı" + +msgid "Create" +msgstr "Oluştur" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "En az bir yazıcı seçilmelidir." + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "Filament Seçimi" + +msgid "System Filaments" +msgstr "Sistem Filamentleri" + +msgid "Custom Filaments" +msgstr "Özel Filamentler" + +msgid "Create New" +msgstr "Yeni Oluştur" + +msgid "Filament type" +msgstr "Filament türü" + +msgid "Vendor" +msgstr "Satıcı" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "Hepsini temizle" + +msgid "At least one filament must be selected." +msgstr "En az bir filament seçilmelidir." + +msgid "Do you want to use the default filament?" +msgstr "Varsayılan filamenti kullanmak ister misiniz ?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Bu, Orca Cloud profil eşitlemesi dahil tüm bulut özelliklerini devre dışı bırakır. Tamamen çevrimdışı çalışmayı tercih eden kullanıcılar bu seçeneği etkinleştirebilir." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Not: Gizli Mod etkinken kullanıcı profilleriniz Orca Cloud'a yedeklenmez." + +msgid "Enable Stealth Mode." +msgstr "Gizli Modu etkinleştirin." + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "Bazı yazıcı üreticileri, yazıcılarıyla iletişim için özel eklentilere ihtiyaç duyar. Bu tür yazıcılar kullanıyorsanız lütfen ilgili eklentiyi seçin." + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "Lütfen bu eklentilerin OrcaSlicer tarafından geliştirilmediğini veya bakımının yapılmadığını unutmayın. Kendi takdirinize ve riskinize göre kullanılmalıdırlar." + +msgid "Install Bambu Network plug-in" +msgstr "Bambu Ağı eklentisini yükleyin" + msgid "[Action Required] " msgstr "[İşlem Gerekli] " @@ -13241,6 +13532,14 @@ msgstr "Filament ekstrüzyon rolü değişim G-code'u" msgid "No object can be printed. It may be too small." msgstr "Hiçbir nesne basılamıyor. Nesne çok küçük olabilir." +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Baskınız hazırlama bölgelerine çok yakın. Çarpışma olmadığından emin olun." @@ -13417,6 +13716,26 @@ msgstr "doğrulama başarısız" msgid "write callback failed" msgstr "geri arama yazma başarısız oldu" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1%, hariç tutma alanına çok yakın; yazdırma sırasında çarpışmalar meydana gelebilir." @@ -13470,6 +13789,43 @@ msgstr "Yine de yazdırmak istiyorsanız Tercihler / Denetim / Dilimleme / Karı msgid "No extrusions under current settings." msgstr "Mevcut ayarlarda ekstrüzyon yok." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Gradyanlı bir karışık filament kullanılıyor ancak 'Karışık renk alt katmanı' devre dışı. Gradyan basılmayacak." @@ -13480,6 +13836,15 @@ msgstr "\"Nesneye göre\" dizisi etkinleştirildiğinde, hızlandırılmış çe msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "\"Nesneye göre\" sırası etkinleştirildiğinde kümelenme tespiti desteklenmez." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Hem hassas Z yüksekliğini hem de hazırlık kulesini etkinleştirmek dilimleme hatalarına neden olabilir." @@ -13496,10 +13861,6 @@ msgstr "Bir nesne birden fazla malzeme içerdiğinde spiral vazo modu çalışma msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "%1% nesnesinin kendisi yapı hacmine uysa da, malzeme büzülme telafisi nedeniyle maksimum yapı hacmi yüksekliğini aşıyor." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "%1% nesnesi maksimum yapı hacmi yüksekliğini aşıyor." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "%1% nesnesinin kendisi yapı hacmine uysa da, son katmanı maksimum yapı hacmi yüksekliğini aşıyor." @@ -13507,6 +13868,10 @@ msgstr "%1% nesnesinin kendisi yapı hacmine uysa da, son katmanı maksimum yap msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Modelinizin boyutunu küçültmek veya mevcut yazdırma ayarlarını değiştirip yeniden denemek isteyebilirsiniz." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "%1% nesnesi maksimum yapı hacmi yüksekliğini aşıyor." + msgid "Variable layer height is not supported with Organic supports." msgstr "Değişken katman yüksekliği Organik desteklerle desteklenmez." @@ -14483,12 +14848,39 @@ msgstr "İç köprülerin hızı. Değer yüzde olarak ifade edilirse köprü h msgid "This is the distance from the model to the outermost brim line." msgstr "Modelden en dış kenar çizgisine kadar olan mesafe." +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Kenar tipi" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Bu, modellerin dış ve/veya iç kısmındaki Kenar oluşumunu kontrol eder. Otomatik, kenar genişliğinin otomatik olarak analiz edilip hesaplandığı anlamına gelir." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Kenar-nesne boşluğu" @@ -15686,9 +16078,6 @@ msgstr "Filament fiyatı. Yalnızca istatistikler için." msgid "money/kg" msgstr "ücret/kg" -msgid "Vendor" -msgstr "Satıcı" - msgid "Vendor of filament. For show only." msgstr "Filament satıcısı. Yalnızca gösteri için." @@ -15762,6 +16151,66 @@ msgstr "Çok çizgili dolgu" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Dolgu deseni tarafından destekleniyorsa, dolgu deseni için birden fazla çizgi kullanılması." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Doğrusal" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Z burkulma eğilimi optimizasyonu (deneysel)" @@ -18046,6 +18495,99 @@ msgstr "Tek ekstruder çoklu malzeme" msgid "Use single nozzle to print multi filament." msgstr "Çoklu filament basmak için tek nozul kullan." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Manuel filament değişimi" @@ -18428,6 +18970,130 @@ msgstr "Eşik çakışması" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Eşik açısı sıfır ise örtüşmesi eşiğin altında olan çıkıntılar için destek oluşturulacaktır. Bu değer ne kadar küçük olursa, desteksiz yazdırılabilecek çıkıntı da o kadar dik olur." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°/s" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Ağaç desteği dal açısı" @@ -18608,17 +19274,11 @@ msgstr "Üst kabuk katmanları tarafından hesaplanan kalınlık bu değerden da msgid "Separated infills" msgstr "Ayrık dolgular" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Her parçanın iç dolgusunu, tüm montaja göre değil, sanki tek başına dilimlenmiş gibi kendi üzerinde ortalar. Birbirine değen veya çakışan parçalar tek gövde olarak ele alınır ve ortak bir merkezi paylaşır; ayrı parçaların (veya farklı 3D nesnelerin) her biri kendi merkezine sahip olur.\n" -"Bir montaj, her biri tutarlı ve kendi merkezine göre hizalanmış dolguyu koruması gereken birkaç nesneyi gruplandırdığında yararlıdır.\n" -"Çizgi ve ızgara desenlerini ve döndürme şablonlu dolguları etkiler.\n" -"Genel koordinatlara kilitlenmiş desenler (Jiroid, Bal peteği, TPMS, ...) etkilenmez." # AI Translated msgid "Center surface pattern on" @@ -18853,6 +19513,12 @@ msgstr "Filament değişiminden sonra temizleme, nesnelerin desteğinin içinde msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Bu nesne, filamentten tasarruf etmek ve baskı süresini azaltmak için filament değişiminden sonra nozulu temizlemek için kullanılacaktır. Sonuç olarak nesnelerin renkleri karıştırılacaktır. Prime tower etkinleştirilmediği sürece etkili olmayacaktır." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Maksimum köprüleme mesafesi" @@ -19764,8 +20430,8 @@ msgstr "Dilimleme için kullanılan fiziksel yazıcının adı." msgid "Layer number" msgstr "Katman numarası" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Geçerli katmanın dizini. Tek tabanlı (yani ilk katman 1 numaradır)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Z katmanı" @@ -19907,9 +20573,6 @@ msgstr "Yeniden kalibrasyon" msgid "Calibrate" msgstr "Kalibre et" -msgid "Finish" -msgstr "Bitir" - msgid "How can I use calibration results?" msgstr "Kalibrasyon sonucu nasıl kullanılır?" @@ -20453,12 +21116,12 @@ msgstr "" "Hızlanma değerleri hız değerlerinden büyük olmalıdır.\n" "Lütfen girişleri doğrulayın." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Sıcaklık kalibrasyonu" -msgid "Filament type" -msgstr "Filament türü" - msgid "PLA" msgstr "PLA" @@ -20480,6 +21143,13 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +# AI Translated +msgid "Test model" +msgstr "Test modeli" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Başlangıç sıcaklığı: " @@ -20605,10 +21275,6 @@ msgstr "Geri çekme uzunluğu başlangıcı: " msgid "End retraction length: " msgstr "Geri çekme uzunluğu bitişi: " -# AI Translated -msgid "Test model" -msgstr "Test modeli" - msgid "Ringing Tower" msgstr "Titreşim Test Kulesi" @@ -21061,9 +21727,6 @@ msgstr "Örneğin. Basic, Mat, İpek, Mermer" msgid "Filament Preset" msgstr "Filament Ön Ayarı" -msgid "Create" -msgstr "Oluştur" - msgid "Vendor is not selected; please reselect vendor." msgstr "Satıcı seçilmedi, lütfen satıcıyı yeniden seçin." @@ -21373,6 +22036,9 @@ msgstr "" "Yazıcı ve yazıcıya ait tüm filament ve işlem ön ayarları.\n" "Başkalarıyla paylaşılabilir." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -22136,9 +22802,6 @@ msgstr "Filamenti manuel olarak sol veya sağ nozule atayın" msgid "Global settings" msgstr "Genel ayarlar" -msgid "Video tutorial" -msgstr "Öğretici Video" - msgid "(Sync with printer)" msgstr "(Yazıcıyla senkronize edin)" @@ -22582,6 +23245,33 @@ msgstr "Etkinleştirildiğinde yukarıdaki değerler, gelecekteki STEP içe akta msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "Paket klasörü mevcut değil." @@ -22626,6 +23316,12 @@ msgstr "Paket Aboneliğinden Çık" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "Ön ayar paketini kaydet" @@ -27062,214 +27758,6 @@ msgstr "Bu yazı tipinde bu metin için dış hat yok" msgid "Size: %.1f × %.1f mm" msgstr "Boyut: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Şekil" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Boş mesh oluşturuldu" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Kutu" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Hızlı:" - -# AI Translated -msgid "Width (X)" -msgstr "Genişlik (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Derinlik (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Yükseklik (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "Alt R" - -# AI Translated -msgid "Top R" -msgstr "Üst R" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "Büyük R" - -# AI Translated -msgid "Minor R" -msgstr "Küçük R" - -# AI Translated -msgid "All edges" -msgstr "Tüm kenarlar" - -# AI Translated -msgid "Top edges" -msgstr "Üst kenarlar" - -# AI Translated -msgid "Bottom edges" -msgstr "Alt kenarlar" - -# AI Translated -msgid "Lateral edges" -msgstr "Yan kenarlar" - -# AI Translated -msgid "Mesh resolution" -msgstr "Mesh çözünürlüğü" - -# AI Translated -msgid "Add Shape" -msgstr "Şekil ekle" - -# AI Translated -msgid "No outer profile" -msgstr "Dış profil yok" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Dış yüz oluşturulamadı" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Delikli yüz oluşturulamadı" - -# AI Translated -msgid "Revolve failed" -msgstr "Döndürme başarısız oldu" - -# AI Translated -msgid "Profile" -msgstr "Profil" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Yeni profil başlat (delikler için)" - -# AI Translated -msgid "Segments" -msgstr "Segmentler" - -# AI Translated -msgid "Sides" -msgstr "Kenar sayısı" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Çizmek için tuvale tıklayın" - -# AI Translated -msgid "Snap to grid" -msgstr "Izgaraya yasla" - -# AI Translated -msgid "Grid step" -msgstr "Izgara adımı" - -# AI Translated -msgid "Outer" -msgstr "Dış" - -# AI Translated -msgid "closed" -msgstr "kapalı" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% nokta %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Üst)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Ön)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Yan)" - -# AI Translated -msgid "Revolve deg" -msgstr "Döndürme açısı" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Ekstrüzyon için 0, döndürme için >0 girin" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Cep (kes)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu kapalı profil" -msgstr[1] "%zu kapalı profil" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Etkinleştirmek için kapalı bir profil çizin" - -# AI Translated -msgid "Clear all" -msgstr "Tümünü temizle" - -# AI Translated -msgid "Empty result" -msgstr "Boş sonuç" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Ekstrüzyon: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Döndürme: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Nesne seçilmedi" - -# AI Translated -msgid "Face failed" -msgstr "Yüz oluşturulamadı" - -# AI Translated -msgid "Face with holes failed" -msgstr "Delikli yüz oluşturulamadı" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Araç mesh'i boş" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Cep eklendi (negatif hacim)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Cep: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27392,6 +27880,9 @@ msgstr "Gizmo birleştir" msgid "Gizmo brim ears" msgstr "Gizmo lenarlık kulakları" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Dikey kaydırıcı - Etkin başparmağı yukarı hareket ettir" @@ -28376,10 +28867,6 @@ msgstr "Ayarlarım" msgid "Custom Printer Setup" msgstr "Özel Yazıcı Kurulumu" -# AI Translated -msgid "Custom Printer" -msgstr "Özel Yazıcı" - # AI Translated msgid "Define a custom printer profile" msgstr "Özel bir yazıcı profili tanımlayın" @@ -29025,9 +29512,8 @@ msgstr "Açı eşiği - doldurma bundan daha keskin kenarlarda durur" msgid "Click a triangle to paint it" msgstr "Boyamak için bir üçgene tıklayın" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Etkin katmanın Açınım (LSCM) ile haritalanmış olmasını gerektirir." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -29041,17 +29527,15 @@ msgstr "Hızlı - kabartma oluşturulmaz, yalnızca gölgelendirmeyle gösterili msgid "Checker" msgstr "Dama" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Dama - doku yerine bir test ızgarası. Karelerin kare kaldığı yerlerde doku bozulmamıştır; karelerin gerildiği yerlerde doku da gerilecektir" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Bozulma" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Bozulma - açınım üzerinde maviden kırmızıya gerilme ısı haritası" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -29167,24 +29651,11 @@ msgstr "Filamentleri karıştır" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Aradaki renkleri taklit etmek için iki filamenti dönüşümlü kullanır; böylece birkaç filament bir fotoğrafı veya bir gradyanı karşılayabilir. Düz renklerden oluşan bir görüntü her iki durumda da aynı yazdırılır. Kapalıyken her alan için tek filament kullanılır." -# AI Translated -msgid "Mix by" -msgstr "Karıştırma yöntemi" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Yüzey" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Katmanlar: iki filament baskı katmanları arasında dönüşümlü kullanılır; bu, dik yüzeylerde yumuşak bir karışım verir ancak tüm katmanın tek bir şerit olduğu düz bakan yüzeylerde kaybolur.\n" -"Yüzey: yüzey boyunca ince bir dama deseni; her açıda çalışır ancak karışım yerine doku gibi algılanabilir.\n" -"Otomatik: dik yüzlerde katmanlar; düz bakan yüzler en yakın tek filamenti alır, çünkü orada dama deseni bir desen olarak görünür." # AI Translated #, boost-format @@ -29644,14 +30115,6 @@ msgstr "Yaklaşık %1% üçgen gerekiyor, bütçe %2% - pişirme mesh'i yeniden msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Sıklaştırmanın modele kaç bin üçgen ekleyebileceği. En kötü uyan üçgen her zaman önce bölünür; böylece bütçenin tamamını harcayan bir çalışma bile onu en çok fark edilen yerlere harcamış olur. Kabartma hâlâ kaba görünüyorsa artırın." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Pişirmeyi durdurur. O ana kadar tamamlanan her şey modelde kalır ve geri alınabilir." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Aracı pişirmeden kapatır. Boyanız, katmanlarınız ve ayarlarınız modelde kalır." - # AI Translated msgid "Preparing..." msgstr "Hazırlanıyor..." @@ -29676,6 +30139,14 @@ msgstr "Boyanmış yükseklik haritalarını, var olan tepe noktalarını hareke msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Boyanmış yükseklik haritalarını gerçek geometriye dönüştürür. Mesh önce düzgün bir yoğunlukta yeniden oluşturulur ve dokunun büküldüğü yerlerde sıklaştırılır; böylece ayrıntının oturacağı tepe noktaları olur - hepsi tek adımda." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Pişirmeyi durdurur. O ana kadar tamamlanan her şey modelde kalır ve geri alınabilir." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Aracı pişirmeden kapatır. Boyanız, katmanlarınız ve ayarlarınız modelde kalır." + # AI Translated #, boost-format msgid "%1% k" @@ -29892,6 +30363,28 @@ msgstr "Filament eklentileri" msgid "Printer plugins" msgstr "Yazıcı eklentileri" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Varsayılanları geri yükle" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Yapılandırma geçerli bir JSON değil. Değişiklikleriniz kaydedilmedi." @@ -29911,10 +30404,6 @@ msgstr "" "\n" "Bu, ön ayarın geçersiz kılmasını siler ve genel yapılandırmayı kullanır." -# AI Translated -msgid "Restore defaults" -msgstr "Varsayılanları geri yükle" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Genel yapılandırma kullanılıyor. Kalıcı hale getirmek için ön ayarı kaydedin." @@ -29984,6 +30473,215 @@ msgstr "Eklenti yükleniyor" msgid "Installed \"%s\"." msgstr "\"%s\" yüklendi." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -30200,6 +30898,54 @@ msgstr "Eklenti yeniden yüklenemedi." msgid "Reloaded \"%s\"." msgstr "\"%s\" yeniden yüklendi." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "Model bilgisi yok" + +msgid "Edit Project Info" +msgstr "Proje Bilgilerini Düzenle" + +msgid "Model Information" +msgstr "Model Bilgileri" + +msgid "Accessories" +msgstr "Aksesuarlar" + +msgid "Profile Information" +msgstr "Profil Bilgisi" + +msgid "Model name" +msgstr "Model adı" + +msgid "Created by" +msgstr "Oluşturan" + +msgid "Remixed by" +msgstr "Değiştiren" + +msgid "Shared by" +msgstr "Paylaşan" + +msgid "Model description" +msgstr "Model açıklaması" + +msgid "BOM" +msgstr "Malzeme Listesi" + +msgid "Profile name" +msgstr "Profil ismi" + +msgid "Profile Author" +msgstr "Profil Yazarı" + +msgid "Profile description" +msgstr "Profil açıklaması" + # AI Translated msgid "Purge Mode Settings" msgstr "Yıkama Modu Ayarları" @@ -30224,6 +30970,16 @@ msgstr "Prime atığını azaltır ve daha hızlı yazdırır. Hafif renk karı msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Zaten çalışan bir komut var." @@ -30490,6 +31246,9 @@ msgstr " | yaslama AÇIK" msgid "Change texture - choose another one from the texture library" msgstr "Dokuyu değiştir - doku kütüphanesinden başka bir doku seçin" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Yükseklik haritası - katmanın dokusunu adaların altında gösterir" @@ -30522,17 +31281,14 @@ msgstr "Adaları bağla" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Açınımı bağlı bir ağ olarak yerleştirir: kenar paylaşan parçalar yan yana açılır (bir küp altı ayrı kare yerine birleşik bir açınım olur). Ayrı adalar olarak kalırlar; böylece daha sonra herhangi birini yine elle taşıyabilirsiniz." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Ada - adaların tamamını taşı, döndür ve ölçekle" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Tepe noktası - yeniden şekillendirmek için tepe noktalarını sürükleyin; çoklu seçim için Shift/Ctrl" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Kenar - yeniden şekillendirmek için kenarları sürükleyin; çoklu seçim için Shift/Ctrl" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30570,9 +31326,13 @@ msgstr "UV düzenlemelerini temizle - tüm manuel tepe noktası/kenar taşımala msgid "Snap - stick islands together when dragging one against another" msgstr "Yasla - bir adayı diğerine doğru sürüklerken adaları birbirine yapıştırır" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Tüm adaları çerçevele (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30583,6 +31343,9 @@ msgstr "Açınım ile haritalanmış katman yok" msgid "%.1f mm tile" msgstr "%.1f mm karo" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Güncel değil - bu açınım oluşturulduktan sonra boya, kesim çizgileri veya kesim açısı değişti. Açınımı yeniden çıkarmak için basın." @@ -30591,19 +31354,48 @@ msgstr "Güncel değil - bu açınım oluşturulduktan sonra boya, kesim çizgil msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Boyalı alanı UV adalarına düzleştirir. Her düzenlemede değil, yalnızca buna bastığınızda hesaplanır - bu yüzden önce boyayın, kesim açısını değiştirin veya kesim çizgilerini işaretleyin, ardından Açınım'a basın." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d ada, %s yüz" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "Bambu Ağı eklentisi algılanmadı. Yüklemek için burayı tıklayın." + +msgid "Create new project" +msgstr "Yeni proje oluştur" + +msgid "Recently opened" +msgstr "Yakın zamanda açıldı" + +msgid "Open Containing Folder" +msgstr "Dosyayı içeren klasörü açınız" + # AI Translated msgid "Forward" msgstr "İleri" -# AI Translated -msgid "Tools" -msgstr "Araçlar" - # AI Translated msgid "View Source" msgstr "Kaynağı Görüntüle" @@ -30749,6 +31541,16 @@ msgstr "" "\"%s\" eklentisi aşağıdaki komutları çalıştırmak istiyor:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30758,6 +31560,30 @@ msgstr "\"%s\" eklentisi \"%s\" Python denetim olayı için izin istiyor." msgid "Plugin permission request" msgstr "Eklenti izin isteği" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Eklentinin yapılandırma arayüzü boştu. Varsayılan düzenleyici gösteriliyor." @@ -31346,6 +32172,316 @@ msgstr "" "Eğilmeyi önleyin\n" "ABS gibi bükülmeye yatkın malzemelere baskı yaparken, ısıtma yatağı sıcaklığının uygun şekilde arttırılmasının bükülme olasılığını azaltabileceğini biliyor muydunuz?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Microsoft WebView2 Runtime yüklenemedi.\n" +#~ "Kurulum sihirbazı dahil bazı özellikler, yüklenene kadar boş görünebilir.\n" +#~ "Lütfen https://developer.microsoft.com/microsoft-edge/webview2/ adresinden elle yükleyin ve Orca Slicer'ı yeniden başlatın." + +#~ msgid "Why this grouping" +#~ msgstr "Neden bu gruplama" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Yazılım, bir baskı için farklı çaptaki püskürtme uçlarının kullanılmasını desteklemez. Eğer sol ve sağ püskürtme uçları tutarsız ise yalnızca tek kafalı baskıya geçebiliriz. Lütfen bu proje için hangi nozulu kullanmak istediğinizi onaylayın." + +#~ msgid "Switch diameter" +#~ msgstr "Anahtar çapı" + +# AI Translated +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudio Projesi" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "3MF, BambuStudio (sürüm %s) ile oluşturulmuş; bu sürüm, uyumlu sürüm %s'ten daha yeni. Tanınmayan ayarlar bulundu:" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "3MF, BambuStudio (sürüm %s) ile oluşturulmuş; bu sürüm, uyumlu sürüm %s'ten daha yeni. Bazı ayarlar tam olarak uyumlu olmayabilir." + +# AI Translated +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "3MF, BambuStudio ile oluşturulmuş. Bazı ayarlar OrcaSlicer'dakinden farklı olabilir." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Bir işlem sürerken geri alma veya ileri alma yapılamaz. Önce işlemi durdurun." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Her parçanın iç dolgusunu, tüm montaja göre değil, sanki tek başına dilimlenmiş gibi kendi üzerinde ortalar. Birbirine değen veya çakışan parçalar tek gövde olarak ele alınır ve ortak bir merkezi paylaşır; ayrı parçaların (veya farklı 3D nesnelerin) her biri kendi merkezine sahip olur.\n" +#~ "Bir montaj, her biri tutarlı ve kendi merkezine göre hizalanmış dolguyu koruması gereken birkaç nesneyi gruplandırdığında yararlıdır.\n" +#~ "Çizgi ve ızgara desenlerini ve döndürme şablonlu dolguları etkiler.\n" +#~ "Genel koordinatlara kilitlenmiş desenler (Jiroid, Bal peteği, TPMS, ...) etkilenmez." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Geçerli katmanın dizini. Tek tabanlı (yani ilk katman 1 numaradır)." + +#~ msgid "Video tutorial" +#~ msgstr "Öğretici Video" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Şekil" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Boş mesh oluşturuldu" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Kutu" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Hızlı:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Genişlik (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Derinlik (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Yükseklik (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "Alt R" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "Üst R" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "Büyük R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "Küçük R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Tüm kenarlar" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Üst kenarlar" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Alt kenarlar" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Yan kenarlar" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Mesh çözünürlüğü" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Şekil ekle" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Dış profil yok" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Dış yüz oluşturulamadı" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Delikli yüz oluşturulamadı" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Döndürme başarısız oldu" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Profil" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Yeni profil başlat (delikler için)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Segmentler" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Kenar sayısı" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Çizmek için tuvale tıklayın" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Izgaraya yasla" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Izgara adımı" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Dış" + +# AI Translated +#~ msgid "closed" +#~ msgstr "kapalı" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% nokta %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Üst)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Ön)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Yan)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Döndürme açısı" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Ekstrüzyon için 0, döndürme için >0 girin" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Cep (kes)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu kapalı profil" +#~ msgstr[1] "%zu kapalı profil" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Etkinleştirmek için kapalı bir profil çizin" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Boş sonuç" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Ekstrüzyon: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Döndürme: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Nesne seçilmedi" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Yüz oluşturulamadı" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Delikli yüz oluşturulamadı" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Araç mesh'i boş" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Cep eklendi (negatif hacim)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Cep: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Etkin katmanın Açınım (LSCM) ile haritalanmış olmasını gerektirir." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Dama - doku yerine bir test ızgarası. Karelerin kare kaldığı yerlerde doku bozulmamıştır; karelerin gerildiği yerlerde doku da gerilecektir" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Bozulma - açınım üzerinde maviden kırmızıya gerilme ısı haritası" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Karıştırma yöntemi" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Yüzey" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Katmanlar: iki filament baskı katmanları arasında dönüşümlü kullanılır; bu, dik yüzeylerde yumuşak bir karışım verir ancak tüm katmanın tek bir şerit olduğu düz bakan yüzeylerde kaybolur.\n" +#~ "Yüzey: yüzey boyunca ince bir dama deseni; her açıda çalışır ancak karışım yerine doku gibi algılanabilir.\n" +#~ "Otomatik: dik yüzlerde katmanlar; düz bakan yüzler en yakın tek filamenti alır, çünkü orada dama deseni bir desen olarak görünür." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Ada - adaların tamamını taşı, döndür ve ölçekle" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Tepe noktası - yeniden şekillendirmek için tepe noktalarını sürükleyin; çoklu seçim için Shift/Ctrl" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Kenar - yeniden şekillendirmek için kenarları sürükleyin; çoklu seçim için Shift/Ctrl" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Tüm adaları çerçevele (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Deneysel) Baskı sunucuları yerine yazıcı aracılarını kullan" @@ -31379,16 +32515,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Bir yüze veya referans düzlemine tıklayın, ardından bir çizim aracı seçin" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31445,10 +32571,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Dikey mesafe" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Doğrusal" - #~ msgid "Face recognition" #~ msgstr "Yüz tanıma" @@ -33032,9 +34154,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "parça seçimi" -#~ msgid "°" -#~ msgstr "°/s" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po index b688a2a88c..494ad2d724 100644 --- a/localization/i18n/uk/OrcaSlicer_uk.po +++ b/localization/i18n/uk/OrcaSlicer_uk.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: orcaslicerua\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2026-07-17 16:25+0300\n" "Last-Translator: Andrij Mizyk \n" "Language-Team: Ukrainian\n" @@ -2118,15 +2118,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "Виконання WebView2" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Не вдалося встановити Microsoft WebView2 Runtime.\n" -"Деякі функції, зокрема майстер налаштування, можуть відображатися порожніми, доки його не буде встановлено.\n" -"Встановіть його вручну зі сторінки https://developer.microsoft.com/microsoft-edge/webview2/ і перезапустіть Orca Slicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4251,6 +4248,9 @@ msgstr "Перейти до пластини" msgid "AMS Materials Setting" msgstr "Налаштування матеріалів AMS" +msgid "Wiki Guide" +msgstr "Вікі-підручник" + msgid "Close" msgstr "Закрити" @@ -4274,9 +4274,6 @@ msgstr "Вхідне значення має бути більше %1% і мен msgid "Factors of Flow Dynamics Calibration" msgstr "Фактори Калібрування динамічного потоку" -msgid "Wiki Guide" -msgstr "Вікі-підручник" - msgid "PA Profile" msgstr "Профіль PA" @@ -4368,7 +4365,7 @@ msgstr "Зберегти" msgctxt "Navigation" msgid "Back" -msgstr "Ззаду" +msgstr "Назад" msgid "Example" msgstr "Приклад" @@ -4889,6 +4886,11 @@ msgstr "Автоматично налаштувати до межі (%g мм)?" msgid "Adjust" msgstr "Налаштувати" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5743,9 +5745,6 @@ msgstr "Автоматично повторно нарізати відпові msgid "Filament Grouping" msgstr "Групування філаменту" -msgid "Why this grouping" -msgstr "Чому це згруповано" - # AI Translated msgid "Please place filaments on the printer based on grouping result." msgstr "Розмістіть філаменти на принтері відповідно до результату групування." @@ -5942,6 +5941,43 @@ msgstr "Збільшення/зменшення області редагува msgid "Sequence" msgstr "Послідовність" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Обʼєм" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "Вибір обʼєкта" @@ -6159,6 +6195,12 @@ msgstr "Лінії сітки" msgid "Labels" msgstr "Підписи" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Перемістити площину розрізу" @@ -6209,7 +6251,7 @@ msgid "Size:" msgstr "Розмір:" # AI Translated -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Виявлено конфлікти шляхів G-code на шарі %d, Z = %.2lf мм. Будь ласка, рознесіть конфліктуючі обʼєкти далі один від одного (%s <-> %s)." @@ -6690,6 +6732,12 @@ msgstr "Показати лінії сітки" msgid "Show Gridlines on plate" msgstr "Показати лінії сітки на пластині" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Скинути розташування вікон" @@ -8408,6 +8456,61 @@ msgstr "Переглянути всі налаштування обʼєкта" msgid "Material settings" msgstr "Налаштування матеріалу" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Інструменти" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Вилучити поточну пластину (якщо вона не остання)" @@ -8432,6 +8535,17 @@ msgstr "Змінити назву поточної пластини" msgid "Move plate to the front" msgstr "Перемістити пластину на перед" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Пристосувати поточну пластину" @@ -8499,13 +8613,6 @@ msgstr "AMS(1 слот)" msgid "Not installed" msgstr "Не встановлено" -# AI Translated -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Програма не підтримує використання сопел різного діаметра в одному друці. Якщо ліве та праве сопла відрізняються, ми можемо продовжити лише друк однією головкою. Підтвердьте, яке сопло ви хочете використати для цього проєкту." - -msgid "Switch diameter" -msgstr "Змінити діаметр" - msgid "Configuration incompatible" msgstr "Несумісність конфігурації" @@ -8588,6 +8695,9 @@ msgstr "Змішаний філамент" msgid "Remove last mixed filament" msgstr "Вилучити останній змішаний філамент" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Додати змішаний філамент" @@ -8610,6 +8720,10 @@ msgstr "У змішаного філаменту пошкоджені посил msgid "Edit / Delete / Merge" msgstr "Редагувати / Видалити / Обʼєднати" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Цільовий змішаний філамент використовує цей фізичний філамент як компонент. Обʼєднання вилучить цей фізичний філамент і може зробити змішаний філамент недійсним. Продовжити?" @@ -8691,9 +8805,6 @@ msgstr "Завантаження файлу: %s" msgid "Load 3MF" msgstr "Завантажити 3MF" -msgid "BambuStudio Project" -msgstr "Проєкт BambuStudio" - # AI Translated msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "Цей 3MF не підтримується OrcaSlicer, завантажуються лише дані геометрії." @@ -8731,20 +8842,6 @@ msgstr "Вам краще оновити програмне забезпечен msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "Версія файлу 3MF %s новіша, ніж версія %s %s, радимо оновити програмне забезпечення." -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "Файл 3MF створено в BambuStudio (версія %s), новішій за сумісну версію %s. Знайдено нерозпізнані налаштування:" - -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "Файл 3MF створено в BambuStudio (версія %s), новішій за сумісну версію %s. Деякі налаштування можуть бути не повністю сумісними." - -# AI Translated -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "Файл 3MF створено в BambuStudio. Деякі налаштування можуть відрізнятися від OrcaSlicer." - msgid "Invalid values found in the 3MF:" msgstr "У 3MF знайдено неприпустимі значення:" @@ -8916,6 +9013,12 @@ msgstr "Вимкнути авто-кидання, щоб зберегти роз msgid "Object with floating parts was detected" msgstr "Виявлено обʼєкт з плаваючими частинами" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Виконується інше завдання експорту." @@ -8998,6 +9101,38 @@ msgstr "Неправильні дані" msgid "Slicing Canceled" msgstr "Нарізка скасована" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "Мережевий плагін змінено успішно." @@ -9031,9 +9166,8 @@ msgstr "" msgid "Sync now" msgstr "Синхронізувати зараз" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Неможливо скасувати чи повторити дію, поки виконується операція. Спершу зупиніть її." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9105,6 +9239,11 @@ msgstr "Завантаження не вдалося через виняток msgid "Project downloaded %d%%" msgstr "Проект завантажено %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Тест Pressure Advance" @@ -9132,6 +9271,13 @@ msgstr "Калібрування потоку Orca YOLO" msgid "Flowrate Test - Pass%d" msgstr "Тест потоку - Прохід %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Тест температури сопла" @@ -11649,6 +11795,9 @@ msgstr "Синхронізація різних приводів екструд msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Синхронізувати зміну параметрів з відповідними параметрами іншого екструдера." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Натисніть, щоб скинути всі налаштування до останнього збереженого пресету." @@ -12087,6 +12236,12 @@ msgstr "Місце для друку" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Виберіть реалізацію мережевого агента для звʼязку з принтером. Доступні агенти реєструються під час запуску." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12205,9 +12360,24 @@ msgstr "Діаметр сопла" msgid "Wipe tower" msgstr "Вежа протирання" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Параметри екструдеру в багато-екструдерному принтері" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Це принтер з підтримкою декількох матеріалів одним екструдером, діаметри всіх екструдерів буде замінено новим значенням. Хочете продовжити?" @@ -12217,6 +12387,18 @@ msgstr "Обмеження висоти шару" msgid "Z-Hop" msgstr "Стрибок-Z" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12336,8 +12518,8 @@ msgid "Don't warn again for this preset" msgstr "Більше не попереджати для цього пресету" #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" msgid "No modifications need to be copied." msgstr "Немає змін для копіювання." @@ -12780,9 +12962,6 @@ msgstr "мс" msgid "Total ramming" msgstr "Загальний раммінг" -msgid "Volume" -msgstr "Обʼєм" - # AI Translated msgid "Ramming line" msgstr "Лінія раммінгу" @@ -12833,6 +13012,120 @@ msgstr "Не вдалося ввійти. Спробуйте ще раз." msgid "parse json failed" msgstr "не вдалося зчитати json" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "Завершити" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Власний принтер" + +msgid "Create" +msgstr "Створити" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "Тип філаменту" + +msgid "Vendor" +msgstr "Виробник" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "Очистити все" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Це вимикає всі хмарні функції, зокрема синхронізацію профілів Orca Cloud. Користувачі, які надають перевагу повністю автономній роботі, можуть увімкнути цю опцію." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Примітка: коли увімкнено прихований режим, ваші профілі користувача не резервуватимуться в Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + msgid "[Action Required] " msgstr "[Необхідна дія] " @@ -13298,6 +13591,14 @@ msgstr "G-code ролі екструзіх зміни філаменту" msgid "No object can be printed. It may be too small." msgstr "Жодний обʼєкт не може бути надрукований. Можливо, занадто маленький" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Ваша модель для друку розташована дуже близький до основних областей. Переконайтесь, що немає зіткнення." @@ -13473,6 +13774,26 @@ msgstr "валідація не пройшла" msgid "write callback failed" msgstr "збій зворотного виклику запису" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% знаходиться надто близько до забороненої зони, можливі зіткнення при друку." @@ -13528,6 +13849,43 @@ msgstr "Якщо ви все одно хочете друкувати, може msgid "No extrusions under current settings." msgstr "Немає екструзій під час поточних налаштувань." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Використовується змішаний філамент із градієнтом, але параметр «Підшар змішаного кольору» вимкнено. Градієнт не буде надруковано." @@ -13539,6 +13897,15 @@ msgstr "Плавний режим таймлапсу не підтримуєть msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Виявлення налипання не підтримується, коли увімкнено послідовність «по обʼєктах»." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + # AI Translated msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Одночасне увімкнення точної висоти Z та підготовчої вежі може спричинити помилки нарізки." @@ -13558,10 +13925,6 @@ msgstr "Режим спіральної вази не працює, якщо о msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Обʼєкт %1% влазить в робочий обʼєм, але він перевищує максимальну висоту робочого обʼєму із-за компенсації усадки матеріалу." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Обʼєкт %1% перевищує максимальну висоту обʼєму друку." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Хоча сам обʼєкт %1% вписується в обʼєм збірки, його останній шар перевищує максимальну висоту обʼєму друку." @@ -13569,6 +13932,10 @@ msgstr "Хоча сам обʼєкт %1% вписується в обʼєм зб msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Можливо, ви захочете зменшити розмір моделі або змінити поточні налаштування друку і спробувати ще раз." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Обʼєкт %1% перевищує максимальну висоту обʼєму друку." + msgid "Variable layer height is not supported with Organic supports." msgstr "Змінна висота шару не підтримується з Органічними підтримками." @@ -14583,12 +14950,39 @@ msgstr "Швидкість внутрішніх мостів. Якщо знач msgid "This is the distance from the model to the outermost brim line." msgstr "Відстань від моделі до останньої зовнішньої лінії кайми" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Тип кайми" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Керує генерацією кайми на зовнішніх та/або внутрішніх сторонах моделей. Авто означає, що ширина кайми аналізується та визначається автоматично." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Зазор між каймою та обʼєктом" @@ -15807,9 +16201,6 @@ msgstr "Ціна філаменту. Тільки для статистики" msgid "money/kg" msgstr "грн/кг" -msgid "Vendor" -msgstr "Виробник" - msgid "Vendor of filament. For show only." msgstr "Виробник філаменту. Для показу, тільки для відображення" @@ -15884,6 +16275,66 @@ msgstr "Багатолінійне заповнення" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Використання кількох ліній для шаблону заповнення, якщо шаблон це підтримує." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Лінійний" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Оптимізація зміщення проти Z-вигинання (експериментально)" @@ -18237,6 +18688,99 @@ msgstr "Мульти-матеріальний (ММ) друк з одним ек msgid "Use single nozzle to print multi filament." msgstr "Використовувати одне сопло для друку декількома філаментами" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Ручна заміна філаменту" @@ -18628,6 +19172,130 @@ msgstr "Поріг накладання" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Якщо пороговий кут дорівнює нулю, підтримка буде генеруватися для нависань, перекриття яких знаходиться нижче порогу. Чим менше це значення, тим крутіше нависання можна надрукувати без підтримки." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Кут гілки опори дерева" @@ -18816,17 +19484,11 @@ msgstr "Кількість верхніх суцільних шарів збіл msgid "Separated infills" msgstr "Роздільні заповнення" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Центрує внутрішнє заповнення кожної частини на ній самій, ніби її нарізали окремо, а не на всій збірці. Частини, що торкаються або перекриваються, вважаються одним тілом і мають спільний центр; окремі частини (або різні 3D-обʼєкти) отримують власний.\n" -"Корисно, коли збірка групує кілька обʼєктів, кожен з яких має зберігати узгоджене, самоцентроване заповнення.\n" -"Впливає на лінійні та сіткові шаблони, а також на заповнення з шаблонами обертання.\n" -"Шаблони, привʼязані до глобальних координат (Гіроїд, Медові стільники, TPMS, ...), не змінюються." # AI Translated msgid "Center surface pattern on" @@ -19065,6 +19727,12 @@ msgstr "Очищення після зміни філаменту буде ви msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Цей обʼєкт буде використаний для очищення сопла після зміни філаменту для економії філаменту та зменшення часу друку. В результаті кольори обʼєктів будуть змішані. Ця опція не набуде чинності, поки не включена підготовча вежа." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Максимальна мостова відстань" @@ -19987,8 +20655,8 @@ msgstr "Назва фізичного принтера, який викорис msgid "Layer number" msgstr "Номер шару" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Індекс поточного шару. На одній основі (тобто перший шар номер 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Шар Z" @@ -20133,9 +20801,6 @@ msgstr "Перекалібрування" msgid "Calibrate" msgstr "Калібрувати" -msgid "Finish" -msgstr "Завершити" - msgid "How can I use calibration results?" msgstr "Як використовувати результат калібрування?" @@ -20690,12 +21355,12 @@ msgstr "" "Значення прискорення мають бути більшими за значення швидкості.\n" "Перевірте введені дані." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Калібрування температури" -msgid "Filament type" -msgstr "Тип філаменту" - msgid "PLA" msgstr "PLA" @@ -20717,6 +21382,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Тестова модель" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Початкова температура: " @@ -20842,9 +21513,6 @@ msgstr "Початкова довжина ретракту: " msgid "End retraction length: " msgstr "Кінцева довжина ретракту: " -msgid "Test model" -msgstr "Тестова модель" - # AI Translated msgid "Ringing Tower" msgstr "Вежа резонансу (Ringing Tower)" @@ -21303,9 +21971,6 @@ msgstr "наприклад, Basic, Matte, Silk, Marble" msgid "Filament Preset" msgstr "Набір параметрів філаменту" -msgid "Create" -msgstr "Створити" - msgid "Vendor is not selected; please reselect vendor." msgstr "Виробник не вибраний. Будь ласка, перевиберіть виробника." @@ -21615,6 +22280,9 @@ msgstr "" "Принтер і всі нитки та налаштування процесу, які належать принтеру.\n" "Ними можна ділитись з іншими." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -22339,9 +23007,6 @@ msgstr "Вручну призначити філамент для лівого msgid "Global settings" msgstr "Глобальні налаштування" -msgid "Video tutorial" -msgstr "Відео-урок" - msgid "(Sync with printer)" msgstr "(Синхронізувати з принтером)" @@ -22742,6 +23407,33 @@ msgstr "Якщо дозволено, значення вище зберігат msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "Тека набору не існує." @@ -22775,6 +23467,12 @@ msgstr "Відписатися від набору" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "Зберегти набір пресету" @@ -27229,216 +27927,6 @@ msgstr "У цьому шрифті немає контурів символів msgid "Size: %.1f × %.1f mm" msgstr "Розмір: %.1f × %.1f мм" -# AI Translated -msgid "Primitive" -msgstr "Примітив" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Згенеровано порожню сітку" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Паралелепіпед" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Швидкий вибір:" - -# AI Translated -msgid "Width (X)" -msgstr "Ширина (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Глибина (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Висота (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "Нижній R" - -# AI Translated -msgid "Top R" -msgstr "Верхній R" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "Великий R" - -# AI Translated -msgid "Minor R" -msgstr "Малий R" - -# AI Translated -msgid "All edges" -msgstr "Усі ребра" - -# AI Translated -msgid "Top edges" -msgstr "Верхні ребра" - -# AI Translated -msgid "Bottom edges" -msgstr "Нижні ребра" - -# AI Translated -msgid "Lateral edges" -msgstr "Бічні ребра" - -# AI Translated -msgid "Mesh resolution" -msgstr "Роздільна здатність сітки" - -# AI Translated -msgid "Add Shape" -msgstr "Додати форму" - -# AI Translated -msgid "No outer profile" -msgstr "Немає зовнішнього профілю" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Не вдалося створити зовнішню грань" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Не вдалося побудувати грань з отворами" - -# AI Translated -msgid "Revolve failed" -msgstr "Не вдалося виконати обертання" - -# AI Translated -msgid "Profile" -msgstr "Профіль" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Почати новий профіль (для отворів)" - -# AI Translated -msgid "Segments" -msgstr "Сегменти" - -# AI Translated -msgid "Sides" -msgstr "Сторони" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Клацніть на полотні, щоб малювати" - -# AI Translated -msgid "Snap to grid" -msgstr "Привʼязка до сітки" - -# AI Translated -msgid "Grid step" -msgstr "Крок сітки" - -# AI Translated -msgid "Outer" -msgstr "Зовнішній" - -# AI Translated -msgid "closed" -msgstr "замкнений" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2% (точок: %3%) %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Верх)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Перед)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Бік)" - -# AI Translated -msgid "Revolve deg" -msgstr "Обертання, °" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "0 — видавлювання, >0 — обертання" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Кишеня (вирізання)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu замкнений профіль" -msgstr[1] "%zu замкнені профілі" -msgstr[2] "%zu замкнених профілів" -msgstr[3] "%zu замкненого профілю" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Намалюйте замкнений профіль, щоб увімкнути" - -# AI Translated -msgid "Clear all" -msgstr "Очистити все" - -# AI Translated -msgid "Empty result" -msgstr "Порожній результат" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Видавлювання: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Обертання: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Не вибрано обʼєкт" - -# AI Translated -msgid "Face failed" -msgstr "Не вдалося створити грань" - -# AI Translated -msgid "Face with holes failed" -msgstr "Не вдалося створити грань з отворами" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Сітка інструмента порожня" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Кишеню додано (відʼємний обʼєм)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Кишеня: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -27561,6 +28049,9 @@ msgstr "Зібрати Gizmo" msgid "Gizmo brim ears" msgstr "Краєчки Gizmo" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Вертикальний повзунок - рух активного великого пальця вгору" @@ -28542,10 +29033,6 @@ msgstr "Мої налаштування" msgid "Custom Printer Setup" msgstr "Налаштування власного принтера" -# AI Translated -msgid "Custom Printer" -msgstr "Власний принтер" - # AI Translated msgid "Define a custom printer profile" msgstr "Створіть профіль власного принтера" @@ -29192,9 +29679,8 @@ msgstr "Пороговий кут - заливка зупиняється на msgid "Click a triangle to paint it" msgstr "Клацніть трикутник, щоб замалювати його" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Потрібен активний шар із проєкцією «Розгортка (LSCM)»." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -29208,17 +29694,15 @@ msgstr "Швидкий - рельєф лише затінюється, а не msgid "Checker" msgstr "Шахівниця" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Шахівниця - тестова сітка замість текстури. Там, де квадрати лишаються квадратними, текстура не спотворена; де вони розтягуються, розтягнеться й вона" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Спотворення" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Спотворення - теплова карта розтягнення від синього до червоного поверх розгортки" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -29334,24 +29818,11 @@ msgstr "Змішувати філаменти" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Чергує два філаменти, щоб імітувати проміжні кольори, тож кількома філаментами можна відтворити фото або градієнт. Зображення з однотонними кольорами в обох випадках друкується однаково. Якщо вимкнено, на кожну область використовується один філамент." -# AI Translated -msgid "Mix by" -msgstr "Змішувати за" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Поверхня" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Шари: два філаменти чергуються між шарами друку, що дає плавне змішування на вертикальних поверхнях, але зникає на пласких, де цілий шар — одна смуга.\n" -"Поверхня: дрібна шахова сітка по поверхні, яка працює під будь-яким кутом, але може сприйматися як текстура, а не як змішування.\n" -"Автоматично: шари на вертикальних гранях; пласкі грані отримують найближчий окремий філамент, оскільки шахова сітка на них видна як візерунок." # AI Translated #, boost-format @@ -29811,14 +30282,6 @@ msgstr "Потрібно близько %1% трикутників, бюджет msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Скільки тисяч трикутників уточнення може додати до моделі. Першим завжди ділиться трикутник, який найгірше відповідає формі, тож навіть якщо витратити весь бюджет, його буде витрачено там, де це найпомітніше. Збільште, якщо рельєф і далі виглядає грубим." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Зупиняє запікання. Усе, що вже було завершено, лишається на моделі, і це можна скасувати." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Закриває інструмент без запікання. Ваше малювання, шари та налаштування залишаються з моделлю." - # AI Translated msgid "Preparing..." msgstr "Підготовка..." @@ -29843,6 +30306,14 @@ msgstr "Перетворити намальовані карти висот на msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Перетворити намальовані карти висот на реальну геометрію. Спершу сітка перебудовується до рівномірної щільності та уточнюється там, де текстура вигинається, щоб деталям було на які вершини лягти - усе за один крок." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Зупиняє запікання. Усе, що вже було завершено, лишається на моделі, і це можна скасувати." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Закриває інструмент без запікання. Ваше малювання, шари та налаштування залишаються з моделлю." + # AI Translated #, boost-format msgid "%1% k" @@ -30059,6 +30530,28 @@ msgstr "Плагіни філаменту" msgid "Printer plugins" msgstr "Плагіни принтера" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Відновити типові" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Конфігурація не є коректним JSON. Ваші зміни не збережено." @@ -30078,10 +30571,6 @@ msgstr "" "\n" "Це відкине перевизначення в пресеті й застосує глобальну конфігурацію." -# AI Translated -msgid "Restore defaults" -msgstr "Відновити типові" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Використовується глобальна конфігурація. Збережіть пресет, щоб зміни залишилися." @@ -30151,6 +30640,215 @@ msgstr "Встановлення плагіна" msgid "Installed \"%s\"." msgstr "Встановлено «%s»." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -30367,6 +31065,54 @@ msgstr "Не вдалося перезавантажити плагін." msgid "Reloaded \"%s\"." msgstr "Перезавантажено «%s»." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "Налаштування режиму очищення" @@ -30391,6 +31137,16 @@ msgstr "Зменшує відходи підготовки та пришвидш msgid "Terminal" msgstr "Термінал" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Команда вже виконується." @@ -30657,6 +31413,9 @@ msgstr " | привʼязку УВІМКНЕНО" msgid "Change texture - choose another one from the texture library" msgstr "Змінити текстуру - вибрати іншу з бібліотеки текстур" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Карта висот - показати текстуру шару під островами" @@ -30689,17 +31448,14 @@ msgstr "Зʼєднувати острови" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Розкладати розгортку звʼязно: частини зі спільним ребром розгортаються поруч (куб стає суцільною розгорткою, а не шістьма окремими квадратами). Вони лишаються окремими островами, тож згодом будь-який із них можна перемістити вручну." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Острів - переміщення, обертання й масштабування цілих островів" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Вершина - перетягуйте вершини, щоб змінити форму; Shift/Ctrl для множинного вибору" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Ребро - перетягуйте ребра, щоб змінити форму; Shift/Ctrl для множинного вибору" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30737,9 +31493,13 @@ msgstr "Скинути UV-правки - відкинути всі ручні п msgid "Snap - stick islands together when dragging one against another" msgstr "Привʼязка - зліплювати острови, коли один перетягується впритул до іншого" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Вмістити всі острови в кадр (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30750,6 +31510,9 @@ msgstr "Немає шару з проєкцією «Розгортка»" msgid "%.1f mm tile" msgstr "плитка %.1f мм" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Застаріло - малювання, шви або кут шва змінилися після створення цієї розгортки. Натисніть, щоб розгорнути знову." @@ -30758,19 +31521,48 @@ msgstr "Застаріло - малювання, шви або кут шва з msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Розпрямити намальовану область в UV-острови. Обчислюється лише після натискання цієї кнопки, а не при кожній зміні - тож спочатку малюйте, змініть кут шва або позначте шви, а потім натисніть «Розгорнути»." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "Островів: %d, граней: %s" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + # AI Translated msgid "Forward" msgstr "Уперед" -# AI Translated -msgid "Tools" -msgstr "Інструменти" - # AI Translated msgid "View Source" msgstr "Переглянути код" @@ -30916,6 +31708,16 @@ msgstr "" "Плагін «%s» запитує дозвіл на виконання таких команд:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30925,6 +31727,30 @@ msgstr "Плагін «%s» запитує дозвіл на подію ауди msgid "Plugin permission request" msgstr "Запит дозволу плагіна" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Інтерфейс конфігурації плагіна порожній. Показано типовий редактор." @@ -31516,6 +32342,317 @@ msgstr "" "Уникнення деформації\n" "Чи знаєте ви, що при друку матеріалами, схильними до деформації, такими як ABS, відповідне підвищення температури столу може зменшити ймовірність деформації?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Не вдалося встановити Microsoft WebView2 Runtime.\n" +#~ "Деякі функції, зокрема майстер налаштування, можуть відображатися порожніми, доки його не буде встановлено.\n" +#~ "Встановіть його вручну зі сторінки https://developer.microsoft.com/microsoft-edge/webview2/ і перезапустіть Orca Slicer." + +#~ msgid "Why this grouping" +#~ msgstr "Чому це згруповано" + +# AI Translated +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Програма не підтримує використання сопел різного діаметра в одному друці. Якщо ліве та праве сопла відрізняються, ми можемо продовжити лише друк однією головкою. Підтвердьте, яке сопло ви хочете використати для цього проєкту." + +#~ msgid "Switch diameter" +#~ msgstr "Змінити діаметр" + +#~ msgid "BambuStudio Project" +#~ msgstr "Проєкт BambuStudio" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "Файл 3MF створено в BambuStudio (версія %s), новішій за сумісну версію %s. Знайдено нерозпізнані налаштування:" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "Файл 3MF створено в BambuStudio (версія %s), новішій за сумісну версію %s. Деякі налаштування можуть бути не повністю сумісними." + +# AI Translated +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "Файл 3MF створено в BambuStudio. Деякі налаштування можуть відрізнятися від OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Неможливо скасувати чи повторити дію, поки виконується операція. Спершу зупиніть її." + +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Центрує внутрішнє заповнення кожної частини на ній самій, ніби її нарізали окремо, а не на всій збірці. Частини, що торкаються або перекриваються, вважаються одним тілом і мають спільний центр; окремі частини (або різні 3D-обʼєкти) отримують власний.\n" +#~ "Корисно, коли збірка групує кілька обʼєктів, кожен з яких має зберігати узгоджене, самоцентроване заповнення.\n" +#~ "Впливає на лінійні та сіткові шаблони, а також на заповнення з шаблонами обертання.\n" +#~ "Шаблони, привʼязані до глобальних координат (Гіроїд, Медові стільники, TPMS, ...), не змінюються." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Індекс поточного шару. На одній основі (тобто перший шар номер 1)." + +#~ msgid "Video tutorial" +#~ msgstr "Відео-урок" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Примітив" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Згенеровано порожню сітку" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Паралелепіпед" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Швидкий вибір:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Ширина (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Глибина (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Висота (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "Нижній R" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "Верхній R" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "Великий R" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "Малий R" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Усі ребра" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Верхні ребра" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Нижні ребра" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Бічні ребра" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Роздільна здатність сітки" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Додати форму" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Немає зовнішнього профілю" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Не вдалося створити зовнішню грань" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Не вдалося побудувати грань з отворами" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Не вдалося виконати обертання" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Профіль" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Почати новий профіль (для отворів)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Сегменти" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Сторони" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Клацніть на полотні, щоб малювати" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Привʼязка до сітки" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Крок сітки" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Зовнішній" + +# AI Translated +#~ msgid "closed" +#~ msgstr "замкнений" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2% (точок: %3%) %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Верх)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Перед)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Бік)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Обертання, °" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "0 — видавлювання, >0 — обертання" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Кишеня (вирізання)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu замкнений профіль" +#~ msgstr[1] "%zu замкнені профілі" +#~ msgstr[2] "%zu замкнених профілів" +#~ msgstr[3] "%zu замкненого профілю" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Намалюйте замкнений профіль, щоб увімкнути" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Порожній результат" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Видавлювання: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Обертання: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Не вибрано обʼєкт" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Не вдалося створити грань" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Не вдалося створити грань з отворами" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Сітка інструмента порожня" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Кишеню додано (відʼємний обʼєм)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Кишеня: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Потрібен активний шар із проєкцією «Розгортка (LSCM)»." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Шахівниця - тестова сітка замість текстури. Там, де квадрати лишаються квадратними, текстура не спотворена; де вони розтягуються, розтягнеться й вона" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Спотворення - теплова карта розтягнення від синього до червоного поверх розгортки" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Змішувати за" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Поверхня" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Шари: два філаменти чергуються між шарами друку, що дає плавне змішування на вертикальних поверхнях, але зникає на пласких, де цілий шар — одна смуга.\n" +#~ "Поверхня: дрібна шахова сітка по поверхні, яка працює під будь-яким кутом, але може сприйматися як текстура, а не як змішування.\n" +#~ "Автоматично: шари на вертикальних гранях; пласкі грані отримують найближчий окремий філамент, оскільки шахова сітка на них видна як візерунок." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Острів - переміщення, обертання й масштабування цілих островів" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Вершина - перетягуйте вершини, щоб змінити форму; Shift/Ctrl для множинного вибору" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Ребро - перетягуйте ребра, щоб змінити форму; Shift/Ctrl для множинного вибору" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Вмістити всі острови в кадр (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Експериментально) Використовувати агентів принтера замість хостів друку" @@ -31549,16 +32686,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Клацніть грань або опорну площину, потім виберіть інструмент малювання" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -31615,10 +32742,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Вертикальна відстань" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Лінійний" - #~ msgid "Face recognition" #~ msgstr "Розпізнавання обличчя" @@ -33183,9 +34306,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "вибір частини" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/vi/OrcaSlicer_vi.po b/localization/i18n/vi/OrcaSlicer_vi.po index 561b7dc2b6..d6d1b1fb01 100644 --- a/localization/i18n/vi/OrcaSlicer_vi.po +++ b/localization/i18n/vi/OrcaSlicer_vi.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2025-10-02 17:43+0700\n" "Last-Translator: \n" "Language-Team: hainguyen.ts13@gmail.com\n" @@ -2230,15 +2230,12 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"Không thể cài đặt Microsoft WebView2 Runtime.\n" -"Một số tính năng, bao gồm trình hướng dẫn thiết lập, có thể hiển thị trống cho đến khi nó được cài đặt.\n" -"Vui lòng cài đặt thủ công từ https://developer.microsoft.com/microsoft-edge/webview2/ rồi khởi động lại Orca Slicer." #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4509,6 +4506,10 @@ msgstr "Đi tới plate" msgid "AMS Materials Setting" msgstr "Cài đặt vật liệu AMS" +# AI Translated +msgid "Wiki Guide" +msgstr "Hướng dẫn Wiki" + msgid "Close" msgstr "Đóng" @@ -4532,10 +4533,6 @@ msgstr "Giá trị nhập vào phải lớn hơn %1% và nhỏ hơn %2%" msgid "Factors of Flow Dynamics Calibration" msgstr "Các hệ số của hiệu chỉnh flow động" -# AI Translated -msgid "Wiki Guide" -msgstr "Hướng dẫn Wiki" - # AI Translated msgid "PA Profile" msgstr "Hồ sơ PA" @@ -4631,7 +4628,7 @@ msgstr "Lưu" msgctxt "Navigation" msgid "Back" -msgstr "Sau" +msgstr "Quay lại" msgid "Example" msgstr "Ví dụ" @@ -5159,6 +5156,11 @@ msgstr "Tự động điều chỉnh về giới hạn (%g mm)?" msgid "Adjust" msgstr "Điều chỉnh" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -6073,10 +6075,6 @@ msgstr "Tự động slice lại theo cách nhóm filament tối ưu; kết qu msgid "Filament Grouping" msgstr "Nhóm filament" -# AI Translated -msgid "Why this grouping" -msgstr "Vì sao lại nhóm như vậy" - # AI Translated msgid "Please place filaments on the printer based on grouping result." msgstr "Vui lòng đặt filament lên máy in theo kết quả nhóm." @@ -6280,6 +6278,43 @@ msgstr "Tăng/giảm vùng chỉnh sửa" msgid "Sequence" msgstr "Trình tự" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "Thể tích" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + # AI Translated msgid "Object selection" msgstr "Chọn vật thể" @@ -6514,6 +6549,12 @@ msgstr "Đường lưới" msgid "Labels" msgstr "Nhãn" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "Di chuyển mặt phẳng cắt" @@ -6562,7 +6603,7 @@ msgstr "Thể tích:" msgid "Size:" msgstr "Kích thước:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "Đã tìm thấy xung đột đường đi G-code tại lớp %d, Z = %.2lfmm. Vui lòng tách các vật thể xung đột ra xa hơn (%s <-> %s)." @@ -7057,6 +7098,12 @@ msgstr "Hiện đường lưới" msgid "Show Gridlines on plate" msgstr "Hiện đường lưới trên plate" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "Đặt lại bố cục cửa sổ" @@ -8820,6 +8867,61 @@ msgstr "Xem tất cả cài đặt của đối tượng" msgid "Material settings" msgstr "Cài đặt vật liệu" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "Công cụ" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "Xóa bản hiện tại (nếu không phải bản cuối)" @@ -8845,6 +8947,17 @@ msgstr "Chỉnh sửa tên bản hiện tại" msgid "Move plate to the front" msgstr "Di chuyển bản ra phía trước" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "Tùy chỉnh bản hiện tại" @@ -8921,14 +9034,6 @@ msgstr "AMS(1 khe)" msgid "Not installed" msgstr "Chưa lắp" -# AI Translated -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "Phần mềm không hỗ trợ dùng các đầu phun có đường kính khác nhau trong một lần in. Nếu đầu phun trái và phải không giống nhau, chúng tôi chỉ có thể tiến hành in bằng một đầu. Vui lòng xác nhận bạn muốn dùng đầu phun nào cho dự án này." - -# AI Translated -msgid "Switch diameter" -msgstr "Chuyển đường kính" - msgid "Configuration incompatible" msgstr "Cấu hình không tương thích" @@ -9016,6 +9121,9 @@ msgstr "Filament pha trộn" msgid "Remove last mixed filament" msgstr "Xóa filament pha trộn cuối cùng" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "Thêm filament pha trộn" @@ -9038,6 +9146,10 @@ msgstr "Filament pha trộn có tham chiếu thành phần bị lỗi" msgid "Edit / Delete / Merge" msgstr "Chỉnh sửa / Xóa / Gộp" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "Filament pha trộn đích sử dụng filament vật lý này làm thành phần. Việc gộp sẽ xóa filament vật lý này và có thể làm filament pha trộn không còn hợp lệ. Tiếp tục?" @@ -9117,10 +9229,6 @@ msgstr "Đang tải file: %s" msgid "Load 3MF" msgstr "Tải 3MF" -# AI Translated -msgid "BambuStudio Project" -msgstr "Dự án BambuStudio" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "File 3MF không được hỗ trợ bởi OrcaSlicer, chỉ tải dữ liệu hình học." @@ -9153,20 +9261,6 @@ msgstr "Bạn nên nâng cấp phần mềm của mình.\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "Phiên bản 3MF %s mới hơn phiên bản %s của %s, khuyến nghị nâng cấp phần mềm của bạn." -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "File 3MF được tạo bởi BambuStudio (phiên bản %s), mới hơn phiên bản tương thích %s. Đã tìm thấy các cài đặt không nhận dạng được:" - -# AI Translated -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "File 3MF được tạo bởi BambuStudio (phiên bản %s), mới hơn phiên bản tương thích %s. Một số cài đặt có thể không hoàn toàn tương thích." - -# AI Translated -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "File 3MF được tạo bởi BambuStudio. Một số cài đặt có thể khác với OrcaSlicer." - msgid "Invalid values found in the 3MF:" msgstr "Tìm thấy giá trị không hợp lệ trong file 3MF:" @@ -9340,6 +9434,12 @@ msgstr "Tắt Tự động thả để giữ nguyên vị trí Z?\n" msgid "Object with floating parts was detected" msgstr "Đã phát hiện vật thể có phần lơ lửng" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "Một tác vụ xuất khác đang chạy." @@ -9432,6 +9532,38 @@ msgstr "Dữ liệu không hợp lệ" msgid "Slicing Canceled" msgstr "Đã hủy slice" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + # AI Translated msgid "Network plug-in switched successfully." msgstr "Đã chuyển plug-in mạng thành công." @@ -9468,9 +9600,8 @@ msgstr "" msgid "Sync now" msgstr "Đồng bộ ngay" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "Không thể hoàn tác hoặc làm lại khi một thao tác đang chạy. Hãy dừng nó trước." +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -9541,6 +9672,11 @@ msgstr "Tải xuống thất bại, kích thước file bất thường." msgid "Project downloaded %d%%" msgstr "Dự án đã tải xuống %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Kiểm tra Pressure Advance" @@ -9567,6 +9703,13 @@ msgstr "Hiệu chỉnh lưu lượng Orca YOLO" msgid "Flowrate Test - Pass%d" msgstr "Kiểm tra lưu lượng - Lượt %d" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "Kiểm tra nhiệt độ đầu phun" @@ -12198,6 +12341,9 @@ msgstr "Không hỗ trợ đồng bộ giữa các loại truyền động extru msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "Đồng bộ thay đổi tham số sang tham số tương ứng của extruder còn lại." +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "Nhấp để đặt lại tất cả cài đặt về preset đã lưu cuối cùng." @@ -12616,6 +12762,12 @@ msgstr "Không gian in" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "Chọn cách triển khai tác nhân mạng cho việc giao tiếp với máy in. Các tác nhân khả dụng được đăng ký khi khởi động." +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -12736,9 +12888,24 @@ msgstr "Đường kính đầu phun" msgid "Wipe tower" msgstr "Wipe tower" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "Tham số đa vật liệu extruder đơn" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "Đây là máy in đa vật liệu extruder đơn, đường kính của tất cả extruder sẽ được đặt thành giá trị mới. Bạn có muốn tiếp tục?" @@ -12748,6 +12915,18 @@ msgstr "Giới hạn chiều cao lớp" msgid "Z-Hop" msgstr "Z-Hop" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + # AI Translated msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" @@ -12861,10 +13040,9 @@ msgstr "Tiếp tục" msgid "Don't warn again for this preset" msgstr "Không cảnh báo lại cho cài đặt sẵn này" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -13331,9 +13509,6 @@ msgstr "ms" msgid "Total ramming" msgstr "Tổng ramming" -msgid "Volume" -msgstr "Thể tích" - msgid "Ramming line" msgstr "Đường ramming" @@ -13386,6 +13561,120 @@ msgstr "Đăng nhập thất bại. Vui lòng thử lại." msgid "parse json failed" msgstr "phân tích json thất bại" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "" + +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "" + +msgid "Get Started" +msgstr "" + +msgid "Please select your login region" +msgstr "" + +msgid "Finish" +msgstr "Hoàn thành" + +msgid "Printer Selection" +msgstr "" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "Máy in tùy chỉnh" + +msgid "Create" +msgstr "Tạo" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "Loại filament" + +msgid "Vendor" +msgstr "Nhà cung cấp" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +# AI Translated +msgid "Clear all" +msgstr "Xóa tất cả" + +msgid "At least one filament must be selected." +msgstr "" + +msgid "Do you want to use the default filament?" +msgstr "" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "Tùy chọn này tắt toàn bộ tính năng cloud, bao gồm cả đồng bộ hồ sơ Orca Cloud. Người dùng muốn làm việc hoàn toàn ngoại tuyến có thể bật tùy chọn này." + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "Lưu ý: Khi Chế độ ẩn danh được bật, hồ sơ người dùng của bạn sẽ không được sao lưu lên Orca Cloud." + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "" + # AI Translated msgid "[Action Required] " msgstr "[Cần thao tác] " @@ -13869,6 +14158,14 @@ msgstr "G-code đổi vai trò đùn (filament)" msgid "No object can be printed. It may be too small." msgstr "Không có đối tượng nào có thể in. Có thể quá nhỏ" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "Bản in của bạn rất gần vùng priming. Hãy chắc chắn rằng không có va chạm." @@ -14046,6 +14343,26 @@ msgstr "xác thực thất bại" msgid "write callback failed" msgstr "gọi lại ghi thất bại" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% quá gần vùng loại trừ, có thể có va chạm khi in." @@ -14102,6 +14419,43 @@ msgstr "Nếu bạn vẫn muốn in, bạn có thể bật tùy chọn trong Tù msgid "No extrusions under current settings." msgstr "Không có đùn dưới cài đặt hiện tại." +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "Đang dùng filament pha trộn có gradient, nhưng 'Lớp con màu pha trộn' đã bị tắt. Gradient sẽ không được in." @@ -14113,6 +14467,15 @@ msgstr "Chế độ mượt của timelapse không được hỗ trợ khi trìn msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "Không hỗ trợ phát hiện vón cục khi trình tự \"theo vật thể\" được bật." +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "Bật cả chiều cao Z chính xác và tháp mồi có thể gây ra lỗi cắt lớp." @@ -14130,10 +14493,6 @@ msgstr "Chế độ bình xoắn ốc không hoạt động khi đối tượng msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "Mặc dù đối tượng %1% vừa với thể tích xây dựng, nó vượt quá chiều cao thể tích xây dựng tối đa do bù co ngót vật liệu." -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Đối tượng %1% vượt quá chiều cao thể tích xây dựng tối đa." - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "Mặc dù đối tượng %1% vừa với thể tích xây dựng, lớp cuối cùng của nó vượt quá chiều cao thể tích xây dựng tối đa." @@ -14141,6 +14500,10 @@ msgstr "Mặc dù đối tượng %1% vừa với thể tích xây dựng, lớp msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "Bạn có thể muốn giảm kích thước model của mình hoặc thay đổi cài đặt in hiện tại và thử lại." +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Đối tượng %1% vượt quá chiều cao thể tích xây dựng tối đa." + msgid "Variable layer height is not supported with Organic supports." msgstr "Chiều cao lớp thay đổi không được hỗ trợ với support hữu cơ." @@ -15147,12 +15510,39 @@ msgstr "Tốc độ của cầu bên trong. Nếu giá trị được biểu th msgid "This is the distance from the model to the outermost brim line." msgstr "Khoảng cách từ model đến đường brim ngoài cùng." +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Loại brim" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "Điều này điều khiển việc tạo brim ở bên ngoài và/hoặc bên trong của model. Tự động có nghĩa là độ rộng brim được phân tích và tính tự động." +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Khoảng cách brim-đối tượng" @@ -16378,9 +16768,6 @@ msgstr "Giá filament. Chỉ cho thống kê." msgid "money/kg" msgstr "tiền/kg" -msgid "Vendor" -msgstr "Nhà cung cấp" - msgid "Vendor of filament. For show only." msgstr "Nhà cung cấp filament. Chỉ để hiển thị." @@ -16454,6 +16841,66 @@ msgstr "Lấp nhiều đường" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "Sử dụng nhiều đường cho mẫu infill, nếu được hỗ trợ bởi mẫu infill." +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "Tuyến tính" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + # AI Translated msgid "Z-buckling bias optimization (experimental)" msgstr "Tối ưu thiên lệch chống oằn theo Z (thử nghiệm)" @@ -18761,6 +19208,99 @@ msgstr "Extruder đơn đa vật liệu" msgid "Use single nozzle to print multi filament." msgstr "Sử dụng đầu phun đơn để in nhiều filament." +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "Thay filament thủ công" @@ -19147,6 +19687,130 @@ msgstr "Chồng lấp ngưỡng" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "Nếu góc ngưỡng là không, support sẽ được tạo cho phần nhô có chồng lấp dưới ngưỡng. Giá trị này càng nhỏ, phần nhô càng dốc có thể được in mà không cần support." +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "Góc nhánh support cây" @@ -19326,17 +19990,11 @@ msgstr "Số lượng lớp đặc trên được tăng lên khi slice nếu đ msgid "Separated infills" msgstr "Infill tách biệt" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"Căn giữa infill bên trong của từng phần theo chính nó, như thể nó được slice riêng, thay vì theo toàn bộ cụm lắp ráp. Các phần chạm hoặc chồng lên nhau được coi là một khối và dùng chung một tâm; các phần rời nhau (hoặc các vật thể 3D riêng biệt) thì mỗi phần có tâm riêng.\n" -"Hữu ích khi một cụm lắp ráp gộp nhiều vật thể mà mỗi vật thể cần giữ infill nhất quán, tự căn giữa.\n" -"Ảnh hưởng đến các mẫu đường và lưới cùng các infill dùng mẫu xoay.\n" -"Các mẫu bị khóa theo tọa độ toàn cục (Gyroid, Tổ ong, TPMS, ...) không bị ảnh hưởng." # AI Translated msgid "Center surface pattern on" @@ -19582,6 +20240,12 @@ msgstr "Xả sau khi thay filament sẽ được thực hiện bên trong suppor msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "Đối tượng này sẽ được sử dụng để xả đầu phun sau khi thay filament để tiết kiệm filament và giảm thời gian in. Màu sắc của các đối tượng sẽ được trộn lẫn. Nó sẽ không có hiệu lực trừ khi prime tower được bật." +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "Khoảng cách nối cầu tối đa" @@ -20508,8 +21172,8 @@ msgstr "Tên của máy in vật lý được sử dụng để slice." msgid "Layer number" msgstr "Số lớp" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "Chỉ số của lớp hiện tại. Dựa trên một (tức là lớp đầu tiên là số 1)." +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "Lớp Z" @@ -20654,9 +21318,6 @@ msgstr "Hiệu chỉnh lại" msgid "Calibrate" msgstr "Hiệu chỉnh" -msgid "Finish" -msgstr "Hoàn thành" - msgid "How can I use calibration results?" msgstr "Cách sử dụng kết quả hiệu chỉnh?" @@ -21212,12 +21873,12 @@ msgstr "" "Giá trị gia tốc phải lớn hơn giá trị tốc độ.\n" "Vui lòng kiểm tra lại dữ liệu nhập." +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "Hiệu chỉnh nhiệt độ" -msgid "Filament type" -msgstr "Loại filament" - msgid "PLA" msgstr "PLA" @@ -21239,6 +21900,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "Model kiểm tra" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "Nhiệt độ bắt đầu: " @@ -21365,9 +22032,6 @@ msgstr "Độ dài rút bắt đầu: " msgid "End retraction length: " msgstr "Độ dài rút kết thúc: " -msgid "Test model" -msgstr "Model kiểm tra" - msgid "Ringing Tower" msgstr "Tháp rung" @@ -21837,9 +22501,6 @@ msgstr "ví dụ Cơ bản, Mờ, Lụa, Đá cẩm thạch" msgid "Filament Preset" msgstr "Cài đặt sẵn filament" -msgid "Create" -msgstr "Tạo" - msgid "Vendor is not selected; please reselect vendor." msgstr "Nhà cung cấp không được chọn, vui lòng chọn lại nhà cung cấp." @@ -22154,6 +22815,9 @@ msgstr "" "Máy in và tất cả các loại sợi in 3D cùng các cài đặt quy trình đi kèm với máy in.\n" "Có thể chia sẻ với người khác." +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -22934,10 +23598,6 @@ msgstr "Gán filament thủ công cho đầu phun trái hoặc phải" msgid "Global settings" msgstr "Cài đặt toàn cục" -# AI Translated -msgid "Video tutorial" -msgstr "Video hướng dẫn" - # AI Translated msgid "(Sync with printer)" msgstr "(Đồng bộ với máy in)" @@ -23432,6 +24092,33 @@ msgstr "Nếu bật, các giá trị ở trên sẽ được lưu làm mặc đ msgid "PresetBundle" msgstr "PresetBundle" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + # AI Translated msgid "Bundle folder does not exist." msgstr "Thư mục gói không tồn tại." @@ -23476,6 +24163,12 @@ msgstr "Hủy đăng ký gói" msgid "ExportPresetBundle" msgstr "ExportPresetBundle" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + # AI Translated msgid "Save preset bundle" msgstr "Lưu gói cài đặt sẵn" @@ -27905,213 +28598,6 @@ msgstr "Font này không có đường viền cho chữ này" msgid "Size: %.1f × %.1f mm" msgstr "Kích thước: %.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "Hình nguyên thủy" - -# AI Translated -msgid "Empty mesh generated" -msgstr "Đã tạo lưới rỗng" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "Hộp" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "Nhanh:" - -# AI Translated -msgid "Width (X)" -msgstr "Độ rộng (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "Độ sâu (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "Chiều cao (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "R đáy" - -# AI Translated -msgid "Top R" -msgstr "R đỉnh" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "R lớn" - -# AI Translated -msgid "Minor R" -msgstr "R nhỏ" - -# AI Translated -msgid "All edges" -msgstr "Tất cả cạnh" - -# AI Translated -msgid "Top edges" -msgstr "Cạnh trên" - -# AI Translated -msgid "Bottom edges" -msgstr "Cạnh dưới" - -# AI Translated -msgid "Lateral edges" -msgstr "Cạnh bên" - -# AI Translated -msgid "Mesh resolution" -msgstr "Độ phân giải lưới" - -# AI Translated -msgid "Add Shape" -msgstr "Thêm hình" - -# AI Translated -msgid "No outer profile" -msgstr "Không có biên dạng ngoài" - -# AI Translated -msgid "Failed to make outer face" -msgstr "Không thể tạo mặt ngoài" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "Không thể tạo mặt có lỗ" - -# AI Translated -msgid "Revolve failed" -msgstr "Tròn xoay thất bại" - -# AI Translated -msgid "Profile" -msgstr "Biên dạng" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "Bắt đầu biên dạng mới (cho lỗ)" - -# AI Translated -msgid "Segments" -msgstr "Số đoạn" - -# AI Translated -msgid "Sides" -msgstr "Số cạnh" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "Nhấn vào khung vẽ để vẽ" - -# AI Translated -msgid "Snap to grid" -msgstr "Bám theo lưới" - -# AI Translated -msgid "Grid step" -msgstr "Bước lưới" - -# AI Translated -msgid "Outer" -msgstr "Ngoài" - -# AI Translated -msgid "closed" -msgstr "khép kín" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%: %3% điểm %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY (Trên)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ (Trước)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ (Bên)" - -# AI Translated -msgid "Revolve deg" -msgstr "Góc tròn xoay" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "Đặt 0 để đùn, >0 để tạo khối tròn xoay" - -# AI Translated -msgid "Pocket (cut)" -msgstr "Khoét hốc (cắt)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu biên dạng khép kín" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "Vẽ một biên dạng khép kín để bật" - -# AI Translated -msgid "Clear all" -msgstr "Xóa tất cả" - -# AI Translated -msgid "Empty result" -msgstr "Kết quả rỗng" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "Đùn: %1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "Tròn xoay: %1%" - -# AI Translated -msgid "No object selected" -msgstr "Chưa chọn vật thể nào" - -# AI Translated -msgid "Face failed" -msgstr "Tạo mặt thất bại" - -# AI Translated -msgid "Face with holes failed" -msgstr "Tạo mặt có lỗ thất bại" - -# AI Translated -msgid "Tool mesh empty" -msgstr "Lưới công cụ rỗng" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "Đã thêm hốc (thể tích âm)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "Khoét hốc: %1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -28235,6 +28721,9 @@ msgstr "Gizmo lắp ráp" msgid "Gizmo brim ears" msgstr "Gizmo tai viền" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "Thanh trượt dọc - Di chuyển nút hoạt động lên" @@ -29217,10 +29706,6 @@ msgstr "Cài đặt của tôi" msgid "Custom Printer Setup" msgstr "Thiết lập máy in tùy chỉnh" -# AI Translated -msgid "Custom Printer" -msgstr "Máy in tùy chỉnh" - # AI Translated msgid "Define a custom printer profile" msgstr "Định nghĩa hồ sơ máy in tùy chỉnh" @@ -29865,9 +30350,8 @@ msgstr "Ngưỡng góc - vùng tô dừng lại ở các cạnh sắc hơn góc msgid "Click a triangle to paint it" msgstr "Nhấn vào một tam giác để vẽ nó" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "Cần lớp kết cấu đang hoạt động được ánh xạ bằng Trải phẳng (LSCM)." +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -29881,17 +30365,15 @@ msgstr "Nhanh - phần nổi chỉ được tô bóng, không được dựng th msgid "Checker" msgstr "Ô bàn cờ" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "Ô bàn cờ - một lưới kiểm tra thay cho kết cấu. Nơi các ô vẫn vuông thì kết cấu không bị méo; nơi chúng bị kéo giãn thì kết cấu cũng vậy" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "Độ méo" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "Độ méo - bản đồ nhiệt độ kéo giãn từ xanh đến đỏ trên phần trải phẳng" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -30007,24 +30489,11 @@ msgstr "Trộn filament" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "Đan xen hai filament để mô phỏng các màu trung gian, nhờ đó chỉ vài filament cũng có thể thể hiện một bức ảnh hoặc dải chuyển màu. Ảnh có màu phẳng sẽ in ra giống nhau dù bật hay tắt. Tắt thì mỗi vùng dùng một filament." -# AI Translated -msgid "Mix by" -msgstr "Trộn theo" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "Bề mặt" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"Lớp: hai filament luân phiên giữa các lớp in, hòa trộn mượt trên các bề mặt thẳng đứng nhưng biến mất trên các bề mặt nằm ngang, nơi cả một lớp chỉ là một dải màu.\n" -"Bề mặt: một bàn cờ mịn trên bề mặt, hoạt động ở mọi góc nhưng có thể trông như kết cấu hơn là sự hòa trộn.\n" -"Tự động: dùng lớp trên các mặt thẳng đứng; các mặt nằm ngang lấy filament đơn gần nhất, vì bàn cờ ở đó sẽ lộ ra thành hoa văn." # AI Translated #, boost-format @@ -30484,14 +30953,6 @@ msgstr "Cần khoảng %1% tam giác, hạn mức %2% - quá trình nướng s msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "Số nghìn tam giác mà quá trình tinh chỉnh được phép thêm vào mô hình. Tam giác khớp kém nhất luôn được chia trước, nên kể cả khi dùng hết hạn mức thì cũng đã dùng ở nơi dễ thấy nhất. Tăng nếu phần nổi vẫn trông thô." -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "Dừng quá trình nướng. Những gì đã hoàn tất vẫn được giữ trên mô hình và có thể hoàn tác." - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "Đóng công cụ mà không nướng. Phần vẽ, các lớp kết cấu và cài đặt vẫn được lưu cùng mô hình." - # AI Translated msgid "Preparing..." msgstr "Đang chuẩn bị..." @@ -30516,6 +30977,14 @@ msgstr "Biến các bản đồ độ cao đã vẽ thành hình học thực b msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "Biến các bản đồ độ cao đã vẽ thành hình học thực. Trước tiên lưới được tạo lại với mật độ đều và được tinh chỉnh ở nơi kết cấu uốn cong, để chi tiết có đỉnh mà bám vào - tất cả trong một bước." +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "Dừng quá trình nướng. Những gì đã hoàn tất vẫn được giữ trên mô hình và có thể hoàn tác." + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "Đóng công cụ mà không nướng. Phần vẽ, các lớp kết cấu và cài đặt vẫn được lưu cùng mô hình." + # AI Translated #, boost-format msgid "%1% k" @@ -30732,6 +31201,28 @@ msgstr "Plugin filament" msgid "Printer plugins" msgstr "Plugin máy in" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "Khôi phục mặc định" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "Cấu hình không phải là JSON hợp lệ. Các thay đổi của bạn chưa được lưu." @@ -30751,10 +31242,6 @@ msgstr "" "\n" "Thao tác này sẽ hủy phần ghi đè của cài đặt sẵn và dùng cấu hình chung." -# AI Translated -msgid "Restore defaults" -msgstr "Khôi phục mặc định" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "Đang dùng cấu hình chung. Hãy lưu cài đặt sẵn để giữ lại thay đổi." @@ -30824,6 +31311,215 @@ msgstr "Đang cài đặt plugin" msgid "Installed \"%s\"." msgstr "Đã cài đặt \"%s\"." +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -31040,6 +31736,54 @@ msgstr "Tải lại plugin thất bại." msgid "Reloaded \"%s\"." msgstr "Đã tải lại \"%s\"." +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "" + +msgid "Edit Project Info" +msgstr "" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "Cài đặt chế độ xả" @@ -31064,6 +31808,16 @@ msgstr "Giảm lượng nhựa xả bỏ và in nhanh hơn. Có thể gây lẫn msgid "Terminal" msgstr "Terminal" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "Một lệnh khác đang chạy." @@ -31330,6 +32084,9 @@ msgstr " | bắt dính BẬT" msgid "Change texture - choose another one from the texture library" msgstr "Đổi kết cấu - chọn kết cấu khác từ thư viện kết cấu" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "Bản đồ độ cao - hiển thị kết cấu của lớp bên dưới các mảnh" @@ -31362,17 +32119,14 @@ msgstr "Nối các mảnh" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "Bố trí phần trải phẳng thành một hình khai triển liền: các mảnh chung cạnh được trải cạnh nhau (một khối lập phương trở thành một hình khai triển liền thay vì sáu hình vuông rời). Chúng vẫn là các mảnh riêng, nên sau đó bạn vẫn có thể tự di chuyển bất kỳ mảnh nào." -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "Mảnh - di chuyển, xoay và co giãn toàn bộ mảnh" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "Đỉnh - kéo đỉnh để định hình lại; Shift/Ctrl để chọn nhiều" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "Cạnh - kéo cạnh để định hình lại; Shift/Ctrl để chọn nhiều" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -31410,9 +32164,13 @@ msgstr "Xóa chỉnh sửa UV - hủy mọi thao tác di chuyển đỉnh/cạnh msgid "Snap - stick islands together when dragging one against another" msgstr "Bắt dính - gắn các mảnh vào nhau khi kéo một mảnh sát vào mảnh khác" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "Vừa khung tất cả mảnh (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -31423,6 +32181,9 @@ msgstr "Không có lớp nào được ánh xạ bằng Trải phẳng" msgid "%.1f mm tile" msgstr "ô %.1f mm" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "Đã lỗi thời - phần vẽ, các đường cắt hoặc góc đường cắt đã thay đổi kể từ lần trải phẳng này. Nhấn để trải phẳng lại." @@ -31431,19 +32192,48 @@ msgstr "Đã lỗi thời - phần vẽ, các đường cắt hoặc góc đư msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "Làm phẳng vùng đã vẽ thành các mảnh UV. Việc này chỉ được tính khi bạn nhấn nút này, không phải sau mỗi lần chỉnh sửa - vì vậy hãy vẽ, đổi góc đường cắt hoặc đánh dấu đường cắt trước, rồi nhấn Trải phẳng." +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d mảnh, %s mặt" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "" + +msgid "Create new project" +msgstr "" + +msgid "Recently opened" +msgstr "" + +msgid "Open Containing Folder" +msgstr "" + # AI Translated msgid "Forward" msgstr "Tiến" -# AI Translated -msgid "Tools" -msgstr "Công cụ" - # AI Translated msgid "View Source" msgstr "Xem mã nguồn" @@ -31589,6 +32379,16 @@ msgstr "" "Plugin \"%s\" đang yêu cầu chạy (các) lệnh sau:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -31598,6 +32398,30 @@ msgstr "Plugin \"%s\" đang yêu cầu quyền cho sự kiện audit Python \"%s msgid "Plugin permission request" msgstr "Yêu cầu quyền của plugin" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "Giao diện cấu hình của plugin trống. Đang hiển thị trình chỉnh sửa mặc định." @@ -32185,6 +33009,319 @@ msgstr "" "Tránh cong vênh\n" "Bạn có biết rằng khi in vật liệu dễ cong vênh như ABS, tăng nhiệt độ bàn nóng một cách thích hợp có thể giảm xác suất cong vênh không?" +# AI Translated +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "Không thể cài đặt Microsoft WebView2 Runtime.\n" +#~ "Một số tính năng, bao gồm trình hướng dẫn thiết lập, có thể hiển thị trống cho đến khi nó được cài đặt.\n" +#~ "Vui lòng cài đặt thủ công từ https://developer.microsoft.com/microsoft-edge/webview2/ rồi khởi động lại Orca Slicer." + +# AI Translated +#~ msgid "Why this grouping" +#~ msgstr "Vì sao lại nhóm như vậy" + +# AI Translated +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "Phần mềm không hỗ trợ dùng các đầu phun có đường kính khác nhau trong một lần in. Nếu đầu phun trái và phải không giống nhau, chúng tôi chỉ có thể tiến hành in bằng một đầu. Vui lòng xác nhận bạn muốn dùng đầu phun nào cho dự án này." + +# AI Translated +#~ msgid "Switch diameter" +#~ msgstr "Chuyển đường kính" + +# AI Translated +#~ msgid "BambuStudio Project" +#~ msgstr "Dự án BambuStudio" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "File 3MF được tạo bởi BambuStudio (phiên bản %s), mới hơn phiên bản tương thích %s. Đã tìm thấy các cài đặt không nhận dạng được:" + +# AI Translated +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "File 3MF được tạo bởi BambuStudio (phiên bản %s), mới hơn phiên bản tương thích %s. Một số cài đặt có thể không hoàn toàn tương thích." + +# AI Translated +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "File 3MF được tạo bởi BambuStudio. Một số cài đặt có thể khác với OrcaSlicer." + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "Không thể hoàn tác hoặc làm lại khi một thao tác đang chạy. Hãy dừng nó trước." + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "Căn giữa infill bên trong của từng phần theo chính nó, như thể nó được slice riêng, thay vì theo toàn bộ cụm lắp ráp. Các phần chạm hoặc chồng lên nhau được coi là một khối và dùng chung một tâm; các phần rời nhau (hoặc các vật thể 3D riêng biệt) thì mỗi phần có tâm riêng.\n" +#~ "Hữu ích khi một cụm lắp ráp gộp nhiều vật thể mà mỗi vật thể cần giữ infill nhất quán, tự căn giữa.\n" +#~ "Ảnh hưởng đến các mẫu đường và lưới cùng các infill dùng mẫu xoay.\n" +#~ "Các mẫu bị khóa theo tọa độ toàn cục (Gyroid, Tổ ong, TPMS, ...) không bị ảnh hưởng." + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "Chỉ số của lớp hiện tại. Dựa trên một (tức là lớp đầu tiên là số 1)." + +# AI Translated +#~ msgid "Video tutorial" +#~ msgstr "Video hướng dẫn" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "Hình nguyên thủy" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "Đã tạo lưới rỗng" + +# AI Translated +#~ msgid "Box" +#~ msgstr "Hộp" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "Nhanh:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "Độ rộng (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "Độ sâu (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "Chiều cao (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "R đáy" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "R đỉnh" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "R lớn" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "R nhỏ" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "Tất cả cạnh" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "Cạnh trên" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "Cạnh dưới" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "Cạnh bên" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "Độ phân giải lưới" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "Thêm hình" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "Không có biên dạng ngoài" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "Không thể tạo mặt ngoài" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "Không thể tạo mặt có lỗ" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "Tròn xoay thất bại" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "Biên dạng" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "Bắt đầu biên dạng mới (cho lỗ)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "Số đoạn" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "Số cạnh" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "Nhấn vào khung vẽ để vẽ" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "Bám theo lưới" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "Bước lưới" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "Ngoài" + +# AI Translated +#~ msgid "closed" +#~ msgstr "khép kín" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%: %3% điểm %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY (Trên)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ (Trước)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ (Bên)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "Góc tròn xoay" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "Đặt 0 để đùn, >0 để tạo khối tròn xoay" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "Khoét hốc (cắt)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu biên dạng khép kín" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "Vẽ một biên dạng khép kín để bật" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "Kết quả rỗng" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "Đùn: %1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "Tròn xoay: %1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "Chưa chọn vật thể nào" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "Tạo mặt thất bại" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "Tạo mặt có lỗ thất bại" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "Lưới công cụ rỗng" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "Đã thêm hốc (thể tích âm)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "Khoét hốc: %1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "Cần lớp kết cấu đang hoạt động được ánh xạ bằng Trải phẳng (LSCM)." + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "Ô bàn cờ - một lưới kiểm tra thay cho kết cấu. Nơi các ô vẫn vuông thì kết cấu không bị méo; nơi chúng bị kéo giãn thì kết cấu cũng vậy" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "Độ méo - bản đồ nhiệt độ kéo giãn từ xanh đến đỏ trên phần trải phẳng" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "Trộn theo" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "Bề mặt" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "Lớp: hai filament luân phiên giữa các lớp in, hòa trộn mượt trên các bề mặt thẳng đứng nhưng biến mất trên các bề mặt nằm ngang, nơi cả một lớp chỉ là một dải màu.\n" +#~ "Bề mặt: một bàn cờ mịn trên bề mặt, hoạt động ở mọi góc nhưng có thể trông như kết cấu hơn là sự hòa trộn.\n" +#~ "Tự động: dùng lớp trên các mặt thẳng đứng; các mặt nằm ngang lấy filament đơn gần nhất, vì bàn cờ ở đó sẽ lộ ra thành hoa văn." + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "Mảnh - di chuyển, xoay và co giãn toàn bộ mảnh" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Đỉnh - kéo đỉnh để định hình lại; Shift/Ctrl để chọn nhiều" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "Cạnh - kéo cạnh để định hình lại; Shift/Ctrl để chọn nhiều" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "Vừa khung tất cả mảnh (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(Thử nghiệm) Dùng tác nhân máy in thay cho máy chủ in" @@ -32218,16 +33355,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "Nhấn một mặt hoặc một mặt phẳng tham chiếu, rồi chọn một công cụ vẽ" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -32284,10 +33411,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "Khoảng cách dọc" -# AI Translated -#~ msgid "Linear" -#~ msgstr "Tuyến tính" - #~ msgid "Face recognition" #~ msgstr "Nhận dạng mặt" @@ -33861,9 +34984,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "chọn phần" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po index e5c067013f..2523b5c9ab 100644 --- a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po +++ b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2026-06-11 12:37-0300\n" "Last-Translator: Handle \n" "Language-Team: \n" @@ -455,8 +455,9 @@ msgstr "自动支撑角度阈值:" msgid "Circle" msgstr "圆" +# AI Translated msgid "Sphere" -msgstr "球" +msgstr "球体" msgid "Fill" msgstr "填充" @@ -474,8 +475,9 @@ msgstr "水平" msgid "Allows painting only on facets selected by: \"%1%\"" msgstr "绘制仅对由%1%选中的面片生效" +# AI Translated msgid "Highlight faces according to overhang angle." -msgstr "根据当前设置的悬垂角度来高亮片面。" +msgstr "根据当前设置的悬垂角度高亮显示面片。" msgid "No auto support" msgstr "无自动支撑" @@ -616,14 +618,16 @@ msgstr "移动" msgid "Please select at least one object." msgstr "请至少选中一个对象。" +# AI Translated msgid "Gizmo-Move" -msgstr "Gizmo-移动" +msgstr "移动" msgid "Rotate" msgstr "旋转" +# AI Translated msgid "Gizmo-Rotate" -msgstr "Gizmo-旋转" +msgstr "旋转" msgid "Optimize orientation" msgstr "优化朝向" @@ -632,8 +636,9 @@ msgctxt "Verb" msgid "Scale" msgstr "缩放" +# AI Translated msgid "Gizmo-Scale" -msgstr "缩放工具" +msgstr "缩放" msgid "Error: Please close all toolbar menus first" msgstr "错误:请先关闭所有工具栏菜单" @@ -828,24 +833,27 @@ msgstr "间隙" msgid "Spacing" msgstr "间距" +# AI Translated msgid "" "Click to flip the cut plane\n" "Drag to move the cut plane" msgstr "" -"单击以翻转剖切面\n" -"拖动以移动剖切面" +"单击以翻转切割平面\n" +"拖动以移动切割平面" +# AI Translated msgid "" "Click to flip the cut plane\n" "Drag to move the cut plane\n" "Right-click a part to assign it to the other side" msgstr "" -"单击以翻转剖切面\n" -"拖动以移动剖切面\n" -"在零件上单击鼠标右键以将其指定给另一侧" +"单击以翻转切割平面\n" +"拖动以移动切割平面\n" +"右键单击零件可将其分配到另一侧" +# AI Translated msgid "Move cut plane" -msgstr "移动剖切面" +msgstr "移动切割平面" msgid "Mode" msgstr "模式" @@ -862,8 +870,9 @@ msgstr "拖拽" msgid "Move cut line" msgstr "移动切割线" +# AI Translated msgid "Draw cut line" -msgstr "绘制切线" +msgstr "绘制切割线" msgid "Add connector" msgstr "添加连接件" @@ -888,8 +897,9 @@ msgctxt "Cut tool" msgid "Cut" msgstr "切割" +# AI Translated msgid "Rotate cut plane" -msgstr "旋转剖切面" +msgstr "旋转切割平面" msgid "Remove connectors" msgstr "删除所有连接件" @@ -909,8 +919,9 @@ msgstr "与半径相关的间隔比例" msgid "Confirm connectors" msgstr "确认" +# AI Translated msgid "Flip cut plane" -msgstr "翻转剖切面" +msgstr "翻转切割平面" msgid "Groove change" msgstr "槽变化" @@ -975,11 +986,13 @@ msgstr "存在连接件相互重叠" msgid "Select at least one object to keep after cutting." msgstr "切割后至少选择一个要保留的对象。" +# AI Translated msgid "Cut plane is placed out of object" -msgstr "剖切面放置在对象之外" +msgstr "切割平面位于对象之外" +# AI Translated msgid "Cut plane with groove is invalid" -msgstr "槽所在的切割平面无效" +msgstr "带槽的切割平面无效" msgid "Connector" msgstr "连接件" @@ -1389,20 +1402,23 @@ msgstr "撤销粗细调整" msgid "Tiny / Wide glyphs" msgstr "细小/粗大的字形" +# AI Translated msgid "Undo letter's skew" -msgstr "撤消字母的斜体效果" +msgstr "撤销字母的斜体效果" msgid "Italic strength ratio" msgstr "倾斜强度比" +# AI Translated msgid "Undo translation" -msgstr "撤消翻译" +msgstr "撤销平移" msgid "Distance of the center of the text to the model surface." msgstr "文字中心到模型曲面的距离。" +# AI Translated msgid "Undo rotation" -msgstr "撤消旋转" +msgstr "撤销旋转" msgid "Rotate text Clockwise." msgstr "顺时针旋转文本。" @@ -1416,11 +1432,13 @@ msgstr "沿对象曲面移动文本时,锁定文本的旋转。" msgid "Select from True Type Collection." msgstr "从True Type集合中选择。" +# AI Translated msgid "Set text to face camera" -msgstr "文字面向摄像头" +msgstr "文字朝向相机" +# AI Translated msgid "Orient the text towards the camera." -msgstr "选择文字使其面向摄像头" +msgstr "使文字朝向相机。" #, boost-format msgid "Font \"%1%\" can't be used. Please select another." @@ -1584,8 +1602,9 @@ msgstr "浮雕形状中缺少 SVG 文件" msgid "Missing data of svg file" msgstr "缺少 SVG 文件数据" +# AI Translated msgid "Face the camera" -msgstr "面向摄像机" +msgstr "朝向相机" #. TRN - Preview of filename after clear local filepath. msgid "Unknown filename" @@ -2065,14 +2084,16 @@ msgstr "" msgid "WebView2 Runtime" msgstr "WebView2 运行库" +# AI Translated +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" "无法安装 Microsoft WebView2 运行库。\n" -"在安装之前,包括设置向导在内的部分功能可能显示为空白。\n" -"请从 https://developer.microsoft.com/microsoft-edge/webview2/ 手动安装,然后重启 Orca Slicer。" +"安装完成前,设置向导等部分功能可能显示为空白。\n" +"请从 %1% 手动安装,然后重启 Orca Slicer。" #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -2586,14 +2607,16 @@ msgstr "立方体" msgid "Cylinder" msgstr "圆柱体" +# AI Translated msgid "Cone" -msgstr "锥体" +msgstr "圆锥体" msgid "Disc" msgstr "圆盘" +# AI Translated msgid "Torus" -msgstr "环面" +msgstr "圆环体" msgid "Orca Cube" msgstr "Orca方块" @@ -3028,18 +3051,20 @@ msgid "%1$d error repaired" msgid_plural "%1$d errors repaired" msgstr[0] "%1$d个错误已修复" +# AI Translated #, c-format, boost-format msgid "Error: %1$d non-manifold edge." msgid_plural "Error: %1$d non-manifold edges." -msgstr[0] "错误: %1$d 存在非流形边." +msgstr[0] "错误:%1$d 条非流形边。" msgid "Remaining errors" msgstr "剩余错误" +# AI Translated #, c-format, boost-format msgid "%1$d non-manifold edge" msgid_plural "%1$d non-manifold edges" -msgstr[0] "%1$d 存在非流形边" +msgstr[0] "%1$d 条非流形边" msgid "Click the icon to repair model object" msgstr "点击图标修复模型对象" @@ -4140,6 +4165,9 @@ msgstr "转到盘" msgid "AMS Materials Setting" msgstr "AMS 材料设置" +msgid "Wiki Guide" +msgstr "维基指南" + msgid "Close" msgstr "关闭" @@ -4161,9 +4189,6 @@ msgstr "输入的范围应当在 %1% 和 %2% 之间" msgid "Factors of Flow Dynamics Calibration" msgstr "动态流量校准系数" -msgid "Wiki Guide" -msgstr "维基指南" - msgid "PA Profile" msgstr "PA 配置文件" @@ -4249,9 +4274,10 @@ msgstr "校准完成。如下图中的示例,请在您的热床上找到最均 msgid "Save" msgstr "保存" +# AI Translated msgctxt "Navigation" msgid "Back" -msgstr "背面" +msgstr "返回" msgid "Example" msgstr "示例" @@ -4748,6 +4774,14 @@ msgstr "是否自动调整到限制值(%g mm)?" msgid "Adjust" msgstr "调整" +# AI Translated +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" +"传送带打印机不支持筏层和风挡。\n" +"已自动禁用。" + # AI Translated msgid "" "Layer height too small\n" @@ -5585,9 +5619,6 @@ msgstr "根据最佳耗材丝分组自动重新切片,切片后显示分组结 msgid "Filament Grouping" msgstr "耗材丝分组" -msgid "Why this grouping" -msgstr "为什么这样分组" - msgid "Please place filaments on the printer based on grouping result." msgstr "请根据分组结果将耗材放置在打印机上。" @@ -5776,6 +5807,54 @@ msgstr "增加/减小编辑区域" msgid "Sequence" msgstr "顺序" +# AI Translated +msgid "Plate center of mass" +msgstr "整盘质心" + +# AI Translated +msgid "Part center of mass" +msgstr "零件质心" + +# AI Translated +msgid "Support center of mass" +msgstr "支撑质心" + +# AI Translated +msgid "Assembly center of mass" +msgstr "装配体质心" + +# AI Translated +msgid "Object center of mass" +msgstr "对象质心" + +# AI Translated +msgid "Finished print" +msgstr "完整打印件" + +# AI Translated +#, boost-format +msgid "Printed up to layer %1%" +msgstr "已打印至第 %1% 层" + +# AI Translated +msgid "Weight" +msgstr "重量" + +msgid "Volume" +msgstr "体积" + +# AI Translated +msgid "Center in bounding box" +msgstr "在边界框中的位置" + +# AI Translated +msgid "Bounding box size" +msgstr "边界框尺寸" + +# AI Translated +msgid "Moment of inertia" +msgstr "转动惯量" + msgid "Object selection" msgstr "对象选择" @@ -5813,8 +5892,9 @@ msgstr "右喷嘴:X:%1%-%2%,Y:%3%-%4%,Z:%5%-%6%" msgid "Tool move" msgstr "工具 移动" +# AI Translated msgid "Tool Rotate" -msgstr "工具 旋转" +msgstr "旋转" msgid "Move object" msgstr "移动对象" @@ -5866,31 +5946,34 @@ msgstr "X" # AI Translated msgctxt "Camera View" msgid "Front" -msgstr "前面" +msgstr "前视" +# AI Translated msgctxt "Camera View" msgid "Back" -msgstr "背面" +msgstr "后视" # AI Translated #. TRN To be shown in the main menu View->Top msgctxt "Camera View" msgid "Top" -msgstr "顶部" +msgstr "俯视" # AI Translated #. TRN To be shown in the main menu View->Bottom msgctxt "Camera View" msgid "Bottom" -msgstr "底部" +msgstr "仰视" +# AI Translated msgctxt "Camera View" msgid "Left" -msgstr "左" +msgstr "左视" +# AI Translated msgctxt "Camera View" msgid "Right" -msgstr "右" +msgstr "右视" msgid "Add plate" msgstr "添加新盘" @@ -5952,8 +6035,9 @@ msgstr "画布工具栏" msgid "Section view" msgstr "剖面视图" +# AI Translated msgid "Fit camera to scene or selected object." -msgstr "让相机适合场景或选定的对象。" +msgstr "缩放视图以完整显示场景或所选对象。" msgid "3D Navigator" msgstr "3D 导航器" @@ -5991,6 +6075,14 @@ msgstr "网格线" msgid "Labels" msgstr "标签" +# AI Translated +msgid "Center of mass" +msgstr "质心" + +# AI Translated +msgid "Show raw G-code (belt only)" +msgstr "显示原始 G-code(仅限传送带打印机)" + # AI Translated msgid "Move section plane" msgstr "移动剖切面" @@ -6039,7 +6131,7 @@ msgstr "体积:" msgid "Size:" msgstr "尺寸:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "发现G-code路径在层%d,高度为%.2lf mm处有冲突。请将有冲突的对象分离得更远(%s <-> %s)。" @@ -6304,11 +6396,13 @@ msgstr "下载模型" msgid "Default View" msgstr "默认视图" +# AI Translated msgid "Top View" -msgstr "顶部视图" +msgstr "俯视图" +# AI Translated msgid "Bottom View" -msgstr "底部视图" +msgstr "仰视图" msgid "Front View" msgstr "前视图" @@ -6316,7 +6410,7 @@ msgstr "前视图" # AI Translated msgctxt "Camera View" msgid "Rear" -msgstr "背面" +msgstr "后视" msgid "Rear View" msgstr "后视图" @@ -6488,8 +6582,9 @@ msgstr "使用正交视角" msgid "Auto Perspective" msgstr "自动透视" +# AI Translated msgid "Automatically switch between orthographic and perspective when changing from top/bottom/side views." -msgstr "当从顶部/底部/侧视图更改时,自动在正交和透视之间切换。" +msgstr "从俯视图、仰视图或侧视图切换时,自动在正交和透视之间切换。" msgid "Show &G-code Window" msgstr "显示G-code窗口" @@ -6509,6 +6604,14 @@ msgstr "显示网格线" msgid "Show Gridlines on plate" msgstr "在盘上显示网格线" +# AI Translated +msgid "Show IDEX/IQEX Toolhead" +msgstr "显示 IDEX/IQEX 工具头" + +# AI Translated +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "在 G-code 预览中显示每个使用中喷嘴周围的 IDEX/IQEX 工具头示意模型。" + msgid "Reset Window Layout" msgstr "重置窗口布局" @@ -6995,8 +7098,9 @@ msgstr "死区:" msgid "Options:" msgstr "选项:" +# AI Translated msgid "Zoom" -msgstr "视角缩放" +msgstr "缩放" msgid "Translation/Zoom" msgstr "平移/缩放" @@ -7579,35 +7683,35 @@ msgstr "VFA 校准" # AI Translated msgid "View: Top" -msgstr "视图:顶部" +msgstr "视图:俯视图" # AI Translated msgid "View: Bottom" -msgstr "视图:底部" +msgstr "视图:仰视图" # AI Translated msgid "View: Front" -msgstr "视图:前面" +msgstr "视图:前视图" # AI Translated msgid "View: Rear" -msgstr "视图:背面" +msgstr "视图:后视图" # AI Translated msgid "View: Left" -msgstr "视图:左" +msgstr "视图:左视图" # AI Translated msgid "View: Right" -msgstr "视图:右" +msgstr "视图:右视图" # AI Translated msgid "View: Isometric" -msgstr "视图:等距" +msgstr "视图:等轴测视图" # AI Translated msgid "View: Default" -msgstr "视图:默认" +msgstr "视图:默认视图" # AI Translated msgid "Fit Bed to View" @@ -7926,14 +8030,18 @@ msgstr "请升级您的显卡驱动。" msgid "Unsupported OpenGL version" msgstr "不支持的OpenGL版本" +# AI Translated #, c-format, boost-format msgid "" "Unable to load shaders:\n" "%s" -msgstr "无法加载Shader: %s" +msgstr "" +"无法加载着色器:\n" +"%s" +# AI Translated msgid "Error loading shaders" -msgstr "加载shader程序时发生错误" +msgstr "加载着色器时出错" msgctxt "Layers" msgid "Top" @@ -8155,6 +8263,77 @@ msgstr "查看所有对象的配置" msgid "Material settings" msgstr "材料设置" +# AI Translated +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "每个模式都规定了哪些工具头参与以及各自的角色。单击工具头按钮可循环切换角色;将鼠标悬停在下方颜色上可查看各角色的作用。" + +# AI Translated +msgid "Add Mode" +msgstr "添加模式" + +# AI Translated +msgid "Tools" +msgstr "工具" + +msgid "G-code" +msgstr "G-code" + +# AI Translated +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "该模式在盘的 IDEX/IQEX 模式选择器中显示的名称。必填,未命名的模式无法选择。" + +# AI Translated +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "参与该模式的工具头及其各自的角色。单击方块可循环切换角色。" + +# AI Translated +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "打印开始时运行的 G-code,用于将打印机切换到此模式(例如调用 Klipper 的 SET_PRINT_MODE)。切片软件只生成主工具头的路径,其余工具头由固件控制。" + +# AI Translated +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "打印全部切片路径。始终为工具头 0,可通过上方的“工具头 0 位置”选择它位于热床的哪个角。它无法从网格中移除。" + +# AI Translated +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "由固件控制跟随主工具头,在自己的区域内偏移打印相同的路径。" + +# AI Translated +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "由固件控制跟随主工具头,沿两个区域之间的分界线镜像打印相同的路径。" + +# AI Translated +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "把主工具头所在龙门上的一个工具头标记为它的多色搭档。在龙门配对模式下多色打印时必须设置此项。" + +# AI Translated +msgid "Primary" +msgstr "主模式" + +# AI Translated +msgid "Mode name (required)" +msgstr "模式名称(必填)" + +# AI Translated +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "此并行模式在盘的 IDEX/IQEX 模式选择器中显示的名称。项目按名称记录所用的模式,因此重命名已被盘使用的模式后,这些盘会回退到主模式。不能为空,留空时会自动生成名称。" + +# AI Translated +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "使用此模式的打印开始时输出一次的 G-code,位于打印机起始G-code 之前。打印机在此切换到对应的固件模式(例如调用 Klipper 的 SET_PRINT_MODE 或 RepRapFirmware 的 M567),因为切片软件只生成主工具头的路径,复制(Copy)/镜像(Mirror)工具头由固件控制。支持占位符,可通过编辑按钮浏览。如果该模式无需固件设置,请留空。" + +# AI Translated +msgid "Edit G-code / browse placeholders" +msgstr "编辑 G-code / 浏览占位符" + +# AI Translated +msgid "Remove mode" +msgstr "删除此模式" + +# AI Translated +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "放弃对此模式所做的未保存修改(恢复为已保存的值)" + msgid "Remove current plate (if not last one)" msgstr "移除当前盘(如果不是最后一个)" @@ -8179,6 +8358,20 @@ msgstr "编辑当前盘名" msgid "Move plate to the front" msgstr "将当前盘移到最前面" +# AI Translated +#, boost-format +msgid " (process preset: %1%)" +msgstr " (工艺预设:%1%)" + +# AI Translated +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "IDEX/IQEX 模式:%1%(左键单击循环切换,右键单击打开菜单)" + +# AI Translated +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "警告:此盘包含多材料对象,同时使用了 IDEX/IQEX 并行模式。请谨慎操作,并确认您的 G-code 能正确处理这种组合。" + msgid "Customize current plate" msgstr "自定义当前盘" @@ -8245,12 +8438,6 @@ msgstr "AMS(1 槽)" msgid "Not installed" msgstr "未安装" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "该软件不支持在一次打印中使用不同直径的喷嘴。如果左右喷嘴不一致,就只能进行单头打印。请确认您想在该项目中使用哪种喷嘴。" - -msgid "Switch diameter" -msgstr "开关直径" - msgid "Configuration incompatible" msgstr "配置不兼容" @@ -8332,6 +8519,10 @@ msgstr "混合耗材丝" msgid "Remove last mixed filament" msgstr "移除最后一个混合耗材丝" +# AI Translated +msgid "Remove all mixed filaments" +msgstr "移除所有混合耗材丝" + # AI Translated msgid "Add mixed filament" msgstr "添加混合耗材丝" @@ -8354,6 +8545,11 @@ msgstr "混合耗材丝的组分引用已失效" msgid "Edit / Delete / Merge" msgstr "编辑 / 删除 / 合并" +# AI Translated +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "是否移除全部 %1% 个混合耗材丝?" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "目标混合耗材丝将此物理耗材丝用作组分。合并将移除此物理耗材丝,并可能使该混合耗材丝失效。是否继续?" @@ -8428,9 +8624,6 @@ msgstr "加载文件:%s" msgid "Load 3MF" msgstr "加载 3MF" -msgid "BambuStudio Project" -msgstr "BambuStudio 项目" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "该 3MF 不受 OrcaSlicer 支持,仅加载几何数据。" @@ -8460,17 +8653,6 @@ msgstr "建议升级您的软件版本。\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "该 3MF 文件版本 %s 比 %s 的版本 %s 新,建议升级您的软件。" -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "该 3MF 由 BambuStudio(版本 %s)创建,其版本高于兼容版本 %s。发现无法识别的设置:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "该 3MF 由 BambuStudio(版本 %s)创建,其版本高于兼容版本 %s。部分设置可能无法完全兼容。" - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "该 3MF 由 BambuStudio 创建。部分设置可能与 OrcaSlicer 不同。" - msgid "Invalid values found in the 3MF:" msgstr "在3mf文件中发现无效值:" @@ -8638,6 +8820,14 @@ msgstr "禁用自动落板以保留 Z 轴定位?\n" msgid "Object with floating parts was detected" msgstr "检测到含有悬空零件的对象" +# AI Translated +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "无法切片:有对象与 IDEX/IQEX 并行打印的预留区域(副区域或主区域内的滑车避让带)重叠。" + +# AI Translated +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "无法切片:擦拭塔与 IDEX/IQEX 并行打印的预留区域(副区域或主区域内的滑车避让带)重叠。" + msgid "Another export job is running." msgstr "有其他导出任务正在进行中。" @@ -8720,6 +8910,50 @@ msgstr "无效数据" msgid "Slicing Canceled" msgstr "切片已取消" +# AI Translated +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "热床温度冲突:T%d(%s)将热床设为 %d°C,而 T%d(%s)需要 %d°C。热床温度由主工具头决定,副工具头只能沿用该温度。" + +# AI Translated +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "耗材丝类型不匹配:T%d 使用 %s,而 T%d 使用 %s。这些材料的打印条件互不兼容,不宜一起打印。" + +# AI Translated +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" +"盘 %d 启用了 IDEX/IQEX 并行模式,存在以下问题:\n" +"\n" + +# AI Translated +msgid "Continue slicing?" +msgstr "是否继续切片?" + +# AI Translated +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "IDEX/IQEX 并行模式警告" + +# AI Translated +msgid "Don't show these warnings again" +msgstr "不再显示这些警告" + +# AI Translated +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "盘 %d:\n" + +# AI Translated +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" +"检测到以下 IDEX/IQEX 并行模式问题:\n" +"\n" + msgid "Network plug-in switched successfully." msgstr "网络插件切换成功。" @@ -8752,8 +8986,8 @@ msgid "Sync now" msgstr "立即同步" # AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "操作正在进行时无法撤销或重做。请先停止该操作。" +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "有操作正在进行,无法撤销或重做。请停止该操作,或等其完成后再试。" # AI Translated msgid "" @@ -8825,6 +9059,14 @@ msgstr "下载失败,文件大小异常。" msgid "Project downloaded %d%%" msgstr "项目已下载%d%%" +# AI Translated +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" +"传送带打印机暂不支持“划线模式”和“V形模式”PA 测试。\n" +"请改用“PA塔”方法。" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advance 测试" @@ -8851,6 +9093,15 @@ msgstr "Orca YOLO 流量校准" msgid "Flowrate Test - Pass%d" msgstr "流量测试 - 第 %d 轮" +# AI Translated +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "没有适用于 %1% 至 %2% °C 的传送带温度塔。请使用温度塔模型支持的温度范围,例如 230 至 190。" + +# AI Translated +msgid "Temperature tower" +msgstr "温度塔" + # AI Translated msgid "Nozzle temperature test" msgstr "喷嘴温度测试" @@ -9151,23 +9402,29 @@ msgstr "目前,对象配置表单不能与多挤出机打印机一起使用。 msgid "Not available" msgstr "无法使用" +# AI Translated msgid "isometric" -msgstr "等距" +msgstr "等轴测" +# AI Translated msgid "top_front" -msgstr "顶面" +msgstr "前上方" +# AI Translated msgid "top" -msgstr "顶部" +msgstr "俯视" +# AI Translated msgid "bottom" -msgstr "底部" +msgstr "仰视" +# AI Translated msgid "front" -msgstr "正面" +msgstr "前视" +# AI Translated msgid "rear" -msgstr "后部" +msgstr "后视" msgid "Switching languages requires the application to restart.\n" msgstr "切换语言需要重启应用程序。\n" @@ -9567,26 +9824,31 @@ msgstr "触控板" msgid "Camera style" msgstr "视角控制模式" +# AI Translated msgid "" "Select camera navigation style.\n" "Default: LMB+move for rotation, RMB/MMB+move for panning.\n" "Touchpad: Alt+move for rotation, Shift+move for panning." msgstr "" -"触摸板:Alt+移动进行旋转,Shift+移动进行平移选择摄像机的导航模式。\n" -"默认:鼠标左键+拖动 旋转,鼠标右键+拖动 平移;\n" -"触控板:Alt+拖动 旋转,Shift+拖动 平移。" +"选择视角控制模式。\n" +"默认:鼠标左键拖动旋转,鼠标右键/中键拖动平移。\n" +"触控板:Alt+移动旋转,Shift+移动平移。" +# AI Translated msgid "Orbit speed multiplier" -msgstr "轨道速度倍数" +msgstr "环绕速度倍率" +# AI Translated msgid "Multiplies the orbit speed for finer or coarser camera movement." -msgstr "乘以轨道速度以获得更精细或更粗略的相机移动" +msgstr "调整相机环绕的速度倍率,数值越小转动越精细,越大转动越快。" +# AI Translated msgid "Zoom to mouse position" -msgstr "放大到鼠标位置" +msgstr "以鼠标位置为中心缩放" +# AI Translated msgid "Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center." -msgstr "在3D视角放大到鼠标位置,而不是2D窗口的中心。" +msgstr "在 3D 视图中以鼠标指针位置为中心缩放,而不是以窗口中心缩放。" msgid "Use free camera" msgstr "使用自由视角" @@ -11256,6 +11518,10 @@ msgstr "不支持同步不同的挤出机传动方式或喷嘴内腔体积类型 msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "将参数的修改同步到另一个挤出机的相应参数。" +# AI Translated +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "带有此图标的参数可以按喷嘴分别设置。" + msgid "Click to reset all settings to the last saved preset." msgstr "点击以将所有设置还原到最后一次保存的版本。" @@ -11665,6 +11931,14 @@ msgstr "可打印区域" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "为打印机通信选择网络代理。可用的代理将在启动时列出。" +# AI Translated +msgid "Belt printer" +msgstr "传送带打印机" + +# AI Translated +msgid "Machine frame transforms" +msgstr "机器坐标系变换" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -11778,9 +12052,29 @@ msgstr "喷嘴直径" msgid "Wipe tower" msgstr "擦拭塔" +# AI Translated +msgid "Belt purge tower" +msgstr "传送带冲刷塔" + msgid "Single extruder multi-material parameters" msgstr "单挤出机多材料参数" +# AI Translated +msgid "IDEX/IQEX Configuration" +msgstr "IDEX/IQEX 配置" + +# AI Translated +msgid "Pre-slice warnings" +msgstr "切片前警告" + +# AI Translated +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "检测到 IDEX/IQEX 并行模式问题(热床温度冲突、耗材丝类型不匹配、多材料冲突)时,在切片前显示警告对话框。可在对话框中选择不再显示;若误关,可在此处重新启用。" + +# AI Translated +msgid "Modes" +msgstr "模式" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "这是一台单挤出机多材料打印机,所有挤出机的直径都将被设置为新值。您想继续吗?" @@ -11790,6 +12084,22 @@ msgstr "层高限制" msgid "Z-Hop" msgstr "Z轴抬升" +# AI Translated +msgid "Front-left" +msgstr "左前" + +# AI Translated +msgid "Front-right" +msgstr "右前" + +# AI Translated +msgid "Rear-left" +msgstr "左后" + +# AI Translated +msgid "Rear-right" +msgstr "右后" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -11893,10 +12203,9 @@ msgstr "继续" msgid "Don't warn again for this preset" msgstr "不再为此预设警告" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s: %s" +msgid "%s %s" +msgstr "%s %s" # AI Translated msgid "No modifications need to be copied." @@ -12324,9 +12633,6 @@ msgstr "ms" msgid "Total ramming" msgstr "总冲刷量" -msgid "Volume" -msgstr "体积" - msgid "Ramming line" msgstr "预冲刷线" @@ -12375,6 +12681,133 @@ msgstr "登录失败。请重试。" msgid "parse json failed" msgstr "解析 json 失败" +msgid "Loading…" +msgstr "正在加载……" + +msgid "Welcome to Orca Slicer" +msgstr "欢迎使用 Orca Slicer" + +# AI Translated +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer 将通过几个步骤完成设置。让我们开始吧!" + +msgid "Get Started" +msgstr "开始" + +msgid "Please select your login region" +msgstr "请选择登录区域" + +msgid "Finish" +msgstr "完成" + +msgid "Printer Selection" +msgstr "选择打印机" + +# AI Translated +msgid "Vendors" +msgstr "供应商" + +# AI Translated +msgid "Custom Printer" +msgstr "自定义打印机" + +msgid "Create" +msgstr "创建" + +# AI Translated +msgid "Check for new printers" +msgstr "检查新打印机" + +msgid "At least one printer must be selected." +msgstr "至少需要选择一款打印机。" + +# AI Translated +msgid "New printers found" +msgstr "发现新打印机" + +# AI Translated +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "已安装新的打印机供应商:%s" + +# AI Translated +msgid "New printer vendors were found, but installation was cancelled." +msgstr "发现了新的打印机供应商,但安装已取消。" + +# AI Translated +msgid "No new printers found." +msgstr "未发现新打印机。" + +msgid "Filament Selection" +msgstr "选择耗材丝" + +msgid "System Filaments" +msgstr "系统耗材丝" + +msgid "Custom Filaments" +msgstr "自建耗材丝" + +msgid "Create New" +msgstr "新建" + +msgid "Filament type" +msgstr "耗材类型" + +msgid "Vendor" +msgstr "供应商" + +# AI Translated +msgid "No items" +msgstr "无项目" + +# AI Translated +msgid "Filter items" +msgstr "筛选项目" + +# AI Translated +msgid "Checked" +msgstr "已勾选" + +# AI Translated +msgid "Unchecked" +msgstr "未勾选" + +# AI Translated +msgid "Select filtered" +msgstr "选择筛选项" + +msgid "Clear all" +msgstr "清空" + +msgid "At least one filament must be selected." +msgstr "至少要选择一款耗材丝。" + +msgid "Do you want to use the default filament?" +msgstr "你希望使用默认的耗材丝列表吗?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "这将禁用所有云功能,包括 Orca Cloud 配置文件同步。希望完全离线工作的用户可以启用此选项。" + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "注意:启用局域网模式后,您的用户配置文件将不会备份到 Orca Cloud。" + +# AI Translated +msgid "Enable Stealth Mode." +msgstr "启用局域网模式。" + +# AI Translated +msgid "Proprietary Plugins" +msgstr "专有插件" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "一些打印机供应商需要安装他们的专有插件才能与打印机通信。如果您使用这类打印机,请选择相应的插件。" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "注意:这些插件不是由 OrcaSlicer 开发或维护的。使用它们需自担风险。" + +msgid "Install Bambu Network plug-in" +msgstr "安装 Bambu 网络插件" + msgid "[Action Required] " msgstr "[需要操作] " @@ -12395,11 +12828,13 @@ msgstr "参数配置包在之前的配置向导中发生了变更" msgid "Configuration package changed" msgstr "参数配置包发生变更" +# AI Translated msgid "Pan View" -msgstr "移动视角" +msgstr "平移视图" +# AI Translated msgid "Rotate View" -msgstr "旋转视角" +msgstr "旋转视图" # AI Translated #, c-format, boost-format @@ -12466,8 +12901,9 @@ msgstr "鼠标中键" msgid "Right mouse" msgstr "鼠标右键" +# AI Translated msgid "Zoom View" -msgstr "缩放视角" +msgstr "缩放视图" # AI Translated msgid "Painting" @@ -12834,6 +13270,16 @@ msgstr "耗材挤出类型更换 G-code" msgid "No object can be printed. It may be too small." msgstr "没有可打印的对象。可能是因为尺寸过小。" +# AI Translated +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "所选打印机上的 IDEX/IQEX 模式“%1%”没有分配工具头,将改用主模式打印。请在打印机设置中为该模式分配工具头,或通过盘上的 IDEX/IQEX 按钮选择其他模式。" + +# AI Translated +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "此盘设置为 IDEX/IQEX 模式“%1%”,但所选打印机未定义该模式,将改用主模式打印。请通过盘上的 IDEX/IQEX 按钮选择模式,或在打印机设置中恢复该模式。" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "你的指纹非常接近启动区域。确保没有碰撞。" @@ -13006,6 +13452,33 @@ msgstr "验证失败" msgid "write callback failed" msgstr "写入回调失败" +# AI Translated +# Needs human review: MMU/AFC manifold → 合流器: confirm the term Chinese users use for a multi-input filament merger (合料器?). +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "IDEX/IQEX 并行模式下进行多色打印时,每种耗材丝都必须有专用的物理挤出机。当前有两种或以上使用中的耗材丝经由打印机的物理挤出机映射(MMU/AFC 合流器)送入同一个物理工具头,从动龙门无法跟随这种切换。" + +# AI Translated +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "当前 IDEX/IQEX 模式没有定义主工具头,因此无法安排多色打印。请打开打印机设置中的 IDEX/IQEX 模式编辑器,为某个工具头分配主工具头(Primary)角色。" + +# AI Translated +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "此模式下的多色打印不属于并行打印:所有使用中的工具头都在同一个龙门上,没有第二个龙门可供复制或镜像。若要在单个龙门上多色打印,请将此盘切换为主模式;或定义一个包含第二个龙门上工具头的 IDEX/IQEX 模式。" + +# AI Translated +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "IDEX/IQEX 并行模式下进行多色打印时,主工具头所在的龙门上必须有一个 Span 工具头,否则该模式没有指定同一龙门内的多色搭档。请改为只使用一种耗材丝,或切换到主模式,或打开打印机设置中的 IDEX/IQEX 模式编辑器,将主工具头所在龙门上的一个工具头标记为 Span。" + +# AI Translated +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "在此 Span 模式下,只有 %1% 参与多色打印,但耗材丝 %2% 未分配给任何工具头。请使用分配给 %1% 的耗材丝,或将此盘切换为主模式。" + +# AI Translated +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "在此 Span 模式下,只有 %1% 参与多色打印,但耗材丝 %2% 分配给了 T%3%。请使用分配给 %1% 的耗材丝,或将此盘切换为主模式。" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1%离屏蔽区域太近,可能会发生碰撞。" @@ -13056,6 +13529,55 @@ msgstr "如果您仍要打印,可以在 偏好设置 / 控制 / 切片 / 移 msgid "No extrusions under current settings." msgstr "根据当前设置,不会生成任何打印。" +# AI Translated +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "IDEX/IQEX 并行模式不支持混合耗材丝。请将此盘切换为主模式。" + +# AI Translated +msgid "no configured tool" +msgstr "未配置的工具头" + +# AI Translated +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "IDEX/IQEX 模式“%1%”使用 T%2% 打印,但此盘的耗材丝在 %3% 上。请改用装在 T%2% 上的耗材丝,或将此盘切换为主模式。" + +# AI Translated +msgid "Raft is not compatible with belt printer mode." +msgstr "筏层与传送带打印机模式不兼容。" + +# AI Translated +msgid "Draft shield is not compatible with belt printer mode." +msgstr "风挡与传送带打印机模式不兼容。" + +# AI Translated +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "在传送带打印机上,Brim 与旋转花瓶模式不兼容。请禁用其中之一。" + +# AI Translated +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "传送带倾角过大,不适合使用 Brim,将不会生成 Brim。" + +# AI Translated +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "仅当传送带倾斜时才会生成 Brim。请设置传送带倾斜角度,或移除 Brim 设置。" + +# AI Translated +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "传送带打印机仅支持外侧和内侧 Brim。“自动”“圆盘”和“绘制”类型的 Brim 将按“仅外侧”打印,宽度取“Brim宽度”。" + +# AI Translated +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "“Brim与模型的间隙”会让前缘 Brim 与对象的前缘分离,而前缘 Brim 正是用来固定这条边的。使用“前缘 Brim 长度”时,请将该间隙设为 0。" + +# AI Translated +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "“前缘 Brim 长度”会使 Brim 沿传送带向每个对象前方延伸,而“自动摆放”不会为此预留空间。请在对象之间留出足够的间距。" + +# AI Translated +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "“仅前缘”Brim 仅适用于传送带打印机,在此打印机上将按普通外侧 Brim 打印。" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "使用了渐变混合耗材丝,但“混色子层”已关闭。渐变将不会被打印。" @@ -13066,6 +13588,18 @@ msgstr "平滑模式的延时摄影不支持在逐件打印模式下使用。" msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "启用“按对象”序列时,不支持结块检测。" +# AI Translated +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "“逐件”打印顺序下不会生成传送带冲刷塔,换料时将不会冲刷。" + +# AI Translated +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "已启用传送带冲刷塔,但项目中没有冲刷塔对象,换料时将不会冲刷。请在应用程序中打开该项目以生成冲刷塔。" + +# AI Translated +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "项目中包含多个自动管理的传送带冲刷塔。请重新加载此盘,或将传送带冲刷塔关闭后再开启,以重新生成。" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "同时启用精确Z高度和擦拭塔可能会导致切片错误。" @@ -13082,10 +13616,6 @@ msgstr "不支持在包含多个材料的打印中使用旋转花瓶模式。" msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "虽然对象 %1% 本身适合构建体积,但由于材料收缩补偿,它超出了最大构建体积高度。" -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "对象 %1% 超过了最大构建体积高度" - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "对象 %1% 自身虽然构建体积合适,但最后一层却超过了最大构建体积高度" @@ -13093,6 +13623,10 @@ msgstr "对象 %1% 自身虽然构建体积合适,但最后一层却超过了 msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "或许您想要缩小模型的尺寸,或者更改当前打印设置,然后重试" +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "对象 %1% 超过了最大构建体积高度" + msgid "Variable layer height is not supported with Organic supports." msgstr "Organic支撑不支持可变层高。" @@ -14002,12 +14536,56 @@ msgstr "内部桥接的速度。如果该值以百分比表示,将基于桥接 msgid "This is the distance from the model to the outermost brim line." msgstr "从模型到最外圈brim走线的距离" +# AI Translated +msgid "Leading brim length" +msgstr "前缘 Brim 长度" + +# AI Translated +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" +"仅适用于传送带打印机。将 Brim 沿传送带向对象前方延伸,覆盖其接触区域中每一条朝下坡方向的边,包括对象首次接触传送带的位置,以及之后才落到传送带上的岛屿。这条前置 Brim 带会先于对象铺在传送带上,使前缘有已经粘牢的部分可以依附。\n" +"\n" +"在传送带表面上测量,并在“Brim宽度”的基础上叠加:Brim 在对象前方延伸的距离为“Brim与模型的间隙”+“前缘 Brim 长度”+“Brim宽度”。请将“Brim与模型的间隙”设为 0,否则这条前置 Brim 带将接触不到它要固定的对象。\n" +"\n" +"在倾斜的传送带上,每层铺设一条 Brim,因此最终 Brim 片的厚度由流量而非层高决定,可通过“Brim流量比”调节。\n" +"\n" +"设置为 0 以禁用。" + +# AI Translated +msgid "Extra brim width" +msgstr "额外 Brim 宽度" + +# AI Translated +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" +"仅适用于传送带打印机。沿横跨传送带的方向将 Brim 向两侧加宽,而不会使其在对象前方或后方进一步延伸。当零件沿长度方向需要比单靠“Brim宽度”更强的附着力时使用。\n" +"\n" +"在传送带表面上测量,并在“Brim宽度”的基础上叠加:Brim 在对象两侧延伸的距离为“Brim与模型的间隙”+“Brim宽度”+“额外 Brim 宽度”。若要让 Brim 向对象前方延伸,请改用“前缘 Brim 长度”。\n" +"\n" +"设置为 0 以禁用。" + msgid "Brim type" msgstr "Brim类型" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "该参数控制在模型的外侧和/或内侧生成brim。自动是指自动分析和计算边框的宽度。" +# AI Translated +msgid "Leading edge only" +msgstr "仅前缘" + msgid "Brim-object gap" msgstr "Brim与模型的间隙" @@ -15189,9 +15767,6 @@ msgstr "耗材丝的价格。只用于统计信息。" msgid "money/kg" msgstr "金额/kg" -msgid "Vendor" -msgstr "供应商" - msgid "Vendor of filament. For show only." msgstr "打印耗材的供应商。仅用于展示。" @@ -15265,6 +15840,92 @@ msgstr "填充多线" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "如果填充图案支持,使用多线进行填充。" +# AI Translated +msgid "Adaptive density (experimental)" +msgstr "自适应密度(实验性)" + +# AI Translated +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" +"让对象内部的螺旋体和 TPMS 填充密度渐变:填充单元从对象表面向中心逐渐变大。表面处使用稀疏填充密度,中心处使用内部密度。\n" +"距离扭曲、平滑混合和阶梯壳层按到最近表面(包括顶部和底部)的距离渐变,离表面最远处使用内部密度:\n" +" - 距离扭曲:单一连续的图案,在距离随方向变化不一的地方(如板状和长条形零件)被拉伸和剪切。\n" +" - 平滑混合:相邻密度的图案相互融合,交界处会出现小环。\n" +" - 阶梯壳层:由常规图案组成的多层壳,相邻壳层中较高的密度约为较低密度的 1.5 倍,各层线条沿壳层边界相连。\n" +" - 分瓣:跟随对象的三维形状(包括顶部和底部)。每个瓣(通过较窄的颈部与其余部分相连的部分)都朝其自身中心渐变。\n" +" - 垂直于 Z、Y 或 X:跟随对象垂直于该轴的截面,因此密度沿该轴不变。" + +# AI Translated +msgid "Distance warp" +msgstr "距离扭曲" + +# AI Translated +msgid "Smooth blend" +msgstr "平滑混合" + +# AI Translated +msgid "Stepped shells" +msgstr "阶梯壳层" + +# AI Translated +msgid "Lobes" +msgstr "分瓣" + +# AI Translated +msgid "Normal Z" +msgstr "垂直于 Z" + +# AI Translated +msgid "Normal Y" +msgstr "垂直于 Y" + +# AI Translated +msgid "Normal X" +msgstr "垂直于 X" + +# AI Translated +msgid "Interior density" +msgstr "内部密度" + +# AI Translated +msgid "Density of the adaptive infill at the center of the object." +msgstr "对象中心处的自适应填充密度。" + +# AI Translated +msgid "Adaptive gradient" +msgstr "自适应渐变" + +# AI Translated +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" +"密度从对象表面到中心的变化方式。\n" +"线性:密度均匀变化。\n" +"二次:表面附近的密度接近稀疏填充密度,越靠近中心变化越快。\n" +"指数:密度在表面以下迅速变化,越靠近中心越趋于平稳。" + +# AI Translated +msgid "Linear" +msgstr "线性" + +# AI Translated +msgid "Quadratic" +msgstr "二次" + +# AI Translated +msgid "Exponential" +msgstr "指数" + msgid "Z-buckling bias optimization (experimental)" msgstr "Z 轴屈曲偏置优化(实验性)" @@ -17025,11 +17686,13 @@ msgstr "仅顶面" msgid "Bottom Only" msgstr "仅底面" +# AI Translated msgid "Top and Bottom" -msgstr "顶面和地面" +msgstr "顶面和底面" +# AI Translated msgid "Direct Drive" -msgstr "直驱(近程)" +msgstr "近程挤出机" msgid "Bowden" msgstr "远程挤出机" @@ -17479,6 +18142,131 @@ msgstr "单挤出机多材料" msgid "Use single nozzle to print multi filament." msgstr "使用单喷嘴打印多耗材" +# AI Translated +msgid "IDEX/IQEX Printer" +msgstr "IDEX/IQEX 打印机" + +# AI Translated +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "为具有多个独立滑车的打印机(IDEX、IQEX 等)启用并行打印。" + +# AI Translated +msgid "Firmware-managed zones" +msgstr "固件管理区域" + +# AI Translated +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "启用后,切片软件输出的 G-code 会以热床原点 (0,0) 为中心放置主区域的内容,由打印机固件负责把复制件/镜像件放到各个物理区域。仅当打印机固件在复制/镜像模式下会自行应用区域偏移时才启用(例如 RepRapFirmware 的 IDEX 复制模式)。主模式下无效。" + +# AI Translated +msgid "Gantry Count" +msgstr "龙门数量" + +# AI Translated +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "独立 Y 轴龙门的数量。IDEX/单导轨 IQEX 为 1,双龙门系统为 2(将热床分成多排)。" + +# AI Translated +msgid "Tools per Gantry" +msgstr "每个龙门的工具头数" + +# AI Translated +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "每个龙门上沿 X 方向独立运动的工具头数量。IDEX 类机型为 2。" + +# AI Translated +msgid "Tool 0 Position" +msgstr "工具头 0 位置" + +# AI Translated +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "工具头 T0(索引 0)在热床上的物理位置,决定工具头索引与热床区域的对应关系。单龙门配置(IDEX)只区分左右;双龙门配置(IQEX)可选择全部四个角(前 = Y 值较小 / 靠近操作者,后 = Y 值较大 / 机器后部)。" + +# AI Translated +msgid "Nozzle Clearance X" +msgstr "喷嘴避让距离 X" + +# AI Translated +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "X 方向上喷嘴到滑车碰撞侧边缘的距离(mm),用于计算每条 X 边界处防碰撞屏蔽带的宽度。" + +# AI Translated +msgid "Nozzle Clearance Y" +msgstr "喷嘴避让距离 Y" + +# AI Translated +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "Y 方向上喷嘴到滑车碰撞侧边缘的距离(mm),用于计算每条 Y 边界处防碰撞屏蔽带的宽度。" + +# AI Translated +msgid "Safety Margin" +msgstr "安全边距" + +# AI Translated +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "在主区域内每条滑车边界处显示的提示性避让带宽度(mm),不会阻止切片。放在此带内的零件仍可正常切片,它仅用于提醒您在区域边缘附近多留间隙。" + +# AI Translated +msgid "Visualization Theme" +msgstr "可视化主题" + +# AI Translated +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "IDEX/IQEX 热床区域显示的配色主题。如有需要,可选择色盲友好主题。" + +# AI Translated +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "绿色盲 / 红色盲(红绿色盲)" + +# AI Translated +msgid "Tritanopia (blue-yellow)" +msgstr "蓝色盲(蓝黄色盲)" + +# AI Translated +msgid "High Contrast" +msgstr "高对比度" + +# AI Translated +msgid "IDEX/IQEX Print Mode" +msgstr "IDEX/IQEX 打印模式" + +# AI Translated +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "当前 IDEX/IQEX 并行打印模式的名称;单滑车打印时为 \"primary\"。需在打印机预设中启用“IDEX/IQEX 打印机”(打印机 → 材料 → IDEX/IQEX 配置)。" + +# AI Translated +msgid "IDEX/IQEX head filament map" +msgstr "IDEX/IQEX 工具头耗材丝映射" + +# AI Translated +# Needs human review: "pem-inversion defaults": confirm pem is the physical extruder map and that the default is its inverse. +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "按盘单独设置物理工具头到耗材丝槽位的映射(从 1 开始编号),覆盖默认映射。留空则使用由物理挤出机映射(pem)反推的默认值。" + +# AI Translated +msgid "IDEX/IQEX Mode Names" +msgstr "IDEX/IQEX 模式名称" + +# AI Translated +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "每个用户定义的 IDEX/IQEX 并行打印模式的显示名称。" + +# AI Translated +msgid "IDEX/IQEX Mode Active Tools" +msgstr "IDEX/IQEX 模式启用的工具头" + +# AI Translated +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "每个模式中各工具头的角色分配。格式为 \"idx:P,idx:C,idx:M\",例如 \"0:P,1:C,2:M,3:M\",其中 P=主工具头(Primary),C=复制(Copy),M=镜像(Mirror)。由打印机预设中的 IDEX/IQEX 模式编辑器管理。" + +# AI Translated +msgid "IDEX/IQEX Mode G-codes" +msgstr "IDEX/IQEX 模式 G-code" + +# AI Translated +msgid "G-code or macro call to inject at print start for each mode." +msgstr "每个模式在打印开始时插入的 G-code 或宏调用。" + msgid "Manual Filament Change" msgstr "手动更换丝材" @@ -17857,6 +18645,161 @@ msgstr "阈值支撑比例" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "如果阈值角为零,将会为重叠度低于阈值的悬垂部分生成支撑。若该值越小,则可打印而无需支撑的悬垂角度就越陡。" +# AI Translated +msgid "Build plate tilt X" +msgstr "热床倾斜 X" + +# AI Translated +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "热床沿 X 轴的倾斜角度。正值使热床 +X 侧抬高,重力偏向 -X,+X 侧的悬垂增多;负值使 -X 侧抬高。设为 0 表示 X 方向不倾斜。在传送带打印机模式下,此值会自动与传送带角度同步。" + +# AI Translated +msgid "Build plate tilt Y" +msgstr "热床倾斜 Y" + +# AI Translated +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "热床沿 Y 轴的倾斜角度。正值使热床 +Y 侧抬高,重力偏向 -Y,+Y 侧的悬垂增多;负值使 -Y 侧抬高。设为 0 表示 Y 方向不倾斜。" + +# AI Translated +msgid "Enable belt printing" +msgstr "启用传送带打印" + +# AI Translated +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "启用传送带打印机模式。传送带打印机以倾斜一定角度(通常为 45 度)的传送带作为打印表面。切片软件会旋转切片平面,并针对倾斜的打印表面变换 G-code 坐标。" + +# AI Translated +msgid "Infinite Y axis" +msgstr "无限 Y 轴" + +# AI Translated +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "为传送带打印机启用无限 Y 轴。启用后,Y 轴方向的打印尺寸限制实际上被取消,可沿传送带方向打印任意长度的对象。" + +# AI Translated +msgid "Belt tilt axis" +msgstr "传送带倾斜轴" + +# AI Translated +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "切片前模型网格的旋转轴。这一旋转即传送带打印机的倾斜:它是保距(无畸变)旋转,同时用于热床渲染和支撑的重力倾斜;生成 G-code 时,逆变换会先还原这一旋转,再进行机器坐标系剪切/缩放和重映射。X 是典型的龙门倾斜轴(传送带沿 Y 方向移动)。" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +# AI Translated +msgid "Belt tilt angle" +msgstr "传送带倾斜角度" + +# AI Translated +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "传送带表面的倾斜角度,单位为度。大多数传送带打印机为 45°。从倾斜轴正端朝原点看,正值为逆时针旋转;其绝对值同时也是热床渲染和支撑重力所用的实际传送带倾角。" + +msgid "°" +msgstr "°" + +# AI Translated +msgid "Decouple machine-frame tilt" +msgstr "解耦机器坐标系倾角" + +# AI Translated +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "专家选项:单独设置机器坐标系(G-code 剪切/缩放)的倾斜角度,与切片前的旋转角度互不影响。禁用时,机器坐标系变换由传送带倾斜角度推导,两个阶段使用同一个角度。仅当机器实际的龙门倾角与切片旋转角度不一致时,才需启用此项进行补偿。" + +# AI Translated +msgid "Machine-frame tilt angle" +msgstr "机器坐标系倾斜角度" + +# AI Translated +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "用于推导应用于 G-code 的机器坐标系剪切(cot)和缩放(1/|sin|)的倾斜角度(度)。仅在启用“解耦机器坐标系倾角”时使用,否则使用传送带倾斜角度。" + +msgid "+X" +msgstr "+X" + +msgid "+Y" +msgstr "+Y" + +msgid "+Z" +msgstr "+Z" + +msgid "-X" +msgstr "-X" + +msgid "-Y" +msgstr "-Y" + +msgid "-Z" +msgstr "-Z" + +# AI Translated +msgid "Rev X" +msgstr "反转 X" + +# AI Translated +msgid "Rev Y" +msgstr "反转 Y" + +# AI Translated +msgid "Rev Z" +msgstr "反转 Z" + +# AI Translated +msgid "G-code remap X" +msgstr "G-code 重映射 X" + +# AI Translated +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "指定在 G-code 输出中映射到机器 X 轴的切片坐标轴。在切片之后、生成 G-code 时应用。" + +# AI Translated +msgid "G-code remap Y" +msgstr "G-code 重映射 Y" + +# AI Translated +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "指定在 G-code 输出中映射到机器 Y 轴的切片坐标轴。在切片之后、生成 G-code 时应用。" + +# AI Translated +msgid "G-code remap Z" +msgstr "G-code 重映射 Z" + +# AI Translated +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "指定在 G-code 输出中映射到机器 Z 轴的切片坐标轴。在切片之后、生成 G-code 时应用。" + +# AI Translated +msgid "Support Floor Z offset" +msgstr "支撑底面 Z 偏移" + +# AI Translated +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "将计算出的传送带底面上移或下移(mm)。负值会降低底面,从而保留更多支撑。可用于诊断传送带底面公式的问题。" + +# AI Translated +msgid "Enable belt purge tower" +msgstr "启用传送带冲刷塔" + +# AI Translated +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "传送带打印机上擦拭塔的替代方案。在传送带打印机上启用后,会在打印零件旁自动生成一个冲刷棱柱,换料冲刷将在其中进行(传统擦拭塔的 G-code 会绕过传送带坐标变换,因此无法用于传送带打印机)。仅适用于传送带打印机。" + +# AI Translated +msgid "Belt purge tower width" +msgstr "传送带冲刷塔宽度" + +# AI Translated +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "冲刷棱柱的宽度(机器 X 方向,即横跨传送带的方向)。在传送带打印机上启用传送带冲刷塔并使用多种耗材丝时,会自动生成该棱柱,换料冲刷会改为挤出到棱柱中,而不是传统擦拭塔。棱柱高度根据每层最大冲刷体积自动计算:棱柱越宽,高度越低。" + msgid "Tree support branch angle" msgstr "树状支撑分支角度" @@ -18033,13 +18976,11 @@ msgstr "分离式填充" msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"将每个零件的内部填充以其自身为中心,就好像它是单独切片的一样,而不是以整个装配体为中心。相互接触或重叠的零件被视为一个整体并共享一个中心;分离的零件(或不同的 3D 物体)各自拥有自己的中心。\n" -"当一个装配体将多个物体分为一组、而每个物体都应保持一致的自我居中填充时,此选项很有用。\n" -"会影响直线和网格图案以及旋转模板填充。\n" -"锁定到全局坐标的图案(螺旋体、蜂窝、TPMS 等)不受影响。" +"使每个零件的内部填充以零件自身为中心,如同单独切片一样,而不是以整个装配体为中心。相互接触或重叠的零件视为一个整体,共用一个中心;彼此分离的零件(或不同的 3D 对象)各有各的中心。\n" +"适用于装配体中组合了多个对象、且每个对象都需要各自居中的一致填充的情况。\n" +"自适应立方体和支撑立方体始终以各零件自身为中心;闪电填充针对整个对象生成,不受此选项影响。" # AI Translated msgid "Center surface pattern on" @@ -18273,6 +19214,14 @@ msgstr "换料后的过渡料会被用来打印对象的支撑。这样可以减 msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "换料后的过渡料会被用来打印这个对象。这样可以减少材料浪费和缩短打印时间,但是这个对象的外观会是混色的。该功能只有在启用料塔的时候才生效。" +# AI Translated +msgid "Belt purge tower object" +msgstr "传送带冲刷塔对象" + +# AI Translated +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "标记自动生成的传送带冲刷棱柱。由程序自动管理,请勿手动设置。" + msgid "Maximal bridging distance" msgstr "最大桥接距离" @@ -18693,7 +19642,7 @@ msgstr "绕 Y 轴的旋转角度(以度为单位)" # AI Translated msgid "Ground largest face" -msgstr "以最大面着床" +msgstr "以最大面贴合热床" # AI Translated msgid "Lay each object on the largest face of its convex hull and drop it onto the bed. Of equally large faces, the one already facing down is kept. Objects without a face large enough to rest on are left as they are. Transforms run in command-line order, so rotations given before this option are respected. --orient 1 runs after all transforms and replaces the orientation." @@ -18701,7 +19650,7 @@ msgstr "将每个对象以其凸包的最大面放置,并落到热床上。若 # AI Translated msgid "Ground face by normal" -msgstr "按法线以指定面着床" +msgstr "按法线选择面贴合热床" # AI Translated msgid "Lay each object on the convex hull face whose outward normal is closest to the direction NX,NY,NZ and drop it onto the bed. The direction is in object coordinates, which include the rotations given before this option and match the plate axes unless the input file rotates the object. For example, 1,0,0 stands the object on its +X side. --orient 1 runs after all transforms and replaces the orientation." @@ -18709,7 +19658,7 @@ msgstr "将每个对象以其凸包中外法线最接近方向 NX,NY,NZ 的面 # AI Translated msgid "Ground face at point" -msgstr "以指定点所在面着床" +msgstr "以指定点所在的面贴合热床" # AI Translated msgid "Lay each object on the convex hull face that contains the point X,Y,Z and drop it onto the bed. The point is in object coordinates, which include the rotations given before this option; --inspect-mesh reports face centers in them. Objects without such a face are left as they are, and the run fails if no object has one. --orient 1 runs after all transforms and replaces the orientation." @@ -19169,8 +20118,9 @@ msgstr "用于切片的,实际的打印机的名字。" msgid "Layer number" msgstr "层编号" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "当前层编号。从 1 开始编号(即第一层编号为 1)。" +# AI Translated +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "当前层的索引。从 0 开始(即第一层为 0),但在挤出类型更换 G-code 中从 1 开始。" msgid "Layer Z" msgstr "层的 Z 坐标" @@ -19315,9 +20265,6 @@ msgstr "重新校准" msgid "Calibrate" msgstr "校准" -msgid "Finish" -msgstr "完成" - msgid "How can I use calibration results?" msgstr "如何使用校准结果?" @@ -19805,8 +20752,9 @@ msgstr "PA 校准" msgid "Extruder type" msgstr "挤出机类型" +# AI Translated msgid "DDE" -msgstr "直驱/近程挤出机" +msgstr "近程挤出机" msgid "PA Tower" msgstr "PA塔" @@ -19857,12 +20805,13 @@ msgid "" "Please verify the inputs." msgstr "加速度值必须大于速度值,请验证输入。" +# AI Translated +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "传送带打印机暂不支持此功能,请改用“PA塔”方法。" + msgid "Temperature calibration" msgstr "温度校准" -msgid "Filament type" -msgstr "耗材类型" - msgid "PLA" msgstr "PLA" @@ -19884,6 +20833,13 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "测试模型" + +# AI Translated +msgid "Overhang" +msgstr "悬垂" + msgid "Start temp: " msgstr "起始温度: " @@ -20009,9 +20965,6 @@ msgstr "起始回抽长度" msgid "End retraction length: " msgstr "结束回抽长度" -msgid "Test model" -msgstr "测试模型" - msgid "Ringing Tower" msgstr "振纹塔" @@ -20438,9 +21391,6 @@ msgstr "例如:Basic, Matte, Silk, Marble" msgid "Filament Preset" msgstr "耗材预设" -msgid "Create" -msgstr "创建" - msgid "Vendor is not selected; please reselect vendor." msgstr "未选择供应商,请重新选择供应商。" @@ -20748,6 +21698,10 @@ msgstr "" "打印机和属于打印机的所有的耗材和工艺预设。\n" "可与他人分享。" +# AI Translated +msgid "Include custom bed texture and model" +msgstr "包含自定义热床纹理和模型" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21490,9 +22444,6 @@ msgstr "手动将耗材分配到左侧或右侧喷嘴" msgid "Global settings" msgstr "全局设置" -msgid "Video tutorial" -msgstr "视频指南" - msgid "(Sync with printer)" msgstr "(与打印机同步)" @@ -21892,6 +22843,42 @@ msgstr "如果启用,上述值将被存储为将来 STEP 导入所用的默认 msgid "PresetBundle" msgstr "预设包" +# AI Translated +msgid "Export Presets" +msgstr "导出预设" + +# AI Translated +msgid "Open folder in explorer" +msgstr "打开所在文件夹" + +# AI Translated +msgid "Delete bundle" +msgstr "删除预设包" + +# AI Translated +msgid "Unsubscribe bundle" +msgstr "取消订阅预设包" + +# AI Translated +msgid "Update available" +msgstr "有可用更新" + +# AI Translated +msgid "Unauthorized bundle" +msgstr "未授权的预设包" + +# AI Translated +msgid "Open this bundle in your browser" +msgstr "在浏览器中打开此预设包" + +# AI Translated +msgid "Subscribed" +msgstr "已订阅" + +# AI Translated +msgid "Local" +msgstr "本地" + msgid "Bundle folder does not exist." msgstr "预设包文件夹不存在。" @@ -21925,6 +22912,14 @@ msgstr "取消订阅预设包" msgid "ExportPresetBundle" msgstr "导出预设包" +# AI Translated +msgid "Export to OrcaCloud" +msgstr "导出到 OrcaCloud" + +# AI Translated +msgid "Export to folder" +msgstr "导出到文件夹" + msgid "Save preset bundle" msgstr "保存预设包" @@ -26335,213 +27330,6 @@ msgstr "此字体中没有该文字的字形轮廓" msgid "Size: %.1f × %.1f mm" msgstr "大小:%.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "标准模型" - -# AI Translated -msgid "Empty mesh generated" -msgstr "生成了空网格" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "长方体" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "快速:" - -# AI Translated -msgid "Width (X)" -msgstr "宽度 (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "深度 (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "高度 (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "底面半径" - -# AI Translated -msgid "Top R" -msgstr "顶面半径" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "大半径" - -# AI Translated -msgid "Minor R" -msgstr "小半径" - -# AI Translated -msgid "All edges" -msgstr "所有边" - -# AI Translated -msgid "Top edges" -msgstr "顶部边" - -# AI Translated -msgid "Bottom edges" -msgstr "底部边" - -# AI Translated -msgid "Lateral edges" -msgstr "侧边" - -# AI Translated -msgid "Mesh resolution" -msgstr "网格精度" - -# AI Translated -msgid "Add Shape" -msgstr "添加形状" - -# AI Translated -msgid "No outer profile" -msgstr "没有外轮廓" - -# AI Translated -msgid "Failed to make outer face" -msgstr "无法生成外轮廓面" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "无法生成带孔的面" - -# AI Translated -msgid "Revolve failed" -msgstr "旋转失败" - -# AI Translated -msgid "Profile" -msgstr "轮廓" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "开始新轮廓(用于孔)" - -# AI Translated -msgid "Segments" -msgstr "段数" - -# AI Translated -msgid "Sides" -msgstr "边数" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "单击画布进行绘制" - -# AI Translated -msgid "Snap to grid" -msgstr "吸附到网格" - -# AI Translated -msgid "Grid step" -msgstr "网格间距" - -# AI Translated -msgid "Outer" -msgstr "外轮廓" - -# AI Translated -msgid "closed" -msgstr "已闭合" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%:%3% 个点 %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY(顶部)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ(前面)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ(侧面)" - -# AI Translated -msgid "Revolve deg" -msgstr "旋转角度" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "设为 0 则拉伸,大于 0 则旋转" - -# AI Translated -msgid "Pocket (cut)" -msgstr "凹槽(切除)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu 个闭合轮廓" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "绘制一个闭合轮廓以启用" - -# AI Translated -msgid "Clear all" -msgstr "全部清除" - -# AI Translated -msgid "Empty result" -msgstr "结果为空" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "拉伸:%1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "旋转:%1%" - -# AI Translated -msgid "No object selected" -msgstr "未选择对象" - -# AI Translated -msgid "Face failed" -msgstr "生成面失败" - -# AI Translated -msgid "Face with holes failed" -msgstr "生成带孔的面失败" - -# AI Translated -msgid "Tool mesh empty" -msgstr "工具网格为空" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "已添加凹槽(负体积)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "凹槽:%1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -26593,8 +27381,9 @@ msgstr "从STL/STEP/3MF/OBJ/AMF文件中导入几何数据" msgid "Select all objects" msgstr "选择所有对象" +# AI Translated msgid "Paste from clipboard" -msgstr "从剪切板粘贴" +msgstr "从剪贴板粘贴" msgid "Toggle printable for object/part" msgstr "切换对象/零件的可打印状态" @@ -26627,15 +27416,17 @@ msgstr "将所选项顺时针旋转 45 度" msgid "Gizmo move" msgstr "移动小工具" +# AI Translated msgid "Gizmo rotate" -msgstr "旋转物件" +msgstr "旋转小工具" # AI Translated msgid "Gizmo scale" msgstr "缩放小工具" +# AI Translated msgid "Gizmo place face on bed" -msgstr "选择底面" +msgstr "选择底面小工具" # AI Translated msgid "Gizmo cut" @@ -26643,7 +27434,7 @@ msgstr "切割小工具" # AI Translated msgid "Gizmo mesh boolean" -msgstr "网格布尔操作小工具" +msgstr "网格布尔运算小工具" # AI Translated msgid "Gizmo FDM paint-on supports" @@ -26652,8 +27443,9 @@ msgstr "FDM 手绘支撑小工具" msgid "Gizmo FDM paint-on seam" msgstr "FDM涂装接缝" +# AI Translated msgid "Gizmo FDM paint-on fuzzy skin" -msgstr "Gizmo FDM手绘绒毛表面" +msgstr "手绘绒毛表面小工具" # AI Translated msgid "Gizmo multi-material painting" @@ -26669,12 +27461,16 @@ msgstr "测量小工具" # AI Translated msgid "Gizmo assemble" -msgstr "组合小工具" +msgstr "装配小工具" # AI Translated msgid "Gizmo brim ears" msgstr "耳状帽檐小工具" +# AI Translated +msgid "Gizmo texture displacement painting" +msgstr "纹理置换绘制小工具" + msgid "Vertical slider - Move active thumb Up" msgstr "垂直滑动条 - 向上移动一层" @@ -26693,30 +27489,37 @@ msgstr "水平滑块 - 移动到起始位置" msgid "Horizontal slider - Move to last position" msgstr "水平滑块 - 移动到末尾位置" +# AI Translated msgid "Camera view - Default" -msgstr "摄像机视角 - 默认" +msgstr "视图 - 默认视图" +# AI Translated msgid "Camera view - Top" -msgstr "摄像机视角 - 顶部" +msgstr "视图 - 俯视图" +# AI Translated msgid "Camera view - Bottom" -msgstr "摄像机视角 - 底部" +msgstr "视图 - 仰视图" +# AI Translated msgid "Camera view - Front" -msgstr "摄像机视角 - 正面" +msgstr "视图 - 前视图" +# AI Translated msgid "Camera view - Behind" -msgstr "摄像机视角 - 后面" +msgstr "视图 - 后视图" +# AI Translated msgid "Camera Angle - Left side" -msgstr "摄像机视角 - 左面" +msgstr "视图 - 左视图" +# AI Translated msgid "Camera Angle - Right side" -msgstr "摄像机视角 - 右面" +msgstr "视图 - 右视图" # AI Translated msgid "Camera view - Current plate" -msgstr "相机视图 - 当前盘" +msgstr "视图 - 当前盘" msgid "Zoom in" msgstr "放大" @@ -27656,10 +28459,6 @@ msgstr "我的设置" msgid "Custom Printer Setup" msgstr "自定义打印机设置" -# AI Translated -msgid "Custom Printer" -msgstr "自定义打印机" - # AI Translated msgid "Define a custom printer profile" msgstr "定义自定义打印机配置文件" @@ -28305,8 +29104,8 @@ msgid "Click a triangle to paint it" msgstr "单击三角形以进行绘制" # AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "需要当前图层使用“展开 (LSCM)”映射。" +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "仅适用于映射为“展开 (LSCM)”的图层,将当前图层的映射设为“展开”即可使用此视图。" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -28321,16 +29120,16 @@ msgid "Checker" msgstr "棋盘格" # AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "棋盘格 - 用测试网格代替纹理。方格保持正方形的地方纹理没有变形;方格被拉伸的地方,纹理也会被拉伸" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "棋盘格 - 用测试网格代替纹理显示。方格保持方正处,纹理无变形;方格被拉伸处,纹理也会被拉伸。若 UV 编辑器未打开,将自动打开" # AI Translated msgid "Distortion" msgstr "畸变" # AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "畸变 - 在展开上叠加由蓝到红的拉伸热力图" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "畸变 - 在展开图上叠加由蓝到红的拉伸热力图。若 UV 编辑器未打开,将自动打开" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28447,23 +29246,12 @@ msgid "Interleaves two filaments to fake the colors in between, so a handful of msgstr "交替使用两种耗材丝来模拟它们之间的颜色,从而用少量耗材丝呈现照片或渐变。纯色图像无论是否开启,打印效果都相同。关闭时每个区域只使用一种耗材丝。" # AI Translated -msgid "Mix by" -msgstr "混合方式" +msgid "Mixed colors" +msgstr "混色数量" # AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "表面" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." -msgstr "" -"层:两种耗材丝在打印层之间交替,在竖直表面上过渡平滑,但在朝上或朝下的平坦表面上会失效,因为那里整层只是一条色带。\n" -"表面:在表面上形成细密的棋盘格,适用于任何角度,但看起来可能更像纹理而非混色。\n" -"自动:竖直面按层混合;平坦面采用较接近的单一耗材丝,因为棋盘格在那里会显现为图案。" +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." +msgstr "烘焙时最多可添加的混合耗材丝数量。混合耗材丝从纹理颜色中选取,且只会创建烘焙实际用到的那些。" # AI Translated #, boost-format @@ -28923,14 +29711,6 @@ msgstr "需要约 %1% 个三角形,预算为 %2% - 烘焙将重新简化并丢 msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "细化过程最多可向模型添加多少千个三角形。最不贴合的三角形总是优先拆分,因此即使用完全部预算,也是用在最明显的地方。如果起伏看起来仍然粗糙,请调高此值。" -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "停止烘焙。已完成的部分会保留在模型上,并且可以撤销。" - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "不烘焙并关闭工具。您的绘制、图层和设置都会保留在模型中。" - # AI Translated msgid "Preparing..." msgstr "正在准备..." @@ -28955,6 +29735,14 @@ msgstr "通过移动现有的顶点,将绘制的高度图转换为真实的几 msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "将绘制的高度图转换为真实的几何体。网格会先被重新网格化为均匀密度,并在纹理弯折处进行细化,使细节有顶点可落 - 一步完成。" +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "停止烘焙。已完成的部分会保留在模型上,并且可以撤销。" + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "不烘焙并关闭工具。您的绘制、图层和设置都会保留在模型中。" + # AI Translated #, boost-format msgid "%1% k" @@ -29171,6 +29959,34 @@ msgstr "耗材丝插件" msgid "Printer plugins" msgstr "打印机插件" +# AI Translated +msgid "This preset does not use any plugin capabilities" +msgstr "此预设未使用任何插件功能" + +# AI Translated +msgid "Capabilities used by this preset" +msgstr "此预设使用的功能" + +# AI Translated +msgid "Capability configuration (JSON)" +msgstr "功能配置(JSON)" + +# AI Translated +msgid "Plugin configuration" +msgstr "插件配置" + +# AI Translated +msgid "Discard this preset's override and use the global configuration again" +msgstr "放弃此预设的覆盖配置,重新使用全局配置" + +# AI Translated +msgid "Restore defaults" +msgstr "恢复默认" + +# AI Translated +msgid "Invalid JSON" +msgstr "无效的 JSON" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "配置不是有效的 JSON。您的更改未保存。" @@ -29190,10 +30006,6 @@ msgstr "" "\n" "这将放弃该预设的覆盖设置,并使用全局配置。" -# AI Translated -msgid "Restore defaults" -msgstr "恢复默认" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "正在使用全局配置。请保存预设以使其持久生效。" @@ -29263,6 +30075,282 @@ msgstr "正在安装插件" msgid "Installed \"%s\"." msgstr "已安装“%s”。" +# AI Translated +msgid "Search plugins" +msgstr "搜索插件" + +# AI Translated +msgid "Clear search" +msgstr "清除搜索" + +# AI Translated +msgid "Match case" +msgstr "区分大小写" + +# AI Translated +msgid "Match whole word" +msgstr "全字匹配" + +# AI Translated +msgid "More plugin install options" +msgstr "更多插件安装选项" + +# AI Translated +msgid "Install plugin" +msgstr "安装插件" + +# AI Translated +msgid "Install local plugin" +msgstr "安装本地插件" + +# AI Translated +msgid "Activate" +msgstr "激活" + +# AI Translated +msgid "Sort by name" +msgstr "按名称排序" + +# AI Translated +msgid "Sort by version" +msgstr "按版本排序" + +# AI Translated +msgid "Plugin Version" +msgstr "插件版本" + +# AI Translated +msgid "Sort by source" +msgstr "按来源排序" + +# AI Translated +msgid "Source" +msgstr "来源" + +# AI Translated +msgid "Sort by status" +msgstr "按状态排序" + +# AI Translated +msgctxt "Plugin" +msgid "Status" +msgstr "状态" + +# AI Translated +msgid "Drag to resize; double-click to reset" +msgstr "拖动以调整大小;双击以重置" + +# AI Translated +msgid "Resize the plugin list" +msgstr "调整插件列表大小" + +# AI Translated +msgid "Plugin details" +msgstr "插件详情" + +# AI Translated +msgid "Plugin Info" +msgstr "插件信息" + +# AI Translated +msgid "Description" +msgstr "描述" + +# AI Translated +msgid "Config" +msgstr "配置" + +# AI Translated +msgid "Changelog" +msgstr "更新日志" + +# AI Translated +msgid "Diagnostics" +msgstr "诊断" + +# AI Translated +msgid "Types" +msgstr "类型" + +# AI Translated +msgid "Installed Version" +msgstr "已安装版本" + +# AI Translated +msgid "Latest Version" +msgstr "最新版本" + +# AI Translated +msgid "Update to the latest version" +msgstr "更新到最新版本" + +# AI Translated +msgid "No description available" +msgstr "暂无描述" + +# AI Translated +msgid "Select a plugin to configure its capabilities" +msgstr "选择一个插件以配置其功能" + +# AI Translated +msgid "Configurable capabilities" +msgstr "可配置的功能" + +# AI Translated +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "放弃为此功能保存的设置,恢复插件的默认配置" + +# AI Translated +msgid "Plugin changelog" +msgstr "插件更新日志" + +# AI Translated +msgid "Date" +msgstr "日期" + +# AI Translated +msgid "Changes" +msgstr "更新内容" + +# AI Translated +msgid "No changelog available" +msgstr "暂无更新日志" + +# AI Translated +msgid "No issues detected" +msgstr "未检测到问题" + +# AI Translated +msgid "No plugins found" +msgstr "未找到插件" + +# AI Translated +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "没有与“%s”匹配的插件" + +# AI Translated +msgid "Mine" +msgstr "我的" + +# AI Translated +msgid "Orphaned" +msgstr "孤立" + +# AI Translated +msgid "Some plugin capabilities are enabled" +msgstr "已启用部分插件功能" + +# AI Translated +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "收起 %s 的功能" + +# AI Translated +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "展开 %s 的功能" + +# AI Translated +msgid "Collapse capabilities" +msgstr "收起功能" + +# AI Translated +msgid "Expand capabilities" +msgstr "展开功能" + +# AI Translated +msgid "Open this plugin in your browser" +msgstr "在浏览器中打开此插件" + +# AI Translated +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "功能:%s" + +# AI Translated +msgctxt "Plugin" +msgid "Capabilities" +msgstr "功能" + +# AI Translated +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "运行“%s”" + +# AI Translated +#, c-format, boost-format +msgid "Enable %s" +msgstr "启用 %s" + +# AI Translated +msgid "Unauthorized for updates" +msgstr "未获更新授权" + +# AI Translated +msgid "Loading the plugin…" +msgstr "正在加载插件…" + +# AI Translated +msgid "This plugin exposes no capabilities" +msgstr "此插件未提供任何功能" + +# AI Translated +msgid "Activate this plugin to configure its capabilities" +msgstr "激活此插件后即可配置其功能" + +# AI Translated +msgid "View on OrcaCloud here" +msgstr "点击此处前往 OrcaCloud 查看" + +# AI Translated +msgid "Activated" +msgstr "已激活" + +# AI Translated +msgid "Runtime error" +msgstr "运行时错误" + +# AI Translated +msgid "Inactive" +msgstr "未激活" + +# AI Translated +msgid "This plugin is active and ready to be used." +msgstr "此插件已激活,可以使用。" + +# AI Translated +msgid "This plugin is still loading." +msgstr "此插件仍在加载中。" + +# AI Translated +msgid "This plugin is blocked until its error is fixed." +msgstr "此插件存在错误,修复之前无法使用。" + +# AI Translated +msgid "This plugin is loaded but a capability reported an error." +msgstr "此插件已加载,但有功能报告了错误。" + +# AI Translated +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "此插件未激活。激活后即可安装或加载。" + +# AI Translated +msgid "Select a plugin to view its status and details." +msgstr "选择一个插件以查看其状态和详细信息。" + +# AI Translated +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "孤立:此插件已不再订阅,或已无法在 OrcaCloud 中获取。本地副本仍保持安装,可以继续使用。" + +# AI Translated +msgid "A newer plugin version is available." +msgstr "插件有新版本可用。" + +# AI Translated +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "此插件未获更新授权,无法获取云端更新。" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29479,6 +30567,56 @@ msgstr "重新加载插件失败。" msgid "Reloaded \"%s\"." msgstr "已重新加载“%s”。" +# AI Translated +msgid "Printer Connection" +msgstr "打印机连接" + +# AI Translated +msgid "Please set up your printer connection to view the device." +msgstr "请先设置打印机连接以查看设备。" + +msgid "No model information" +msgstr "该模型没有相关信息" + +msgid "Edit Project Info" +msgstr "编辑项目信息" + +msgid "Model Information" +msgstr "模型信息" + +msgid "Accessories" +msgstr "附件" + +msgid "Profile Information" +msgstr "配置信息" + +msgid "Model name" +msgstr "模型名称" + +msgid "Created by" +msgstr "创作" + +msgid "Remixed by" +msgstr "修改" + +msgid "Shared by" +msgstr "分享" + +msgid "Model description" +msgstr "模型介绍" + +msgid "BOM" +msgstr "物料清单" + +msgid "Profile name" +msgstr "配置名称" + +msgid "Profile Author" +msgstr "配置作者" + +msgid "Profile description" +msgstr "配置介绍" + # AI Translated msgid "Purge Mode Settings" msgstr "冲刷模式设置" @@ -29503,6 +30641,19 @@ msgstr "减少冲刷浪费并加快打印。可能导致轻微混色或细小的 msgid "Terminal" msgstr "终端" +# AI Translated +msgid "python ... or uv ..." +msgstr "python ... 或 uv ..." + +# AI Translated +msgid "Plugin terminal ready." +msgstr "插件终端已就绪。" + +# AI Translated +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "进程已退出,退出代码:%s" + # AI Translated msgid "A command is already running." msgstr "已有命令正在运行。" @@ -29769,6 +30920,10 @@ msgstr " | 吸附已开启" msgid "Change texture - choose another one from the texture library" msgstr "更换纹理 - 从纹理库中选择另一个纹理" +# AI Translated +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "当前图层的平铺尺寸,即纹理每重复一次在模型上覆盖的范围。画布以平铺为单位,一个网格单元即一次重复。可在图层的平铺设置中修改。" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "高度图 - 在岛下方显示图层的纹理" @@ -29802,16 +30957,16 @@ msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfo msgstr "将展开布局为相连的展开图:共享边的块会相邻展开(立方体会变成相连的展开图,而不是六个分散的正方形)。它们仍是独立的岛,因此之后仍可手动移动其中任何一个。" # AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "岛 - 移动、旋转和缩放整个岛" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "岛 - 以整个 UV 岛为单位操作。单击选中一个岛,然后拖动可移动,右键拖动可旋转,也可按 R 或 S 后用鼠标旋转或缩放(单击或按 Enter 确认,按 Esc 取消)。" # AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "顶点 - 拖动顶点以调整形状;按住 Shift/Ctrl 可多选" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "顶点 - 拖动顶点,手动调整 UV 岛的形状;按住 Shift 可加选,按住 Ctrl 可切换单个顶点的选中状态。" # AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "边 - 拖动边以调整形状;按住 Shift/Ctrl 可多选" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "边 - 拖动边,手动调整 UV 岛的形状;按住 Shift 可加选,按住 Ctrl 可切换单条边的选中状态。" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -29850,8 +31005,16 @@ msgid "Snap - stick islands together when dragging one against another" msgstr "吸附 - 将一个岛拖向另一个岛时使它们贴合在一起" # AI Translated -msgid "Frame all islands (Home)" -msgstr "框显所有岛 (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" +"全部适配视图,使所有 UV 岛都显示在视图内(Home 或 F)。\n" +"在画布其他位置:滚动滚轮以光标为中心缩放;按住中键拖动或拖动空白处可平移。" + +# AI Translated +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "当前选中的内容,以及拖动时移动、旋转或缩放的精确数值。" # AI Translated msgid "No layer mapped with Unwrap" @@ -29862,6 +31025,10 @@ msgstr "没有使用“展开”映射的图层" msgid "%.1f mm tile" msgstr "%.1f mm 平铺" +# AI Translated +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "此面板对应当前纹理图层,该图层的映射必须为“展开 (LSCM)”。请添加一个图层,并将其映射设为“展开”。" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "已过期 - 自生成此展开以来,绘制、切缝或切缝角度已更改。按下以重新展开。" @@ -29870,18 +31037,54 @@ msgstr "已过期 - 自生成此展开以来,绘制、切缝或切缝角度已 msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "将绘制区域展平为 UV 岛。仅在您按下此按钮时才会计算,而不是每次编辑都计算 - 因此请先绘制、更改切缝角度或标记切缝,然后再按“展开”。" +# AI Translated +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "请先开启“标记切缝”;使用“路径”可以更快地标记切缝。" + +# AI Translated +msgid "No seams are marked on this layer." +msgstr "此图层上未标记任何切缝。" + +# AI Translated +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "尚未手动调整任何 UV 岛的形状,没有可放弃的修改。" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d 个岛,%s 个面" # AI Translated -msgid "Forward" -msgstr "前进" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "绘制区域的展开结果:切分出的独立块数(在切缝处及比切缝角度更尖锐的边处切开),以及这些块包含的三角形总数。" # AI Translated -msgid "Tools" -msgstr "工具" +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "请先单击“展开”,目前还没有可操作的 UV 岛。" + +# AI Translated +msgid "Click an island on the canvas first, in Island mode." +msgstr "请先在岛模式下单击画布上的一个 UV 岛。" + +# AI Translated +msgid "Not signed in" +msgstr "未登录" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "没有发现 Bambu 网络插件,请下载并安装。" + +msgid "Create new project" +msgstr "创建一个新项目" + +msgid "Recently opened" +msgstr "近期打开文件" + +msgid "Open Containing Folder" +msgstr "打开所在的文件夹" + +# AI Translated +msgid "Forward" +msgstr "前进" # AI Translated msgid "View Source" @@ -30028,6 +31231,20 @@ msgstr "" "插件“%s”正在请求运行以下命令:\n" "%s" +# AI Translated +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "插件“%s”正在请求创建线程的权限。" + +# AI Translated +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" +"插件“%s”正在请求将正在运行的应用程序替换为:\n" +"%s" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30037,6 +31254,38 @@ msgstr "插件“%s”正在请求 Python 审计事件“%s”的权限。" msgid "Plugin permission request" msgstr "插件权限请求" +# AI Translated +msgid "Printer connection" +msgstr "打印机连接" + +# AI Translated +msgid "Pages" +msgstr "页面" + +# AI Translated +msgid "Analysis" +msgstr "分析" + +# AI Translated +msgid "Importer" +msgstr "导入器" + +# AI Translated +msgid "Exporter" +msgstr "导出器" + +# AI Translated +msgid "Visualization" +msgstr "可视化" + +# AI Translated +msgid "Script" +msgstr "脚本" + +# AI Translated +msgid "Slicing Pipeline" +msgstr "切片流水线" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "插件的配置界面为空。正在显示默认编辑器。" @@ -30623,6 +31872,310 @@ msgstr "" "避免翘曲\n" "您知道吗?打印ABS这类易翘曲材料时,适当提高热床温度可以降低翘曲的概率。" +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "无法安装 Microsoft WebView2 运行库。\n" +#~ "在安装之前,包括设置向导在内的部分功能可能显示为空白。\n" +#~ "请从 https://developer.microsoft.com/microsoft-edge/webview2/ 手动安装,然后重启 Orca Slicer。" + +#~ msgid "Why this grouping" +#~ msgstr "为什么这样分组" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "该软件不支持在一次打印中使用不同直径的喷嘴。如果左右喷嘴不一致,就只能进行单头打印。请确认您想在该项目中使用哪种喷嘴。" + +#~ msgid "Switch diameter" +#~ msgstr "开关直径" + +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudio 项目" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "该 3MF 由 BambuStudio(版本 %s)创建,其版本高于兼容版本 %s。发现无法识别的设置:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "该 3MF 由 BambuStudio(版本 %s)创建,其版本高于兼容版本 %s。部分设置可能无法完全兼容。" + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "该 3MF 由 BambuStudio 创建。部分设置可能与 OrcaSlicer 不同。" + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "操作正在进行时无法撤销或重做。请先停止该操作。" + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s: %s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "将每个零件的内部填充以其自身为中心,就好像它是单独切片的一样,而不是以整个装配体为中心。相互接触或重叠的零件被视为一个整体并共享一个中心;分离的零件(或不同的 3D 物体)各自拥有自己的中心。\n" +#~ "当一个装配体将多个物体分为一组、而每个物体都应保持一致的自我居中填充时,此选项很有用。\n" +#~ "会影响直线和网格图案以及旋转模板填充。\n" +#~ "锁定到全局坐标的图案(螺旋体、蜂窝、TPMS 等)不受影响。" + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "当前层编号。从 1 开始编号(即第一层编号为 1)。" + +#~ msgid "Video tutorial" +#~ msgstr "视频指南" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "标准模型" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "生成了空网格" + +# AI Translated +#~ msgid "Box" +#~ msgstr "长方体" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "快速:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "宽度 (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "深度 (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "高度 (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "底面半径" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "顶面半径" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "大半径" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "小半径" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "所有边" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "顶部边" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "底部边" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "侧边" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "网格精度" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "添加形状" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "没有外轮廓" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "无法生成外轮廓面" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "无法生成带孔的面" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "旋转失败" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "轮廓" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "开始新轮廓(用于孔)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "段数" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "边数" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "单击画布进行绘制" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "吸附到网格" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "网格间距" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "外轮廓" + +# AI Translated +#~ msgid "closed" +#~ msgstr "已闭合" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%:%3% 个点 %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY(顶部)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ(前面)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ(侧面)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "旋转角度" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "设为 0 则拉伸,大于 0 则旋转" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "凹槽(切除)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu 个闭合轮廓" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "绘制一个闭合轮廓以启用" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "结果为空" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "拉伸:%1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "旋转:%1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "未选择对象" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "生成面失败" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "生成带孔的面失败" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "工具网格为空" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "已添加凹槽(负体积)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "凹槽:%1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "需要当前图层使用“展开 (LSCM)”映射。" + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "棋盘格 - 用测试网格代替纹理。方格保持正方形的地方纹理没有变形;方格被拉伸的地方,纹理也会被拉伸" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "畸变 - 在展开上叠加由蓝到红的拉伸热力图" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "混合方式" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "表面" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "层:两种耗材丝在打印层之间交替,在竖直表面上过渡平滑,但在朝上或朝下的平坦表面上会失效,因为那里整层只是一条色带。\n" +#~ "表面:在表面上形成细密的棋盘格,适用于任何角度,但看起来可能更像纹理而非混色。\n" +#~ "自动:竖直面按层混合;平坦面采用较接近的单一耗材丝,因为棋盘格在那里会显现为图案。" + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "岛 - 移动、旋转和缩放整个岛" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "顶点 - 拖动顶点以调整形状;按住 Shift/Ctrl 可多选" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "边 - 拖动边以调整形状;按住 Shift/Ctrl 可多选" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "框显所有岛 (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(实验性)使用打印机代理替代打印主机" @@ -30656,16 +32209,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "单击一个面或基准面,然后选取绘图工具" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -30722,10 +32265,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "竖直距离" -# AI Translated -#~ msgid "Linear" -#~ msgstr "线性" - #~ msgid "Face recognition" #~ msgstr "外观面检测" @@ -32410,9 +33949,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "零件选择" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "Controls the density (spacing) of external bridge lines. Default is 100%.\n" #~ "Theoretically, 100% means a solid bridge, but due to the tendency of bridge extrusions to sag, 100% may not be sufficient.\n" diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index f47b5900ee..809972d755 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-10-06 15:16-0300\n" +"POT-Creation-Date: 2026-10-11 16:21+0800\n" "PO-Revision-Date: 2025-11-28 13:48-0600\n" "Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n" "Language-Team: \n" @@ -2115,14 +2115,12 @@ msgstr "Orca Slicer 需要 Microsoft WebView2 Runtime 才能操作某些功能 msgid "WebView2 Runtime" msgstr "WebView2 Runtime" +#, boost-format msgid "" "The Microsoft WebView2 Runtime could not be installed.\n" "Some features, including the setup wizard, may appear blank until it is installed.\n" -"Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +"Please install it manually from %1% and restart Orca Slicer." msgstr "" -"無法安裝 Microsoft WebView2 Runtime。\n" -"在安裝完成前,包括設定精靈在內的部分功能可能顯示為空白。\n" -"請從 https://developer.microsoft.com/microsoft-edge/webview2/ 手動安裝,然後重新啟動 Orca Slicer。" #, c-format, boost-format msgid "Resources path does not exist or is not a directory: %s" @@ -4242,6 +4240,9 @@ msgstr "前往列印板" msgid "AMS Materials Setting" msgstr "AMS 線材設定" +msgid "Wiki Guide" +msgstr "Wiki 指南" + msgid "Close" msgstr "關閉" @@ -4266,9 +4267,6 @@ msgstr "輸入的範圍在 %1% 和 %2% 之間" msgid "Factors of Flow Dynamics Calibration" msgstr "動態流量係數校正" -msgid "Wiki Guide" -msgstr "Wiki 指南" - msgid "PA Profile" msgstr "PA 設定檔" @@ -4356,9 +4354,10 @@ msgstr "校正完成。如下圖中的範例,請在您的熱床上找到最均 msgid "Save" msgstr "儲存" +# AI Translated msgctxt "Navigation" msgid "Back" -msgstr "背面" +msgstr "返回" msgid "Example" msgstr "範例" @@ -4863,6 +4862,11 @@ msgstr "是否自動調整至限制值(%g mm)?" msgid "Adjust" msgstr "調整" +msgid "" +"Raft and draft shield are not available on belt printers.\n" +"They have been disabled." +msgstr "" + msgid "" "Layer height too small\n" "It has been reset to 0.2" @@ -5715,9 +5719,6 @@ msgstr "根據最佳線材分組自動重新切片,切片後將顯示分組結 msgid "Filament Grouping" msgstr "線材分組" -msgid "Why this grouping" -msgstr "為何這樣分組" - msgid "Please place filaments on the printer based on grouping result." msgstr "請根據分組結果在列印裝置上放置線材。" @@ -5906,6 +5907,43 @@ msgstr "增加/減小編輯區域" msgid "Sequence" msgstr "順序" +msgid "Plate center of mass" +msgstr "" + +msgid "Part center of mass" +msgstr "" + +msgid "Support center of mass" +msgstr "" + +msgid "Assembly center of mass" +msgstr "" + +msgid "Object center of mass" +msgstr "" + +msgid "Finished print" +msgstr "" + +#, boost-format +msgid "Printed up to layer %1%" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Volume" +msgstr "體積" + +msgid "Center in bounding box" +msgstr "" + +msgid "Bounding box size" +msgstr "" + +msgid "Moment of inertia" +msgstr "" + msgid "Object selection" msgstr "物件選取" @@ -6121,6 +6159,12 @@ msgstr "網格線" msgid "Labels" msgstr "標籤" +msgid "Center of mass" +msgstr "" + +msgid "Show raw G-code (belt only)" +msgstr "" + # AI Translated msgid "Move section plane" msgstr "移動剖切面" @@ -6169,7 +6213,7 @@ msgstr "體積:" msgid "Size:" msgstr "尺寸:" -#, c-format, boost-format +#, boost-format msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)." msgstr "發現 G-code 路徑在 %d 層,Z = %.2lf mm 處的衝突。請將有衝突的物件分離得更遠(%s <-> %s)。" @@ -6640,6 +6684,12 @@ msgstr "顯示網格線" msgid "Show Gridlines on plate" msgstr "顯示列印板上的網格線" +msgid "Show IDEX/IQEX Toolhead" +msgstr "" + +msgid "Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview." +msgstr "" + msgid "Reset Window Layout" msgstr "重設視窗配置" @@ -8318,6 +8368,61 @@ msgstr "檢視所有物件的設定" msgid "Material settings" msgstr "材料設定" +msgid "Each mode names the tool heads that take part and the role each one plays. Click a tool button to cycle its role — hover a color below for what each role does." +msgstr "" + +msgid "Add Mode" +msgstr "" + +# AI Translated +msgid "Tools" +msgstr "工具" + +msgid "G-code" +msgstr "" + +msgid "How the mode is labeled in the plate's IDEX/IQEX mode selector. Required — a mode with no name cannot be selected." +msgstr "" + +msgid "Which tool heads take part in the mode and what role each one plays. Click a tile to cycle its role." +msgstr "" + +msgid "G-code run at print start to put the printer into this mode (for example a Klipper SET_PRINT_MODE call). The slicer only emits the Primary tool's paths; the firmware drives the others." +msgstr "" + +msgid "Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose which corner of the bed it occupies. It cannot be moved from the grid." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths offset into its own zone." +msgstr "" + +msgid "Follows the Primary at the firmware level, printing the same paths reflected across the boundary between the two zones." +msgstr "" + +msgid "Marks a tool on the Primary's gantry as its multicolor partner. Required to allow multi-color printing in paired-gantry modes." +msgstr "" + +msgid "Primary" +msgstr "" + +msgid "Mode name (required)" +msgstr "" + +msgid "Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode selector. Stored in the project by name, so renaming a mode that plates already use makes them fall back to Primary. Cannot be empty — a blank name is replaced with a generated one." +msgstr "" + +msgid "G-code emitted once at the start of a print that uses this mode, before the machine start G-code. This is where the printer is put into the matching firmware mode — for example a Klipper SET_PRINT_MODE call or a RepRapFirmware M567 — since the slicer only emits the Primary tool's paths and the firmware drives the Copy / Mirror tools. Placeholders are supported; use the edit button to browse them. Leave empty if the mode needs no firmware setup." +msgstr "" + +msgid "Edit G-code / browse placeholders" +msgstr "" + +msgid "Remove mode" +msgstr "" + +msgid "Discard in-session edits to this mode (snap back to saved value)" +msgstr "" + msgid "Remove current plate (if not last one)" msgstr "刪除目前列印板(如果不是最後一個)" @@ -8342,6 +8447,17 @@ msgstr "編輯列印板名稱" msgid "Move plate to the front" msgstr "更改列印板順序至前" +#, boost-format +msgid " (process preset: %1%)" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode: %1% (left-click to cycle, right-click for menu)" +msgstr "" + +msgid "Warning: this plate uses a parallel IDEX/IQEX mode with multi-material objects. Proceed with caution — verify your G-code handles this combination correctly." +msgstr "" + msgid "Customize current plate" msgstr "自訂列印板參數" @@ -8408,12 +8524,6 @@ msgstr "AMS(1 槽位)" msgid "Not installed" msgstr "未安裝" -msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." -msgstr "軟體不支援在一次列印中使用不同直徑的噴嘴。如果左右噴嘴不一致,只能進行單頭列印。請確認您要在此專案中使用哪個噴嘴。" - -msgid "Switch diameter" -msgstr "切換直徑" - msgid "Configuration incompatible" msgstr "設定檔不相容" @@ -8495,6 +8605,9 @@ msgstr "混合線材" msgid "Remove last mixed filament" msgstr "移除最後一個混合線材" +msgid "Remove all mixed filaments" +msgstr "" + # AI Translated msgid "Add mixed filament" msgstr "新增混合線材" @@ -8517,6 +8630,10 @@ msgstr "混合線材的成分參照已失效" msgid "Edit / Delete / Merge" msgstr "編輯 / 刪除 / 合併" +#, boost-format +msgid "Remove all %1% mixed filaments?" +msgstr "" + # AI Translated msgid "The target mixed filament uses this physical filament as a component. Merging will remove this physical filament and may invalidate the mixed filament. Continue?" msgstr "目標混合線材使用此實體線材作為成分。合併將移除此實體線材,並可能使該混合線材失效。是否繼續?" @@ -8591,9 +8708,6 @@ msgstr "載入檔案:%s" msgid "Load 3MF" msgstr "載入 3MF" -msgid "BambuStudio Project" -msgstr "BambuStudio 專案" - msgid "The 3MF is not supported by OrcaSlicer, loading geometry data only." msgstr "該 3MF 不被 OrcaSlicer 支援,僅載入幾何資料。" @@ -8623,17 +8737,6 @@ msgstr "建議升級您的軟體版本。\n" msgid "The 3MF file version %s is newer than %s's version %s, we suggest to upgrade your software." msgstr "該 3MF 檔案版本 %s 比 %s 的版本 %s 新,建議升級您的軟體。" -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" -msgstr "此 3MF 由 BambuStudio(版本 %s)建立,其版本比相容版本 %s 更新。發現無法辨識的設定:" - -#, c-format, boost-format -msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." -msgstr "此 3MF 由 BambuStudio(版本 %s)建立,該版本新於相容版本 %s。部分設定可能無法完全相容。" - -msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." -msgstr "此 3MF 由 BambuStudio 建立。部分設定可能與 OrcaSlicer 不同。" - msgid "Invalid values found in the 3MF:" msgstr "在 3MF 檔案中發現無效值:" @@ -8805,6 +8908,12 @@ msgstr "停用自動落板以保留 Z 定位?\n" msgid "Object with floating parts was detected" msgstr "偵測到含有懸空零件的物件" +msgid "Cannot slice: an object overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + +msgid "Cannot slice: the prime tower overlaps an area reserved for IDEX/IQEX parallel printing (a secondary zone, or a carriage clearance strip inside the primary zone)." +msgstr "" + msgid "Another export job is running." msgstr "有其他匯出任務正在進行中。" @@ -8889,6 +8998,38 @@ msgstr "無效資料" msgid "Slicing Canceled" msgstr "切片已取消" +#, c-format, boost-format +msgid "Bed temperature conflict: T%d (%s) sets the bed to %d°C — T%d (%s) requires %d°C. The primary tool controls the bed; secondary tools print at whatever temperature it sets." +msgstr "" + +#, c-format, boost-format +msgid "Filament type mismatch: T%d uses %s and T%d uses %s. These materials have incompatible requirements and are not designed to print together." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plate %d has IDEX/IQEX parallel mode active with the following concerns:\n" +"\n" +msgstr "" + +msgid "Continue slicing?" +msgstr "" + +msgid "IDEX/IQEX Parallel Mode Warning" +msgstr "" + +msgid "Don't show these warnings again" +msgstr "" + +#, c-format, boost-format +msgid "Plate %d:\n" +msgstr "" + +msgid "" +"The following IDEX/IQEX parallel mode concerns were detected:\n" +"\n" +msgstr "" + msgid "Network plug-in switched successfully." msgstr "網路外掛程式切換成功。" @@ -8920,9 +9061,8 @@ msgstr "" msgid "Sync now" msgstr "立即同步" -# AI Translated -msgid "Cannot undo or redo while an operation is running. Stop it first." -msgstr "操作執行期間無法復原或重做。請先停止該操作。" +msgid "Cannot undo or redo while an operation is running. Stop the operation, or wait for it to finish and then retry." +msgstr "" # AI Translated msgid "" @@ -8994,6 +9134,11 @@ msgstr "下載失敗,檔案大小異常。" msgid "Project downloaded %d%%" msgstr "專案已下載 %d%%" +msgid "" +"PA Line and PA Pattern tests are not enabled yet on belt printers.\n" +"Please use the PA Tower method instead." +msgstr "" + # AI Translated msgid "Pressure Advance Test" msgstr "Pressure Advance 測試" @@ -9020,6 +9165,13 @@ msgstr "Orca YOLO 流量校正" msgid "Flowrate Test - Pass%d" msgstr "流量測試 - 第 %d 遍" +#, boost-format +msgid "No belt temperature tower is available for the range %1% to %2% °C. Use a range the tower models cover, for example 230 to 190." +msgstr "" + +msgid "Temperature tower" +msgstr "" + # AI Translated msgid "Nozzle temperature test" msgstr "噴嘴溫度測試" @@ -11465,6 +11617,9 @@ msgstr "不支援同步不同的擠出機驅動或噴嘴內腔體積類型。" msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgstr "將參數的修改同步到另一個擠出機的對應參數。" +msgid "Parameters with this icon can be configurable per nozzle." +msgstr "" + msgid "Click to reset all settings to the last saved preset." msgstr "點選以將所有設定還原到最後一次儲存的版本。" @@ -11874,6 +12029,12 @@ msgstr "可列印區域" msgid "Select the network agent implementation for printer communication. Available agents are registered at startup." msgstr "選擇列印裝置通訊的網路代理實施。可用代理在啟動時註冊。" +msgid "Belt printer" +msgstr "" + +msgid "Machine frame transforms" +msgstr "" + #. TRN: The first argument is the parameter's name; the second argument is its value. #, boost-format msgid "Invalid value provided for parameter %1%: %2%" @@ -11987,9 +12148,24 @@ msgstr "噴嘴直徑" msgid "Wipe tower" msgstr "換料塔" +msgid "Belt purge tower" +msgstr "" + msgid "Single extruder multi-material parameters" msgstr "單擠出機多線材參數" +msgid "IDEX/IQEX Configuration" +msgstr "" + +msgid "Pre-slice warnings" +msgstr "" + +msgid "Show a warning dialog before slicing if IDEX/IQEX parallel mode concerns are detected (bed temperature conflicts, filament type mismatches, multi-material conflicts). Can be suppressed from the dialog itself. Re-enable here if suppressed accidentally." +msgstr "" + +msgid "Modes" +msgstr "" + msgid "This is a single extruder multi-material printer, diameters of all extruders will be set to the new value. Do you want to proceed?" msgstr "這是一台單噴頭多材料列印機,所有噴頭的直徑將被設定為新的值。您要繼續嗎?" @@ -11999,6 +12175,18 @@ msgstr "層高限制" msgid "Z-Hop" msgstr "Z 軸抬升" +msgid "Front-left" +msgstr "" + +msgid "Front-right" +msgstr "" + +msgid "Rear-left" +msgstr "" + +msgid "Rear-right" +msgstr "" + msgid "" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "\n" @@ -12102,10 +12290,9 @@ msgstr "繼續" msgid "Don't warn again for this preset" msgstr "不再為此預設顯示警告" -# AI Translated #, c-format, boost-format -msgid "%s: %s" -msgstr "%s:%s" +msgid "%s %s" +msgstr "" # AI Translated msgid "No modifications need to be copied." @@ -12533,9 +12720,6 @@ msgstr "毫秒" msgid "Total ramming" msgstr "總擠出量" -msgid "Volume" -msgstr "體積" - msgid "Ramming line" msgstr "擠出線" @@ -12584,6 +12768,120 @@ msgstr "登入失敗。請再試一次。" msgid "parse json failed" msgstr "解析 json 失敗" +msgid "Loading…" +msgstr "" + +msgid "Welcome to Orca Slicer" +msgstr "歡迎使用 Orca Slicer" + +# AI Translated +msgid "Orca Slicer will be set up in several steps. Let's start!" +msgstr "Orca Slicer 將透過幾個步驟完成設定。讓我們開始吧!" + +msgid "Get Started" +msgstr "開始" + +msgid "Please select your login region" +msgstr "請選擇登入區域" + +msgid "Finish" +msgstr "完成" + +msgid "Printer Selection" +msgstr "選擇列印裝置" + +msgid "Vendors" +msgstr "" + +# AI Translated +msgid "Custom Printer" +msgstr "自訂列印裝置" + +msgid "Create" +msgstr "建立" + +msgid "Check for new printers" +msgstr "" + +msgid "At least one printer must be selected." +msgstr "至少需要選擇一款列印裝置。" + +msgid "New printers found" +msgstr "" + +#, c-format, boost-format +msgid "New printer vendors installed: %s" +msgstr "" + +msgid "New printer vendors were found, but installation was cancelled." +msgstr "" + +msgid "No new printers found." +msgstr "" + +msgid "Filament Selection" +msgstr "選擇線材" + +msgid "System Filaments" +msgstr "" + +msgid "Custom Filaments" +msgstr "" + +msgid "Create New" +msgstr "" + +msgid "Filament type" +msgstr "線材類型" + +msgid "Vendor" +msgstr "廠牌" + +msgid "No items" +msgstr "" + +msgid "Filter items" +msgstr "" + +msgid "Checked" +msgstr "" + +msgid "Unchecked" +msgstr "" + +msgid "Select filtered" +msgstr "" + +msgid "Clear all" +msgstr "清空" + +msgid "At least one filament must be selected." +msgstr "至少要選擇一款線材。" + +msgid "Do you want to use the default filament?" +msgstr "你希望使用預設的線材列表嗎?" + +msgid "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option." +msgstr "這會停用所有雲端功能,包括 Orca Cloud 設定檔同步。偏好完全離線工作的使用者可以啟用此選項。" + +msgid "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." +msgstr "注意:啟用無痕模式時,您的使用者設定檔將不會備份到 Orca Cloud。" + +msgid "Enable Stealth Mode." +msgstr "" + +msgid "Proprietary Plugins" +msgstr "" + +msgid "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers." +msgstr "" + +msgid "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk." +msgstr "" + +msgid "Install Bambu Network plug-in" +msgstr "安裝 Bambu 網路外掛" + msgid "[Action Required] " msgstr "[需要操作] " @@ -13042,6 +13340,14 @@ msgstr "線材變更擠出模式 G-code" msgid "No object can be printed. It may be too small." msgstr "沒有可列印的物件。可能是因為尺寸過小" +#, boost-format +msgid "The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. Printing in Primary mode instead. Assign the mode's tools in Printer Settings, or pick another mode from the plate's IDEX/IQEX button." +msgstr "" + +#, boost-format +msgid "This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer does not define. Printing in Primary mode instead. Pick a mode from the plate's IDEX/IQEX button, or restore the mode in Printer Settings." +msgstr "" + msgid "Your print is very close to the priming regions. Make sure there is no collision." msgstr "您的列印區域非常接近準備區域,請確認不會發生碰撞。" @@ -13214,6 +13520,26 @@ msgstr "驗證失敗" msgid "write callback failed" msgstr "寫入回呼失敗" +msgid "Multi-color prints in IDEX/IQEX parallel modes require each filament to have its own dedicated physical extruder. Two or more of the active filaments are routed to the same physical head via the printer's physical extruder map (an MMU/AFC manifold), which the slaved gantry cannot follow." +msgstr "" + +msgid "The active IDEX/IQEX mode does not define a primary tool, so multi-color printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes editor and assign a Primary role to one tool." +msgstr "" + +msgid "Multi-color in this mode isn't a parallel-print scenario — all of the active tools sit on a single gantry, so there's no second gantry being copied or mirrored to. Switch the plate to Primary mode for multi-color printing on a single gantry, or define an IDEX/IQEX mode that includes tools on a second gantry." +msgstr "" + +msgid "Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the primary's gantry — without one, the mode doesn't declare a within-gantry multicolor partner. Either reduce the print to a single filament, switch to Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a tool on the primary's gantry as Span." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% isn't routed to any tool. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + +#, boost-format +msgid "In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use filaments routed to %1%, or switch this plate to Primary mode." +msgstr "" + #, boost-format msgid "%1% is too close to exclusion area. There may be collisions when printing." msgstr "%1% 離淨空區域太近,可能會發生碰撞。" @@ -13264,6 +13590,43 @@ msgstr "如果您仍想列印,可以在「偏好設定 / 控制 / 切片 / 移 msgid "No extrusions under current settings." msgstr "根據目前設定,不會進行任何列印。" +msgid "Mixed filaments are not supported in IDEX/IQEX parallel modes. Switch this plate to Primary mode." +msgstr "" + +msgid "no configured tool" +msgstr "" + +#, boost-format +msgid "IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. Assign a filament loaded on T%2%, or switch this plate to Primary mode." +msgstr "" + +msgid "Raft is not compatible with belt printer mode." +msgstr "" + +msgid "Draft shield is not compatible with belt printer mode." +msgstr "" + +msgid "Brim is not compatible with spiral vase mode on a belt printer. Disable one of them." +msgstr "" + +msgid "The belt is too steep for a brim, so no brim will be generated." +msgstr "" + +msgid "A brim is only generated when the belt is tilted. Set a belt tilt angle, or remove the brim setting." +msgstr "" + +msgid "Belt printers support outer and inner brim only. Auto, Mouse ear and Painted brim are printed as Outer brim only, using Brim width." +msgstr "" + +msgid "Brim-object gap separates the leading brim from the object's leading edge, which is the edge it is meant to anchor. Set the gap to 0 when using leading brim length." +msgstr "" + +msgid "Leading brim length extends ahead of each object along the belt, and Arrange does not reserve that space. Leave room between objects." +msgstr "" + +msgid "\"Leading edge only\" brim applies to belt printers. On this printer it is printed as an ordinary outer brim." +msgstr "" + # AI Translated msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgstr "使用了漸層混合線材,但「混色子層」已停用。漸層將不會列印。" @@ -13274,6 +13637,15 @@ msgstr "逐件列印模式下不支援使用平滑模式的縮時錄影。" msgid "Clumping detection is not supported when \"by object\" sequence is enabled." msgstr "啟用“按物件”序列時,不支援結塊偵測。" +msgid "The belt purge tower is not generated in \"By object\" print sequence; filament changes will not be purged." +msgstr "" + +msgid "The belt purge tower is enabled but the project has no purge tower object; filament changes will not be purged. Open the project in the application to generate the tower." +msgstr "" + +msgid "The project contains multiple managed belt purge towers. Reload the plate or toggle the belt purge tower off and on to regenerate it." +msgstr "" + msgid "Enabling both precise Z height and the prime tower may cause slicing errors." msgstr "同時啟用精確 Z 高度和擦拭塔可能會導致切片錯誤。" @@ -13290,10 +13662,6 @@ msgstr "不支援在包含多個線材的列印中使用螺旋花瓶模式。" msgid "While the object %1% itself fits the build volume, it exceeds the maximum build volume height because of material shrinkage compensation." msgstr "物件 %1% 本身雖然符合建構體積,但由於材料收縮補償,導致其超出了最大建構高度限制。" -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "物件 %1% 超出了最大體積高度。" - #, boost-format msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." msgstr "物件 %1% 本身雖符合建構體積限制,但其最後一層超出了最大建構高度。" @@ -13301,6 +13669,10 @@ msgstr "物件 %1% 本身雖符合建構體積限制,但其最後一層超出 msgid "You might want to reduce the size of your model or change current print settings and retry." msgstr "您可能想要減小模型的尺寸或更改目前的列印設定並重試。" +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "物件 %1% 超出了最大體積高度。" + msgid "Variable layer height is not supported with Organic supports." msgstr "有機樹支撐不支持可變層高。" @@ -14221,12 +14593,39 @@ msgstr "內部橋接速度。如果該值以百分比表示,將基於 bridge_s msgid "This is the distance from the model to the outermost brim line." msgstr "從模型到 Brim 最外圈的距離" +msgid "Leading brim length" +msgstr "" + +msgid "" +"Belt printers only. Extends the brim AHEAD of the object along the belt, on every downhill-facing edge of its contact area - both the object's first contact with the belt and any island that lands later. This apron is laid onto the belt before the object reaches it, so the leading edge has something already stuck down to hold on to.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Leading brim length + Brim width ahead of the object. Set Brim-object gap to 0, or the apron will not touch the object it is meant to anchor.\n" +"\n" +"On a tilted belt each layer lays one strip of the brim, so the thickness of the resulting brim sheet is set by flow rather than by layer height. Use Brim flow ratio to tune it.\n" +"\n" +"Set to 0 to disable." +msgstr "" + +msgid "Extra brim width" +msgstr "" + +msgid "" +"Belt printers only. Widens the brim SIDEWAYS, across the belt, without extending it further ahead of or behind the object. Use it when a part needs more grip along its length than Brim width alone gives.\n" +"\n" +"Measured on the belt surface, and added on top of Brim width: the brim reaches Brim-object gap + Brim width + Extra brim width to either side of the object. To extend the brim ahead of the object instead, use Leading brim length.\n" +"\n" +"Set to 0 to disable." +msgstr "" + msgid "Brim type" msgstr "Brim 類型" msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analyzed and calculated automatically." msgstr "該參數控制在模型的外側和/或內側產生 Brim 。自動是指自動分析和計算邊框的寬度。" +msgid "Leading edge only" +msgstr "" + msgid "Brim-object gap" msgstr "Brim 與模型的間隙" @@ -15394,9 +15793,6 @@ msgstr "線材的價格。只用於統計資訊" msgid "money/kg" msgstr "元/公斤" -msgid "Vendor" -msgstr "廠牌" - msgid "Vendor of filament. For show only." msgstr "列印線材的廠牌。僅用於展示" @@ -15470,6 +15866,66 @@ msgstr "多線填充" msgid "Using multiple lines for the infill pattern, if supported by infill pattern." msgstr "為填充圖案使用多條線,如果填充圖案支援。" +msgid "Adaptive density (experimental)" +msgstr "" + +msgid "" +"Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the object towards its center. The sparse infill density is used at the surface and the interior density at the center.\n" +"Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, including the top and bottom, with the interior density at the point farthest from it:\n" +" - Distance warp: one continuous pattern, stretched and sheared where the distance changes across directions, as in plates and long parts.\n" +" - Smooth blend: the patterns of neighbouring densities blended into each other, with small loops where they meet.\n" +" - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their lines joined along the shell boundaries.\n" +" - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part joined to the rest by a narrower neck, is graded towards its own center.\n" +" - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density does not change along it." +msgstr "" + +msgid "Distance warp" +msgstr "" + +msgid "Smooth blend" +msgstr "" + +msgid "Stepped shells" +msgstr "" + +msgid "Lobes" +msgstr "" + +msgid "Normal Z" +msgstr "" + +msgid "Normal Y" +msgstr "" + +msgid "Normal X" +msgstr "" + +msgid "Interior density" +msgstr "" + +msgid "Density of the adaptive infill at the center of the object." +msgstr "" + +msgid "Adaptive gradient" +msgstr "" + +msgid "" +"How the density changes from the surface to the center of the object.\n" +"Linear: the density changes at a constant rate.\n" +"Quadratic: the density stays close to the sparse infill density near the surface and changes faster towards the center.\n" +"Exponential: the density changes quickly just below the surface and levels off towards the center." +msgstr "" + +# AI Translated +msgid "Linear" +msgstr "線性" + +msgid "Quadratic" +msgstr "" + +msgid "Exponential" +msgstr "" + msgid "Z-buckling bias optimization (experimental)" msgstr "Z 軸挫曲偏置最佳化(實驗性)" @@ -17683,6 +18139,99 @@ msgstr "單擠出機多線材" msgid "Use single nozzle to print multi filament." msgstr "使用單噴嘴列印多線材" +msgid "IDEX/IQEX Printer" +msgstr "" + +msgid "Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)." +msgstr "" + +msgid "Firmware-managed zones" +msgstr "" + +msgid "When enabled, the slicer emits g-code with the primary zone's contents centered on bed origin (0,0). The printer firmware is responsible for placing copies/mirrors at each physical zone position. Enable only on printers whose firmware applies its own zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX duplication mode). Has no effect in Primary mode." +msgstr "" + +msgid "Gantry Count" +msgstr "" + +msgid "Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)." +msgstr "" + +msgid "Tools per Gantry" +msgstr "" + +msgid "Number of independent toolheads per gantry along X. 2 for IDEX-style." +msgstr "" + +msgid "Tool 0 Position" +msgstr "" + +msgid "Physical position on the bed where tool T0 (index 0) is located. Determines how tool indices map to bed zones. For single-gantry setups (IDEX) only left/right matters; for dual-gantry setups (IQEX) all four corners are selectable (front = lower Y / near the operator, rear = higher Y / back of machine)." +msgstr "" + +msgid "Nozzle Clearance X" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary." +msgstr "" + +msgid "Nozzle Clearance Y" +msgstr "" + +msgid "Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary." +msgstr "" + +msgid "Safety Margin" +msgstr "" + +msgid "Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge." +msgstr "" + +msgid "Visualization Theme" +msgstr "" + +msgid "Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed." +msgstr "" + +msgid "Deuteranopia / Protanopia (red-green)" +msgstr "" + +msgid "Tritanopia (blue-yellow)" +msgstr "" + +msgid "High Contrast" +msgstr "" + +msgid "IDEX/IQEX Print Mode" +msgstr "" + +msgid "Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer → Multimaterial → IDEX/IQEX Configuration)." +msgstr "" + +msgid "IDEX/IQEX head filament map" +msgstr "" + +msgid "Per-plate override mapping physical heads to filament slots (1-based). Empty means use pem-inversion defaults." +msgstr "" + +msgid "IDEX/IQEX Mode Names" +msgstr "" + +msgid "Display names for each user-defined IDEX/IQEX parallel print mode." +msgstr "" + +msgid "IDEX/IQEX Mode Active Tools" +msgstr "" + +msgid "Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset." +msgstr "" + +msgid "IDEX/IQEX Mode G-codes" +msgstr "" + +msgid "G-code or macro call to inject at print start for each mode." +msgstr "" + msgid "Manual Filament Change" msgstr "手動更換線材" @@ -18059,6 +18608,130 @@ msgstr "門檻值疊加比例" msgid "If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support." msgstr "當門檻值角度設為 0 時,系統將為重疊比例低於該門檻值的懸垂部分產生支撐。數值越小,代表可以在不使用支撐的情況下列印更陡峭的懸垂結構。" +msgid "Build plate tilt X" +msgstr "" + +msgid "Tilt angle of the build plate along the X axis. A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. In belt printer mode, this is automatically synced to the belt angle." +msgstr "" + +msgid "Build plate tilt Y" +msgstr "" + +msgid "Tilt angle of the build plate along the Y axis. A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt." +msgstr "" + +msgid "Enable belt printing" +msgstr "" + +msgid "Enable belt printer mode. Belt printers use a conveyor belt as the build surface, tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane and transform G-code coordinates for the tilted build surface." +msgstr "" + +msgid "Infinite Y axis" +msgstr "" + +msgid "Enable infinite Y axis for belt printers. When enabled, the Y axis build volume limit is effectively removed, allowing objects of any length to be printed along the belt direction." +msgstr "" + +msgid "Belt tilt axis" +msgstr "" + +msgid "Axis the mesh is rotated about before slicing. This is the belt printer's tilt: an isometric (no distortion) rotation that also drives bed rendering and support gravity tilt, and that the g-code back-transform inverts before the machine-frame shear/scale and remap. X is the typical gantry tilt (belt travels along Y)." +msgstr "" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +# AI Translated +msgid "Z" +msgstr "Z" + +msgid "Belt tilt angle" +msgstr "" + +msgid "Tilt angle of the belt surface, in degrees. Most belt printers use 45°. Positive values rotate counter-clockwise looking down the positive tilt axis; the magnitude is also the physical belt tilt used for bed rendering and support gravity." +msgstr "" + +msgid "°" +msgstr "°" + +msgid "Decouple machine-frame tilt" +msgstr "" + +msgid "Expert override: set the machine-frame (g-code shear/scale) tilt angle independently of the pre-slice rotation angle. When disabled, the machine-frame transform is derived from the belt tilt angle, so a single angle drives both stages. Enable only to compensate for a machine whose physical gantry tilt differs from the slicing rotation." +msgstr "" + +msgid "Machine-frame tilt angle" +msgstr "" + +msgid "Tilt angle (degrees) used to derive the machine-frame shear (cot) and scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame tilt' is enabled; otherwise the belt tilt angle is used." +msgstr "" + +msgid "+X" +msgstr "" + +msgid "+Y" +msgstr "" + +msgid "+Z" +msgstr "" + +msgid "-X" +msgstr "" + +msgid "-Y" +msgstr "" + +msgid "-Z" +msgstr "" + +msgid "Rev X" +msgstr "" + +msgid "Rev Y" +msgstr "" + +msgid "Rev Z" +msgstr "" + +msgid "G-code remap X" +msgstr "" + +msgid "Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Y" +msgstr "" + +msgid "Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "G-code remap Z" +msgstr "" + +msgid "Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation." +msgstr "" + +msgid "Support Floor Z offset" +msgstr "" + +msgid "Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues." +msgstr "" + +msgid "Enable belt purge tower" +msgstr "" + +msgid "Belt-printer replacement for the wipe/prime tower. When enabled on a belt printer, a purge prism is automatically generated next to the printed parts and filament-change purging is routed into it (the classic wipe tower cannot be used on belt printers because its G-code bypasses the belt transform). Only available on belt printers." +msgstr "" + +msgid "Belt purge tower width" +msgstr "" + +msgid "Width (machine X, across the belt) of the purge prism that is automatically generated on belt printers when the belt purge tower is enabled and multiple filaments are used. Filament-change purging is routed into this prism's extrusions instead of a classic wipe tower. Its height is computed automatically from the worst-case purge volume per layer: a wider prism results in a shorter one." +msgstr "" + msgid "Tree support branch angle" msgstr "樹狀支撐分支角度" @@ -18231,17 +18904,11 @@ msgstr "當切片時,如果透過頂部殼層計算的厚度小於設定值, msgid "Separated infills" msgstr "分離填充" -# AI Translated msgid "" "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" -"Affects line and grid patterns and rotation-template infills.\n" -"Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +"Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for the whole object and is unaffected." msgstr "" -"將每個零件的內部填充以其自身為中心,如同它是單獨切片一樣,而非以整個組件為中心。相互接觸或重疊的零件會被視為一個實體並共用一個中心;分離的零件(或不同的 3D 物件)則各自擁有自己的中心。\n" -"適用於組件中分組了多個各自應保持一致、以自身為中心之填充的物件時。\n" -"會影響線形與網格圖樣以及旋轉範本填充。\n" -"鎖定為全域座標的圖樣(螺旋體、蜂巢、TPMS…)則不受影響。" # AI Translated msgid "Center surface pattern on" @@ -18474,6 +19141,12 @@ msgstr "更換線材後的沖洗動作將在物件的支撐結構內進行,可 msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "此物件將用於更換線材後進行噴嘴清洗,從而節省線材並縮短列印時間。但物件的顏色會因此被混合。此功能需啟用換料塔後才會生效。" +msgid "Belt purge tower object" +msgstr "" + +msgid "Marks the auto-generated belt purge prism. Managed automatically; do not set manually." +msgstr "" + msgid "Maximal bridging distance" msgstr "最大橋接距離" @@ -19363,8 +20036,8 @@ msgstr "用於切片的印表裝置名稱。" msgid "Layer number" msgstr "層數" -msgid "Index of the current layer. One-based (i.e. first layer is number 1)." -msgstr "當層數 (第一層為一)" +msgid "Index of the current layer. Zero-based (i.e. first layer is number 0), except in extrusion role change G-code, where it is one-based." +msgstr "" msgid "Layer Z" msgstr "層 z 高" @@ -19508,9 +20181,6 @@ msgstr "重新校正" msgid "Calibrate" msgstr "校正" -msgid "Finish" -msgstr "完成" - msgid "How can I use calibration results?" msgstr "如何使用校正結果?" @@ -20049,12 +20719,12 @@ msgstr "" "加速度值必須大於速度值。\n" "請驗證輸入。" +msgid "Not enabled yet on belt printers — use the PA Tower method instead." +msgstr "" + msgid "Temperature calibration" msgstr "溫度校正" -msgid "Filament type" -msgstr "線材類型" - msgid "PLA" msgstr "PLA" @@ -20076,6 +20746,12 @@ msgstr "PA-CF" msgid "PET-CF" msgstr "PET-CF" +msgid "Test model" +msgstr "測試模型" + +msgid "Overhang" +msgstr "" + msgid "Start temp: " msgstr "起始溫度: " @@ -20201,9 +20877,6 @@ msgstr "起始回抽長度:" msgid "End retraction length: " msgstr "結束回抽長度:" -msgid "Test model" -msgstr "測試模型" - msgid "Ringing Tower" msgstr "振鈴塔" @@ -20630,9 +21303,6 @@ msgstr "例如:基本、霧面、絲光、大理石" msgid "Filament Preset" msgstr "線材預設" -msgid "Create" -msgstr "建立" - msgid "Vendor is not selected; please reselect vendor." msgstr "廠牌尚未選擇,請重新選擇廠牌。" @@ -20940,6 +21610,9 @@ msgstr "" "列印裝置及所有屬於該列印裝置的線材和處理預設設定。 \n" "可以與他人分享。" +msgid "Include custom bed texture and model" +msgstr "" + msgid "" "User's filament preset set.\n" "Can be shared with others." @@ -21688,9 +22361,6 @@ msgstr "手動將線材分配到左側或右側噴嘴" msgid "Global settings" msgstr "全域性設定" -msgid "Video tutorial" -msgstr "影片指南" - msgid "(Sync with printer)" msgstr "(與列印裝置同步)" @@ -22090,6 +22760,33 @@ msgstr "若啟用,上述數值會儲存為未來 STEP 匯入所使用的預設 msgid "PresetBundle" msgstr "設定檔組" +msgid "Export Presets" +msgstr "" + +msgid "Open folder in explorer" +msgstr "" + +msgid "Delete bundle" +msgstr "" + +msgid "Unsubscribe bundle" +msgstr "" + +msgid "Update available" +msgstr "" + +msgid "Unauthorized bundle" +msgstr "" + +msgid "Open this bundle in your browser" +msgstr "" + +msgid "Subscribed" +msgstr "" + +msgid "Local" +msgstr "" + msgid "Bundle folder does not exist." msgstr "設定檔組資料夾不存在。" @@ -22123,6 +22820,12 @@ msgstr "取消訂閱設定檔組" msgid "ExportPresetBundle" msgstr "匯出設定檔組" +msgid "Export to OrcaCloud" +msgstr "" + +msgid "Export to folder" +msgstr "" + msgid "Save preset bundle" msgstr "儲存設定檔組" @@ -26533,213 +27236,6 @@ msgstr "此字型中沒有該文字的字形輪廓" msgid "Size: %.1f × %.1f mm" msgstr "尺寸:%.1f × %.1f mm" -# AI Translated -msgid "Primitive" -msgstr "標準模型" - -# AI Translated -msgid "Empty mesh generated" -msgstr "產生了空的網格" - -# AI Translated -#. TRN Default name of an object created from the box primitive shape. -msgid "Box" -msgstr "長方體" - -# AI Translated -#. TRN Primitive gizmo: label in front of the preset cube size buttons -msgid "Quick:" -msgstr "快速:" - -# AI Translated -msgid "Width (X)" -msgstr "寬度 (X)" - -# AI Translated -msgid "Depth (Y)" -msgstr "深度 (Y)" - -# AI Translated -msgid "Height (Z)" -msgstr "高度 (Z)" - -# AI Translated -#. TRN Primitive gizmo: bottom radius of a cone ("Top R" is the top radius) -msgid "Bottom R" -msgstr "底部半徑" - -# AI Translated -msgid "Top R" -msgstr "頂部半徑" - -# AI Translated -#. TRN Primitive gizmo: major radius of a torus ("Minor R" is the tube radius) -msgid "Major R" -msgstr "主半徑" - -# AI Translated -msgid "Minor R" -msgstr "次半徑" - -# AI Translated -msgid "All edges" -msgstr "所有邊" - -# AI Translated -msgid "Top edges" -msgstr "頂部邊" - -# AI Translated -msgid "Bottom edges" -msgstr "底部邊" - -# AI Translated -msgid "Lateral edges" -msgstr "側邊" - -# AI Translated -msgid "Mesh resolution" -msgstr "網格解析度" - -# AI Translated -msgid "Add Shape" -msgstr "新增形狀" - -# AI Translated -msgid "No outer profile" -msgstr "沒有外輪廓" - -# AI Translated -msgid "Failed to make outer face" -msgstr "無法建立外部面" - -# AI Translated -msgid "Failed to build face with holes" -msgstr "無法建立帶孔的面" - -# AI Translated -msgid "Revolve failed" -msgstr "迴轉失敗" - -# AI Translated -msgid "Profile" -msgstr "輪廓" - -# AI Translated -msgid "Start new profile (for holes)" -msgstr "開始新輪廓(用於孔洞)" - -# AI Translated -msgid "Segments" -msgstr "段數" - -# AI Translated -msgid "Sides" -msgstr "邊數" - -# AI Translated -msgid "Click on canvas to draw" -msgstr "在畫布上點選以繪製" - -# AI Translated -msgid "Snap to grid" -msgstr "貼齊格線" - -# AI Translated -msgid "Grid step" -msgstr "格線間距" - -# AI Translated -msgid "Outer" -msgstr "外輪廓" - -# AI Translated -msgid "closed" -msgstr "已封閉" - -# AI Translated -#. TRN Sketch gizmo profile list: "Outer" or "Hole", profile number, point count, "closed" or nothing -#, boost-format -msgid "%1% %2%: %3% points %4%" -msgstr "%1% %2%:%3% 個點 %4%" - -# AI Translated -msgid "XY (Top)" -msgstr "XY(頂部)" - -# AI Translated -msgid "XZ (Front)" -msgstr "XZ(前面)" - -# AI Translated -msgid "YZ (Side)" -msgstr "YZ(側面)" - -# AI Translated -msgid "Revolve deg" -msgstr "迴轉角度" - -# AI Translated -msgid "Set to 0 for extrude, >0 for revolve" -msgstr "設為 0 表示擠出,大於 0 表示迴轉" - -# AI Translated -msgid "Pocket (cut)" -msgstr "挖槽(切除)" - -# AI Translated -#, c-format -msgid "%zu closed profile" -msgid_plural "%zu closed profiles" -msgstr[0] "%zu 個封閉輪廓" - -# AI Translated -msgid "Draw a closed profile to enable" -msgstr "請繪製封閉輪廓以啟用" - -# AI Translated -msgid "Clear all" -msgstr "全部清除" - -# AI Translated -msgid "Empty result" -msgstr "結果為空" - -# AI Translated -#, boost-format -msgid "Extrude: %1%" -msgstr "擠出:%1%" - -# AI Translated -#, boost-format -msgid "Revolve: %1%" -msgstr "迴轉:%1%" - -# AI Translated -msgid "No object selected" -msgstr "未選取物件" - -# AI Translated -msgid "Face failed" -msgstr "建立面失敗" - -# AI Translated -msgid "Face with holes failed" -msgstr "建立帶孔的面失敗" - -# AI Translated -msgid "Tool mesh empty" -msgstr "工具網格為空" - -# AI Translated -msgid "Pocket added (negative volume)" -msgstr "已新增挖槽(負體積)" - -# AI Translated -#, boost-format -msgid "Pocket: %1%" -msgstr "挖槽:%1%" - # AI Translated msgctxt "Keyboard Shortcut" msgid "Ins" @@ -26868,6 +27364,9 @@ msgstr "組裝" msgid "Gizmo brim ears" msgstr "擴邊耳工具" +msgid "Gizmo texture displacement painting" +msgstr "" + msgid "Vertical slider - Move active thumb Up" msgstr "垂直滑動條 - 向上移動一層" @@ -27849,10 +28348,6 @@ msgstr "我的設定" msgid "Custom Printer Setup" msgstr "自訂列印裝置設定" -# AI Translated -msgid "Custom Printer" -msgstr "自訂列印裝置" - # AI Translated msgid "Define a custom printer profile" msgstr "定義自訂列印裝置設定檔" @@ -28497,9 +28992,8 @@ msgstr "角度門檻 - 填充會在比此角度更銳利的邊處停止" msgid "Click a triangle to paint it" msgstr "點選三角形即可繪製" -# AI Translated -msgid "Needs the active layer mapped with Unwrap (LSCM)." -msgstr "需要目前圖層使用「展開 (LSCM)」映射。" +msgid "Only for a layer mapped with Unwrap (LSCM) - set the active layer's Mapping to Unwrap to use this view." +msgstr "" # AI Translated msgid "Normal - the real geometry, exactly what Bake will produce. Slower to update" @@ -28513,17 +29007,15 @@ msgstr "快速 - 浮雕僅以著色呈現而非實際建構,且只顯示正在 msgid "Checker" msgstr "棋盤格" -# AI Translated -msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" -msgstr "棋盤格 - 以測試網格取代紋理。方格維持正方形之處,紋理不會變形;方格被拉伸之處,紋理也會被拉伸" +msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Distortion" msgstr "變形" -# AI Translated -msgid "Distortion - blue-to-red stretch heatmap over the unwrap" -msgstr "變形 - 在展開結果上以藍到紅的熱圖顯示拉伸程度" +msgid "Distortion - blue-to-red stretch heatmap over the unwrap. Opens the UV editor if it is closed" +msgstr "" # AI Translated msgid "Wireframe - overlay the mesh edges; independent of the view above" @@ -28639,24 +29131,11 @@ msgstr "混合線材" msgid "Interleaves two filaments to fake the colors in between, so a handful of filaments can cover a photo or a gradient. An image of flat colors prints the same either way. Off uses one filament per area." msgstr "交錯使用兩種線材來模擬兩者之間的顏色,讓少數幾種線材也能呈現照片或漸層。純色影像無論開關與否,列印結果都相同。關閉時每個區域只使用一種線材。" -# AI Translated -msgid "Mix by" -msgstr "混合方式" +msgid "Mixed colors" +msgstr "" -# AI Translated -msgctxt "Texture Displacement" -msgid "Surface" -msgstr "表面" - -# AI Translated -msgid "" -"Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" -"Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" -"Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +msgid "The most mixed filaments a bake may add. They are picked from the texture's colors, and only the ones the bake actually uses are created." msgstr "" -"層:兩種線材在列印層之間交替,在直立表面上混合平順,但在朝上或朝下的平面上會消失,因為整層只是單一色帶。\n" -"表面:在表面上形成細密的棋盤格,任何角度都適用,但看起來可能像紋理而非混色。\n" -"自動:直立面採用層交替;平面則採用較接近的單一線材,因為棋盤格在平面上會顯現為圖案。" # AI Translated #, boost-format @@ -29116,14 +29595,6 @@ msgstr "需要約 %1% 個三角形,預算為 %2% - 固化將會簡化網格並 msgid "How many thousand triangles the refinement may add to the model. The triangle that fits worst is always split first, so even a run that spends the lot has spent it where it shows most. Raise it if the relief still looks coarse." msgstr "細化可在模型上增加多少千個三角形。最不貼合的三角形一律優先分割,因此即使用完全部預算,也是用在最明顯的地方。若浮雕看起來仍然粗糙,請調高此值。" -# AI Translated -msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." -msgstr "停止固化。已完成的部分會保留在模型上,且可以復原。" - -# AI Translated -msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." -msgstr "關閉工具而不進行固化。您的繪製、圖層與設定都會保留在模型上。" - # AI Translated msgid "Preparing..." msgstr "準備中..." @@ -29148,6 +29619,14 @@ msgstr "藉由移動現有的頂點,將繪製的高度圖轉換為真實幾何 msgid "Turn the painted height maps into real geometry. The mesh is remeshed to an even density and refined where the texture bends first, so the detail has vertices to land on - all in one step." msgstr "將繪製的高度圖轉換為真實幾何。網格會先重新網格化為均勻密度,並在紋理彎折處細化,讓細節有頂點可以落腳 - 全部一步完成。" +# AI Translated +msgid "Stops the bake. Whatever it had already finished stays on the model, and can be undone." +msgstr "停止固化。已完成的部分會保留在模型上,且可以復原。" + +# AI Translated +msgid "Closes the tool without baking. Your paint, layers and settings stay with the model." +msgstr "關閉工具而不進行固化。您的繪製、圖層與設定都會保留在模型上。" + # AI Translated #, boost-format msgid "%1% k" @@ -29364,6 +29843,28 @@ msgstr "線材外掛" msgid "Printer plugins" msgstr "列印裝置外掛" +msgid "This preset does not use any plugin capabilities" +msgstr "" + +msgid "Capabilities used by this preset" +msgstr "" + +msgid "Capability configuration (JSON)" +msgstr "" + +msgid "Plugin configuration" +msgstr "" + +msgid "Discard this preset's override and use the global configuration again" +msgstr "" + +# AI Translated +msgid "Restore defaults" +msgstr "還原預設值" + +msgid "Invalid JSON" +msgstr "" + # AI Translated msgid "The configuration is not valid JSON. Your changes were not saved." msgstr "設定不是有效的 JSON。您的變更未儲存。" @@ -29383,10 +29884,6 @@ msgstr "" "\n" "這會捨棄此預設中的覆寫值,並改用全域設定。" -# AI Translated -msgid "Restore defaults" -msgstr "還原預設值" - # AI Translated msgid "Using global configuration. Save the preset to persist it." msgstr "正在使用全域設定。請儲存預設以保留此設定。" @@ -29456,6 +29953,215 @@ msgstr "正在安裝外掛" msgid "Installed \"%s\"." msgstr "已安裝「%s」。" +msgid "Search plugins" +msgstr "" + +msgid "Clear search" +msgstr "" + +msgid "Match case" +msgstr "" + +msgid "Match whole word" +msgstr "" + +msgid "More plugin install options" +msgstr "" + +msgid "Install plugin" +msgstr "" + +msgid "Install local plugin" +msgstr "" + +msgid "Activate" +msgstr "" + +msgid "Sort by name" +msgstr "" + +msgid "Sort by version" +msgstr "" + +msgid "Plugin Version" +msgstr "" + +msgid "Sort by source" +msgstr "" + +msgid "Source" +msgstr "" + +msgid "Sort by status" +msgstr "" + +msgctxt "Plugin" +msgid "Status" +msgstr "" + +msgid "Drag to resize; double-click to reset" +msgstr "" + +msgid "Resize the plugin list" +msgstr "" + +msgid "Plugin details" +msgstr "" + +msgid "Plugin Info" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Config" +msgstr "" + +msgid "Changelog" +msgstr "" + +msgid "Diagnostics" +msgstr "" + +msgid "Types" +msgstr "" + +msgid "Installed Version" +msgstr "" + +msgid "Latest Version" +msgstr "" + +msgid "Update to the latest version" +msgstr "" + +msgid "No description available" +msgstr "" + +msgid "Select a plugin to configure its capabilities" +msgstr "" + +msgid "Configurable capabilities" +msgstr "" + +msgid "Discard the settings saved for this capability and restore the plugin's defaults" +msgstr "" + +msgid "Plugin changelog" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Changes" +msgstr "" + +msgid "No changelog available" +msgstr "" + +msgid "No issues detected" +msgstr "" + +msgid "No plugins found" +msgstr "" + +#, c-format, boost-format +msgid "No plugins match \"%s\"" +msgstr "" + +msgid "Mine" +msgstr "" + +msgid "Orphaned" +msgstr "" + +msgid "Some plugin capabilities are enabled" +msgstr "" + +#, c-format, boost-format +msgid "Collapse %s capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Expand %s capabilities" +msgstr "" + +msgid "Collapse capabilities" +msgstr "" + +msgid "Expand capabilities" +msgstr "" + +msgid "Open this plugin in your browser" +msgstr "" + +#, c-format, boost-format +msgid "Capabilities: %s" +msgstr "" + +msgctxt "Plugin" +msgid "Capabilities" +msgstr "" + +#, c-format, boost-format +msgid "Run \"%s\"" +msgstr "" + +#, c-format, boost-format +msgid "Enable %s" +msgstr "" + +msgid "Unauthorized for updates" +msgstr "" + +msgid "Loading the plugin…" +msgstr "" + +msgid "This plugin exposes no capabilities" +msgstr "" + +msgid "Activate this plugin to configure its capabilities" +msgstr "" + +msgid "View on OrcaCloud here" +msgstr "" + +msgid "Activated" +msgstr "" + +msgid "Runtime error" +msgstr "" + +msgid "Inactive" +msgstr "" + +msgid "This plugin is active and ready to be used." +msgstr "" + +msgid "This plugin is still loading." +msgstr "" + +msgid "This plugin is blocked until its error is fixed." +msgstr "" + +msgid "This plugin is loaded but a capability reported an error." +msgstr "" + +msgid "This plugin is inactive. Activate it to install or load it." +msgstr "" + +msgid "Select a plugin to view its status and details." +msgstr "" + +msgid "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used." +msgstr "" + +msgid "A newer plugin version is available." +msgstr "" + +msgid "Cloud updates are unavailable because this plugin is unauthorized for updates." +msgstr "" + # AI Translated #, c-format, boost-format msgid "Failed to activate \"%s\"." @@ -29672,6 +30378,54 @@ msgstr "重新載入外掛失敗。" msgid "Reloaded \"%s\"." msgstr "已重新載入「%s」。" +msgid "Printer Connection" +msgstr "" + +msgid "Please set up your printer connection to view the device." +msgstr "" + +msgid "No model information" +msgstr "沒有模型相關資訊" + +msgid "Edit Project Info" +msgstr "編輯專案資訊" + +msgid "Model Information" +msgstr "" + +msgid "Accessories" +msgstr "" + +msgid "Profile Information" +msgstr "" + +msgid "Model name" +msgstr "" + +msgid "Created by" +msgstr "" + +msgid "Remixed by" +msgstr "" + +msgid "Shared by" +msgstr "" + +msgid "Model description" +msgstr "" + +msgid "BOM" +msgstr "" + +msgid "Profile name" +msgstr "" + +msgid "Profile Author" +msgstr "" + +msgid "Profile description" +msgstr "" + # AI Translated msgid "Purge Mode Settings" msgstr "清理模式設定" @@ -29696,6 +30450,16 @@ msgstr "減少清理廢料並加快列印。可能會造成輕微混色或細小 msgid "Terminal" msgstr "終端機" +msgid "python ... or uv ..." +msgstr "" + +msgid "Plugin terminal ready." +msgstr "" + +#, c-format, boost-format +msgid "Process exited with code: %s" +msgstr "" + # AI Translated msgid "A command is already running." msgstr "已有指令正在執行。" @@ -29962,6 +30726,9 @@ msgstr " | 吸附:開啟" msgid "Change texture - choose another one from the texture library" msgstr "更換紋理 - 從紋理庫中選擇另一個" +msgid "The active layer's tile size: how much of the model one repeat of the texture covers. The canvas is measured in tiles, so one grid cell is one repeat. Change it with Tiling in the layer's settings." +msgstr "" + # AI Translated msgid "Height map - show the layer's texture under the islands" msgstr "高度圖 - 在 UV 島下方顯示圖層的紋理" @@ -29994,17 +30761,14 @@ msgstr "連接 UV 島" msgid "Lay the unwrap out as a connected net: pieces that share an edge are unfolded next to each other (a cube becomes a joined net rather than six loose squares). They stay separate islands, so you can still move any of them by hand afterwards." msgstr "將展開結果排列成相連的展開圖:共用邊的區塊會相鄰展開(立方體會變成相連的展開圖,而不是六個分散的正方形)。它們仍是各自獨立的 UV 島,因此之後仍可手動移動任一個。" -# AI Translated -msgid "Island - move, rotate and scale whole islands" -msgstr "UV 島 - 移動、旋轉與縮放整個 UV 島" +msgid "Island - work on whole islands. Click one to select it, then drag to move it, right-drag to rotate it, or press R to rotate and S to scale with the mouse (click or Enter to confirm, Esc to cancel)." +msgstr "" -# AI Translated -msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" -msgstr "頂點 - 拖曳頂點以調整形狀;按 Shift/Ctrl 可多選" +msgid "Vertex - drag vertices to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" -# AI Translated -msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" -msgstr "邊 - 拖曳邊以調整形狀;按 Shift/Ctrl 可多選" +msgid "Edge - drag edges to reshape an island by hand; Shift adds to the selection, Ctrl toggles one in or out of it." +msgstr "" # AI Translated msgid "Mark seams - click edges on the model to cut the unwrap along them. The edge under the cursor is highlighted yellow; click to mark it red, click a red edge again to unmark it. Painting is paused while this is on." @@ -30042,9 +30806,13 @@ msgstr "清除 UV 編輯 - 捨棄所有手動移動的頂點/邊,並將展開 msgid "Snap - stick islands together when dragging one against another" msgstr "吸附 - 將一個 UV 島拖曳靠近另一個時,使兩者貼合在一起" -# AI Translated -msgid "Frame all islands (Home)" -msgstr "置中顯示所有 UV 島 (Home)" +msgid "" +"Frame all islands, fitting every one of them in view (Home or F).\n" +"Elsewhere on the canvas: scroll to zoom around the cursor, and middle-drag - or drag empty space - to pan." +msgstr "" + +msgid "What is selected, and the exact figures of the move, rotation or scale while you drag one." +msgstr "" # AI Translated msgid "No layer mapped with Unwrap" @@ -30055,6 +30823,9 @@ msgstr "沒有使用「展開」映射的圖層" msgid "%.1f mm tile" msgstr "%.1f mm 平鋪" +msgid "The pane follows the active texture layer, and that layer has to be mapped with Unwrap (LSCM). Add a layer and set its Mapping to Unwrap." +msgstr "" + # AI Translated msgid "Out of date - the paint, the seams or the seam angle changed since this unwrap was made. Press to unwrap again." msgstr "已過期 - 自此次展開後,繪製、縫合線或縫合線角度已變更。按下即可重新展開。" @@ -30063,19 +30834,48 @@ msgstr "已過期 - 自此次展開後,繪製、縫合線或縫合線角度已 msgid "Flatten the painted area into UV islands. It is computed only when you press this, not on every edit - so paint, change the seam angle or mark seams first, then press Unwrap." msgstr "將繪製區域攤平為 UV 島。只有在按下此按鈕時才會計算,而非每次編輯都計算 - 因此請先繪製、變更縫合線角度或標記縫合線,再按「展開」。" +msgid "Turn Mark seams on first - Path is a quicker way of marking them." +msgstr "" + +msgid "No seams are marked on this layer." +msgstr "" + +msgid "No islands have been reshaped by hand, so there is nothing to discard." +msgstr "" + # AI Translated #, c-format, boost-format msgid "%d islands, %s faces" msgstr "%d 個 UV 島,%s 個面" +msgid "How the painted area came out of the unwrap: the number of separate pieces it was cut into (at the seams and at edges sharper than the seam angle), and how many triangles they hold in total." +msgstr "" + +msgid "Press Unwrap first - there are no islands to work on yet." +msgstr "" + +msgid "Click an island on the canvas first, in Island mode." +msgstr "" + +msgid "Not signed in" +msgstr "" + +msgid "Bambu Network plug-in not detected. Click here to install it." +msgstr "沒有發現 Bambu 網路外掛,請下載並安裝。" + +msgid "Create new project" +msgstr "建立一個新專案" + +msgid "Recently opened" +msgstr "最近開啟檔案" + +msgid "Open Containing Folder" +msgstr "開啟所在的資料夾" + # AI Translated msgid "Forward" msgstr "前進" -# AI Translated -msgid "Tools" -msgstr "工具" - # AI Translated msgid "View Source" msgstr "檢視原始碼" @@ -30221,6 +31021,16 @@ msgstr "" "外掛「%s」正在請求執行下列命令:\n" "%s" +#, c-format, boost-format +msgid "Plugin \"%s\" is requesting permission to create a thread." +msgstr "" + +#, c-format, boost-format +msgid "" +"Plugin \"%s\" is requesting to replace the running application with:\n" +"%s" +msgstr "" + # AI Translated #, c-format, boost-format msgid "Plugin \"%s\" is requesting permission for the Python audit event \"%s\"." @@ -30230,6 +31040,30 @@ msgstr "外掛「%s」正在請求 Python 稽核事件「%s」的權限。" msgid "Plugin permission request" msgstr "外掛權限請求" +msgid "Printer connection" +msgstr "" + +msgid "Pages" +msgstr "" + +msgid "Analysis" +msgstr "" + +msgid "Importer" +msgstr "" + +msgid "Exporter" +msgstr "" + +msgid "Visualization" +msgstr "" + +msgid "Script" +msgstr "" + +msgid "Slicing Pipeline" +msgstr "" + # AI Translated msgid "The plugin's configuration UI was empty. Showing the default editor." msgstr "外掛的設定介面為空。將顯示預設編輯器。" @@ -30837,6 +31671,310 @@ msgstr "" "避免翹曲\n" "您知道嗎?當列印容易翹曲的材料(如 ABS)時,適當提高熱床溫度可以降低翹曲的機率。" +#~ msgid "" +#~ "The Microsoft WebView2 Runtime could not be installed.\n" +#~ "Some features, including the setup wizard, may appear blank until it is installed.\n" +#~ "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer." +#~ msgstr "" +#~ "無法安裝 Microsoft WebView2 Runtime。\n" +#~ "在安裝完成前,包括設定精靈在內的部分功能可能顯示為空白。\n" +#~ "請從 https://developer.microsoft.com/microsoft-edge/webview2/ 手動安裝,然後重新啟動 Orca Slicer。" + +#~ msgid "Why this grouping" +#~ msgstr "為何這樣分組" + +#~ msgid "The software does not support using different diameter of nozzles for one print. If the left and right nozzles are inconsistent, we can only proceed with single-head printing. Please confirm which nozzle you would like to use for this project." +#~ msgstr "軟體不支援在一次列印中使用不同直徑的噴嘴。如果左右噴嘴不一致,只能進行單頭列印。請確認您要在此專案中使用哪個噴嘴。" + +#~ msgid "Switch diameter" +#~ msgstr "切換直徑" + +#~ msgid "BambuStudio Project" +#~ msgstr "BambuStudio 專案" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Found unrecognized settings:" +#~ msgstr "此 3MF 由 BambuStudio(版本 %s)建立,其版本比相容版本 %s 更新。發現無法辨識的設定:" + +#, c-format, boost-format +#~ msgid "The 3MF was created by BambuStudio (version %s), which is newer than the compatible version %s. Some settings may not be fully compatible." +#~ msgstr "此 3MF 由 BambuStudio(版本 %s)建立,該版本新於相容版本 %s。部分設定可能無法完全相容。" + +#~ msgid "The 3MF was created by BambuStudio. Some settings may differ from OrcaSlicer." +#~ msgstr "此 3MF 由 BambuStudio 建立。部分設定可能與 OrcaSlicer 不同。" + +# AI Translated +#~ msgid "Cannot undo or redo while an operation is running. Stop it first." +#~ msgstr "操作執行期間無法復原或重做。請先停止該操作。" + +# AI Translated +#, c-format, boost-format +#~ msgid "%s: %s" +#~ msgstr "%s:%s" + +# AI Translated +#~ msgid "" +#~ "Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts (or distinct 3D objects) each get their own.\n" +#~ "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n" +#~ "Affects line and grid patterns and rotation-template infills.\n" +#~ "Patterns locked to global coordinates (Gyroid, Honeycomb, TPMS, ...) are unaffected." +#~ msgstr "" +#~ "將每個零件的內部填充以其自身為中心,如同它是單獨切片一樣,而非以整個組件為中心。相互接觸或重疊的零件會被視為一個實體並共用一個中心;分離的零件(或不同的 3D 物件)則各自擁有自己的中心。\n" +#~ "適用於組件中分組了多個各自應保持一致、以自身為中心之填充的物件時。\n" +#~ "會影響線形與網格圖樣以及旋轉範本填充。\n" +#~ "鎖定為全域座標的圖樣(螺旋體、蜂巢、TPMS…)則不受影響。" + +#~ msgid "Index of the current layer. One-based (i.e. first layer is number 1)." +#~ msgstr "當層數 (第一層為一)" + +#~ msgid "Video tutorial" +#~ msgstr "影片指南" + +# AI Translated +#~ msgid "Primitive" +#~ msgstr "標準模型" + +# AI Translated +#~ msgid "Empty mesh generated" +#~ msgstr "產生了空的網格" + +# AI Translated +#~ msgid "Box" +#~ msgstr "長方體" + +# AI Translated +#~ msgid "Quick:" +#~ msgstr "快速:" + +# AI Translated +#~ msgid "Width (X)" +#~ msgstr "寬度 (X)" + +# AI Translated +#~ msgid "Depth (Y)" +#~ msgstr "深度 (Y)" + +# AI Translated +#~ msgid "Height (Z)" +#~ msgstr "高度 (Z)" + +# AI Translated +#~ msgid "Bottom R" +#~ msgstr "底部半徑" + +# AI Translated +#~ msgid "Top R" +#~ msgstr "頂部半徑" + +# AI Translated +#~ msgid "Major R" +#~ msgstr "主半徑" + +# AI Translated +#~ msgid "Minor R" +#~ msgstr "次半徑" + +# AI Translated +#~ msgid "All edges" +#~ msgstr "所有邊" + +# AI Translated +#~ msgid "Top edges" +#~ msgstr "頂部邊" + +# AI Translated +#~ msgid "Bottom edges" +#~ msgstr "底部邊" + +# AI Translated +#~ msgid "Lateral edges" +#~ msgstr "側邊" + +# AI Translated +#~ msgid "Mesh resolution" +#~ msgstr "網格解析度" + +# AI Translated +#~ msgid "Add Shape" +#~ msgstr "新增形狀" + +# AI Translated +#~ msgid "No outer profile" +#~ msgstr "沒有外輪廓" + +# AI Translated +#~ msgid "Failed to make outer face" +#~ msgstr "無法建立外部面" + +# AI Translated +#~ msgid "Failed to build face with holes" +#~ msgstr "無法建立帶孔的面" + +# AI Translated +#~ msgid "Revolve failed" +#~ msgstr "迴轉失敗" + +# AI Translated +#~ msgid "Profile" +#~ msgstr "輪廓" + +# AI Translated +#~ msgid "Start new profile (for holes)" +#~ msgstr "開始新輪廓(用於孔洞)" + +# AI Translated +#~ msgid "Segments" +#~ msgstr "段數" + +# AI Translated +#~ msgid "Sides" +#~ msgstr "邊數" + +# AI Translated +#~ msgid "Click on canvas to draw" +#~ msgstr "在畫布上點選以繪製" + +# AI Translated +#~ msgid "Snap to grid" +#~ msgstr "貼齊格線" + +# AI Translated +#~ msgid "Grid step" +#~ msgstr "格線間距" + +# AI Translated +#~ msgid "Outer" +#~ msgstr "外輪廓" + +# AI Translated +#~ msgid "closed" +#~ msgstr "已封閉" + +# AI Translated +#, boost-format +#~ msgid "%1% %2%: %3% points %4%" +#~ msgstr "%1% %2%:%3% 個點 %4%" + +# AI Translated +#~ msgid "XY (Top)" +#~ msgstr "XY(頂部)" + +# AI Translated +#~ msgid "XZ (Front)" +#~ msgstr "XZ(前面)" + +# AI Translated +#~ msgid "YZ (Side)" +#~ msgstr "YZ(側面)" + +# AI Translated +#~ msgid "Revolve deg" +#~ msgstr "迴轉角度" + +# AI Translated +#~ msgid "Set to 0 for extrude, >0 for revolve" +#~ msgstr "設為 0 表示擠出,大於 0 表示迴轉" + +# AI Translated +#~ msgid "Pocket (cut)" +#~ msgstr "挖槽(切除)" + +# AI Translated +#, c-format +#~ msgid "%zu closed profile" +#~ msgid_plural "%zu closed profiles" +#~ msgstr[0] "%zu 個封閉輪廓" + +# AI Translated +#~ msgid "Draw a closed profile to enable" +#~ msgstr "請繪製封閉輪廓以啟用" + +# AI Translated +#~ msgid "Empty result" +#~ msgstr "結果為空" + +# AI Translated +#, boost-format +#~ msgid "Extrude: %1%" +#~ msgstr "擠出:%1%" + +# AI Translated +#, boost-format +#~ msgid "Revolve: %1%" +#~ msgstr "迴轉:%1%" + +# AI Translated +#~ msgid "No object selected" +#~ msgstr "未選取物件" + +# AI Translated +#~ msgid "Face failed" +#~ msgstr "建立面失敗" + +# AI Translated +#~ msgid "Face with holes failed" +#~ msgstr "建立帶孔的面失敗" + +# AI Translated +#~ msgid "Tool mesh empty" +#~ msgstr "工具網格為空" + +# AI Translated +#~ msgid "Pocket added (negative volume)" +#~ msgstr "已新增挖槽(負體積)" + +# AI Translated +#, boost-format +#~ msgid "Pocket: %1%" +#~ msgstr "挖槽:%1%" + +# AI Translated +#~ msgid "Needs the active layer mapped with Unwrap (LSCM)." +#~ msgstr "需要目前圖層使用「展開 (LSCM)」映射。" + +# AI Translated +#~ msgid "Checker - a test grid instead of the texture. Where the squares stay square the texture is undistorted; where they stretch, it will too" +#~ msgstr "棋盤格 - 以測試網格取代紋理。方格維持正方形之處,紋理不會變形;方格被拉伸之處,紋理也會被拉伸" + +# AI Translated +#~ msgid "Distortion - blue-to-red stretch heatmap over the unwrap" +#~ msgstr "變形 - 在展開結果上以藍到紅的熱圖顯示拉伸程度" + +# AI Translated +#~ msgid "Mix by" +#~ msgstr "混合方式" + +# AI Translated +#~ msgctxt "Texture Displacement" +#~ msgid "Surface" +#~ msgstr "表面" + +# AI Translated +#~ msgid "" +#~ "Layers: the two filaments alternate between print layers, which blends smoothly on upright surfaces but disappears on flat-facing ones, where a whole layer is a single band.\n" +#~ "Surface: a fine checkerboard across the surface, which works at any angle but can read as texture rather than as a blend.\n" +#~ "Automatic: layers on upright faces; flat-facing faces take the nearer single filament, since a checkerboard there shows as a pattern." +#~ msgstr "" +#~ "層:兩種線材在列印層之間交替,在直立表面上混合平順,但在朝上或朝下的平面上會消失,因為整層只是單一色帶。\n" +#~ "表面:在表面上形成細密的棋盤格,任何角度都適用,但看起來可能像紋理而非混色。\n" +#~ "自動:直立面採用層交替;平面則採用較接近的單一線材,因為棋盤格在平面上會顯現為圖案。" + +# AI Translated +#~ msgid "Island - move, rotate and scale whole islands" +#~ msgstr "UV 島 - 移動、旋轉與縮放整個 UV 島" + +# AI Translated +#~ msgid "Vertex - drag vertices to reshape; Shift/Ctrl to multi-select" +#~ msgstr "頂點 - 拖曳頂點以調整形狀;按 Shift/Ctrl 可多選" + +# AI Translated +#~ msgid "Edge - drag edges to reshape; Shift/Ctrl to multi-select" +#~ msgstr "邊 - 拖曳邊以調整形狀;按 Shift/Ctrl 可多選" + +# AI Translated +#~ msgid "Frame all islands (Home)" +#~ msgstr "置中顯示所有 UV 島 (Home)" + # AI Translated #~ msgid "(Experimental) Use printer agents instead of print hosts" #~ msgstr "(實驗性)使用列印裝置代理程式取代列印主機" @@ -30870,16 +32008,6 @@ msgstr "" #~ msgid "Click a face or a reference plane, then pick a drawing tool" #~ msgstr "點選一個面或參考平面,再選擇繪圖工具" -#~ msgid "X" -#~ msgstr "X" - -#~ msgid "Y" -#~ msgstr "Y" - -# AI Translated -#~ msgid "Z" -#~ msgstr "Z" - # AI Translated #~ msgid "XY" #~ msgstr "XY" @@ -30936,10 +32064,6 @@ msgstr "" #~ msgid "Vertical distance" #~ msgstr "垂直距離" -# AI Translated -#~ msgid "Linear" -#~ msgstr "線性" - #~ msgid "Face recognition" #~ msgstr "外觀面偵測" @@ -32621,9 +33745,6 @@ msgstr "" #~ msgid "part selection" #~ msgstr "零件選擇" -#~ msgid "°" -#~ msgstr "°" - #~ msgid "" #~ "The Wipe option is not available when using the Firmware Retraction mode.\n" #~ "\n" diff --git a/resources/images/extruder_sync.svg b/resources/images/extruder_sync.svg index 4e18766368..a8e8c922a6 100644 --- a/resources/images/extruder_sync.svg +++ b/resources/images/extruder_sync.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/resources/images/multi_extruder.svg b/resources/images/multi_extruder.svg index 24bb6eed8c..f3774ed1e0 100644 --- a/resources/images/multi_extruder.svg +++ b/resources/images/multi_extruder.svg @@ -1,10 +1 @@ - - - - - - - - - - + \ No newline at end of file diff --git a/resources/images/plate_imex_copy_mode.svg b/resources/images/plate_imex_copy_mode.svg new file mode 100644 index 0000000000..b938e909a1 --- /dev/null +++ b/resources/images/plate_imex_copy_mode.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_copy_mode_dark.svg b/resources/images/plate_imex_copy_mode_dark.svg new file mode 100644 index 0000000000..c87b0e0ffe --- /dev/null +++ b/resources/images/plate_imex_copy_mode_dark.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_copy_mode_hover.svg b/resources/images/plate_imex_copy_mode_hover.svg new file mode 100644 index 0000000000..4238552426 --- /dev/null +++ b/resources/images/plate_imex_copy_mode_hover.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_copy_mode_hover_dark.svg b/resources/images/plate_imex_copy_mode_hover_dark.svg new file mode 100644 index 0000000000..4633b747fe --- /dev/null +++ b/resources/images/plate_imex_copy_mode_hover_dark.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_custom_mode.svg b/resources/images/plate_imex_custom_mode.svg new file mode 100644 index 0000000000..99bc534382 --- /dev/null +++ b/resources/images/plate_imex_custom_mode.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_custom_mode_dark.svg b/resources/images/plate_imex_custom_mode_dark.svg new file mode 100644 index 0000000000..d31da3bb3a --- /dev/null +++ b/resources/images/plate_imex_custom_mode_dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_custom_mode_hover.svg b/resources/images/plate_imex_custom_mode_hover.svg new file mode 100644 index 0000000000..c0cc65a2a4 --- /dev/null +++ b/resources/images/plate_imex_custom_mode_hover.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_custom_mode_hover_dark.svg b/resources/images/plate_imex_custom_mode_hover_dark.svg new file mode 100644 index 0000000000..4b5682dbb2 --- /dev/null +++ b/resources/images/plate_imex_custom_mode_hover_dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_mirror_mode.svg b/resources/images/plate_imex_mirror_mode.svg new file mode 100644 index 0000000000..92f57755b3 --- /dev/null +++ b/resources/images/plate_imex_mirror_mode.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_mirror_mode_dark.svg b/resources/images/plate_imex_mirror_mode_dark.svg new file mode 100644 index 0000000000..b0ab1ee257 --- /dev/null +++ b/resources/images/plate_imex_mirror_mode_dark.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_mirror_mode_hover.svg b/resources/images/plate_imex_mirror_mode_hover.svg new file mode 100644 index 0000000000..1772d2c7fb --- /dev/null +++ b/resources/images/plate_imex_mirror_mode_hover.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_mirror_mode_hover_dark.svg b/resources/images/plate_imex_mirror_mode_hover_dark.svg new file mode 100644 index 0000000000..d50131ed4b --- /dev/null +++ b/resources/images/plate_imex_mirror_mode_hover_dark.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_normal_mode.svg b/resources/images/plate_imex_normal_mode.svg new file mode 100644 index 0000000000..2d2324236f --- /dev/null +++ b/resources/images/plate_imex_normal_mode.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_normal_mode_dark.svg b/resources/images/plate_imex_normal_mode_dark.svg new file mode 100644 index 0000000000..86d4b2ec0e --- /dev/null +++ b/resources/images/plate_imex_normal_mode_dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_normal_mode_hover.svg b/resources/images/plate_imex_normal_mode_hover.svg new file mode 100644 index 0000000000..3cdfb350fa --- /dev/null +++ b/resources/images/plate_imex_normal_mode_hover.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/plate_imex_normal_mode_hover_dark.svg b/resources/images/plate_imex_normal_mode_hover_dark.svg new file mode 100644 index 0000000000..70b26ed81b --- /dev/null +++ b/resources/images/plate_imex_normal_mode_hover_dark.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/resources/profiles/Anker.json b/resources/profiles/Anker.json index 6ff3e6d959..b6d2ceb80d 100644 --- a/resources/profiles/Anker.json +++ b/resources/profiles/Anker.json @@ -1,6 +1,6 @@ { "name": "Anker", - "version": "02.04.00.05", + "version": "02.04.00.06", "force_update": "0", "description": "Anker configurations", "machine_model_list": [ @@ -304,6 +304,26 @@ "name": "Generic PLA Silk @Anker 0.25 nozzle", "sub_path": "filament/Generic PLA Silk @Anker 0.25 nozzle.json" }, + { + "name": "AnkerMake PLA+ Basic @Anker base", + "sub_path": "filament/AnkerMake PLA+ Basic @Anker base.json" + }, + { + "name": "AnkerMake PLA+ Glitter @Anker base", + "sub_path": "filament/AnkerMake PLA+ Glitter @Anker base.json" + }, + { + "name": "AnkerMake PLA+ Matte @Anker base", + "sub_path": "filament/AnkerMake PLA+ Matte @Anker base.json" + }, + { + "name": "AnkerMake PLA+ Metallic @Anker base", + "sub_path": "filament/AnkerMake PLA+ Metallic @Anker base.json" + }, + { + "name": "AnkerMake PLA+ Silk @Anker base", + "sub_path": "filament/AnkerMake PLA+ Silk @Anker base.json" + }, { "name": "Generic PLA+ @Anker", "sub_path": "filament/Generic PLA+ @Anker.json" @@ -327,6 +347,26 @@ { "name": "Generic TPU @Anker", "sub_path": "filament/Generic TPU @Anker.json" + }, + { + "name": "AnkerMake PLA+ Basic @Anker", + "sub_path": "filament/AnkerMake PLA+ Basic @Anker.json" + }, + { + "name": "AnkerMake PLA+ Glitter @Anker", + "sub_path": "filament/AnkerMake PLA+ Glitter @Anker.json" + }, + { + "name": "AnkerMake PLA+ Matte @Anker", + "sub_path": "filament/AnkerMake PLA+ Matte @Anker.json" + }, + { + "name": "AnkerMake PLA+ Metallic @Anker", + "sub_path": "filament/AnkerMake PLA+ Metallic @Anker.json" + }, + { + "name": "AnkerMake PLA+ Silk @Anker", + "sub_path": "filament/AnkerMake PLA+ Silk @Anker.json" } ], "machine_list": [ diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Basic @Anker base.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Basic @Anker base.json new file mode 100644 index 0000000000..fea2150ee1 --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Basic @Anker base.json @@ -0,0 +1,50 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Basic @Anker base", + "inherits": "Generic PLA+ @Anker base", + "from": "system", + "filament_id": "OFUuZlQL", + "instantiation": "false", + "filament_vendor": [ + "AnkerMake" + ], + "nozzle_temperature": [ + "200" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "hot_plate_temp": [ + "65" + ], + "textured_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "1" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "60" + ], + "slow_down_layer_time": [ + "8" + ], + "slow_down_min_speed": [ + "30" + ], + "default_filament_colour": [ + "#FFFFFF" + ], + "filament_max_volumetric_speed": [ + "22" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Basic @Anker.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Basic @Anker.json new file mode 100644 index 0000000000..24f908cb40 --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Basic @Anker.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Basic @Anker", + "inherits": "AnkerMake PLA+ Basic @Anker base", + "from": "system", + "setting_id": "EfM5rmn4w6pMBajC", + "instantiation": "true", + "compatible_printers": [ + "Anker M5 0.4 nozzle", + "Anker M5 0.6 nozzle", + "Anker M5 All-Metal 0.4 nozzle", + "Anker M5 All-Metal 0.6 nozzle", + "Anker M5C 0.4 nozzle", + "Anker M5C 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Glitter @Anker base.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Glitter @Anker base.json new file mode 100644 index 0000000000..1429181c80 --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Glitter @Anker base.json @@ -0,0 +1,50 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Glitter @Anker base", + "inherits": "Generic PLA+ @Anker base", + "from": "system", + "filament_id": "OFxCURdg", + "instantiation": "false", + "filament_vendor": [ + "AnkerMake" + ], + "nozzle_temperature": [ + "200" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "hot_plate_temp": [ + "65" + ], + "textured_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "1" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "60" + ], + "slow_down_layer_time": [ + "6" + ], + "slow_down_min_speed": [ + "30" + ], + "default_filament_colour": [ + "#00AD66" + ], + "filament_max_volumetric_speed": [ + "22" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Glitter @Anker.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Glitter @Anker.json new file mode 100644 index 0000000000..1950c7db06 --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Glitter @Anker.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Glitter @Anker", + "inherits": "AnkerMake PLA+ Glitter @Anker base", + "from": "system", + "setting_id": "blGHp0htgHEj7khE", + "instantiation": "true", + "compatible_printers": [ + "Anker M5 0.4 nozzle", + "Anker M5 0.6 nozzle", + "Anker M5 All-Metal 0.4 nozzle", + "Anker M5 All-Metal 0.6 nozzle", + "Anker M5C 0.4 nozzle", + "Anker M5C 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Matte @Anker base.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Matte @Anker base.json new file mode 100644 index 0000000000..eca1721ff3 --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Matte @Anker base.json @@ -0,0 +1,50 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Matte @Anker base", + "inherits": "Generic PLA+ @Anker base", + "from": "system", + "filament_id": "OFKDOyNK", + "instantiation": "false", + "filament_vendor": [ + "AnkerMake" + ], + "nozzle_temperature": [ + "210" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "hot_plate_temp": [ + "65" + ], + "textured_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "1" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "60" + ], + "slow_down_layer_time": [ + "6" + ], + "slow_down_min_speed": [ + "30" + ], + "default_filament_colour": [ + "#FFFFFF" + ], + "filament_max_volumetric_speed": [ + "22" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Matte @Anker.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Matte @Anker.json new file mode 100644 index 0000000000..5d5703c93e --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Matte @Anker.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Matte @Anker", + "inherits": "AnkerMake PLA+ Matte @Anker base", + "from": "system", + "setting_id": "tPgwC1eEXyWPOn9S", + "instantiation": "true", + "compatible_printers": [ + "Anker M5 0.4 nozzle", + "Anker M5 All-Metal 0.4 nozzle", + "Anker M5C 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Metallic @Anker base.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Metallic @Anker base.json new file mode 100644 index 0000000000..5935081db7 --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Metallic @Anker base.json @@ -0,0 +1,56 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Metallic @Anker base", + "inherits": "Generic PLA+ @Anker base", + "from": "system", + "filament_id": "OFBfbmtb", + "instantiation": "false", + "filament_vendor": [ + "AnkerMake" + ], + "nozzle_temperature": [ + "200" + ], + "textured_plate_temp": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ], + "filament_flow_ratio": [ + "1" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "60" + ], + "slow_down_layer_time": [ + "6" + ], + "slow_down_min_speed": [ + "30" + ], + "overhang_fan_speed": [ + "50" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "filament_retraction_length": [ + "1" + ], + "filament_retraction_speed": [ + "50" + ], + "filament_deretraction_speed": [ + "50" + ], + "default_filament_colour": [ + "#ACAC8A" + ], + "filament_max_volumetric_speed": [ + "20" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Metallic @Anker.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Metallic @Anker.json new file mode 100644 index 0000000000..d369f4e41d --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Metallic @Anker.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Metallic @Anker", + "inherits": "AnkerMake PLA+ Metallic @Anker base", + "from": "system", + "setting_id": "jlbAMNNaEacdUASZ", + "instantiation": "true", + "compatible_printers": [ + "Anker M5 0.4 nozzle", + "Anker M5 All-Metal 0.4 nozzle", + "Anker M5C 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Silk @Anker base.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Silk @Anker base.json new file mode 100644 index 0000000000..20c59e9e7e --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Silk @Anker base.json @@ -0,0 +1,62 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Silk @Anker base", + "inherits": "Generic PLA+ @Anker base", + "from": "system", + "filament_id": "OFkxTGQc", + "instantiation": "false", + "filament_vendor": [ + "AnkerMake" + ], + "nozzle_temperature": [ + "210" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "hot_plate_temp": [ + "65" + ], + "textured_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "filament_flow_ratio": [ + "1" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "60" + ], + "slow_down_layer_time": [ + "2" + ], + "slow_down_min_speed": [ + "20" + ], + "filament_retraction_length": [ + "0.5" + ], + "filament_retraction_speed": [ + "20" + ], + "filament_wipe": [ + "0" + ], + "default_filament_colour": [ + "#99ADA3" + ], + "filament_deretraction_speed": [ + "20" + ], + "filament_max_volumetric_speed": [ + "13" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anker/filament/AnkerMake PLA+ Silk @Anker.json b/resources/profiles/Anker/filament/AnkerMake PLA+ Silk @Anker.json new file mode 100644 index 0000000000..e8379081b7 --- /dev/null +++ b/resources/profiles/Anker/filament/AnkerMake PLA+ Silk @Anker.json @@ -0,0 +1,15 @@ +{ + "type": "filament", + "name": "AnkerMake PLA+ Silk @Anker", + "inherits": "AnkerMake PLA+ Silk @Anker base", + "from": "system", + "setting_id": "eVM9Ckwjl5vEvEKN", + "instantiation": "true", + "compatible_printers": [ + "Anker M5 0.4 nozzle", + "Anker M5 All-Metal 0.4 nozzle", + "Anker M5 All-Metal 0.6 nozzle", + "Anker M5C 0.4 nozzle", + "Anker M5C 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/Anycubic.json b/resources/profiles/Anycubic.json index 731d2b32eb..1d8f8e70cf 100644 --- a/resources/profiles/Anycubic.json +++ b/resources/profiles/Anycubic.json @@ -1,6 +1,6 @@ { "name": "Anycubic", - "version": "02.04.00.08", + "version": "02.04.00.09", "force_update": "0", "description": "Anycubic configurations", "machine_model_list": [ diff --git a/resources/profiles/Anycubic/machine/Anycubic Vyper 0.4 nozzle.json b/resources/profiles/Anycubic/machine/Anycubic Vyper 0.4 nozzle.json index 03da852642..f1e81a09d0 100644 --- a/resources/profiles/Anycubic/machine/Anycubic Vyper 0.4 nozzle.json +++ b/resources/profiles/Anycubic/machine/Anycubic Vyper 0.4 nozzle.json @@ -110,7 +110,7 @@ "default_filament_profile": [ "Generic PLA @Anycubic" ], - "machine_start_gcode": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG0 Z0.2 F1800 ; move nozzle to print position\nG92 E0 ; specify current extruder position as zero\nG1 Y10 X180 E50 F1200 ; extrude a line in front of the printer\nG92 E0 ; specify current extruder position as zero\nG0 Z20 F6000 ; move head up\nG1 E-7 F2400 ; retract\nG04 S2 ; wait 2s\nG0 X0 F6000 ; wipe from oozed filament\nG1 E-1 F2400 ; undo some of the retraction to avoid oozing\nG1 F6000 ; set travel speed to move to start printing point\nM117", + "machine_start_gcode": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG0 Z0.2 F1800 ; move nozzle to print position\nG92 E0 ; specify current extruder position as zero\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Y10 X180 E50 F1200 ; extrude a line in front of the printer\nG92 E0 ; specify current extruder position as zero\nG0 Z20 F6000 ; move head up\nG1 E-7 F2400 ; retract\nG04 S2 ; wait 2s\nG0 X0 F6000 ; wipe from oozed filament\nG1 E-1 F2400 ; undo some of the retraction to avoid oozing\nG1 F6000 ; set travel speed to move to start printing point\nM117", "machine_end_gcode": "G4 ; wait\nG92 E0\nG1{if max_layer_z < printable_height} Z{z_offset+min(max_layer_z+30, printable_height)}{endif} ; move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/BBL.json b/resources/profiles/BBL.json index 68d2028473..6c6567d37d 100644 --- a/resources/profiles/BBL.json +++ b/resources/profiles/BBL.json @@ -1,7 +1,7 @@ { "name": "Bambulab", "url": "http://www.bambulab.com/Parameters/vendor/BBL.json", - "version": "02.08.00.12", + "version": "02.08.00.14", "force_update": "0", "description": "the initial version of BBL configurations", "machine_model_list": [ diff --git a/resources/profiles/BBL/machine/fdm_bbl_3dp_001_common.json b/resources/profiles/BBL/machine/fdm_bbl_3dp_001_common.json index c0ac9a1843..30077b81f3 100644 --- a/resources/profiles/BBL/machine/fdm_bbl_3dp_001_common.json +++ b/resources/profiles/BBL/machine/fdm_bbl_3dp_001_common.json @@ -8,6 +8,7 @@ "0.4" ], "printer_variant": "0.4", + "use_3mf": "1", "bed_exclude_area": [ "0x0", "28x0", diff --git a/resources/profiles/BBL/machine/fdm_bbl_3dp_002_common.json b/resources/profiles/BBL/machine/fdm_bbl_3dp_002_common.json index a5eaf8c6f5..e32840036f 100644 --- a/resources/profiles/BBL/machine/fdm_bbl_3dp_002_common.json +++ b/resources/profiles/BBL/machine/fdm_bbl_3dp_002_common.json @@ -9,6 +9,7 @@ "0.4" ], "printer_variant": "0.4", + "use_3mf": "1", "best_object_pos": "0.3x0.5", "bed_exclude_area": [], "bed_temperature_formula": "by_highest_temp", diff --git a/resources/profiles/BBL/process/fdm_process_common.json b/resources/profiles/BBL/process/fdm_process_common.json index ecb2956698..cf69564fca 100644 --- a/resources/profiles/BBL/process/fdm_process_common.json +++ b/resources/profiles/BBL/process/fdm_process_common.json @@ -94,7 +94,7 @@ "prime_tower_flat_ironing": "0", "raft_layers": "0", "reduce_crossing_wall": "0", - "reduce_infill_retraction_mode": "Auto", + "reduce_infill_retraction": "1", "resolution": "0.012", "scarf_angle_threshold": "155", "seam_position": "aligned", diff --git a/resources/profiles/Prusa.json b/resources/profiles/Prusa.json index 1b46c1deff..e9bd094f9e 100644 --- a/resources/profiles/Prusa.json +++ b/resources/profiles/Prusa.json @@ -1,6 +1,6 @@ { "name": "Prusa", - "version": "02.04.00.16", + "version": "02.04.00.17", "force_update": "0", "description": "Prusa configurations", "machine_model_list": [ diff --git a/resources/profiles/Prusa/filament/Generic ABS @Prusa CORE One.json b/resources/profiles/Prusa/filament/Generic ABS @Prusa CORE One.json index 5138e20528..52009f8b2a 100644 --- a/resources/profiles/Prusa/filament/Generic ABS @Prusa CORE One.json +++ b/resources/profiles/Prusa/filament/Generic ABS @Prusa CORE One.json @@ -45,7 +45,7 @@ "35" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp" ], "hot_plate_temp": [ "110" diff --git a/resources/profiles/Prusa/filament/Generic ASA @Prusa CORE One.json b/resources/profiles/Prusa/filament/Generic ASA @Prusa CORE One.json index d135ffcbad..70c5d4dd71 100644 --- a/resources/profiles/Prusa/filament/Generic ASA @Prusa CORE One.json +++ b/resources/profiles/Prusa/filament/Generic ASA @Prusa CORE One.json @@ -78,7 +78,7 @@ "35" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp" ], "hot_plate_temp": [ "110" diff --git a/resources/profiles/Prusa/filament/Generic PETG @Prusa CORE One.json b/resources/profiles/Prusa/filament/Generic PETG @Prusa CORE One.json index 4f3e7f400c..ddfce75122 100644 --- a/resources/profiles/Prusa/filament/Generic PETG @Prusa CORE One.json +++ b/resources/profiles/Prusa/filament/Generic PETG @Prusa CORE One.json @@ -50,7 +50,7 @@ "0.8" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.053{elsif nozzle_diameter[filament_extruder_id]==0.5}0.042{elsif nozzle_diameter[filament_extruder_id]==0.6}0.032{elsif nozzle_diameter[filament_extruder_id]==0.8}0.018{elsif nozzle_diameter[filament_extruder_id]==0.25}0.18{elsif nozzle_diameter[filament_extruder_id]==0.3}0.1{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.053{elsif nozzle_diameter[filament_extruder_id]==0.5}0.042{elsif nozzle_diameter[filament_extruder_id]==0.6}0.032{elsif nozzle_diameter[filament_extruder_id]==0.8}0.018{elsif nozzle_diameter[filament_extruder_id]==0.25}0.18{elsif nozzle_diameter[filament_extruder_id]==0.3}0.1{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" ], "filament_wipe": [ "1" diff --git a/resources/profiles/Prusa/filament/Generic PLA @Prusa CORE One.json b/resources/profiles/Prusa/filament/Generic PLA @Prusa CORE One.json index 6f19c61dc6..72c3046a72 100644 --- a/resources/profiles/Prusa/filament/Generic PLA @Prusa CORE One.json +++ b/resources/profiles/Prusa/filament/Generic PLA @Prusa CORE One.json @@ -38,7 +38,7 @@ "15" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One|CORE One L).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" ], "filament_z_hop": [ "0.6" diff --git a/resources/profiles/Prusa/filament/Generic PLA Silk @Prusa CORE One.json b/resources/profiles/Prusa/filament/Generic PLA Silk @Prusa CORE One.json index d22f3c6c6c..a97a88ba62 100644 --- a/resources/profiles/Prusa/filament/Generic PLA Silk @Prusa CORE One.json +++ b/resources/profiles/Prusa/filament/Generic PLA Silk @Prusa CORE One.json @@ -58,7 +58,7 @@ "7" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[0]==0.4}0.05{elsif nozzle_diameter[0]==0.25}0.14{elsif nozzle_diameter[0]==0.3}0.07{elsif nozzle_diameter[0]==0.35}0.06{elsif nozzle_diameter[0]==0.6}0.03{elsif nozzle_diameter[0]==0.5}0.035{elsif nozzle_diameter[0]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[0]==0.4}0.03{elsif nozzle_diameter[0]==0.5}0.022{elsif nozzle_diameter[0]==0.6}0.018{elsif nozzle_diameter[0]==0.8}0.012{elsif nozzle_diameter[0]==0.25}0.12{elsif nozzle_diameter[0]==0.3}0.075{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[0]==0.4}0.05{elsif nozzle_diameter[0]==0.25}0.14{elsif nozzle_diameter[0]==0.3}0.07{elsif nozzle_diameter[0]==0.35}0.06{elsif nozzle_diameter[0]==0.6}0.03{elsif nozzle_diameter[0]==0.5}0.035{elsif nozzle_diameter[0]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[0]==0.4}0.03{elsif nozzle_diameter[0]==0.5}0.022{elsif nozzle_diameter[0]==0.6}0.018{elsif nozzle_diameter[0]==0.8}0.012{elsif nozzle_diameter[0]==0.25}0.12{elsif nozzle_diameter[0]==0.3}0.075{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" ], "filament_z_hop": [ "0.6", diff --git a/resources/profiles/Prusa/filament/Prusament ASA @CORE One.json b/resources/profiles/Prusa/filament/Prusament ASA @CORE One.json index 739b511db9..5cc171531e 100644 --- a/resources/profiles/Prusa/filament/Prusament ASA @CORE One.json +++ b/resources/profiles/Prusa/filament/Prusament ASA @CORE One.json @@ -63,7 +63,7 @@ "0" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.04{elsif nozzle_diameter[filament_extruder_id]==0.25}0.1{elsif nozzle_diameter[filament_extruder_id]==0.3}0.06{elsif nozzle_diameter[filament_extruder_id]==0.35}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.03{elsif nozzle_diameter[filament_extruder_id]==0.6}0.02{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.02{elsif nozzle_diameter[filament_extruder_id]==0.5}0.018{elsif nozzle_diameter[filament_extruder_id]==0.6}0.012{elsif nozzle_diameter[filament_extruder_id]==0.8}0.01{elsif nozzle_diameter[filament_extruder_id]==0.25}0.09{elsif nozzle_diameter[filament_extruder_id]==0.3}0.065{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S40 ; set heatbreak target temp" ], "filament_type": [ "ASA" diff --git a/resources/profiles/Prusa/filament/Prusament PA11 Carbon Fiber @CORE One.json b/resources/profiles/Prusa/filament/Prusament PA11 Carbon Fiber @CORE One.json index d32a445e21..c45168bfbd 100644 --- a/resources/profiles/Prusa/filament/Prusament PA11 Carbon Fiber @CORE One.json +++ b/resources/profiles/Prusa/filament/Prusament PA11 Carbon Fiber @CORE One.json @@ -65,7 +65,7 @@ "0" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp" ], "filament_type": [ "PA11-CF" diff --git a/resources/profiles/Prusa/filament/Prusament PC Blend @CORE One.json b/resources/profiles/Prusa/filament/Prusament PC Blend @CORE One.json index 00b62e3e37..eb94953d62 100644 --- a/resources/profiles/Prusa/filament/Prusament PC Blend @CORE One.json +++ b/resources/profiles/Prusa/filament/Prusament PC Blend @CORE One.json @@ -63,7 +63,7 @@ "0" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp" ], "filament_type": [ "PC" diff --git a/resources/profiles/Prusa/filament/Prusament PC Blend Carbon Fiber @CORE One.json b/resources/profiles/Prusa/filament/Prusament PC Blend Carbon Fiber @CORE One.json index edaad073df..3079872e82 100644 --- a/resources/profiles/Prusa/filament/Prusament PC Blend Carbon Fiber @CORE One.json +++ b/resources/profiles/Prusa/filament/Prusament PC Blend Carbon Fiber @CORE One.json @@ -65,7 +65,7 @@ "0" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.6}0.025{elsif nozzle_diameter[filament_extruder_id]==0.8}0.016{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S45 ; set heatbreak target temp" ], "filament_type": [ "PC-CF" diff --git a/resources/profiles/Prusa/filament/Prusament PETG @CORE One.json b/resources/profiles/Prusa/filament/Prusament PETG @CORE One.json index 51aaba3419..a4e47d5e13 100644 --- a/resources/profiles/Prusa/filament/Prusament PETG @CORE One.json +++ b/resources/profiles/Prusa/filament/Prusament PETG @CORE One.json @@ -69,7 +69,7 @@ "0" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.053{elsif nozzle_diameter[filament_extruder_id]==0.5}0.042{elsif nozzle_diameter[filament_extruder_id]==0.6}0.032{elsif nozzle_diameter[filament_extruder_id]==0.8}0.018{elsif nozzle_diameter[filament_extruder_id]==0.25}0.18{elsif nozzle_diameter[filament_extruder_id]==0.3}0.1{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.07{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.09{elsif nozzle_diameter[filament_extruder_id]==0.35}0.08{elsif nozzle_diameter[filament_extruder_id]==0.6}0.04{elsif nozzle_diameter[filament_extruder_id]==0.5}0.05{elsif nozzle_diameter[filament_extruder_id]==0.8}0.02{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.053{elsif nozzle_diameter[filament_extruder_id]==0.5}0.042{elsif nozzle_diameter[filament_extruder_id]==0.6}0.032{elsif nozzle_diameter[filament_extruder_id]==0.8}0.018{elsif nozzle_diameter[filament_extruder_id]==0.25}0.18{elsif nozzle_diameter[filament_extruder_id]==0.3}0.1{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" ], "filament_type": [ "PETG" diff --git a/resources/profiles/Prusa/filament/Prusament PLA @CORE One.json b/resources/profiles/Prusa/filament/Prusament PLA @CORE One.json index a28ea07ed4..1c7a64d3ec 100644 --- a/resources/profiles/Prusa/filament/Prusament PLA @CORE One.json +++ b/resources/profiles/Prusa/filament/Prusament PLA @CORE One.json @@ -64,7 +64,7 @@ "0" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One|CORE One L).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" ], "filament_type": [ "PLA" diff --git a/resources/profiles/Prusa/filament/Prusament PVB @CORE One.json b/resources/profiles/Prusa/filament/Prusament PVB @CORE One.json index 9f6786bd38..dc2869b319 100644 --- a/resources/profiles/Prusa/filament/Prusament PVB @CORE One.json +++ b/resources/profiles/Prusa/filament/Prusament PVB @CORE One.json @@ -65,7 +65,7 @@ "1" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" ], "filament_type": [ "PVB" diff --git a/resources/profiles/Prusa/filament/Prusament rPLA @CORE One.json b/resources/profiles/Prusa/filament/Prusament rPLA @CORE One.json index 73633d6044..da5c065f15 100644 --- a/resources/profiles/Prusa/filament/Prusament rPLA @CORE One.json +++ b/resources/profiles/Prusa/filament/Prusament rPLA @CORE One.json @@ -64,7 +64,7 @@ "0" ], "filament_start_gcode": [ - "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|CORE One).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" + "M900 K{if nozzle_diameter[filament_extruder_id]==0.4}0.05{elsif nozzle_diameter[filament_extruder_id]==0.25}0.14{elsif nozzle_diameter[filament_extruder_id]==0.3}0.07{elsif nozzle_diameter[filament_extruder_id]==0.35}0.06{elsif nozzle_diameter[filament_extruder_id]==0.6}0.03{elsif nozzle_diameter[filament_extruder_id]==0.5}0.035{elsif nozzle_diameter[filament_extruder_id]==0.8}0.015{else}0{endif} ; Filament gcode\n\n{if printer_notes=~/.*(MK4IS|XLIS|MK4S|MK3.9S|COREONE).*/}\nM572 S{if nozzle_diameter[filament_extruder_id]==0.4}0.036{elsif nozzle_diameter[filament_extruder_id]==0.5}0.025{elsif nozzle_diameter[filament_extruder_id]==0.6}0.022{elsif nozzle_diameter[filament_extruder_id]==0.8}0.014{elsif nozzle_diameter[filament_extruder_id]==0.25}0.12{elsif nozzle_diameter[filament_extruder_id]==0.3}0.08{else}0{endif} ; Filament gcode\n{endif}\n\nM142 S36 ; set heatbreak target temp" ], "filament_type": [ "PLA" diff --git a/resources/profiles/Vivedino.json b/resources/profiles/Vivedino.json index c8f6b65c3e..11b384aabb 100644 --- a/resources/profiles/Vivedino.json +++ b/resources/profiles/Vivedino.json @@ -1,6 +1,6 @@ { "name": "Vivedino", - "version": "02.04.00.02", + "version": "02.04.00.13", "force_update": "0", "description": "Vivedino configurations", "machine_model_list": [ @@ -11,6 +11,22 @@ { "name": "Troodon 2.0 - RRF", "sub_path": "machine/Troodon2RRF.json" + }, + { + "name": "Xplorer Dual Gantry", + "sub_path": "machine/XplorerDualGantry.json" + }, + { + "name": "Xplorer IDEX", + "sub_path": "machine/XplorerIDEX.json" + }, + { + "name": "Xplorer IQEX", + "sub_path": "machine/XplorerIQEX.json" + }, + { + "name": "Xplorer Single", + "sub_path": "machine/XplorerSingle.json" } ], "process_list": [ @@ -45,6 +61,86 @@ { "name": "0.28mm Extra Draft @Troodon2", "sub_path": "process/0.28mm Extra Draft @Troodon2.json" + }, + { + "name": "fdm_process_xplorer_common", + "sub_path": "process/fdm_process_xplorer_common.json" + }, + { + "name": "0.04mm Ultra Fine @Xplorer 0.4", + "sub_path": "process/0.04mm Ultra Fine @Xplorer 0.4.json" + }, + { + "name": "0.08mm Extra Fine @Xplorer 0.4", + "sub_path": "process/0.08mm Extra Fine @Xplorer 0.4.json" + }, + { + "name": "0.12mm Fine @Xplorer 0.4", + "sub_path": "process/0.12mm Fine @Xplorer 0.4.json" + }, + { + "name": "0.16mm Optimal @Xplorer 0.4", + "sub_path": "process/0.16mm Optimal @Xplorer 0.4.json" + }, + { + "name": "0.20mm Standard @Xplorer 0.4", + "sub_path": "process/0.20mm Standard @Xplorer 0.4.json" + }, + { + "name": "0.28mm Draft @Xplorer 0.4", + "sub_path": "process/0.28mm Draft @Xplorer 0.4.json" + }, + { + "name": "0.32mm Extra Draft @Xplorer 0.4", + "sub_path": "process/0.32mm Extra Draft @Xplorer 0.4.json" + }, + { + "name": "fdm_process_xplorer_common_0_6", + "sub_path": "process/fdm_process_xplorer_common_0_6.json" + }, + { + "name": "fdm_process_xplorer_common_0_8", + "sub_path": "process/fdm_process_xplorer_common_0_8.json" + }, + { + "name": "0.18mm Fine @Xplorer 0.6", + "sub_path": "process/0.18mm Fine @Xplorer 0.6.json" + }, + { + "name": "0.24mm Optimal @Xplorer 0.6", + "sub_path": "process/0.24mm Optimal @Xplorer 0.6.json" + }, + { + "name": "0.30mm Standard @Xplorer 0.6", + "sub_path": "process/0.30mm Standard @Xplorer 0.6.json" + }, + { + "name": "0.36mm Draft @Xplorer 0.6", + "sub_path": "process/0.36mm Draft @Xplorer 0.6.json" + }, + { + "name": "0.42mm Extra Draft @Xplorer 0.6", + "sub_path": "process/0.42mm Extra Draft @Xplorer 0.6.json" + }, + { + "name": "0.24mm Fine @Xplorer 0.8", + "sub_path": "process/0.24mm Fine @Xplorer 0.8.json" + }, + { + "name": "0.32mm Optimal @Xplorer 0.8", + "sub_path": "process/0.32mm Optimal @Xplorer 0.8.json" + }, + { + "name": "0.40mm Standard @Xplorer 0.8", + "sub_path": "process/0.40mm Standard @Xplorer 0.8.json" + }, + { + "name": "0.48mm Draft @Xplorer 0.8", + "sub_path": "process/0.48mm Draft @Xplorer 0.8.json" + }, + { + "name": "0.56mm Extra Draft @Xplorer 0.8", + "sub_path": "process/0.56mm Extra Draft @Xplorer 0.8.json" } ], "filament_list": [], @@ -65,9 +161,61 @@ "name": "Troodon 2.0 Klipper 0.4 nozzle", "sub_path": "machine/Troodon 2.0 Klipper 0.4 nozzle.json" }, + { + "name": "Xplorer common", + "sub_path": "machine/Xplorer common.json" + }, { "name": "Troodon 2.0 RRF 0.4 nozzle", "sub_path": "machine/Troodon 2.0 RRF 0.4 nozzle.json" + }, + { + "name": "Xplorer Dual Gantry 0.4 nozzle", + "sub_path": "machine/Xplorer Dual Gantry 0.4 nozzle.json" + }, + { + "name": "Xplorer Dual Gantry 0.6 nozzle", + "sub_path": "machine/Xplorer Dual Gantry 0.6 nozzle.json" + }, + { + "name": "Xplorer Dual Gantry 0.8 nozzle", + "sub_path": "machine/Xplorer Dual Gantry 0.8 nozzle.json" + }, + { + "name": "Xplorer IDEX 0.4 nozzle", + "sub_path": "machine/Xplorer IDEX 0.4 nozzle.json" + }, + { + "name": "Xplorer IDEX 0.6 nozzle", + "sub_path": "machine/Xplorer IDEX 0.6 nozzle.json" + }, + { + "name": "Xplorer IDEX 0.8 nozzle", + "sub_path": "machine/Xplorer IDEX 0.8 nozzle.json" + }, + { + "name": "Xplorer IQEX 0.4 nozzle", + "sub_path": "machine/Xplorer IQEX 0.4 nozzle.json" + }, + { + "name": "Xplorer IQEX 0.6 nozzle", + "sub_path": "machine/Xplorer IQEX 0.6 nozzle.json" + }, + { + "name": "Xplorer IQEX 0.8 nozzle", + "sub_path": "machine/Xplorer IQEX 0.8 nozzle.json" + }, + { + "name": "Xplorer Single 0.4 nozzle", + "sub_path": "machine/Xplorer Single 0.4 nozzle.json" + }, + { + "name": "Xplorer Single 0.6 nozzle", + "sub_path": "machine/Xplorer Single 0.6 nozzle.json" + }, + { + "name": "Xplorer Single 0.8 nozzle", + "sub_path": "machine/Xplorer Single 0.8 nozzle.json" } ] } diff --git a/resources/profiles/Vivedino/Xplorer Dual Gantry_cover.png b/resources/profiles/Vivedino/Xplorer Dual Gantry_cover.png new file mode 100644 index 0000000000..cc82af425a Binary files /dev/null and b/resources/profiles/Vivedino/Xplorer Dual Gantry_cover.png differ diff --git a/resources/profiles/Vivedino/Xplorer IDEX_cover.png b/resources/profiles/Vivedino/Xplorer IDEX_cover.png new file mode 100644 index 0000000000..2462c32015 Binary files /dev/null and b/resources/profiles/Vivedino/Xplorer IDEX_cover.png differ diff --git a/resources/profiles/Vivedino/Xplorer IQEX_cover.png b/resources/profiles/Vivedino/Xplorer IQEX_cover.png new file mode 100644 index 0000000000..89c6092e5d Binary files /dev/null and b/resources/profiles/Vivedino/Xplorer IQEX_cover.png differ diff --git a/resources/profiles/Vivedino/Xplorer Single_cover.png b/resources/profiles/Vivedino/Xplorer Single_cover.png new file mode 100644 index 0000000000..9a86cf6f9f Binary files /dev/null and b/resources/profiles/Vivedino/Xplorer Single_cover.png differ diff --git a/resources/profiles/Vivedino/Xplorer_bed_texture_dualgantry.svg b/resources/profiles/Vivedino/Xplorer_bed_texture_dualgantry.svg new file mode 100644 index 0000000000..b73c3c529f --- /dev/null +++ b/resources/profiles/Vivedino/Xplorer_bed_texture_dualgantry.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Vivedino/Xplorer_bed_texture_idex.svg b/resources/profiles/Vivedino/Xplorer_bed_texture_idex.svg new file mode 100644 index 0000000000..ed0d3182f8 --- /dev/null +++ b/resources/profiles/Vivedino/Xplorer_bed_texture_idex.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Vivedino/Xplorer_bed_texture_iqex.svg b/resources/profiles/Vivedino/Xplorer_bed_texture_iqex.svg new file mode 100644 index 0000000000..768653f848 --- /dev/null +++ b/resources/profiles/Vivedino/Xplorer_bed_texture_iqex.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Vivedino/Xplorer_buildplate_model.stl b/resources/profiles/Vivedino/Xplorer_buildplate_model.stl new file mode 100644 index 0000000000..0f4f99f052 Binary files /dev/null and b/resources/profiles/Vivedino/Xplorer_buildplate_model.stl differ diff --git a/resources/profiles/Vivedino/machine/Xplorer Dual Gantry 0.4 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer Dual Gantry 0.4 nozzle.json new file mode 100644 index 0000000000..1f8ea0fd3a --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer Dual Gantry 0.4 nozzle.json @@ -0,0 +1,261 @@ +{ + "type": "machine", + "name": "Xplorer Dual Gantry 0.4 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "DgYk8X6L1R0MKcfg", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}\n{if layer_num <= 0}\nG91\nG1 Z+10 F1200\nG90\n{endif}", + "change_filament_gcode": ";CHANGE_FILAMENT - Start\n;Layer#=[layer_num] - Z=[layer_z]\n{if layer_z >first_layer_height}\nG91\nG1 Z+2 F1200\nG90\n{endif}\n{if layer_num != -1 || next_extruder != 0}\n Tool{next_extruder}\n{endif}\n; <----\nG1 Z[layer_z] F1200\n{if layer_num == -1 || layer_num == 0}\n M109 S[first_layer_temperature[next_extruder]] T[next_extruder]\n{else}\n M104 S[temperature[next_extruder]] T[next_extruder]\n{endif}\n; ---->\nM83\n;Layer#=[layer_num] - Z=[layer_z]\nLOG_EXTR\n;CHANGE_FILAMENT - End", + "default_nozzle_volume_type": [ + "High Flow", + "High Flow" + ], + "default_print_profile": "0.20mm Standard @Xplorer 0.4", + "deretraction_speed": [ + "120", + "120" + ], + "extruder_colour": [ + "#FCE94F", + "#729FCF" + ], + "extruder_offset": [ + "0x0", + "0x0" + ], + "extruder_type": [ + "Direct Drive", + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "imex_gantry_count": "2", + "imex_mode_active_tools": [ + "0:P", + "0:P,1:C", + "0:P,1:M" + ], + "imex_mode_gcodes": [ + "SET_PRINT_MODE MODE=PRIMARY", + "SET_PRINT_MODE MODE=COPY", + "SET_PRINT_MODE MODE=MIRROR" + ], + "imex_mode_names": [ + "primary", + "copy", + "mirror" + ], + "imex_tool_layout": "rear-left", + "imex_tools_per_gantry": "1", + "is_imex": "1", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0", + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000", + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000", + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50", + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25", + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2", + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0", + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60", + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20", + "40", + "20" + ], + "machine_start_gcode": "M104 S{first_layer_temperature[0]} T0\nM104 S{first_layer_temperature[1]} T1\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[0]} T0\nM109 S{first_layer_temperature[1]} T1\nstart_print\nG1 F5000\n{if first_layer_temperature[1] !=0 }\nTool1\nbrush_Tool1\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nbrush_Tool0\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nG1 Y280 X10.0 Z0.38 F5000.0 \nG1 Y100 X10.0 Z0.38 F1500.0 E15 \nG1 Y100 X10.4 Z0.38 F5000.0 \nG1 Y280 X10.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\n{if first_layer_temperature[0] !=0 }\nTool0\nG1 Y280 X11.0 Z0.38 F5000.0 \nG1 Y100 X11.0 Z0.38 F1500.0 E15 \nG1 Y100 X11.4 Z0.38 F5000.0 \nG1 Y280 X11.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\nM400\nSKEW_PROFILE LOAD=SKEW1\nG28 X\nG28 Y\nTool{initial_extruder}\nSTART_PRINTING_MODE\n\n", + "max_layer_height": [ + "0.32", + "0.32" + ], + "min_layer_height": [ + "0.04", + "0.04" + ], + "nozzle_diameter": [ + "0.4", + "0.4" + ], + "nozzle_type": [ + "hardened_steel", + "hardened_steel" + ], + "nozzle_volume": [ + "0", + "0" + ], + "printable_area": [ + "10x0", + "410x0", + "410x342.5", + "10x342.5" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1", + "2" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "printer_model": "Xplorer Dual Gantry", + "printer_variant": "0.4", + "retract_before_wipe": [ + "70%", + "70%" + ], + "retract_length_toolchange": [ + "2", + "2" + ], + "retract_lift_above": [ + "0.2", + "0.2" + ], + "retract_lift_below": [ + "400", + "400" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18" + ], + "retraction_length": [ + "1.35", + "1.35" + ], + "retraction_minimum_travel": [ + "2", + "2" + ], + "retraction_speed": [ + "120", + "120" + ], + "travel_slope": [ + "1", + "1" + ], + "wipe": [ + "1", + "1" + ], + "wipe_distance": [ + "1", + "1" + ], + "z_hop": [ + "1", + "1" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer Dual Gantry 0.6 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer Dual Gantry 0.6 nozzle.json new file mode 100644 index 0000000000..39e9ecead3 --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer Dual Gantry 0.6 nozzle.json @@ -0,0 +1,261 @@ +{ + "type": "machine", + "name": "Xplorer Dual Gantry 0.6 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "M1ZyjMxGz0TpRDcv", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}\n{if layer_num <= 0}\nG91\nG1 Z+10 F1200\nG90\n{endif}", + "change_filament_gcode": ";CHANGE_FILAMENT - Start\n;Layer#=[layer_num] - Z=[layer_z]\n{if layer_z >first_layer_height}\nG91\nG1 Z+2 F1200\nG90\n{endif}\n{if layer_num != -1 || next_extruder != 0}\n Tool{next_extruder}\n{endif}\n; <----\nG1 Z[layer_z] F1200\n{if layer_num == -1 || layer_num == 0}\n M109 S[first_layer_temperature[next_extruder]] T[next_extruder]\n{else}\n M104 S[temperature[next_extruder]] T[next_extruder]\n{endif}\n; ---->\nM83\n;Layer#=[layer_num] - Z=[layer_z]\nLOG_EXTR\n;CHANGE_FILAMENT - End", + "default_nozzle_volume_type": [ + "High Flow", + "High Flow" + ], + "default_print_profile": "0.30mm Standard @Xplorer 0.6", + "deretraction_speed": [ + "120", + "120" + ], + "extruder_colour": [ + "#FCE94F", + "#729FCF" + ], + "extruder_offset": [ + "0x0", + "0x0" + ], + "extruder_type": [ + "Direct Drive", + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "imex_gantry_count": "2", + "imex_mode_active_tools": [ + "0:P", + "0:P,1:C", + "0:P,1:M" + ], + "imex_mode_gcodes": [ + "SET_PRINT_MODE MODE=PRIMARY", + "SET_PRINT_MODE MODE=COPY", + "SET_PRINT_MODE MODE=MIRROR" + ], + "imex_mode_names": [ + "primary", + "copy", + "mirror" + ], + "imex_tool_layout": "rear-left", + "imex_tools_per_gantry": "1", + "is_imex": "1", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0", + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000", + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000", + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50", + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25", + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2", + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0", + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60", + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20", + "40", + "20" + ], + "machine_start_gcode": "M104 S{first_layer_temperature[0]} T0\nM104 S{first_layer_temperature[1]} T1\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[0]} T0\nM109 S{first_layer_temperature[1]} T1\nstart_print\nG1 F5000\n{if first_layer_temperature[1] !=0 }\nTool1\nbrush_Tool1\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nbrush_Tool0\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nG1 Y280 X10.0 Z0.38 F5000.0 \nG1 Y100 X10.0 Z0.38 F1500.0 E15 \nG1 Y100 X10.4 Z0.38 F5000.0 \nG1 Y280 X10.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\n{if first_layer_temperature[0] !=0 }\nTool0\nG1 Y280 X11.0 Z0.38 F5000.0 \nG1 Y100 X11.0 Z0.38 F1500.0 E15 \nG1 Y100 X11.4 Z0.38 F5000.0 \nG1 Y280 X11.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\nM400\nSKEW_PROFILE LOAD=SKEW1\nG28 X\nG28 Y\nTool{initial_extruder}\nSTART_PRINTING_MODE\n\n", + "max_layer_height": [ + "0.45", + "0.45" + ], + "min_layer_height": [ + "0.12", + "0.12" + ], + "nozzle_diameter": [ + "0.6", + "0.6" + ], + "nozzle_type": [ + "hardened_steel", + "hardened_steel" + ], + "nozzle_volume": [ + "0", + "0" + ], + "printable_area": [ + "10x0", + "410x0", + "410x342.5", + "10x342.5" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1", + "2" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "printer_model": "Xplorer Dual Gantry", + "printer_variant": "0.6", + "retract_before_wipe": [ + "70%", + "70%" + ], + "retract_length_toolchange": [ + "2", + "2" + ], + "retract_lift_above": [ + "0.2", + "0.2" + ], + "retract_lift_below": [ + "400", + "400" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18" + ], + "retraction_length": [ + "1.35", + "1.35" + ], + "retraction_minimum_travel": [ + "2", + "2" + ], + "retraction_speed": [ + "120", + "120" + ], + "travel_slope": [ + "1", + "1" + ], + "wipe": [ + "1", + "1" + ], + "wipe_distance": [ + "1", + "1" + ], + "z_hop": [ + "1", + "1" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer Dual Gantry 0.8 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer Dual Gantry 0.8 nozzle.json new file mode 100644 index 0000000000..4b6e2ed54d --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer Dual Gantry 0.8 nozzle.json @@ -0,0 +1,261 @@ +{ + "type": "machine", + "name": "Xplorer Dual Gantry 0.8 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "fWRcMcf9H5NP6zrX", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}\n{if layer_num <= 0}\nG91\nG1 Z+10 F1200\nG90\n{endif}", + "change_filament_gcode": ";CHANGE_FILAMENT - Start\n;Layer#=[layer_num] - Z=[layer_z]\n{if layer_z >first_layer_height}\nG91\nG1 Z+2 F1200\nG90\n{endif}\n{if layer_num != -1 || next_extruder != 0}\n Tool{next_extruder}\n{endif}\n; <----\nG1 Z[layer_z] F1200\n{if layer_num == -1 || layer_num == 0}\n M109 S[first_layer_temperature[next_extruder]] T[next_extruder]\n{else}\n M104 S[temperature[next_extruder]] T[next_extruder]\n{endif}\n; ---->\nM83\n;Layer#=[layer_num] - Z=[layer_z]\nLOG_EXTR\n;CHANGE_FILAMENT - End", + "default_nozzle_volume_type": [ + "High Flow", + "High Flow" + ], + "default_print_profile": "0.40mm Standard @Xplorer 0.8", + "deretraction_speed": [ + "120", + "120" + ], + "extruder_colour": [ + "#FCE94F", + "#729FCF" + ], + "extruder_offset": [ + "0x0", + "0x0" + ], + "extruder_type": [ + "Direct Drive", + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "imex_gantry_count": "2", + "imex_mode_active_tools": [ + "0:P", + "0:P,1:C", + "0:P,1:M" + ], + "imex_mode_gcodes": [ + "SET_PRINT_MODE MODE=PRIMARY", + "SET_PRINT_MODE MODE=COPY", + "SET_PRINT_MODE MODE=MIRROR" + ], + "imex_mode_names": [ + "primary", + "copy", + "mirror" + ], + "imex_tool_layout": "rear-left", + "imex_tools_per_gantry": "1", + "is_imex": "1", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0", + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000", + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000", + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50", + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25", + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2", + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0", + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60", + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20", + "40", + "20" + ], + "machine_start_gcode": "M104 S{first_layer_temperature[0]} T0\nM104 S{first_layer_temperature[1]} T1\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[0]} T0\nM109 S{first_layer_temperature[1]} T1\nstart_print\nG1 F5000\n{if first_layer_temperature[1] !=0 }\nTool1\nbrush_Tool1\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nbrush_Tool0\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nG1 Y280 X10.0 Z0.38 F5000.0 \nG1 Y100 X10.0 Z0.38 F1500.0 E15 \nG1 Y100 X10.4 Z0.38 F5000.0 \nG1 Y280 X10.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\n{if first_layer_temperature[0] !=0 }\nTool0\nG1 Y280 X11.0 Z0.38 F5000.0 \nG1 Y100 X11.0 Z0.38 F1500.0 E15 \nG1 Y100 X11.4 Z0.38 F5000.0 \nG1 Y280 X11.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\nM400\nSKEW_PROFILE LOAD=SKEW1\nG28 X\nG28 Y\nTool{initial_extruder}\nSTART_PRINTING_MODE\n\n", + "max_layer_height": [ + "0.64", + "0.64" + ], + "min_layer_height": [ + "0.2", + "0.2" + ], + "nozzle_diameter": [ + "0.8", + "0.8" + ], + "nozzle_type": [ + "hardened_steel", + "hardened_steel" + ], + "nozzle_volume": [ + "0", + "0" + ], + "printable_area": [ + "10x0", + "410x0", + "410x342.5", + "10x342.5" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1", + "2" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "printer_model": "Xplorer Dual Gantry", + "printer_variant": "0.8", + "retract_before_wipe": [ + "70%", + "70%" + ], + "retract_length_toolchange": [ + "2", + "2" + ], + "retract_lift_above": [ + "0.2", + "0.2" + ], + "retract_lift_below": [ + "400", + "400" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18" + ], + "retraction_length": [ + "1.35", + "1.35" + ], + "retraction_minimum_travel": [ + "2", + "2" + ], + "retraction_speed": [ + "120", + "120" + ], + "travel_slope": [ + "1", + "1" + ], + "wipe": [ + "1", + "1" + ], + "wipe_distance": [ + "1", + "1" + ], + "z_hop": [ + "1", + "1" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer IDEX 0.4 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer IDEX 0.4 nozzle.json new file mode 100644 index 0000000000..1529f22b4b --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer IDEX 0.4 nozzle.json @@ -0,0 +1,254 @@ +{ + "type": "machine", + "name": "Xplorer IDEX 0.4 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "lOZ2qJY7SsNRW03z", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}\n{if layer_num <= 0}\nG91\nG1 Z+10 F1200\nG90\n{endif}", + "change_filament_gcode": ";CHANGE_FILAMENT - Start\n;Layer#=[layer_num] - Z=[layer_z]\n{if layer_z >first_layer_height}\nG91\nG1 Z+2 F1200\nG90\n{endif}\n{if layer_num != -1 || next_extruder != 0}\n Tool{next_extruder}\n{endif}\n; <----\nG1 Z[layer_z] F1200\n{if layer_num == -1 || layer_num == 0}\n M109 S[first_layer_temperature[next_extruder]] T[next_extruder]\n{else}\n M104 S[temperature[next_extruder]] T[next_extruder]\n{endif}\n; ---->\nM83\n;Layer#=[layer_num] - Z=[layer_z]\nLOG_EXTR\n;CHANGE_FILAMENT - End", + "default_nozzle_volume_type": [ + "High Flow", + "High Flow" + ], + "default_print_profile": "0.20mm Standard @Xplorer 0.4", + "deretraction_speed": [ + "120", + "120" + ], + "extruder_colour": [ + "#FCE94F", + "#729FCF" + ], + "extruder_offset": [ + "0x0", + "0x0" + ], + "extruder_type": [ + "Direct Drive", + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "imex_mode_active_tools": [ + "0:P", + "0:P,1:C", + "0:P,1:M" + ], + "imex_mode_gcodes": [ + "SET_PRINT_MODE MODE=PRIMARY", + "SET_PRINT_MODE MODE=COPY", + "SET_PRINT_MODE MODE=MIRROR" + ], + "imex_mode_names": [ + "primary", + "copy", + "mirror" + ], + "imex_nozzle_clearance_x": "40", + "imex_tool_layout": "front-left", + "is_imex": "1", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0", + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000", + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000", + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50", + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25", + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2", + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0", + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60", + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20", + "40", + "20" + ], + "machine_start_gcode": "M104 S{first_layer_temperature[0]} T0\nM104 S{first_layer_temperature[1]} T1\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[0]} T0\nM109 S{first_layer_temperature[1]} T1\nstart_print\nG1 F5000\n{if first_layer_temperature[1] !=0 }\nTool1\nbrush_Tool1\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nbrush_Tool0\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nG1 X280.1 Y3.0 Z0.38 F5000.0 \nG1 X100.1 Y3.0 Z0.38 F1500.0 E15 \nG1 X100.1 Y3.4 Z0.38 F5000.0 \nG1 X280.1 Y3.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nG1 X100.1 Y2.0 Z0.38 F5000.0 \nG1 X280.1 Y2.0 Z0.38 F1500.0 E15 \nG1 X280.1 Y2.4 Z0.38 F5000.0 \nG1 X100.1 Y2.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nM400\nSKEW_PROFILE LOAD=SKEW1\nG28 X\nTool{initial_extruder}\nSTART_PRINTING_MODE\n\n", + "max_layer_height": [ + "0.32", + "0.32" + ], + "min_layer_height": [ + "0.04", + "0.04" + ], + "nozzle_diameter": [ + "0.4", + "0.4" + ], + "nozzle_type": [ + "hardened_steel", + "hardened_steel" + ], + "nozzle_volume": [ + "0", + "0" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1", + "2" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "printer_model": "Xplorer IDEX", + "printer_variant": "0.4", + "retract_before_wipe": [ + "70%", + "70%" + ], + "retract_length_toolchange": [ + "2", + "2" + ], + "retract_lift_above": [ + "0.2", + "0.2" + ], + "retract_lift_below": [ + "400", + "400" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18" + ], + "retraction_length": [ + "1.35", + "1.35" + ], + "retraction_minimum_travel": [ + "2", + "2" + ], + "retraction_speed": [ + "120", + "120" + ], + "travel_slope": [ + "1", + "1" + ], + "wipe": [ + "1", + "1" + ], + "wipe_distance": [ + "1", + "1" + ], + "z_hop": [ + "1", + "1" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer IDEX 0.6 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer IDEX 0.6 nozzle.json new file mode 100644 index 0000000000..b6cfd97d54 --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer IDEX 0.6 nozzle.json @@ -0,0 +1,254 @@ +{ + "type": "machine", + "name": "Xplorer IDEX 0.6 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "S4ZLGZuPtR3yC4IZ", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}\n{if layer_num <= 0}\nG91\nG1 Z+10 F1200\nG90\n{endif}", + "change_filament_gcode": ";CHANGE_FILAMENT - Start\n;Layer#=[layer_num] - Z=[layer_z]\n{if layer_z >first_layer_height}\nG91\nG1 Z+2 F1200\nG90\n{endif}\n{if layer_num != -1 || next_extruder != 0}\n Tool{next_extruder}\n{endif}\n; <----\nG1 Z[layer_z] F1200\n{if layer_num == -1 || layer_num == 0}\n M109 S[first_layer_temperature[next_extruder]] T[next_extruder]\n{else}\n M104 S[temperature[next_extruder]] T[next_extruder]\n{endif}\n; ---->\nM83\n;Layer#=[layer_num] - Z=[layer_z]\nLOG_EXTR\n;CHANGE_FILAMENT - End", + "default_nozzle_volume_type": [ + "High Flow", + "High Flow" + ], + "default_print_profile": "0.30mm Standard @Xplorer 0.6", + "deretraction_speed": [ + "120", + "120" + ], + "extruder_colour": [ + "#FCE94F", + "#729FCF" + ], + "extruder_offset": [ + "0x0", + "0x0" + ], + "extruder_type": [ + "Direct Drive", + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "imex_mode_active_tools": [ + "0:P", + "0:P,1:C", + "0:P,1:M" + ], + "imex_mode_gcodes": [ + "SET_PRINT_MODE MODE=PRIMARY", + "SET_PRINT_MODE MODE=COPY", + "SET_PRINT_MODE MODE=MIRROR" + ], + "imex_mode_names": [ + "primary", + "copy", + "mirror" + ], + "imex_nozzle_clearance_x": "40", + "imex_tool_layout": "front-left", + "is_imex": "1", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0", + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000", + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000", + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50", + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25", + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2", + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0", + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60", + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20", + "40", + "20" + ], + "machine_start_gcode": "M104 S{first_layer_temperature[0]} T0\nM104 S{first_layer_temperature[1]} T1\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[0]} T0\nM109 S{first_layer_temperature[1]} T1\nstart_print\nG1 F5000\n{if first_layer_temperature[1] !=0 }\nTool1\nbrush_Tool1\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nbrush_Tool0\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nG1 X280.1 Y3.0 Z0.38 F5000.0 \nG1 X100.1 Y3.0 Z0.38 F1500.0 E15 \nG1 X100.1 Y3.4 Z0.38 F5000.0 \nG1 X280.1 Y3.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nG1 X100.1 Y2.0 Z0.38 F5000.0 \nG1 X280.1 Y2.0 Z0.38 F1500.0 E15 \nG1 X280.1 Y2.4 Z0.38 F5000.0 \nG1 X100.1 Y2.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nM400\nSKEW_PROFILE LOAD=SKEW1\nG28 X\nTool{initial_extruder}\nSTART_PRINTING_MODE\n\n", + "max_layer_height": [ + "0.45", + "0.45" + ], + "min_layer_height": [ + "0.12", + "0.12" + ], + "nozzle_diameter": [ + "0.6", + "0.6" + ], + "nozzle_type": [ + "hardened_steel", + "hardened_steel" + ], + "nozzle_volume": [ + "0", + "0" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1", + "2" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "printer_model": "Xplorer IDEX", + "printer_variant": "0.6", + "retract_before_wipe": [ + "70%", + "70%" + ], + "retract_length_toolchange": [ + "2", + "2" + ], + "retract_lift_above": [ + "0.2", + "0.2" + ], + "retract_lift_below": [ + "400", + "400" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18" + ], + "retraction_length": [ + "1.35", + "1.35" + ], + "retraction_minimum_travel": [ + "2", + "2" + ], + "retraction_speed": [ + "120", + "120" + ], + "travel_slope": [ + "1", + "1" + ], + "wipe": [ + "1", + "1" + ], + "wipe_distance": [ + "1", + "1" + ], + "z_hop": [ + "1", + "1" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer IDEX 0.8 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer IDEX 0.8 nozzle.json new file mode 100644 index 0000000000..599717aba4 --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer IDEX 0.8 nozzle.json @@ -0,0 +1,254 @@ +{ + "type": "machine", + "name": "Xplorer IDEX 0.8 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "U50ftmONKAXI4OQ9", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}\n{if layer_num <= 0}\nG91\nG1 Z+10 F1200\nG90\n{endif}", + "change_filament_gcode": ";CHANGE_FILAMENT - Start\n;Layer#=[layer_num] - Z=[layer_z]\n{if layer_z >first_layer_height}\nG91\nG1 Z+2 F1200\nG90\n{endif}\n{if layer_num != -1 || next_extruder != 0}\n Tool{next_extruder}\n{endif}\n; <----\nG1 Z[layer_z] F1200\n{if layer_num == -1 || layer_num == 0}\n M109 S[first_layer_temperature[next_extruder]] T[next_extruder]\n{else}\n M104 S[temperature[next_extruder]] T[next_extruder]\n{endif}\n; ---->\nM83\n;Layer#=[layer_num] - Z=[layer_z]\nLOG_EXTR\n;CHANGE_FILAMENT - End", + "default_nozzle_volume_type": [ + "High Flow", + "High Flow" + ], + "default_print_profile": "0.40mm Standard @Xplorer 0.8", + "deretraction_speed": [ + "120", + "120" + ], + "extruder_colour": [ + "#FCE94F", + "#729FCF" + ], + "extruder_offset": [ + "0x0", + "0x0" + ], + "extruder_type": [ + "Direct Drive", + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "imex_mode_active_tools": [ + "0:P", + "0:P,1:C", + "0:P,1:M" + ], + "imex_mode_gcodes": [ + "SET_PRINT_MODE MODE=PRIMARY", + "SET_PRINT_MODE MODE=COPY", + "SET_PRINT_MODE MODE=MIRROR" + ], + "imex_mode_names": [ + "primary", + "copy", + "mirror" + ], + "imex_nozzle_clearance_x": "40", + "imex_tool_layout": "front-left", + "is_imex": "1", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0", + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000", + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000", + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50", + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25", + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2", + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0", + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60", + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150", + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20", + "40", + "20" + ], + "machine_start_gcode": "M104 S{first_layer_temperature[0]} T0\nM104 S{first_layer_temperature[1]} T1\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[0]} T0\nM109 S{first_layer_temperature[1]} T1\nstart_print\nG1 F5000\n{if first_layer_temperature[1] !=0 }\nTool1\nbrush_Tool1\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nbrush_Tool0\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nG1 X280.1 Y3.0 Z0.38 F5000.0 \nG1 X100.1 Y3.0 Z0.38 F1500.0 E15 \nG1 X100.1 Y3.4 Z0.38 F5000.0 \nG1 X280.1 Y3.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nG1 X100.1 Y2.0 Z0.38 F5000.0 \nG1 X280.1 Y2.0 Z0.38 F1500.0 E15 \nG1 X280.1 Y2.4 Z0.38 F5000.0 \nG1 X100.1 Y2.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nM400\nSKEW_PROFILE LOAD=SKEW1\nG28 X\nTool{initial_extruder}\nSTART_PRINTING_MODE\n\n", + "max_layer_height": [ + "0.64", + "0.64" + ], + "min_layer_height": [ + "0.2", + "0.2" + ], + "nozzle_diameter": [ + "0.8", + "0.8" + ], + "nozzle_type": [ + "hardened_steel", + "hardened_steel" + ], + "nozzle_volume": [ + "0", + "0" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1", + "2" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "printer_model": "Xplorer IDEX", + "printer_variant": "0.8", + "retract_before_wipe": [ + "70%", + "70%" + ], + "retract_length_toolchange": [ + "2", + "2" + ], + "retract_lift_above": [ + "0.2", + "0.2" + ], + "retract_lift_below": [ + "400", + "400" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18" + ], + "retraction_length": [ + "1.35", + "1.35" + ], + "retraction_minimum_travel": [ + "2", + "2" + ], + "retraction_speed": [ + "120", + "120" + ], + "travel_slope": [ + "1", + "1" + ], + "wipe": [ + "1", + "1" + ], + "wipe_distance": [ + "1", + "1" + ], + "z_hop": [ + "1", + "1" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer IQEX 0.4 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer IQEX 0.4 nozzle.json new file mode 100644 index 0000000000..d98f63e703 --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer IQEX 0.4 nozzle.json @@ -0,0 +1,399 @@ +{ + "type": "machine", + "name": "Xplorer IQEX 0.4 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "fbUJR4RMoMczxSkH", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}\n{if layer_num <= 0}\nG91\nG1 Z+10 F1200\nG90\n{endif}", + "change_filament_gcode": ";CHANGE_FILAMENT - Start\n;Layer#=[layer_num] - Z=[layer_z]\n{if layer_z >first_layer_height}\nG91\nG1 Z+2 F1200\nG90\n{endif}\n{if layer_num != -1 || next_extruder != 0}\n Tool{next_extruder}\n{endif}\n; <----\nG1 Z[layer_z] F1200\n{if layer_num == -1 || layer_num == 0}\n M109 S[first_layer_temperature[next_extruder]] T[next_extruder]\n{else}\n M104 S[temperature[next_extruder]] T[next_extruder]\n{endif}\n; ---->\nM83\n;Layer#=[layer_num] - Z=[layer_z]\nLOG_EXTR\n;CHANGE_FILAMENT - End", + "default_nozzle_volume_type": [ + "High Flow", + "High Flow", + "High Flow", + "High Flow" + ], + "default_print_profile": "0.20mm Standard @Xplorer 0.4", + "deretraction_speed": [ + "120", + "120", + "120", + "120" + ], + "extruder_colour": [ + "#FCE94F", + "#729FCF", + "#AD7FA8", + "#F57900" + ], + "extruder_offset": [ + "0x0", + "0x0", + "0x0", + "0x0" + ], + "extruder_type": [ + "Direct Drive", + "Direct Drive", + "Direct Drive", + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "imex_gantry_count": "2", + "imex_mode_active_tools": [ + "0:P", + "0:P,1:C", + "0:P,1:M", + "0:P,1:C,2:C,3:C", + "0:P,1:C,2:M,3:M", + "0:P,1:S,2:C,3:C", + "0:P,1:S,2:M,3:M" + ], + "imex_mode_gcodes": [ + "SET_PRINT_MODE MODE=PRIMARY", + "SET_PRINT_MODE MODE=COPY01", + "SET_PRINT_MODE MODE=MIRROR01", + "SET_PRINT_MODE MODE=COPY0123", + "SET_PRINT_MODE MODE=MIRROR0123", + "SET_PRINT_MODE MODE=MULTICOLOR_COPY01", + "SET_PRINT_MODE MODE=MULTICOLOR_MIRROR01" + ], + "imex_mode_names": [ + "primary", + "copy", + "mirror", + "iq-copy", + "iq-mirror", + "mc-copy", + "mc-mirror" + ], + "imex_nozzle_clearance_x": "40", + "imex_tool_layout": "rear-left", + "is_imex": "1", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0", + "0", + "0", + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000", + "6000", + "5000", + "6000", + "5000", + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000", + "5000", + "5000", + "5000", + "5000", + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50", + "100", + "50", + "100", + "50", + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25", + "2.5", + "1.25", + "2.5", + "1.25", + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5", + "5", + "2.5", + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5", + "5", + "2.5", + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2", + "0.4", + "0.2", + "0.4", + "0.2", + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60", + "120", + "60", + "120", + "60", + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150", + "300", + "150", + "300", + "150", + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150", + "300", + "150", + "300", + "150", + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20", + "40", + "20", + "40", + "20", + "40", + "20" + ], + "machine_start_gcode": "M104 S{first_layer_temperature[0]} T0\nM104 S{first_layer_temperature[1]} T1\nM104 S{first_layer_temperature[2]} T2\nM104 S{first_layer_temperature[3]} T3\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[0]} T0\nM109 S{first_layer_temperature[1]} T1\nM109 S{first_layer_temperature[2]} T2\nM109 S{first_layer_temperature[3]} T3\nstart_print\nG1 F5000\n{if first_layer_temperature[3] !=0 }\nTool3\nbrush_Tool3\n{endif}\n{if first_layer_temperature[2] !=0 }\nTool2\nbrush_Tool2\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nbrush_Tool1\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nbrush_Tool0\n{endif}\n{if first_layer_temperature[3] !=0 }\nTool3\nG1 Y280 X407.0 Z0.38 F5000.0 \nG1 Y175 X407.0 Z0.38 F1500.0 E15 \nG1 Y175 X407.4 Z0.38 F5000.0 \nG1 Y280 X407.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\n{if first_layer_temperature[2] !=0 }\nTool2\nG1 Y280 X12.0 Z0.38 F5000.0 \nG1 Y175 X12.0 Z0.38 F1500.0 E15 \nG1 Y175 X12.4 Z0.38 F5000.0 \nG1 Y280 X12.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nG1 Y280 X408.0 Z0.38 F5000.0 \nG1 Y175 X408.0 Z0.38 F1500.0 E15 \nG1 Y175 X408.4 Z0.38 F5000.0 \nG1 Y280 X408.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\n{if first_layer_temperature[0] !=0 }\nTool0\nG1 Y280 X11.0 Z0.38 F5000.0 \nG1 Y175 X11.0 Z0.38 F1500.0 E15 \nG1 Y175 X11.4 Z0.38 F5000.0 \nG1 Y280 X11.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\nM400\nSKEW_PROFILE LOAD=SKEW1\nG28 X\nG28 Y\nTool{initial_extruder}\nSTART_PRINTING_MODE\n\n", + "max_layer_height": [ + "0.32", + "0.32", + "0.32", + "0.32" + ], + "min_layer_height": [ + "0.04", + "0.04", + "0.04", + "0.04" + ], + "nozzle_diameter": [ + "0.4", + "0.4", + "0.4", + "0.4" + ], + "nozzle_type": [ + "hardened_steel", + "hardened_steel", + "hardened_steel", + "hardened_steel" + ], + "nozzle_volume": [ + "0", + "0", + "0", + "0" + ], + "printable_area": [ + "10x0", + "410x0", + "410x342.5", + "10x342.5" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1", + "2", + "3", + "4" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "printer_model": "Xplorer IQEX", + "printer_variant": "0.4", + "retract_before_wipe": [ + "70%", + "70%", + "70%", + "70%" + ], + "retract_length_toolchange": [ + "2", + "2", + "2", + "2" + ], + "retract_lift_above": [ + "0.2", + "0.2", + "0.2", + "0.2" + ], + "retract_lift_below": [ + "400", + "400", + "400", + "400" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces", + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0", + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0", + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1", + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18", + "18", + "18" + ], + "retraction_length": [ + "1.35", + "1.35", + "1.35", + "1.35" + ], + "retraction_minimum_travel": [ + "2", + "2", + "2", + "2" + ], + "retraction_speed": [ + "120", + "120", + "120", + "120" + ], + "travel_slope": [ + "1", + "1", + "1", + "1" + ], + "wipe": [ + "1", + "1", + "1", + "1" + ], + "wipe_distance": [ + "1", + "1", + "1", + "1" + ], + "z_hop": [ + "1", + "1", + "1", + "1" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift", + "Normal Lift", + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer IQEX 0.6 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer IQEX 0.6 nozzle.json new file mode 100644 index 0000000000..97ab9406c5 --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer IQEX 0.6 nozzle.json @@ -0,0 +1,399 @@ +{ + "type": "machine", + "name": "Xplorer IQEX 0.6 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "hOYAHBik6rxU1B0d", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}\n{if layer_num <= 0}\nG91\nG1 Z+10 F1200\nG90\n{endif}", + "change_filament_gcode": ";CHANGE_FILAMENT - Start\n;Layer#=[layer_num] - Z=[layer_z]\n{if layer_z >first_layer_height}\nG91\nG1 Z+2 F1200\nG90\n{endif}\n{if layer_num != -1 || next_extruder != 0}\n Tool{next_extruder}\n{endif}\n; <----\nG1 Z[layer_z] F1200\n{if layer_num == -1 || layer_num == 0}\n M109 S[first_layer_temperature[next_extruder]] T[next_extruder]\n{else}\n M104 S[temperature[next_extruder]] T[next_extruder]\n{endif}\n; ---->\nM83\n;Layer#=[layer_num] - Z=[layer_z]\nLOG_EXTR\n;CHANGE_FILAMENT - End", + "default_nozzle_volume_type": [ + "High Flow", + "High Flow", + "High Flow", + "High Flow" + ], + "default_print_profile": "0.30mm Standard @Xplorer 0.6", + "deretraction_speed": [ + "120", + "120", + "120", + "120" + ], + "extruder_colour": [ + "#FCE94F", + "#729FCF", + "#AD7FA8", + "#F57900" + ], + "extruder_offset": [ + "0x0", + "0x0", + "0x0", + "0x0" + ], + "extruder_type": [ + "Direct Drive", + "Direct Drive", + "Direct Drive", + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "imex_gantry_count": "2", + "imex_mode_active_tools": [ + "0:P", + "0:P,1:C", + "0:P,1:M", + "0:P,1:C,2:C,3:C", + "0:P,1:C,2:M,3:M", + "0:P,1:S,2:C,3:C", + "0:P,1:S,2:M,3:M" + ], + "imex_mode_gcodes": [ + "SET_PRINT_MODE MODE=PRIMARY", + "SET_PRINT_MODE MODE=COPY01", + "SET_PRINT_MODE MODE=MIRROR01", + "SET_PRINT_MODE MODE=COPY0123", + "SET_PRINT_MODE MODE=MIRROR0123", + "SET_PRINT_MODE MODE=MULTICOLOR_COPY01", + "SET_PRINT_MODE MODE=MULTICOLOR_MIRROR01" + ], + "imex_mode_names": [ + "primary", + "copy", + "mirror", + "iq-copy", + "iq-mirror", + "mc-copy", + "mc-mirror" + ], + "imex_nozzle_clearance_x": "40", + "imex_tool_layout": "rear-left", + "is_imex": "1", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0", + "0", + "0", + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000", + "6000", + "5000", + "6000", + "5000", + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000", + "5000", + "5000", + "5000", + "5000", + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50", + "100", + "50", + "100", + "50", + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25", + "2.5", + "1.25", + "2.5", + "1.25", + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5", + "5", + "2.5", + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5", + "5", + "2.5", + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2", + "0.4", + "0.2", + "0.4", + "0.2", + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60", + "120", + "60", + "120", + "60", + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150", + "300", + "150", + "300", + "150", + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150", + "300", + "150", + "300", + "150", + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20", + "40", + "20", + "40", + "20", + "40", + "20" + ], + "machine_start_gcode": "M104 S{first_layer_temperature[0]} T0\nM104 S{first_layer_temperature[1]} T1\nM104 S{first_layer_temperature[2]} T2\nM104 S{first_layer_temperature[3]} T3\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[0]} T0\nM109 S{first_layer_temperature[1]} T1\nM109 S{first_layer_temperature[2]} T2\nM109 S{first_layer_temperature[3]} T3\nstart_print\nG1 F5000\n{if first_layer_temperature[3] !=0 }\nTool3\nbrush_Tool3\n{endif}\n{if first_layer_temperature[2] !=0 }\nTool2\nbrush_Tool2\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nbrush_Tool1\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nbrush_Tool0\n{endif}\n{if first_layer_temperature[3] !=0 }\nTool3\nG1 Y280 X407.0 Z0.38 F5000.0 \nG1 Y175 X407.0 Z0.38 F1500.0 E15 \nG1 Y175 X407.4 Z0.38 F5000.0 \nG1 Y280 X407.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\n{if first_layer_temperature[2] !=0 }\nTool2\nG1 Y280 X12.0 Z0.38 F5000.0 \nG1 Y175 X12.0 Z0.38 F1500.0 E15 \nG1 Y175 X12.4 Z0.38 F5000.0 \nG1 Y280 X12.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nG1 Y280 X408.0 Z0.38 F5000.0 \nG1 Y175 X408.0 Z0.38 F1500.0 E15 \nG1 Y175 X408.4 Z0.38 F5000.0 \nG1 Y280 X408.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\n{if first_layer_temperature[0] !=0 }\nTool0\nG1 Y280 X11.0 Z0.38 F5000.0 \nG1 Y175 X11.0 Z0.38 F1500.0 E15 \nG1 Y175 X11.4 Z0.38 F5000.0 \nG1 Y280 X11.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\nM400\nSKEW_PROFILE LOAD=SKEW1\nG28 X\nG28 Y\nTool{initial_extruder}\nSTART_PRINTING_MODE\n\n", + "max_layer_height": [ + "0.45", + "0.45", + "0.45", + "0.45" + ], + "min_layer_height": [ + "0.12", + "0.12", + "0.12", + "0.12" + ], + "nozzle_diameter": [ + "0.6", + "0.6", + "0.6", + "0.6" + ], + "nozzle_type": [ + "hardened_steel", + "hardened_steel", + "hardened_steel", + "hardened_steel" + ], + "nozzle_volume": [ + "0", + "0", + "0", + "0" + ], + "printable_area": [ + "10x0", + "410x0", + "410x342.5", + "10x342.5" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1", + "2", + "3", + "4" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "printer_model": "Xplorer IQEX", + "printer_variant": "0.6", + "retract_before_wipe": [ + "70%", + "70%", + "70%", + "70%" + ], + "retract_length_toolchange": [ + "2", + "2", + "2", + "2" + ], + "retract_lift_above": [ + "0.2", + "0.2", + "0.2", + "0.2" + ], + "retract_lift_below": [ + "400", + "400", + "400", + "400" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces", + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0", + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0", + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1", + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18", + "18", + "18" + ], + "retraction_length": [ + "1.35", + "1.35", + "1.35", + "1.35" + ], + "retraction_minimum_travel": [ + "2", + "2", + "2", + "2" + ], + "retraction_speed": [ + "120", + "120", + "120", + "120" + ], + "travel_slope": [ + "1", + "1", + "1", + "1" + ], + "wipe": [ + "1", + "1", + "1", + "1" + ], + "wipe_distance": [ + "1", + "1", + "1", + "1" + ], + "z_hop": [ + "1", + "1", + "1", + "1" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift", + "Normal Lift", + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer IQEX 0.8 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer IQEX 0.8 nozzle.json new file mode 100644 index 0000000000..68a22685ed --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer IQEX 0.8 nozzle.json @@ -0,0 +1,399 @@ +{ + "type": "machine", + "name": "Xplorer IQEX 0.8 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "e048HgBDJy6XnaaO", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}\n{if layer_num <= 0}\nG91\nG1 Z+10 F1200\nG90\n{endif}", + "change_filament_gcode": ";CHANGE_FILAMENT - Start\n;Layer#=[layer_num] - Z=[layer_z]\n{if layer_z >first_layer_height}\nG91\nG1 Z+2 F1200\nG90\n{endif}\n{if layer_num != -1 || next_extruder != 0}\n Tool{next_extruder}\n{endif}\n; <----\nG1 Z[layer_z] F1200\n{if layer_num == -1 || layer_num == 0}\n M109 S[first_layer_temperature[next_extruder]] T[next_extruder]\n{else}\n M104 S[temperature[next_extruder]] T[next_extruder]\n{endif}\n; ---->\nM83\n;Layer#=[layer_num] - Z=[layer_z]\nLOG_EXTR\n;CHANGE_FILAMENT - End", + "default_nozzle_volume_type": [ + "High Flow", + "High Flow", + "High Flow", + "High Flow" + ], + "default_print_profile": "0.40mm Standard @Xplorer 0.8", + "deretraction_speed": [ + "120", + "120", + "120", + "120" + ], + "extruder_colour": [ + "#FCE94F", + "#729FCF", + "#AD7FA8", + "#F57900" + ], + "extruder_offset": [ + "0x0", + "0x0", + "0x0", + "0x0" + ], + "extruder_type": [ + "Direct Drive", + "Direct Drive", + "Direct Drive", + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "imex_gantry_count": "2", + "imex_mode_active_tools": [ + "0:P", + "0:P,1:C", + "0:P,1:M", + "0:P,1:C,2:C,3:C", + "0:P,1:C,2:M,3:M", + "0:P,1:S,2:C,3:C", + "0:P,1:S,2:M,3:M" + ], + "imex_mode_gcodes": [ + "SET_PRINT_MODE MODE=PRIMARY", + "SET_PRINT_MODE MODE=COPY01", + "SET_PRINT_MODE MODE=MIRROR01", + "SET_PRINT_MODE MODE=COPY0123", + "SET_PRINT_MODE MODE=MIRROR0123", + "SET_PRINT_MODE MODE=MULTICOLOR_COPY01", + "SET_PRINT_MODE MODE=MULTICOLOR_MIRROR01" + ], + "imex_mode_names": [ + "primary", + "copy", + "mirror", + "iq-copy", + "iq-mirror", + "mc-copy", + "mc-mirror" + ], + "imex_nozzle_clearance_x": "40", + "imex_tool_layout": "rear-left", + "is_imex": "1", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0", + "0", + "0", + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000", + "6000", + "5000", + "6000", + "5000", + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000", + "5000", + "5000", + "5000", + "5000", + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500", + "5000", + "2500", + "5000", + "2500", + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50", + "100", + "50", + "100", + "50", + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25", + "2.5", + "1.25", + "2.5", + "1.25", + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5", + "5", + "2.5", + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5", + "5", + "2.5", + "5", + "2.5", + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2", + "0.4", + "0.2", + "0.4", + "0.2", + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60", + "120", + "60", + "120", + "60", + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150", + "300", + "150", + "300", + "150", + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150", + "300", + "150", + "300", + "150", + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20", + "40", + "20", + "40", + "20", + "40", + "20" + ], + "machine_start_gcode": "M104 S{first_layer_temperature[0]} T0\nM104 S{first_layer_temperature[1]} T1\nM104 S{first_layer_temperature[2]} T2\nM104 S{first_layer_temperature[3]} T3\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[0]} T0\nM109 S{first_layer_temperature[1]} T1\nM109 S{first_layer_temperature[2]} T2\nM109 S{first_layer_temperature[3]} T3\nstart_print\nG1 F5000\n{if first_layer_temperature[3] !=0 }\nTool3\nbrush_Tool3\n{endif}\n{if first_layer_temperature[2] !=0 }\nTool2\nbrush_Tool2\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nbrush_Tool1\n{endif}\n{if first_layer_temperature[0] !=0 }\nTool0\nbrush_Tool0\n{endif}\n{if first_layer_temperature[3] !=0 }\nTool3\nG1 Y280 X407.0 Z0.38 F5000.0 \nG1 Y175 X407.0 Z0.38 F1500.0 E15 \nG1 Y175 X407.4 Z0.38 F5000.0 \nG1 Y280 X407.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\n{if first_layer_temperature[2] !=0 }\nTool2\nG1 Y280 X12.0 Z0.38 F5000.0 \nG1 Y175 X12.0 Z0.38 F1500.0 E15 \nG1 Y175 X12.4 Z0.38 F5000.0 \nG1 Y280 X12.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\n{if first_layer_temperature[1] !=0 }\nTool1\nG1 Y280 X408.0 Z0.38 F5000.0 \nG1 Y175 X408.0 Z0.38 F1500.0 E15 \nG1 Y175 X408.4 Z0.38 F5000.0 \nG1 Y280 X408.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\n{if first_layer_temperature[0] !=0 }\nTool0\nG1 Y280 X11.0 Z0.38 F5000.0 \nG1 Y175 X11.0 Z0.38 F1500.0 E15 \nG1 Y175 X11.4 Z0.38 F5000.0 \nG1 Y280 X11.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z2 F2000\n{endif}\nG1 F5000\nM400\nSKEW_PROFILE LOAD=SKEW1\nG28 X\nG28 Y\nTool{initial_extruder}\nSTART_PRINTING_MODE\n\n", + "max_layer_height": [ + "0.64", + "0.64", + "0.64", + "0.64" + ], + "min_layer_height": [ + "0.2", + "0.2", + "0.2", + "0.2" + ], + "nozzle_diameter": [ + "0.8", + "0.8", + "0.8", + "0.8" + ], + "nozzle_type": [ + "hardened_steel", + "hardened_steel", + "hardened_steel", + "hardened_steel" + ], + "nozzle_volume": [ + "0", + "0", + "0", + "0" + ], + "printable_area": [ + "10x0", + "410x0", + "410x342.5", + "10x342.5" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1", + "2", + "3", + "4" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow", + "Direct Drive High Flow" + ], + "printer_model": "Xplorer IQEX", + "printer_variant": "0.8", + "retract_before_wipe": [ + "70%", + "70%", + "70%", + "70%" + ], + "retract_length_toolchange": [ + "2", + "2", + "2", + "2" + ], + "retract_lift_above": [ + "0.2", + "0.2", + "0.2", + "0.2" + ], + "retract_lift_below": [ + "400", + "400", + "400", + "400" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces", + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0", + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0", + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1", + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18", + "18", + "18" + ], + "retraction_length": [ + "1.35", + "1.35", + "1.35", + "1.35" + ], + "retraction_minimum_travel": [ + "2", + "2", + "2", + "2" + ], + "retraction_speed": [ + "120", + "120", + "120", + "120" + ], + "travel_slope": [ + "1", + "1", + "1", + "1" + ], + "wipe": [ + "1", + "1", + "1", + "1" + ], + "wipe_distance": [ + "1", + "1", + "1", + "1" + ], + "z_hop": [ + "1", + "1", + "1", + "1" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift", + "Normal Lift", + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer Single 0.4 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer Single 0.4 nozzle.json new file mode 100644 index 0000000000..2d629ad93a --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer Single 0.4 nozzle.json @@ -0,0 +1,167 @@ +{ + "type": "machine", + "name": "Xplorer Single 0.4 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "P4sDniCHVUne9JJF", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}", + "change_filament_gcode": "M600", + "default_nozzle_volume_type": [ + "High Flow" + ], + "default_print_profile": "0.20mm Standard @Xplorer 0.4", + "deretraction_speed": [ + "120" + ], + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "extruder_type": [ + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow" + ], + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20" + ], + "machine_start_gcode": "M104 S[first_layer_temperature] T[initial_tool]\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG4 P10000 ; wait for temp stabilisation\nstart_print \nTool[initial_tool]\nG90\nM109 S[first_layer_temperature] T[initial_tool]\nBrush_Tool[initial_tool]\nG1 Z5.0 F3000 \nG1 X100 Y1.0 Z0.38 F5000.0 \nG1 X280 Y1.0 Z0.38 F1500.0 E15 \nG1 X280 Y1.4 Z0.38 F5000.0 \nG1 X100 Y1.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z5.0 F3000\nSKEW_PROFILE LOAD=SKEW1\n", + "max_layer_height": [ + "0.32" + ], + "min_layer_height": [ + "0.04" + ], + "nozzle_diameter": [ + "0.4" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow" + ], + "printer_model": "Xplorer Single", + "printer_variant": "0.4", + "retract_before_wipe": [ + "70%" + ], + "retract_length_toolchange": [ + "2" + ], + "retract_lift_above": [ + "0.2" + ], + "retract_lift_below": [ + "400" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "1.35" + ], + "retraction_minimum_travel": [ + "2" + ], + "retraction_speed": [ + "120" + ], + "travel_slope": [ + "1" + ], + "wipe": [ + "1" + ], + "wipe_distance": [ + "1" + ], + "z_hop": [ + "1" + ], + "z_hop_types": [ + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer Single 0.6 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer Single 0.6 nozzle.json new file mode 100644 index 0000000000..da3f85454a --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer Single 0.6 nozzle.json @@ -0,0 +1,167 @@ +{ + "type": "machine", + "name": "Xplorer Single 0.6 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "AN4SjJRQBVxztQoT", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}", + "change_filament_gcode": "M600", + "default_nozzle_volume_type": [ + "High Flow" + ], + "default_print_profile": "0.30mm Standard @Xplorer 0.6", + "deretraction_speed": [ + "120" + ], + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "extruder_type": [ + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow" + ], + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20" + ], + "machine_start_gcode": "M104 S[first_layer_temperature] T[initial_tool]\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG4 P10000 ; wait for temp stabilisation\nstart_print \nTool[initial_tool]\nG90\nM109 S[first_layer_temperature] T[initial_tool]\nBrush_Tool[initial_tool]\nG1 Z5.0 F3000 \nG1 X100 Y1.0 Z0.38 F5000.0 \nG1 X280 Y1.0 Z0.38 F1500.0 E15 \nG1 X280 Y1.4 Z0.38 F5000.0 \nG1 X100 Y1.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z5.0 F3000\nSKEW_PROFILE LOAD=SKEW1\n", + "max_layer_height": [ + "0.45" + ], + "min_layer_height": [ + "0.12" + ], + "nozzle_diameter": [ + "0.6" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow" + ], + "printer_model": "Xplorer Single", + "printer_variant": "0.6", + "retract_before_wipe": [ + "70%" + ], + "retract_length_toolchange": [ + "2" + ], + "retract_lift_above": [ + "0.2" + ], + "retract_lift_below": [ + "400" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "1.35" + ], + "retraction_minimum_travel": [ + "2" + ], + "retraction_speed": [ + "120" + ], + "travel_slope": [ + "1" + ], + "wipe": [ + "1" + ], + "wipe_distance": [ + "1" + ], + "z_hop": [ + "1" + ], + "z_hop_types": [ + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer Single 0.8 nozzle.json b/resources/profiles/Vivedino/machine/Xplorer Single 0.8 nozzle.json new file mode 100644 index 0000000000..76e26d31bf --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer Single 0.8 nozzle.json @@ -0,0 +1,167 @@ +{ + "type": "machine", + "name": "Xplorer Single 0.8 nozzle", + "inherits": "Xplorer common", + "from": "system", + "setting_id": "rGCuBhLqBfV0zFLJ", + "instantiation": "true", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n{if layer_num != 0}\nG92 E0\n{endif}", + "change_filament_gcode": "M600", + "default_nozzle_volume_type": [ + "High Flow" + ], + "default_print_profile": "0.40mm Standard @Xplorer 0.8", + "deretraction_speed": [ + "120" + ], + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "extruder_type": [ + "Direct Drive" + ], + "extruder_variant_list": [ + "Direct Drive High Flow" + ], + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nLOG_RESUME\nLOG_EXTR", + "long_retractions_when_cut": [ + "0" + ], + "machine_max_acceleration_e": [ + "6000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "2500" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "5000", + "2500" + ], + "machine_max_acceleration_x": [ + "5000", + "2500" + ], + "machine_max_acceleration_y": [ + "5000", + "2500" + ], + "machine_max_acceleration_z": [ + "100", + "50" + ], + "machine_max_jerk_e": [ + "2.5", + "1.25" + ], + "machine_max_jerk_x": [ + "5", + "2.5" + ], + "machine_max_jerk_y": [ + "5", + "2.5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.2" + ], + "machine_max_junction_deviation": [ + "0", + "0" + ], + "machine_max_speed_e": [ + "120", + "60" + ], + "machine_max_speed_x": [ + "300", + "150" + ], + "machine_max_speed_y": [ + "300", + "150" + ], + "machine_max_speed_z": [ + "40", + "20" + ], + "machine_start_gcode": "M104 S[first_layer_temperature] T[initial_tool]\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG4 P10000 ; wait for temp stabilisation\nstart_print \nTool[initial_tool]\nG90\nM109 S[first_layer_temperature] T[initial_tool]\nBrush_Tool[initial_tool]\nG1 Z5.0 F3000 \nG1 X100 Y1.0 Z0.38 F5000.0 \nG1 X280 Y1.0 Z0.38 F1500.0 E15 \nG1 X280 Y1.4 Z0.38 F5000.0 \nG1 X100 Y1.4 Z0.38 F1500.0 E30\nG92 E0\nG1 Z5.0 F3000\nSKEW_PROFILE LOAD=SKEW1\n", + "max_layer_height": [ + "0.64" + ], + "min_layer_height": [ + "0.2" + ], + "nozzle_diameter": [ + "0.8" + ], + "printable_height": "401", + "printer_extruder_id": [ + "1" + ], + "printer_extruder_variant": [ + "Direct Drive High Flow" + ], + "printer_model": "Xplorer Single", + "printer_variant": "0.8", + "retract_before_wipe": [ + "70%" + ], + "retract_length_toolchange": [ + "2" + ], + "retract_lift_above": [ + "0.2" + ], + "retract_lift_below": [ + "400" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "1.35" + ], + "retraction_minimum_travel": [ + "2" + ], + "retraction_speed": [ + "120" + ], + "travel_slope": [ + "1" + ], + "wipe": [ + "1" + ], + "wipe_distance": [ + "1" + ], + "z_hop": [ + "1" + ], + "z_hop_types": [ + "Normal Lift" + ] +} diff --git a/resources/profiles/Vivedino/machine/Xplorer common.json b/resources/profiles/Vivedino/machine/Xplorer common.json new file mode 100644 index 0000000000..c7b2054c7b --- /dev/null +++ b/resources/profiles/Vivedino/machine/Xplorer common.json @@ -0,0 +1,51 @@ +{ + "type": "machine", + "name": "Xplorer common", + "inherits": "fdm_klipper_common", + "from": "system", + "instantiation": "false", + "default_filament_profile": [ + "Generic PLA @System" + ], + "adaptive_bed_mesh_margin": "0", + "bed_mesh_max": "99999,99999", + "bed_mesh_min": "-99999,-99999", + "bed_mesh_probe_distance": "50,50", + "best_object_pos": "0.5,0.5", + "disable_m73": "0", + "emit_machine_limits_to_gcode": "0", + "enable_long_retraction_when_cut": "0", + "extruder_clearance_height_to_rod": "43", + "extruder_clearance_radius": "70", + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "head_wrap_detect_zone": [], + "machine_end_gcode": "end_print", + "max_resonance_avoidance_speed": "120", + "min_resonance_avoidance_speed": "70", + "nozzle_height": "2.5", + "nozzle_hrc": "0", + "nozzle_type": "hardened_steel", + "nozzle_volume": "0", + "pellet_modded_printer": "0", + "preferred_orientation": "0", + "printable_area": [ + "10x0", + "410x0", + "410x400", + "10x400" + ], + "purge_in_prime_tower": "1", + "resonance_avoidance": "0", + "single_extruder_multi_material": "0", + "support_air_filtration": "1", + "support_chamber_temp_control": "1", + "support_multi_bed_types": "0", + "thumbnails": "48x48/PNG, 300x300/PNG", + "thumbnails_format": "PNG", + "time_cost": "0", + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "z_offset": "0" +} diff --git a/resources/profiles/Vivedino/machine/XplorerDualGantry.json b/resources/profiles/Vivedino/machine/XplorerDualGantry.json new file mode 100644 index 0000000000..bf57b9137b --- /dev/null +++ b/resources/profiles/Vivedino/machine/XplorerDualGantry.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Xplorer Dual Gantry", + "model_id": "XplorerDualGantry", + "nozzle_diameter": "0.4;0.6;0.8", + "machine_tech": "FFF", + "family": "Vivedino", + "bed_model": "Xplorer_buildplate_model.stl", + "bed_texture": "Xplorer_bed_texture_dualgantry.svg", + "hotend_model": "", + "default_materials": "Generic ABS @System;Generic PLA @System;Generic PLA-CF @System;Generic PETG @System;Generic TPU @System;Generic ASA @System;Generic PC @System;Generic PVA @System;Generic PA @System;Generic PA-CF @System" +} diff --git a/resources/profiles/Vivedino/machine/XplorerIDEX.json b/resources/profiles/Vivedino/machine/XplorerIDEX.json new file mode 100644 index 0000000000..ffa5eee149 --- /dev/null +++ b/resources/profiles/Vivedino/machine/XplorerIDEX.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Xplorer IDEX", + "model_id": "XplorerIDEX", + "nozzle_diameter": "0.4;0.6;0.8", + "machine_tech": "FFF", + "family": "Vivedino", + "bed_model": "Xplorer_buildplate_model.stl", + "bed_texture": "Xplorer_bed_texture_idex.svg", + "hotend_model": "", + "default_materials": "Generic ABS @System;Generic PLA @System;Generic PLA-CF @System;Generic PETG @System;Generic TPU @System;Generic ASA @System;Generic PC @System;Generic PVA @System;Generic PA @System;Generic PA-CF @System" +} diff --git a/resources/profiles/Vivedino/machine/XplorerIQEX.json b/resources/profiles/Vivedino/machine/XplorerIQEX.json new file mode 100644 index 0000000000..95a45c221d --- /dev/null +++ b/resources/profiles/Vivedino/machine/XplorerIQEX.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Xplorer IQEX", + "model_id": "XplorerIQEX", + "nozzle_diameter": "0.4;0.6;0.8", + "machine_tech": "FFF", + "family": "Vivedino", + "bed_model": "Xplorer_buildplate_model.stl", + "bed_texture": "Xplorer_bed_texture_iqex.svg", + "hotend_model": "", + "default_materials": "Generic ABS @System;Generic PLA @System;Generic PLA-CF @System;Generic PETG @System;Generic TPU @System;Generic ASA @System;Generic PC @System;Generic PVA @System;Generic PA @System;Generic PA-CF @System" +} diff --git a/resources/profiles/Vivedino/machine/XplorerSingle.json b/resources/profiles/Vivedino/machine/XplorerSingle.json new file mode 100644 index 0000000000..d3ad22af7a --- /dev/null +++ b/resources/profiles/Vivedino/machine/XplorerSingle.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Xplorer Single", + "model_id": "XplorerSingle", + "nozzle_diameter": "0.4;0.6;0.8", + "machine_tech": "FFF", + "family": "Vivedino", + "bed_model": "Xplorer_buildplate_model.stl", + "bed_texture": "", + "hotend_model": "", + "default_materials": "Generic ABS @System;Generic PLA @System;Generic PLA-CF @System;Generic PETG @System;Generic TPU @System;Generic ASA @System;Generic PC @System;Generic PVA @System;Generic PA @System;Generic PA-CF @System" +} diff --git a/resources/profiles/Vivedino/process/0.04mm Ultra Fine @Xplorer 0.4.json b/resources/profiles/Vivedino/process/0.04mm Ultra Fine @Xplorer 0.4.json new file mode 100644 index 0000000000..22e6bd1a33 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.04mm Ultra Fine @Xplorer 0.4.json @@ -0,0 +1,28 @@ +{ + "type": "process", + "name": "0.04mm Ultra Fine @Xplorer 0.4", + "inherits": "fdm_process_xplorer_common", + "from": "system", + "setting_id": "7SZOHFM1nfZsGYHe", + "instantiation": "true", + "bottom_shell_layers": "7", + "initial_layer_print_height": "0.3", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_distance": "3", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "1", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "9", + "top_solid_infill_flow_ratio": "1", + "layer_height": "0.04", + "compatible_printers": [ + "Xplorer Single 0.4 nozzle", + "Xplorer IDEX 0.4 nozzle", + "Xplorer Dual Gantry 0.4 nozzle", + "Xplorer IQEX 0.4 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.08mm Extra Fine @Xplorer 0.4.json b/resources/profiles/Vivedino/process/0.08mm Extra Fine @Xplorer 0.4.json new file mode 100644 index 0000000000..f272186218 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.08mm Extra Fine @Xplorer 0.4.json @@ -0,0 +1,28 @@ +{ + "type": "process", + "name": "0.08mm Extra Fine @Xplorer 0.4", + "inherits": "fdm_process_xplorer_common", + "from": "system", + "setting_id": "OvD7mwbTHKOUsgiT", + "instantiation": "true", + "bottom_shell_layers": "4", + "initial_layer_print_height": "0.3", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_distance": "3", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "1", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "5", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.08", + "compatible_printers": [ + "Xplorer Single 0.4 nozzle", + "Xplorer IDEX 0.4 nozzle", + "Xplorer Dual Gantry 0.4 nozzle", + "Xplorer IQEX 0.4 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.12mm Fine @Xplorer 0.4.json b/resources/profiles/Vivedino/process/0.12mm Fine @Xplorer 0.4.json new file mode 100644 index 0000000000..fc742230b6 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.12mm Fine @Xplorer 0.4.json @@ -0,0 +1,28 @@ +{ + "type": "process", + "name": "0.12mm Fine @Xplorer 0.4", + "inherits": "fdm_process_xplorer_common", + "from": "system", + "setting_id": "9iNid6X4xIPh267R", + "instantiation": "true", + "bottom_shell_layers": "4", + "initial_layer_print_height": "0.3", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_distance": "3", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "1", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "5", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.12", + "compatible_printers": [ + "Xplorer Single 0.4 nozzle", + "Xplorer IDEX 0.4 nozzle", + "Xplorer Dual Gantry 0.4 nozzle", + "Xplorer IQEX 0.4 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.16mm Optimal @Xplorer 0.4.json b/resources/profiles/Vivedino/process/0.16mm Optimal @Xplorer 0.4.json new file mode 100644 index 0000000000..27a67f5a48 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.16mm Optimal @Xplorer 0.4.json @@ -0,0 +1,28 @@ +{ + "type": "process", + "name": "0.16mm Optimal @Xplorer 0.4", + "inherits": "fdm_process_xplorer_common", + "from": "system", + "setting_id": "6eUjAhfHVuxRSCQr", + "instantiation": "true", + "bottom_shell_layers": "4", + "initial_layer_print_height": "0.3", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_distance": "3", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "1", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "5", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.16", + "compatible_printers": [ + "Xplorer Single 0.4 nozzle", + "Xplorer IDEX 0.4 nozzle", + "Xplorer Dual Gantry 0.4 nozzle", + "Xplorer IQEX 0.4 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.18mm Fine @Xplorer 0.6.json b/resources/profiles/Vivedino/process/0.18mm Fine @Xplorer 0.6.json new file mode 100644 index 0000000000..8013e9a901 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.18mm Fine @Xplorer 0.6.json @@ -0,0 +1,28 @@ +{ + "type": "process", + "name": "0.18mm Fine @Xplorer 0.6", + "inherits": "fdm_process_xplorer_common_0_6", + "from": "system", + "setting_id": "tQHKzSbBNyoPQkup", + "instantiation": "true", + "bottom_shell_layers": "4", + "initial_layer_print_height": "0.3", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_distance": "3", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "1", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "5", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.18", + "compatible_printers": [ + "Xplorer Single 0.6 nozzle", + "Xplorer IDEX 0.6 nozzle", + "Xplorer Dual Gantry 0.6 nozzle", + "Xplorer IQEX 0.6 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.20mm Standard @Xplorer 0.4.json b/resources/profiles/Vivedino/process/0.20mm Standard @Xplorer 0.4.json new file mode 100644 index 0000000000..d880d2ba5a --- /dev/null +++ b/resources/profiles/Vivedino/process/0.20mm Standard @Xplorer 0.4.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.20mm Standard @Xplorer 0.4", + "inherits": "fdm_process_xplorer_common", + "from": "system", + "setting_id": "CiJAkwpq5pR6MfYD", + "instantiation": "true", + "initial_layer_print_height": "0.3", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "10", + "outer_wall_speed": "130", + "skirt_loops": "2", + "slowdown_for_curled_perimeters": "1", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.20", + "compatible_printers": [ + "Xplorer Single 0.4 nozzle", + "Xplorer IDEX 0.4 nozzle", + "Xplorer Dual Gantry 0.4 nozzle", + "Xplorer IQEX 0.4 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.24mm Fine @Xplorer 0.8.json b/resources/profiles/Vivedino/process/0.24mm Fine @Xplorer 0.8.json new file mode 100644 index 0000000000..cd2be9355d --- /dev/null +++ b/resources/profiles/Vivedino/process/0.24mm Fine @Xplorer 0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.24mm Fine @Xplorer 0.8", + "inherits": "fdm_process_xplorer_common_0_8", + "from": "system", + "setting_id": "yv9TMduh7bgD1IjO", + "instantiation": "true", + "initial_layer_print_height": "0.3", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "10", + "outer_wall_speed": "130", + "skirt_loops": "2", + "slowdown_for_curled_perimeters": "1", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.24", + "compatible_printers": [ + "Xplorer Single 0.8 nozzle", + "Xplorer IDEX 0.8 nozzle", + "Xplorer Dual Gantry 0.8 nozzle", + "Xplorer IQEX 0.8 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.24mm Optimal @Xplorer 0.6.json b/resources/profiles/Vivedino/process/0.24mm Optimal @Xplorer 0.6.json new file mode 100644 index 0000000000..d628e1a121 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.24mm Optimal @Xplorer 0.6.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.24mm Optimal @Xplorer 0.6", + "inherits": "fdm_process_xplorer_common_0_6", + "from": "system", + "setting_id": "WKjOeNEZndeHrbQw", + "instantiation": "true", + "initial_layer_print_height": "0.3", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "10", + "outer_wall_speed": "130", + "skirt_loops": "2", + "slowdown_for_curled_perimeters": "1", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.24", + "compatible_printers": [ + "Xplorer Single 0.6 nozzle", + "Xplorer IDEX 0.6 nozzle", + "Xplorer Dual Gantry 0.6 nozzle", + "Xplorer IQEX 0.6 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.28mm Draft @Xplorer 0.4.json b/resources/profiles/Vivedino/process/0.28mm Draft @Xplorer 0.4.json new file mode 100644 index 0000000000..eaad4d5f45 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.28mm Draft @Xplorer 0.4.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.28mm Draft @Xplorer 0.4", + "inherits": "fdm_process_xplorer_common", + "from": "system", + "setting_id": "zjvcZ59oVnh73fij", + "instantiation": "true", + "initial_layer_print_height": "0.32", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.28", + "compatible_printers": [ + "Xplorer Single 0.4 nozzle", + "Xplorer IDEX 0.4 nozzle", + "Xplorer Dual Gantry 0.4 nozzle", + "Xplorer IQEX 0.4 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.30mm Standard @Xplorer 0.6.json b/resources/profiles/Vivedino/process/0.30mm Standard @Xplorer 0.6.json new file mode 100644 index 0000000000..4afd997862 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.30mm Standard @Xplorer 0.6.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.30mm Standard @Xplorer 0.6", + "inherits": "fdm_process_xplorer_common_0_6", + "from": "system", + "setting_id": "1NEAZrryKhhZNWoB", + "instantiation": "true", + "initial_layer_print_height": "0.32", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.30", + "compatible_printers": [ + "Xplorer Single 0.6 nozzle", + "Xplorer IDEX 0.6 nozzle", + "Xplorer Dual Gantry 0.6 nozzle", + "Xplorer IQEX 0.6 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.32mm Extra Draft @Xplorer 0.4.json b/resources/profiles/Vivedino/process/0.32mm Extra Draft @Xplorer 0.4.json new file mode 100644 index 0000000000..21ac5b0f55 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.32mm Extra Draft @Xplorer 0.4.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "0.32mm Extra Draft @Xplorer 0.4", + "inherits": "fdm_process_xplorer_common", + "from": "system", + "setting_id": "IrvXoa4zZ1b2Y5cX", + "instantiation": "true", + "initial_layer_print_height": "0.32", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "top_surface_line_width": "0.45", + "layer_height": "0.32", + "compatible_printers": [ + "Xplorer Single 0.4 nozzle", + "Xplorer IDEX 0.4 nozzle", + "Xplorer Dual Gantry 0.4 nozzle", + "Xplorer IQEX 0.4 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.32mm Optimal @Xplorer 0.8.json b/resources/profiles/Vivedino/process/0.32mm Optimal @Xplorer 0.8.json new file mode 100644 index 0000000000..57571e080b --- /dev/null +++ b/resources/profiles/Vivedino/process/0.32mm Optimal @Xplorer 0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.32mm Optimal @Xplorer 0.8", + "inherits": "fdm_process_xplorer_common_0_8", + "from": "system", + "setting_id": "N3z9IBRaaeXwVLbl", + "instantiation": "true", + "initial_layer_print_height": "0.32", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.32", + "compatible_printers": [ + "Xplorer Single 0.8 nozzle", + "Xplorer IDEX 0.8 nozzle", + "Xplorer Dual Gantry 0.8 nozzle", + "Xplorer IQEX 0.8 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.36mm Draft @Xplorer 0.6.json b/resources/profiles/Vivedino/process/0.36mm Draft @Xplorer 0.6.json new file mode 100644 index 0000000000..73783a0e5f --- /dev/null +++ b/resources/profiles/Vivedino/process/0.36mm Draft @Xplorer 0.6.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.36mm Draft @Xplorer 0.6", + "inherits": "fdm_process_xplorer_common_0_6", + "from": "system", + "setting_id": "uv3jUBdJRkJ4dWVd", + "instantiation": "true", + "initial_layer_print_height": "0.32", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.36", + "compatible_printers": [ + "Xplorer Single 0.6 nozzle", + "Xplorer IDEX 0.6 nozzle", + "Xplorer Dual Gantry 0.6 nozzle", + "Xplorer IQEX 0.6 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.40mm Standard @Xplorer 0.8.json b/resources/profiles/Vivedino/process/0.40mm Standard @Xplorer 0.8.json new file mode 100644 index 0000000000..2082554b0c --- /dev/null +++ b/resources/profiles/Vivedino/process/0.40mm Standard @Xplorer 0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.40mm Standard @Xplorer 0.8", + "inherits": "fdm_process_xplorer_common_0_8", + "from": "system", + "setting_id": "ZP9WXfiKDvSAjqU2", + "instantiation": "true", + "initial_layer_print_height": "0.32", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.40", + "compatible_printers": [ + "Xplorer Single 0.8 nozzle", + "Xplorer IDEX 0.8 nozzle", + "Xplorer Dual Gantry 0.8 nozzle", + "Xplorer IQEX 0.8 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.42mm Extra Draft @Xplorer 0.6.json b/resources/profiles/Vivedino/process/0.42mm Extra Draft @Xplorer 0.6.json new file mode 100644 index 0000000000..9641ffb5ef --- /dev/null +++ b/resources/profiles/Vivedino/process/0.42mm Extra Draft @Xplorer 0.6.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.42mm Extra Draft @Xplorer 0.6", + "inherits": "fdm_process_xplorer_common_0_6", + "from": "system", + "setting_id": "JMbldCAibS7WnG1D", + "instantiation": "true", + "initial_layer_print_height": "0.32", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.42", + "compatible_printers": [ + "Xplorer Single 0.6 nozzle", + "Xplorer IDEX 0.6 nozzle", + "Xplorer Dual Gantry 0.6 nozzle", + "Xplorer IQEX 0.6 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.48mm Draft @Xplorer 0.8.json b/resources/profiles/Vivedino/process/0.48mm Draft @Xplorer 0.8.json new file mode 100644 index 0000000000..a7942c6387 --- /dev/null +++ b/resources/profiles/Vivedino/process/0.48mm Draft @Xplorer 0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.48mm Draft @Xplorer 0.8", + "inherits": "fdm_process_xplorer_common_0_8", + "from": "system", + "setting_id": "OhseWRzfSjom4gC9", + "instantiation": "true", + "initial_layer_print_height": "0.32", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.48", + "compatible_printers": [ + "Xplorer Single 0.8 nozzle", + "Xplorer IDEX 0.8 nozzle", + "Xplorer Dual Gantry 0.8 nozzle", + "Xplorer IQEX 0.8 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/0.56mm Extra Draft @Xplorer 0.8.json b/resources/profiles/Vivedino/process/0.56mm Extra Draft @Xplorer 0.8.json new file mode 100644 index 0000000000..065cbf975d --- /dev/null +++ b/resources/profiles/Vivedino/process/0.56mm Extra Draft @Xplorer 0.8.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.56mm Extra Draft @Xplorer 0.8", + "inherits": "fdm_process_xplorer_common_0_8", + "from": "system", + "setting_id": "EXEeYQRkvcwYeLDA", + "instantiation": "true", + "initial_layer_print_height": "0.32", + "inner_wall_speed": "190", + "internal_solid_infill_acceleration": "100%", + "min_skirt_length": "0", + "outer_wall_speed": "130", + "skirt_loops": "1", + "slowdown_for_curled_perimeters": "0", + "small_perimeter_speed": "50%", + "sparse_infill_acceleration": "100%", + "top_shell_layers": "4", + "top_solid_infill_flow_ratio": "0.87", + "layer_height": "0.56", + "compatible_printers": [ + "Xplorer Single 0.8 nozzle", + "Xplorer IDEX 0.8 nozzle", + "Xplorer Dual Gantry 0.8 nozzle", + "Xplorer IQEX 0.8 nozzle" + ] +} diff --git a/resources/profiles/Vivedino/process/fdm_process_xplorer_common.json b/resources/profiles/Vivedino/process/fdm_process_xplorer_common.json new file mode 100644 index 0000000000..c8f4cc55a7 --- /dev/null +++ b/resources/profiles/Vivedino/process/fdm_process_xplorer_common.json @@ -0,0 +1,265 @@ +{ + "type": "process", + "name": "fdm_process_xplorer_common", + "inherits": "fdm_process_klipper_common", + "from": "system", + "instantiation": "false", + "accel_to_decel_enable": "1", + "accel_to_decel_factor": "50%", + "align_infill_direction_to_model": "0", + "alternate_extra_wall": "0", + "bottom_shell_thickness": "1", + "bottom_solid_infill_flow_ratio": "1", + "bottom_surface_density": "100%", + "bottom_surface_pattern": "monotonicline", + "bridge_acceleration": "1500", + "bridge_angle": "0", + "bridge_density": "100%", + "bridge_flow": "1.5", + "brim_ears_detection_length": "1", + "brim_ears_max_angle": "125", + "brim_type": "no_brim", + "calib_flowrate_topinfill_special_order": "0", + "counterbore_hole_bridging": "none", + "default_acceleration": "5000", + "default_jerk": "5", + "default_junction_deviation": "0", + "detect_narrow_internal_solid_infill": "0", + "dont_filter_internal_bridges": "limited", + "elefant_foot_compensation": "0.1", + "elefant_foot_compensation_layers": "2", + "enable_extra_bridge_layer": "disabled", + "enable_overhang_speed": "1", + "enable_prime_tower": "0", + "enforce_support_layers": "0", + "ensure_vertical_shell_thickness": "ensure_moderate", + "extra_perimeters_on_overhangs": "1", + "extra_solid_infills": "", + "extrusion_rate_smoothing_external_perimeter_only": "0", + "fill_multiline": "1", + "filter_out_gap_fill": "2", + "flush_into_infill": "0", + "flush_into_objects": "0", + "flush_into_support": "1", + "fuzzy_skin": "none", + "fuzzy_skin_first_layer": "0", + "fuzzy_skin_mode": "displacement", + "fuzzy_skin_noise_type": "classic", + "fuzzy_skin_octaves": "4", + "fuzzy_skin_persistence": "0.5", + "fuzzy_skin_point_distance": "0.8", + "fuzzy_skin_scale": "1", + "fuzzy_skin_thickness": "0.3", + "gap_fill_target": "nowhere", + "gap_infill_speed": "10", + "gcode_add_line_number": "0", + "gcode_comments": "0", + "gcode_label_objects": "1", + "hole_to_polyhole": "0", + "hole_to_polyhole_threshold": "0.01", + "hole_to_polyhole_twisted": "1", + "independent_support_layer_height": "1", + "infill_anchor": "10", + "infill_anchor_max": "10", + "infill_combination_max_layer_height": "100%", + "infill_jerk": "0", + "infill_lock_depth": "1", + "infill_overhang_angle": "60", + "infill_shift_step": "0.4", + "infill_wall_overlap": "20%", + "initial_layer_acceleration": "1000", + "initial_layer_jerk": "0", + "initial_layer_line_width": "120%", + "initial_layer_min_bead_width": "85%", + "initial_layer_travel_speed": "200", + "inner_wall_acceleration": "3000", + "inner_wall_jerk": "0", + "inner_wall_line_width": "110%", + "interlocking_beam": "0", + "interlocking_beam_layer_count": "2", + "interlocking_beam_width": "0.8", + "interlocking_boundary_avoidance": "2", + "interlocking_depth": "2", + "interlocking_orientation": "22.5", + "internal_bridge_angle": "0", + "internal_bridge_density": "100%", + "internal_bridge_flow": "1.5", + "internal_bridge_speed": "150%", + "internal_solid_infill_line_width": "120%", + "internal_solid_infill_pattern": "monotonicline", + "ironing_angle": "-1", + "ironing_inset": "0", + "ironing_pattern": "rectilinear", + "is_infill_first": "0", + "lateral_lattice_angle_1": "-45", + "lateral_lattice_angle_2": "45", + "line_width": "110%", + "make_overhang_printable": "0", + "make_overhang_printable_angle": "55", + "make_overhang_printable_hole_size": "0", + "max_bridge_length": "10", + "max_volumetric_extrusion_rate_slope": "0", + "max_volumetric_extrusion_rate_slope_segment_length": "1", + "min_bead_width": "85%", + "min_feature_size": "25%", + "min_length_factor": "0.5", + "min_width_top_surface": "0", + "mmu_segmented_region_interlocking_depth": "0", + "mmu_segmented_region_max_width": "0", + "notes": "", + "only_one_wall_first_layer": "0", + "only_one_wall_top": "1", + "ooze_prevention": "0", + "outer_wall_acceleration": "1000", + "outer_wall_jerk": "0", + "outer_wall_line_width": "100%", + "overhang_1_4_speed": "100", + "overhang_reverse": "0", + "overhang_reverse_internal_only": "0", + "overhang_reverse_threshold": "50%", + "post_process": [], + "precise_outer_wall": "1", + "precise_z_height": "0", + "preheat_steps": "1", + "preheat_time": "10", + "prime_tower_brim_width": "10", + "prime_tower_width": "30", + "prime_volume": "10", + "print_flow_ratio": "1", + "print_order": "default", + "raft_contact_distance": "0.1", + "raft_expansion": "1.5", + "raft_first_layer_density": "90%", + "raft_first_layer_expansion": "2", + "reduce_crossing_wall": "1", + "role_based_wipe_speed": "1", + "scarf_angle_threshold": "155", + "scarf_joint_flow_ratio": "1", + "scarf_joint_speed": "100%", + "scarf_overhang_threshold": "40%", + "seam_gap": "10%", + "seam_slope_conditional": "0", + "seam_slope_entire_loop": "0", + "seam_slope_inner_walls": "0", + "seam_slope_min_length": "20", + "seam_slope_start_height": "0", + "seam_slope_steps": "10", + "seam_slope_type": "none", + "single_extruder_multi_material_priming": "0", + "single_loop_draft_shield": "0", + "skeleton_infill_density": "25%", + "skeleton_infill_line_width": "100%", + "skin_infill_density": "25%", + "skin_infill_depth": "2", + "skin_infill_line_width": "100%", + "skirt_speed": "50", + "skirt_start_angle": "-135", + "skirt_type": "combined", + "slice_closing_radius": "0.049", + "slicing_mode": "regular", + "slow_down_layers": "0", + "small_area_infill_flow_compensation": "1", + "small_area_infill_flow_compensation_model": [ + "0,0", + "\n0.2,0.4444", + "\n0.4,0.6145", + "\n0.6,0.7059", + "\n0.8,0.7619", + "\n1.5,0.8571", + "\n2,0.8889", + "\n3,0.9231", + "\n5,0.9520", + "\n10,1" + ], + "small_perimeter_threshold": "0", + "solid_infill_direction": "45", + "solid_infill_filament": "1", + "solid_infill_rotate_template": "45,135", + "sparse_infill_filament": "1", + "sparse_infill_line_width": "110%", + "sparse_infill_pattern": "gyroid", + "sparse_infill_rotate_template": "", + "spiral_finishing_flow_ratio": "0", + "spiral_mode_max_xy_smoothing": "200%", + "spiral_mode_smooth": "0", + "spiral_starting_flow_ratio": "0", + "staggered_inner_seams": "1", + "support_angle": "0", + "support_bottom_interface_spacing": "0.5", + "support_bottom_z_distance": "0.2", + "support_critical_regions_only": "0", + "support_expansion": "0", + "support_interface_not_for_body": "1", + "support_interface_pattern": "auto", + "support_ironing": "0", + "support_ironing_flow": "10%", + "support_ironing_pattern": "rectilinear", + "support_ironing_spacing": "0.1", + "support_line_width": "100%", + "support_object_first_layer_gap": "0.2", + "support_on_build_plate_only": "1", + "support_remove_small_overhang": "1", + "support_threshold_overlap": "50%", + "support_type": "tree(auto)", + "symmetric_infill_y_axis": "0", + "thick_bridges": "1", + "thick_internal_bridges": "1", + "timelapse_type": "0", + "top_bottom_infill_wall_overlap": "15%", + "top_surface_acceleration": "1000", + "top_surface_density": "100%", + "top_surface_jerk": "0", + "top_surface_line_width": "80%", + "top_surface_speed": "50", + "travel_acceleration": "5000", + "travel_jerk": "0", + "travel_speed": "250", + "travel_speed_z": "0", + "tree_support_adaptive_layer_height": "1", + "tree_support_angle_slow": "25", + "tree_support_auto_brim": "1", + "tree_support_branch_angle_organic": "40", + "tree_support_branch_diameter": "5", + "tree_support_branch_diameter_angle": "5", + "tree_support_branch_diameter_organic": "2", + "tree_support_branch_distance": "5", + "tree_support_branch_distance_organic": "1", + "tree_support_brim_width": "3", + "tree_support_tip_diameter": "0.8", + "tree_support_top_rate": "30%", + "wall_direction": "auto", + "wall_distribution_count": "1", + "wall_filament": "1", + "wall_generator": "arachne", + "wall_sequence": "inner wall/outer wall", + "wall_transition_angle": "10", + "wall_transition_filter_deviation": "25%", + "wall_transition_length": "100%", + "wipe_before_external_loop": "0", + "wipe_on_loops": "1", + "wipe_speed": "80%", + "wipe_tower_bridging": "10", + "wipe_tower_cone_angle": "10", + "wipe_tower_extra_flow": "100%", + "wipe_tower_extra_rib_length": "0", + "wipe_tower_extra_spacing": "100%", + "wipe_tower_filament": "0", + "wipe_tower_fillet_wall": "1", + "wipe_tower_max_purge_speed": "90", + "wipe_tower_rib_width": "8", + "wipe_tower_rotation_angle": "0", + "wipe_tower_wall_type": "rectangle", + "wiping_volumes_extruders": [ + "70", + "70", + "70", + "70", + "70", + "70", + "70", + "70", + "70", + "70" + ], + "xy_hole_compensation": "0.05" +} diff --git a/resources/profiles/Vivedino/process/fdm_process_xplorer_common_0_6.json b/resources/profiles/Vivedino/process/fdm_process_xplorer_common_0_6.json new file mode 100644 index 0000000000..3158e4f186 --- /dev/null +++ b/resources/profiles/Vivedino/process/fdm_process_xplorer_common_0_6.json @@ -0,0 +1,8 @@ +{ + "type": "process", + "name": "fdm_process_xplorer_common_0_6", + "inherits": "fdm_process_xplorer_common", + "from": "system", + "instantiation": "false", + "initial_layer_print_height": "0.3" +} diff --git a/resources/profiles/Vivedino/process/fdm_process_xplorer_common_0_8.json b/resources/profiles/Vivedino/process/fdm_process_xplorer_common_0_8.json new file mode 100644 index 0000000000..a6b36e2947 --- /dev/null +++ b/resources/profiles/Vivedino/process/fdm_process_xplorer_common_0_8.json @@ -0,0 +1,8 @@ +{ + "type": "process", + "name": "fdm_process_xplorer_common_0_8", + "inherits": "fdm_process_xplorer_common", + "from": "system", + "instantiation": "false", + "initial_layer_print_height": "0.4" +} diff --git a/resources/shaders/110/texture_displacement_shaded.fs b/resources/shaders/110/texture_displacement_shaded.fs index 44ea89b844..0b9192749c 100644 --- a/resources/shaders/110/texture_displacement_shaded.fs +++ b/resources/shaders/110/texture_displacement_shaded.fs @@ -29,13 +29,11 @@ uniform vec3 palette_lab[64]; uniform vec3 palette_rgb[64]; uniform int palette_count; uniform bool pure_only; // match against single filaments only (flat-colour image) -// How each entry prints. Every entry names a single filament: a mix is given its own mixed filament -// slot, whose components the slicer alternates per print layer, so the fragment just looks that slot's -// colour up. +// The entry's two filaments, equal for a single filament - only so a mix can be told apart. An entry's +// palette_rgb is already the colour it prints in (for a mix, its mixed filament slot's). uniform int palette_a[64]; uniform int palette_b[64]; -uniform vec3 filament_rgb[16]; -uniform int filament_count; +uniform float prefer_pure_de; // PREFER_PURE_DE: how much better than a single filament a mix must be uniform sampler2D color_tex; // the layer's colour image, sampled at the same uv as the height uniform bool has_color_tex; uniform bool volume_mirrored; @@ -210,31 +208,16 @@ int nearest_palette_entry(vec3 rgb) best = i; } } - // The same bias make_palette_quantizer() applies (PREFER_PURE_DE = 10): a mix is an interleave, so - // it is only worth taking when it beats the nearest single filament by a visible step. Without it - // this picked a mix for almost every fragment - with four filaments the palette is 4 pure entries - // against 30 mixes - while the bake picked a single filament for most of them, so the preview - // interleaved the whole wall where the bake interleaves only patches. Compared on the distances - // rather than their squares, so the threshold means the same thing as it does on the CPU (up to - // CIE76 against CIEDE2000, the approximation already noted above). - if (best_pure >= 0 && palette_a[best] != palette_b[best] && sqrt(bd_pure) - sqrt(bd) < 10.0) + // The same bias make_palette_quantizer() applies: a mix is an interleave, so it is only worth taking + // when it beats the nearest single filament by a visible step - otherwise the preview shows mixes + // where the bake prints a single filament. Compared on the distances rather than their squares, so + // the margin means the same thing as it does on the CPU (up to CIE76 against CIEDE2000, the + // approximation already noted above). + if (best_pure >= 0 && palette_a[best] != palette_b[best] && sqrt(bd_pure) - sqrt(bd) < prefer_pure_de) best = best_pure; return best; } -// One 2x2 Bayer cell, {0, 2; 3, 1}, for x and y in {0, 1}. - -// The colour the printer lays down at world point `pos` for palette entry `index`. Every entry names a -// single filament: a mix is given its own mixed filament slot, whose components the slicer alternates -// per print layer, so there is nothing left to interleave here. -vec3 printed_color(int index) -{ - int a = palette_a[index]; - if (a < 0 || a >= filament_count) - return palette_rgb[index]; // no filament to resolve to: the entry's own colour - return filament_rgb[a]; -} - void main() { if (any(lessThan(clipping_planes_dots, ZERO))) @@ -354,16 +337,11 @@ void main() NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - // Diffuse albedo: the image's colour at this fragment, snapped to the nearest printable colour - - // and, where that is a mix, the filament the interleave puts here, so the pattern that prints shows. + // Diffuse albedo: the image's colour at this fragment, snapped to the nearest printable colour. // Only the albedo - the specular term (intensity.y) stays white - so a coloured fragment reads as // the same material under the same light, and the relief this preview exists to show is unaffected. vec3 albedo = uniform_color.rgb; if (palette_count > 0 && has_color_tex && have_uv && weight > 0.0) - // tex_pos, not world_pos: the bake resolves the interleave in the bake frame (world - // orientation and scale about the volume's origin, see texture_displacement_bake_frame()), so - // measuring z from the bed instead shifted the band phase by the volume origin's height - a - // different filament in the same place than the bake produces. - albedo = printed_color(nearest_palette_entry(texture2D(color_tex, color_uv).rgb)); + albedo = palette_rgb[nearest_palette_entry(texture2D(color_tex, color_uv).rgb)]; gl_FragColor = vec4(vec3(intensity.y) + albedo * intensity.x, uniform_color.a); } diff --git a/resources/shaders/140/texture_displacement_shaded.fs b/resources/shaders/140/texture_displacement_shaded.fs index b2936598cd..911a919aaf 100644 --- a/resources/shaders/140/texture_displacement_shaded.fs +++ b/resources/shaders/140/texture_displacement_shaded.fs @@ -88,13 +88,11 @@ uniform vec3 palette_lab[64]; uniform vec3 palette_rgb[64]; uniform int palette_count; uniform bool pure_only; // match against single filaments only (flat-colour image) -// How each entry prints. Every entry names a single filament: a mix is given its own mixed filament -// slot, whose components the slicer alternates per print layer, so the fragment just looks that slot's -// colour up. +// The entry's two filaments, equal for a single filament - only so a mix can be told apart. An entry's +// palette_rgb is already the colour it prints in (for a mix, its mixed filament slot's). uniform int palette_a[64]; uniform int palette_b[64]; -uniform vec3 filament_rgb[16]; -uniform int filament_count; +uniform float prefer_pure_de; // PREFER_PURE_DE: how much better than a single filament a mix must be uniform sampler2D color_tex; // the layer's colour image, sampled at the same uv as the height uniform bool has_color_tex; uniform bool volume_mirrored; @@ -276,31 +274,16 @@ int nearest_palette_entry(vec3 rgb) best = i; } } - // The same bias make_palette_quantizer() applies (PREFER_PURE_DE = 10): a mix is an interleave, so - // it is only worth taking when it beats the nearest single filament by a visible step. Without it - // this picked a mix for almost every fragment - with four filaments the palette is 4 pure entries - // against 30 mixes - while the bake picked a single filament for most of them, so the preview - // interleaved the whole wall where the bake interleaves only patches. Compared on the distances - // rather than their squares, so the threshold means the same thing as it does on the CPU (up to - // CIE76 against CIEDE2000, the approximation already noted above). - if (best_pure >= 0 && palette_a[best] != palette_b[best] && sqrt(bd_pure) - sqrt(bd) < 10.0) + // The same bias make_palette_quantizer() applies: a mix is an interleave, so it is only worth taking + // when it beats the nearest single filament by a visible step - otherwise the preview shows mixes + // where the bake prints a single filament. Compared on the distances rather than their squares, so + // the margin means the same thing as it does on the CPU (up to CIE76 against CIEDE2000, the + // approximation already noted above). + if (best_pure >= 0 && palette_a[best] != palette_b[best] && sqrt(bd_pure) - sqrt(bd) < prefer_pure_de) best = best_pure; return best; } -// One 2x2 Bayer cell, {0, 2; 3, 1}, for x and y in {0, 1}. - -// The colour the printer lays down at world point `pos` for palette entry `index`. Every entry names a -// single filament: a mix is given its own mixed filament slot, whose components the slicer alternates -// per print layer, so there is nothing left to interleave here. -vec3 printed_color(int index) -{ - int a = palette_a[index]; - if (a < 0 || a >= filament_count) - return palette_rgb[index]; // no filament to resolve to: the entry's own colour - return filament_rgb[a]; -} - void main() { if (any(lessThan(clipping_planes_dots, ZERO))) @@ -442,16 +425,11 @@ void main() NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - // Diffuse albedo: the image's colour at this fragment, snapped to the nearest printable colour - - // and, where that is a mix, the filament the interleave puts here, so the pattern that prints shows. + // Diffuse albedo: the image's colour at this fragment, snapped to the nearest printable colour. // Only the albedo - the specular term (intensity.y) stays white - so a coloured fragment reads as // the same material under the same light, and the relief this preview exists to show is unaffected. vec3 albedo = uniform_color.rgb; if (palette_count > 0 && has_color_tex && have_uv && weight > 0.0) - // tex_pos, not world_pos: the bake resolves the interleave in the bake frame (world - // orientation and scale about the volume's origin, see texture_displacement_bake_frame()), so - // measuring z from the bed instead shifted the band phase by the volume origin's height - a - // different filament in the same place than the bake produces. - albedo = printed_color(nearest_palette_entry(texture(color_tex, color_uv).rgb)); + albedo = palette_rgb[nearest_palette_entry(texture(color_tex, color_uv).rgb)]; out_color = vec4(vec3(intensity.y) + albedo * intensity.x, uniform_color.a); } diff --git a/resources/web/data/text.js b/resources/web/data/text.js deleted file mode 100644 index 95342acdaf..0000000000 --- a/resources/web/data/text.js +++ /dev/null @@ -1,1778 +0,0 @@ -var LangText = { - en: { - t1: "Welcome to Orca Slicer", - t2: "Orca Slicer will be setup in several steps. Let's start!", - t3: "User Agreement", - t4: "Disagree", - t5: "Agree", - t6: "We kindly request your help to improve everyone's printing.
Come and Join our Customer Experience Improvement Program", - t7: "Join our Customer Experience Improvement Program", - t8: "Back", - t9: "Next", - t10: "Printer Selection", - t11: "All", - t12: "Clear all", - t13: "mm nozzle", - t14: "Filament Selection", - t15: "Printer", - t16: "Filament type", - t17: "Vendor", - t18: "Error", - t19: "At least one filament must be selected.", - t20: "Do you want to use default filament ?", - t21: "Yes", - t22: "No", - t23: "Release note", - t24: "Get Started", - t25: "Finish", - t26: "Login", - t27: "Register", - t28: "Recent", - t29: "Mall", - t30: "Manual", - t31: "New Project", - t32: "Create new project", - t33: "Open Project", - t34: "hotspot", - t35: "Recently opened", - t36: "OK", - t37: "At least one printer must be selected.", - t38: "Cancel", - t39: "Confirm", - t40: "Network disconnect, please check and try again later.", - t47: "Please select your login region", - t48: "Asia-Pacific", - t49: "China", - t50: "Log out", - t52: "Skip", - t53: "Join", - t54: "In the 3D Printing community, we learn from each other's successes and failures to adjust our own slicing parameters and settings. Orca Slicer follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training Orca Slicer to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in ", - t55: "Privacy Policy", - t56: ". We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy.", - t57: "", - t58: "", - t59: ".", - t60: "Europe", - t61: "North America", - t62: "Others", - t63: "After changing the region, your account will be logged out. Please log in again later.", - t64: "Proprietary Plugins", - t65: "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk.", - t66: "Full remote control", - t67: "Liveview streaming", - t68: "User data synchronization", - t69: "Install Bambu Network plug-in", - t70: "", - t71: "Downloading", - t72: "Downloading failed", - t73: "Installation successful.", - t74: "Restart", - t75: "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.", - t76: "Bambu Network plug-in not detected. Click ", - t77: "here", - t78: " to install it.", - t79: "Failed to install plug-in. ", - t80: "Try the following steps:", - t81: "1, Click ", - t82: " to open the plug-in directory", - t83: "2, Close all open Orca Slicer", - t84: "3, Delete all files under the plug-in directory", - t85: "4, Reopen Orca Slicer and install the plug-in again", - t86: "Close", - t87: "User Manual", - t88: "Remove", - t89: "Open Containing Folder", - t90: "3D Model", - t91: "Download 3D models", - t92: "Create by", - t93: "Remixed by", - t94: "Shared by", - t95: "Model Information", - t96: "Accessories", - t97: "Profile Information", - t98: "Model name", - t100: "Model description", - t101: "BOM", - t102: "Assembly Guide", - t103: "Other", - t104: "Profile name", - t105: "Profile Author", - t106: "Profile description", - t107: "Online Models", - t108: "MORE", - t109: "System Filaments", - t110: "Custom Filaments", - t111: "Create New", - t112: "Join the Program", - t113: "You may change your choice in preference anytime.", - t126: "Loading……", - orca1: "Edit Project Info", - orca2: "No model information", - orca3: "Stealth Mode", - orca4: "This disables all cloud features, including Orca Cloud profile syncing. Users who prefer to work entirely offline can enable this option.", - orca5: "Enable Stealth Mode.", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - orca12: "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud.", - }, - ca_ES: { - t1: "Benvingut a Orca Slicer", - t2: "Orca Slicer es configurarà en diversos passos. Comencem!", - t3: "Acord de l'Usuari", - t4: "No accepto", - t5: "Accepto", - t6: "Sol·licitem la vostra ajuda per millorar la impressió de tothom.
Vine i uneix-te al nostre Programa de Millora de l'Experiència del Client", - t7: "Uneix-te al nostre Programa de Millora de l'Experiència del Client", - t8: "Enrere", - t9: "Següent", - t10: "Selecció d'Impressora", - t11: "Totes", - t12: "Netejar tot", - t13: "mm broquet", - t14: "Selecció de Filament", - t15: "Impressora", - t16: "Tipus de filament", - t17: "Proveïdor", - t18: "Error", - t19: "S'ha de seleccionar almenys un filament.", - t20: "Vols utilitzar el filament per defecte?", - t21: "sí", - t22: "no", - t23: "Nota de llançament", - t24: "Comença", - t25: "Finalitzar", - t26: "Iniciar sessió", - t27: "Registrar", - t28: "Recent", - t29: "Botiga", - t30: "Manual", - t31: "Nou Projecte", - t32: "Crear nou projecte", - t33: "Obrir Projecte", - t34: "hotspot", - t35: "Obert recentment", - t36: "D'acord", - t37: "S'ha de seleccionar almenys una impressora.", - t38: "Cancel·lar", - t39: "Confirmar", - t40: "Desconnexió de la xarxa, si us plau comprova i intenta-ho de nou més tard.", - t47: "Si us plau selecciona la teva regió d'inici de sessió", - t48: "Àsia-Pacífic", - t49: "Xina", - t50: "Tancar sessió", - t52: "Saltar", - t53: "Unir-se", - t54: "A la comunitat d'Impressió 3D, aprenem dels èxits i fracassos dels altres per ajustar els nostres propis paràmetres i configuracions de laminació. Orca Slicer segueix el mateix principi i utilitza l'aprenentatge automàtic per millorar el seu rendiment a partir dels èxits i fracassos d'un gran nombre d'impressions dels nostres usuaris. Estem entrenant Orca Slicer per ser més intel·ligent alimentant-lo amb dades del món real. Si estàs disposat, aquest servei accedirà a informació dels teus registres d'errors i registres d'ús, que poden incloure informació descrita a la ", - t55: "Política de Privacitat", - t56: ". No recopilarem cap dada personal que pugui identificar directament o indirectament a un individu, incloent-hi noms, adreces, informació de pagament o números de telèfon. En habilitar aquest servei, acceptes aquests termes i la declaració sobre la Política de Privacitat.", - t57: "", - t58: "", - t59: ".", - t60: "Europa", - t61: "Amèrica del Nord", - t62: "Altres", - t63: "Després de canviar la regió, el teu compte es tancarà la sessió. Si us plau inicia sessió de nou més tard.", - t64: "Connectors propietaris", - t65: "Tingues en compte que aquests connectors no són desenvolupats ni mantinguts per OrcaSlicer. S'han d'utilitzar a la teva discreció i risc.", - t66: "Control remot complet", - t67: "Transmissió en directe", - t68: "Sincronització de dades de l'usuari", - t69: "Instal·lar connector Bambu Network", - t70: "", - t71: "Descarregant", - t72: "Descàrrega fallida", - t73: "Instal·lació exitosa.", - t74: "Reiniciar", - t75: "Alguns proveïdors d'impressora requereixen connectors propietaris per comunicar-se amb les seves impressores. Si us plau selecciona el connector corresponent si utilitzes aquestes impressores.", - t76: "No s'ha detectat el connector Bambu Network. Fes clic ", - t77: "aquí", - t78: " per instal·lar-lo.", - t79: "No s'ha pogut instal·lar el connector.", - t80: "Prova els següents passos:", - t81: "1, Fes clic ", - t82: " per obrir el directori de connectors", - t83: "2, Tanca totes les Orca Slicer obertes", - t84: "3, Elimina tots els fitxers del directori de connectors", - t85: "4, Reobre Orca Slicer i instal·la el connector de nou", - t86: "Tancar", - t87: "Manual de l'Usuari", - t88: "Eliminar", - t89: "Obrir Carpeta Contenidora", - t90: "Model 3D", - t91: "Descarregar models 3D", - t92: "Creat per", - t93: "Remesclat per", - t94: "Compartit per", - t95: "Informació del Model", - t96: "Accessoris", - t97: "Informació del Perfil", - t98: "Nom del model", - t100: "Descripció del model", - t101: "BOM", - t102: "Guia d'Assemblea", - t103: "Altres", - t104: "Nom del perfil", - t105: "Autor del perfil", - t106: "Descripció del perfil", - t107: "Models en línia", - t108: "MÉS", - t109: "Filaments del Sistema", - t110: "Filaments Personalitzats", - t111: "Crear Nou", - t112: "Unir-se al Programa", - t113: "Pots canviar la teva elecció en les preferències en qualsevol moment.", - orca1: "Editar Informació del Projecte", - orca2: "No hi ha informació del model", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - es_ES: { - t1: "Bienvenido a Orca Slicer", - t2: "Orca Slicer se configurará mediante varios pasos. ¡Comencemos!", - t3: "Términos de uso", - t4: "No acepto", - t5: "Acepto", - t6: "Le rogamos su ayuda para mejorar la experiencia de impresión de todos.
Únase a nuestro Programa de Mejora de la Experiencia del Cliente", - t7: "Permitir enviar datos anónimos", - t8: "Volver", - t9: "Siguiente", - t10: "Selección de impresora", - t11: "Todo", - t12: "Limpiar todo", - t13: "mm de boquilla", - t14: "Selección de filamento", - t15: "Impresora", - t16: "Tipo de filamento", - t17: "Fabricante", - t18: "Error", - t19: "Al menos se debe seleccionar un filamento.", - t20: "¿Desea usar el filamento por defecto?", - t21: "Sí", - t22: "No", - t23: "Notas de la versión", - t24: "Comenzar", - t25: "Finalizar", - t26: "Iniciar sesión", - t27: "Registrarse", - t28: "Reciente", - t29: "Tienda", - t30: "Manual", - t31: "Nuevo proyecto", - t32: "Crear nuevo proyecto", - t33: "Abrir proyecto", - t34: "punto de acceso", - t35: "Abiertos recientemente", - t36: "OK", - t37: "Al menos se debe seleccionar una impresora.", - t38: "Cancelar", - t39: "Confirmar", - t40: "Desconectado, por favor compruebe la conexión de red e inténtelo de nuevo.", - t47: "Por favor, seleccione su región:", - t48: "Asia-Pacífico", - t49: "China", - t50: "Cerrar sesión", - t52: "Omitir", - t53: "Unirse", - t54: "En la comunidad de impresión 3D aprendemos de los éxitos y fracasos de los demás para ajustar nuestros propios parámetros y configuraciones de corte. Orca Slicer sigue el mismo principio y utiliza el aprendizaje automático para mejorar su rendimiento a partir de los éxitos y fallos del gran número de impresiones realizadas por nuestros usuarios. Estamos entrenando a Orca Slicer para que sea más inteligente proporcionándole datos del mundo real. Si lo desea, este servicio accederá a la información de sus registros de errores y de uso, que pueden incluir la información descrita en nuestra ", - t55: "Política de privacidad", - t56: ". No recopilaremos ningún dato personal que pueda identificar directa o indirectamente a una persona, incluyendo, sin limitación, nombres, direcciones, información de pago o números de teléfono. Al habilitar este servicio, acepta estos términos y la declaración sobre la Política de privacidad.", - t57: "", - t58: "", - t59: ".", - t60: "Europa", - t61: "América del Norte", - t62: "Otras", - t63: "Después de cambiar la región, su cuenta se cerrará la sesión. Por favor, vuelva a iniciar sesión.", - t64: "Complementos propietarios", - t65: "Tenga en cuenta que estos complementos no están desarrollados ni mantenidos por OrcaSlicer. Deben usarse bajo su propia responsabilidad.", - t66: "Control remoto total", - t67: "Transmisión en vivo", - t68: "Sincronización de datos de usuario", - t69: "Instalar plug-in Bambu Network", - t70: "", - t71: "Descargando", - t72: "Descarga fallida", - t73: "Instalación exitosa.", - t74: "Reiniciar", - t75: "Algunos proveedores de impresoras requieren complementos propietarios para la comunicación con sus impresoras. Seleccione el complemento correspondiente si utiliza tales impresoras.", - t76: "Plug-in de Bambu Network no detectado. Haga clic ", - t77: "aquí", - t78: " para instalarlo.", - t79: "Fallo al instalar el complemento. ", - t80: "Intente los siguientes pasos:", - t81: "1. Haga clic ", - t82: " para abrir el directorio de complementos", - t83: "2. Cierre todas las instancias de Orca Slicer", - t84: "3. Elimine todos los archivos del directorio de complementos", - t85: "4. Vuelva a abrir Orca Slicer e instale el complemento de nuevo", - t86: "Cerrar", - t87: "Manual de usuario", - t88: "Eliminar", - t89: "Abrir carpeta contenedora", - t90: "Modelo 3D", - t91: "Descargar modelos 3D", - t92: "Creado por", - t93: "Remixado por", - t94: "Compartido por", - t95: "Información del modelo", - t96: "Accesorios", - t97: "Información del perfil", - t98: "Nombre del modelo", - t100: "Descripción del modelo", - t101: "Lista de materiales", - t102: "Guía de ensamblaje", - t103: "Otros", - t104: "Nombre del perfil", - t105: "Autor del perfil", - t106: "Descripción del perfil", - t107: "Modelos en línea", - t108: "Más", - t109: "Filamentos del sistema", - t110: "Filamentos personalizados", - t111: "Crear nuevo", - t112: "Unirse al programa", - t113: "Puede cambiar su elección en Preferencias en cualquier momento.", - t126: "Cargando……", - orca1: "Editar información del proyecto", - orca2: "No hay información sobre el modelo", - orca3: "Modo sigiloso", - orca5: "Activar modo sigiloso.", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - it_IT: { - t1: "Benvenuti in OrcaSlicer", - t2: "OrcaSlicer verrà configurato seguendo diversi passaggi. Cominciamo!", - t3: "Condizioni d'uso", - t4: "Non accetto", - t5: "Accetto", - t6: "Chiediamo gentilmente il tuo aiuto per migliorare la qualità delle stampe.
Iscriviti al nostro programma di miglioramento dell'esperienza utente", - t7: "Iscriviti al nostro programma di miglioramento dell'esperienza utente", - t8: "Indietro", - t9: "Avanti", - t10: "Selezione della stampante", - t11: "Tutto", - t12: "Cancella tutto", - t13: "mm ugello", - t14: "Selezione del filamento", - t15: "Stampante", - t16: "Tipo di filamento", - t17: "Produttore", - t18: "Errore", - t19: "È necessario selezionare almeno un filamento.", - t20: "Vuoi utilizzare il filamento predefinito?", - t21: "Sì", - t22: "No", - t23: "Note di rilascio", - t24: "Inizia", - t25: "Fine", - t26: "Accedi", - t27: "Registrati", - t28: "Recente", - t29: "Negozio", - t30: "Manuale", - t31: "Nuovo progetto", - t32: "Crea un nuovo progetto", - t33: "Apri progetto", - t34: "hotspot", - t35: "Aperti di recente", - t36: "OK", - t37: "È necessario selezionare almeno una stampante.", - t38: "Annulla", - t39: "Conferma", - t40: "Disconnesso, controlla la connessione di rete e riprova.", - t47: "Seleziona la tua regione di accesso", - t48: "Asia-Pacifico", - t49: "Cina", - t50: "Disconnettiti", - t52: "Salta", - t53: "Iscriviti", - t54: "Nella comunità di stampa 3D, impariamo dai successi e dagli insuccessi di ognuno per adattare i nostri parametri e le nostre impostazioni di slicing. OrcaSlicer segue lo stesso principio, utilizzando l'apprendimento automatico per migliorare le sue prestazioni sfruttando i successi e gli insuccessi delle numerose stampe dei nostri utenti. Stiamo addestrando OrcaSlicer ad essere più intelligente, fornendogli dati del mondo reale. Se lo desideri, questo servizio accederà alle informazioni dei tuoi registri di errore e di utilizzo, i quali possono includere informazioni descritte in ", - t55: "Politica sulla riservatezza", - t56: ". Non raccoglieremo alcun Dato Personale tramite il quale un individuo possa essere identificato direttamente o indirettamente, inclusi (senza limitazioni) nomi, indirizzi, informazioni di pagamento o numeri di telefono. Abilitando questo servizio, accetti questi termini e la dichiarazione sulla Politica sulla riservatezza.", - t57: "", - t58: "", - t59: ".", - t60: "Europa", - t61: "Nord America", - t62: "Altri", - t63: "Dopo aver cambiato la regione, il tuo profilo verrà disconnesso. Sarà necessario accedere di nuovo.", - t64: "Moduli proprietari", - t65: "Si prega di notare che questi moduli non sono sviluppati o mantenuti da OrcaSlicer. Dovrebbero essere utilizzati a proprio rischio e discrezione.", - t66: "Controllo remoto completo", - t67: "Video in diretta", - t68: "Sincronizzazione dei dati utente", - t69: "Installa il modulo di rete Bambu", - t70: "", - t71: "Scaricamento", - t72: "Scaricamento non riuscito", - t73: "Installazione riuscita.", - t74: "Riavvia", - t75: "Le stampanti di alcuni produttori richiedono dei moduli proprietari per far in modo che la comunicazione abbia successo. Seleziona il modulo corrispondente se utilizzi tali stampanti.", - t76: "Modulo di rete Bambu non rilevato. Fai clic ", - t77: "qui", - t78: " per installarlo.", - t79: "Impossibile installare il modulo. ", - t80: "Prova i seguenti passaggi:", - t81: "1, Fare clic ", - t82: " per aprire la directory del modulo", - t83: "2, Chiudere tutte le istanze di OrcaSlicer", - t84: "3, Eliminare tutti i file all'interno della directory del modulo", - t85: "4, Riaprire OrcaSlicer e installare nuovamente il modulo", - t86: "Chiudi", - t87: "Manuale d'uso", - t88: "Rimuovi", - t89: "Apri cartella con contenuto", - t90: "Modello 3D", - t91: "Scarica modelli 3D", - t92: "Creato da", - t93: "Modificato da", - t94: "Condiviso da", - t95: "Informazioni sul modello", - t96: "Accessori", - t97: "Informazioni sul profilo", - t98: "Nome del modello", - t100: "Descrizione del modello", - t101: "Elenco dei materiali", - t102: "Istruzioni di montaggio ", - t103: "Altro", - t104: "Nome del profilo", - t105: "Autore del profilo", - t106: "Descrizione del profilo", - t107: "Modelli online", - t108: "ALTRO", - t109: "Filamenti di sistema", - t110: "Filamenti personalizzati", - t111: "Crea Nuovo", - t112: "Unisciti al programma", - t113: "Puoi modificare la tua scelta in 'Preferenze' in qualsiasi momento.", - orca1: "Modifica informazioni progetto", - orca2: "Nessuna informazione sul modello", - orca3: "Modalità invisibile", - orca5: "Abilita la modalità invisibile.", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - de_DE: { - t1: "Willkommen im Orca Slicer", - t2: "Das Orca Slicer wird in mehreren Schritten eingerichtet. Lass uns anfangen!", - t3: "Nutzervereinbarung", - t4: "Ablehnen", - t5: "Zustimmen", - t6: "Wir bitten um deine Hilfe, um den Druck für alle zu verbessern", - t7: "Anonyme Daten senden erlauben", - t8: "Zurück", - t9: "Weiter", - t10: "Druckerauswahl", - t11: "Alle", - t12: "Keinen", - t13: "mm Düse", - t14: "Filamentauswahl", - t15: "Drucker", - t16: "Filamenttyp", - t17: "Hersteller", - t18: "Fehler", - t19: "Es muss mindestens ein Filament ausgewählt sein.", - t20: "Möchten Sie das Standard-Filament verwenden?", - t21: "Ja", - t22: "Nein", - t23: "Versionshinweise", - t24: "Loslegen", - t25: "Fertig", - t26: "Anmelden", - t27: "Registrieren", - t28: "Neueste", - t29: "Einkaufszentrum", - t30: "Handbuch", - t31: "Neues Projekt", - t32: "Neues Projekt erstellen", - t33: "Projekt öffnen", - t34: "Hotspot", - t35: "Zuletzt geöffnet", - t36: "OK", - t37: "Es muss mindestens ein Drucker ausgewählt sein.", - t38: "Abbrechen", - t39: "Bestätigen", - t40: "Netzwerkunterbrechung, bitte überprüfen und später erneut versuchen.", - t47: "Bitte wählen Sie Ihre Login-Region aus", - t48: "Asien-Pazifik", - t49: "China", - t50: "Abmelden", - t52: "Überspringen", - t53: "Beitreten", - t54: "In der 3D-Druck-Community lernen wir aus den Erfolgen und Misserfolgen der anderen Benutzer, um unsere eigenen Schneideparameter und Einstellungen anzupassen. Orca Slicer folgt demselben Prinzip und verbessert seine Leistung durch die Erfolge und Misserfolge der Vielzahl von Drucken unserer Benutzer mittels maschinellem Lernen. Wir trainieren Orca Slicer, indem wir ihnen die realen Daten zuführen. Wenn Sie bereit sind, greift dieser Dienst auf Informationen aus Ihren Fehler- und Nutzungsprotokollen zu, die Informationen enthalten können, die in der ", - t55: "Datenschutzrichtlinie", - t56: ". Wir werden keine personenbezogenen Daten sammeln, durch die eine Person direkt oder indirekt identifiziert werden kann, einschließlich, aber nicht beschränkt auf Namen, Adressen, Zahlungsinformationen oder Telefonnummern. Durch Aktivieren dieses Dienstes stimmen Sie diesen Bedingungen und der Erklärung zur Datenschutzrichtlinie zu.", - t57: "", - t58: "", - t59: ".", - t60: "Europa", - t61: "Nordamerika", - t62: "Andere", - t63: "Nach Ändern der Region wird Ihr Konto abgemeldet. Bitte melden Sie sich später erneut an.", - t64: "Bambu Network-Plug-in", - t65: "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk.", - t66: "Vollständige Fernsteuerung", - t67: "Live-View-Streaming", - t68: "Synchronisierung von Benutzerdaten", - t69: "Bambu Network-Plug-in installieren", - t70: "", - t71: "Herunterladen", - t72: "Herunterladen fehlgeschlagen", - t73: "Installation erfolgreich.", - t74: "Neustart", - t75: "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.", - t76: "Das Bambu Network-Plug-in wurde nicht erkannt. Klicken Sie ", - t77: "hier", - t78: ", um es zu installieren.", - t79: "Fehler beim Installieren des Plug-ins. ", - t80: "Versuchen Sie die folgenden Schritte:", - t81: "1, Klicken Sie auf ", - t82: ", um das Plug-in-Verzeichnis zu öffnen", - t83: "2, Schließen Sie alle geöffneten Orca Slicer", - t84: "3, Löschen Sie alle Dateien im Plug-in-Verzeichnis", - t85: "4, Öffnen Sie Orca Slicer erneut und installieren Sie das Plug-in erneut", - t86: "Schließen", - t87: "Benutzerhandbuch", - t88: "Entfernen", - t89: "Enthaltenden Ordner öffnen", - t90: "3D-Modell", - t91: "3D-Modelle herunterladen", - t92: "Erstellt von", - t93: "Remixed von", - t94: "Geteilt von", - t95: "Modellinformationen", - t96: "Zubehör", - t97: "Profilinformationen", - t98: "Modellname", - t100: "Modellbeschreibung", - t101: "Stückliste", - t102: "Montageanleitung", - t103: "Andere", - t104: "Profilname", - t105: "Profilautor", - t106: "Profilbeschreibung", - t126: "Laden……", - orca1: "Edit Project Info", - orca2: "No model information", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - cs_CZ: { - t1: "Vítejte v Orca Slicer", - t2: "Orca Slicer bude nastaven v několika krocích. Začněme!", - t3: "Uživatelská smlouva", - t4: "Nesouhlasím", - t5: "Souhlasím", - t6: "Prosíme o vaši pomoc se zlepšením všech tisků", - t7: "Povolit odesílání anonymních dat", - t8: "Zpět", - t9: "Další", - t10: "Výběr tiskárny", - t11: "Všechny", - t12: "Vymazat vše", - t13: "Tryska mm", - t14: "Výběr Filamentu", - t15: "Tiskárna", - t16: "Typ Filamentu", - t17: "Dodavatel", - t18: "Chyba", - t19: "Musí být vybraný alespoň jeden Filament.", - t20: "Chcete použít výchozí Filament?", - t21: "Ano", - t22: "Ne", - t23: "Poznámka k vydání", - t24: "Začínáme", - t25: "Dokončit", - t26: "Přihlásit", - t27: "Registrovat", - t28: "Poslední", - t29: "Obchodní centrum", - t30: "Manuální", - t31: "Nový projekt", - t32: "Vytvořit nový projekt", - t33: "Otevřít projekt", - t34: "Hotspot", - t35: "Nedávno otevřeno", - t36: "OK", - t37: "Musí být vybrána alespoň jedna tiskárna.", - t38: "Zrušit", - t39: "Potvrdit", - t40: "Síť je odpojena, prosím zkontrolujte a zkuste to znovu později.", - t47: "Vyberte prosím svou oblast přihlášení", - t48: "Asie-Pacifik", - t49: "Čína", - t50: "Odhlásit se", - t52: "Přeskočit", - t53: "Připojit se", - t54: "V komunitě 3D tisku se ze vzájemných úspěchů a neúspěchů učíme upravovat vlastní parametry a nastavení krájení. Orca Slicer se řídí stejným principem a využívá strojové učení ke zlepšení svého výkonu na základě úspěchů a neúspěchů počet výtisků našimi uživateli. Orca Slicer školíme, aby byl chytřejší tím, že jim poskytuje data z reálného světa. Pokud budete chtít, bude tato služba přistupovat k informacím z vašich protokolů chyb a protokolů použití, které mohou zahrnovat informace popsané v ", - t55: "Zásady ochrany osobních údajů", - t56: ". Nebudeme shromažďovat žádné osobní údaje, pomocí kterých lze přímo nebo nepřímo identifikovat jednotlivce, včetně jmen, adres, platebních údajů nebo telefonních čísel. Povolením této služby souhlasíte s těmito podmínkami a prohlášení o zásadách ochrany osobních údajů.", - t57: "", - t58: "", - t59: ".", - t60: "Evropa", - t61: "Severní Amerika", - t62: "Ostatní", - t63: "Po změně regionu bude váš účet odhlášen. Přihlaste se prosím znovu později.", - t64: "Proprietary Plugins", - t65: "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk.", - t66: "Plné dálkové ovládání", - t67: "Streamování v přímém přenosu", - t68: "Synchronizace uživatelských dat", - t69: "Instalovat Bambu Network plug-in", - t70: "", - t71: "Stahování", - t72: "Stahování se nezdařilo", - t73: "Instalace úspěšná.", - t74: "Restartovat", - t75: "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.", - t76: "Síťový plug-in Bambu nebyl zjištěn. Klikněte na ", - t77: "zde", - t78: " k instalaci.", - t79: "Nepodařilo se nainstalovat plugin.", - t80: "Zkuste následující kroky:", - t81: "1, klikněte", - t82: "otevřete adresář plug-in", - t83: "2, Zavřete všechny otevřené Orca Slicer", - t84: "3, Smažte všechny soubory v adresáři plug-in", - t85: "4, znovu otevřete Orca Slicer a znovu nainstalujte zásuvný modul", - t86: "Zavřít", - t87: "Uživatelská příručka", - t88: "Odstranit", - t89: "Otevřít složku obsahující", - t90: "3D model", - t91: "Stáhnout 3D modely", - t92: "Vytvořil", - t93: "Přepracováno", - t94: "Sdíleno", - t95: "Informace o modelu", - t96: "Příslušenství", - t97: "Informace o profilu", - t98: "Název modelu", - t100: "Popis modelu", - t101: "Seznam součástek (BOM)", - t102: "Průvodce sestavením", - t103: "Jiné", - t104: "Název profilu", - t105: "Autor profilu", - t106: "Popis profilu", - t126: "Načtení probíhá……", - orca1: "Edit Project Info", - orca2: "No model information", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - fr_FR: { - t1: "Bienvenue sur Orca Slicer", - t2: "Orca Slicer sera configuré en plusieurs étapes. Commençons !", - t3: "Accord d'utilisation", - t4: "Décliner", - t5: "Accepter", - t6: "Nous sollicitons votre aide pour améliorer
l'impression de chacun", - t7: "Autoriser l'envoi de données anonymes", - t8: "Retour", - t9: "Suivant", - t10: "Sélection de l'imprimante", - t11: "Tous", - t12: "Supprimer", - t13: "mm", - t14: "Sélection des filaments", - t15: "Imprimante", - t16: "Type de filament", - t17: "Fournisseur", - t18: "Erreur", - t19: "Au moins un filament doit être sélectionné.", - t20: "Voulez-vous utiliser le filament par défaut ?", - t21: "Oui", - t22: "Non", - t23: "Note de version", - t24: "Commencer", - t25: "Terminer", - t26: "Connexion", - t27: "Inscription", - t28: "Récent", - t29: "Mail", - t30: "Manuel", - t31: "Nouveau Projet", - t32: "Créer un nouveau projet", - t33: "Ouvrir un Projet", - t34: "hotspot", - t35: "Récemment ouvert", - t36: "OK", - t37: "Au moins une imprimante doit être sélectionnée.", - t38: "Annuler", - t39: "Confirmer", - t40: "Déconnexion du réseau, veuillez vérifier et réessayer plus tard.", - t47: "Veuillez sélectionner votre région de connexion", - t48: "Asie-Pacifique", - t49: "Chine", - t50: "Se déconnecter", - t52: "Passer", - t53: "Rejoindre", - t54: "Dans la communauté de l'impression 3D, nous apprenons des succès et des échecs des uns et des autres pour ajuster nos propres paramètres et paramètres de découpage. Orca Slicer suit le même principe et utilise l'apprentissage automatique pour améliorer ses performances à partir des succès et des échecs du grand nombre d'impressions de nos utilisateurs. Nous formons Orca Slicer à être plus intelligent en leur fournissant les données du monde réel. Si vous le souhaitez, ce service accédera aux informations de vos journaux d'erreurs et de vos journaux d'utilisation, qui peuvent inclure des informations décrites dans ", - t55: "Politique de confidentialité", - t56: ". Nous ne collecterons aucune donnée personnelle par laquelle un individu peut être identifié directement ou indirectement, y compris, sans s'y limiter, les noms, adresses, informations de paiement ou numéros de téléphone. En activant ce service, vous acceptez ces conditions et la déclaration sur la politique de confidentialité.", - t57: "", - t58: "", - t59: ".", - t60: "Europe", - t61: "Amérique du Nord", - t62: "Autres", - t63: "Après avoir changé de région, votre compte sera déconnecté. Veuillez vous reconnecter ensuite.", - t64: "Plug-in Bambu Network", - t65: "Veuillez noter que ces plugins ne sont pas développés ou maintenus par OrcaSlicer. Ils doivent être utilisés à votre propre discrétion et à vos propres risques.", - t66: "Commande à distance complète", - t67: "Diffusion en direct", - t68: "Synchronisation des données utilisateur", - t69: "Installer Bambu Network", - t70: "", - t71: "Téléchargement", - t72: "Échec du téléchargement", - t73: "Installation réussie.", - t74: "Redémarrer", - t75: "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.", - t76: "Le plug-in Bambu Network n'est pas détecté. Cliquez ", - t77: "ici", - t78: " pour l'installer.", - t79: "Échec de l'installation du plug-in. ", - t80: "Essayez les étapes suivantes :", - t81: "1, Cliquez ", - t82: " pour ouvrir le répertoire des plug-ins", - t83: "2, Fermez toutes les fenêtres de Orca Slicer", - t84: "3, Supprimez tous les fichiers dans le répertoire du plug-in", - t85: "4, Relancez Orca Slicer et réinstallez le plug-in.", - t86: "Fermer", - t87: "Manuel d'utilisation", - t88: "Supprimer", - t89: "Ouvrir le dossier contenant", - t90: "Modèle 3D", - t91: "Télécharger des modèles 3D", - t92: "Créé par", - t93: "Remixé par", - t94: "Partagé par", - t95: "Informations sur le modèle", - t96: "Accessoires", - t97: "Informations de profil", - t98: "Nom du modèle", - t100: "Description du modèle", - t101: "BOM", - t102: "Guide d'assemblage", - t103: "Autre", - t104: "Nom du profil", - t105: "Auteur du profil", - t106: "Description du profil", - t109: "Filaments du système", - t110: "Filaments personnalisés", - t111: "Créer un nouveau filament", - t126: "Chargement en cours……", - orca1: "Modifier les informations du projet", - orca2: "Pas d'information sur le modèle", - wk1: "Démarrage rapide", - wk2: "Cet article présente l'utilisation la plus basique de Orca Slicer. Il guide les utilisateurs pour configurer le logiciel, créer des projets et effectuer la première tâche d'impression étape par étape.", - wk3: "Workflow basé sur des projets", - wk4: "Orca Slicer met en avant un workflow de pointe pour véritablement réaliser un projet « tout en un ». Basé sur le format de projet 3MF grand public, il fournit une série de nouvelles fonctionnalités révolutionnaires, telles que la prise en charge de plusieurs plaques, un gestionnaire de ressources de projet et une vue d'assemblage/de pièce. Cela améliore considérablement l'efficacité des créateurs et des utilisateurs réguliers", - wk5: "Impression haute vitesse de qualité", - wk6: "Il est difficile d'imprimer à grande vitesse tout en maintenant une qualité élevée. Orca Slicer rend cela possible. « Arch Move » permet à la hotend de se déplacer en douceur et réduit les vibrations de la machine. Le refroidissement intelligent est basé sur des paramètres de refroidissement affinés pour chaque type de filament. Le « ralentissement automatique » pour les paroies en porte-à-faux permet d'éviter la déformation à grande vitesse.", - wk7: "Impression multi-couleur", - wk8: "Orca Slicer fournit des outils de colorisation polyvalents pour créer un modèle coloré. Vous pouvez librement ajouter/supprimer des filaments dans un projet et coloriser votre modèle avec différents pinceaux. Avant l'impression, chaque filament sera automatiquement mappé sur un emplacement AMS, sans avoir besoin de modifier manuellement le placement de la bobine dans l'AMS.", - wk9: "Guide de réglage des paramètres de découpage", - wk10: "Les fonctionnalités de gestion des paramètres de Orca Slicer offrent un contrôle très flexible et puissant sur le processus de découpage. Cet article présente l'organisation des paramètres et fournit quelques compétences pour tirer pleinement parti de ces fonctionnalités.", - wk11: "Contrôle et surveillance à distance", - wk12: "Orca Slicer prend en charge l'envoi du travail d'impression à votre imprimante via le réseau WAN/LAN, contrôlant et surveillant chaque aspect de votre imprimante 3D et des travaux d'impression. Si vous avez plusieurs imprimantes, vous pouvez facilement basculer entre elles dans la liste des périphériques.", - wk13: "Format STEP", - wk14: "Par rapport au format STL, le format STEP apporte des informations plus efficaces. Grâce à la grande précision de ce format, de nombreuses trajectoires d'extrusion peuvent être générées sous forme d'arcs. Il inclut également la relation d'assemblage de chaque pièce d'un modèle, qui peut être utilisée pour restaurer la vue d'assemblage après la coupe d'un modèle.", - wk15: "Texte 3D", - wk16: "Avec l'outil Texte 3D, les utilisateurs peuvent facilement créer diverses formes de texte 3D dans le projet, ce qui rend le modèle plus personnalisé. Orca Slicer fournit des dizaines de polices et prend en charge les styles gras et italique pour donner au texte une plus grande flexibilité.", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - zh_CN: { - t1: "欢迎使用Orca Slicer", - t2: "Orca Slicer需要几步安装步骤,让我们开始吧!", - t3: "用户使用协议", - t4: "拒绝", - t5: "同意", - t6: "帮助提升Orca Slicer性能", - t7: "允许发送匿名数据", - t8: "上一步", - t9: "下一步", - t10: "选择打印机", - t11: "全部", - t12: "清空", - t13: "mm 喷嘴", - t14: "选择材料", - t15: "打印机", - t16: "材料类型", - t17: "供应商", - t18: "错误", - t19: "至少要选择一款材料。", - t20: "你希望使用默认的材料列表吗?", - t21: "是", - t22: "否", - t23: "发布说明", - t24: "开始", - t25: "结束", - t26: "登录", - t27: "注册", - t28: "近期", - t29: "商城", - t30: "使用手册", - t31: "新建项目", - t32: "创建一个新项目", - t33: "打开项目", - t34: "热点", - t35: "近期打开文件", - t36: "确定", - t37: "至少需要选择一款打印机。", - t38: "取消", - t39: "确定", - t40: "网络不通,请检查并稍后重试。", - t47: "请选择登录区域", - t48: "亚太", - t49: "中国", - t50: "退出登录", - t52: "忽略", - t53: "同意", - t54: "在3D打印社区,我们从彼此的成功和失败中学习调整自己的切片参数和设置。Orca Slicer遵循同样的原则,通过机器学习的方式从大量用户打印的成功和失败中获取经验,从而改善打印性能。我们正在通过向Orca Slicer提供真实世界的数据来训练他们变得更聪明。如果您愿意,此服务将访问您的错误日志和使用日志中的信息,其中可能包括", - t55: "隐私政策", - t56: "中描述的信息。我们不会收集任何可以直接或间接识别个人的个人数据,包括但不限于姓名、地址、支付信息或电话号码。启用此服务即表示您同意这些条款和有关隐私政策的声明。", - t57: "", - t58: "", - t59: "。", - t60: "欧洲", - t61: "北美", - t62: "其他", - t63: "切换区域后,你的账号会被登出。稍后请重新登录。", - t64: "Bambu网络插件", - t65: "注意:这些插件不是由OrcaSlicer开发或维护的。使用它们需自担风险", - t66: "强大的远程控制功能", - t67: "实时视频流", - t68: "用户数据同步", - t69: "安装Bambu网络插件", - t70: "", - t71: "正在下载", - t72: "下载失败", - t73: "安装成功。", - t74: "重启", - t75: "一些打印机厂商需要安装他们的专有插件才能与打印机通信。如果您使用这类打印机,请选择相应的插件", - t76: "没有发现Bambu网络插件,请", - t77: "下载", - t78: "并安装。", - t79: "安装插件失败。", - t80: "请尝试如下步骤:", - t81: "1, 点击", - t82: "打开插件所在目录", - t83: "2, 关闭所有Orca Slicer", - t84: "3, 删除插件所在目录下的所有文件", - t85: "4, 重新启动Orca Slicer并尝试安装插件", - t86: "关闭", - t87: "使用引导", - t88: "移除", - t89: "打开所在的文件夹", - t90: "3D 模型", - t91: "下载3D模型", - t92: "创作", - t93: "修改", - t94: "分享", - t95: "模型信息", - t96: "附件", - t97: "配置信息", - t98: "模型名称", - t100: "模型介绍", - t101: "物料清单", - t102: "装备指导", - t103: "其他", - t104: "配置名称", - t105: "配置作者", - t106: "配置介绍", - t107: "在线模型", - t108: "更多", - t109: "系统材料", - t110: "自建材料", - t111: "新建", - t112: "加入该计划", - t113: "您可以随时更改您的偏好。", - t126: "正在加载……", - wk1: "快速入门指南", - wk2: "本文介绍了Orca Slicer的最基本用法。它指导用户配置软件,创建项目,并逐步完成第一个打印任务。", - wk3: "基于项目的工作流", - wk4: "Orca Slicer提出了领先的工作流程,真正实现了“一体化”项目。基于主流的3MF项目格式,它提供了一系列革命性的新功能,如支持多盘、项目资源管理器和装配/零件视图。它可以大幅提高模型创作者及普通用户的使用效率。", - wk5: "质量卓越的高速打印", - wk6: "在保持高质量的前提下进行高速打印是非常具有挑战性的。Orca Slicer让这一切发生。支持“圆弧移动”特性使工具头移动更加顺滑,有效减少机器振动。基于不同材料类型的精细标定过的冷却控制参数,使得冷却过程可以自动开展。在悬垂区域进行“自动减速”,可防止高速打印时在此区域的外观瑕疵。", - wk7: "多色打印", - wk8: "Orca Slicer提供了多种着色工具来制作彩色模型。您可以在项目中自由添加/移除打印材料,并使用不同的笔刷为模型着色。开始打印时,打印任务中的各个材料将自动映射到匹配的AMS槽位,无需手动调整AMS中的料卷位置。", - wk9: "切片参数设置指南", - wk10: "Orca Slicer中的参数管理功能为切片过程提供了非常灵活和强大的控制。本文介绍了切片参数的组织分类和设置方法,并提供了一些使用技巧。", - wk11: "远程控制和监控", - wk12: "Orca Slicer支持通过WAN/LAN网络向打印机发送打印任务,控制和查看3D打印机和打印任务的各个方面。如果您有多台打印机,还可以在设备列表中轻松切换。", - wk13: "STEP格式", - wk14: "与STL相比,STEP带来了更多有效的信息。由于STEP的高精度,切片时可以生成更多的圆弧路径。STEP还包括模型每个零件的装配关系,可分割模型后恢复装配视图。", - wk15: "3D文本", - wk16: "使用3D文本工具,用户可以轻松地在项目中创建各种3D文本形状,使模型更加个性化。Orca Slicer提供了数十种字体,并支持粗体和斜体样式,使文本具有更大的灵活性。", - orca1: "编辑项目信息", - orca2: "该模型没有相关信息", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - zh_TW: { - t1: "歡迎使用 Orca Slicer", - t2: "Orca Slicer 需要幾步安裝步驟,讓我們開始吧!", - t3: "使用者協議", - t4: "拒絕", - t5: "同意", - t6: "幫助提升 Orca Slicer 性能", - t7: "允許傳送匿名數據", - t8: "上一步", - t9: "下一步", - t10: "選擇3D列印機", - t11: "全部", - t12: "清空", - t13: "mm 噴嘴", - t14: "選擇線材", - t15: "3D列印機", - t16: "線材類型", - t17: "供應商", - t18: "錯誤", - t19: "至少要選擇一款線材。", - t20: "你希望使用預設的線材列表嗎?", - t21: "是", - t22: "否", - t23: "發布說明", - t24: "開始", - t25: "結束", - t26: "登入", - t27: "註冊", - t28: "最近", - t29: "商城", - t30: "使用手冊", - t31: "新建項目", - t32: "創建一個新項目", - t33: "打開項目", - t34: "熱點", - t35: "最近打開文件", - t36: "確定", - t37: "至少需要選擇一款3D列印機。", - t38: "取消", - t39: "確定", - t40: "網路不通,請檢查並稍後重試。", - t47: "請選擇登入區域", - t48: "亞太", - t49: "中國", - t50: "登出", - t52: "忽略", - t53: "同意", - t54: "在3D列印社區,我們從彼此的成功和失敗中學習調整自己的切片參數和設置。Orca Slicer 遵循同樣的原則,透過機器學習的方式從大量用戶列印的成功和失敗中獲取經驗,從而改善列印性能。我們正在通過向 Orca Slicer 提供真實世界的數據來訓練他們變得更聰明。如果您願意,此服務將訪問您的錯誤日誌和使用日誌中的資訊,其中可能包括", - t55: "隱私政策", - t56: "中描述的資訊。我們不會收集任何可以直接或間接識別個人的個人數據,包括但不限於姓名、地址、支付資訊或電話號碼。啟用此服務即表示您同意這些條款和有關隱私政策的聲明。", - t57: "", - t58: "", - t59: "。", - t60: "歐洲", - t61: "北美", - t62: "其他", - t63: "切換區域後,你的帳號會被登出。稍後請重新登入。", - t64: "Bambu網路插件", - t65: "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk.", - t66: "強大的遠端控制功能", - t67: "即時影片串流", - t68: "使用者數據同步", - t69: "安裝 Bambu網路插件", - t70: "", - t71: "正在下載", - t72: "下載失敗", - t73: "安裝成功。", - t74: "重啟", - t75: "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.", - t76: "沒有發現Bambu網路插件,請", - t77: "下載", - t78: "並安裝。", - t79: "安裝插件失敗。", - t80: "請嘗試如下步驟:", - t81: "1, 點擊", - t82: "打開插件所在目錄", - t83: "2, 關閉所有 Orca Slicer", - t84: "3, 刪除插件所在目錄下的所有文件", - t85: "4, 重新啟動 Orca Slicer 並嘗試安裝插件", - t86: "關閉", - t87: "使用引導", - t88: "移除", - t89: "打開所在的文件夾", - t90: "3D 模型", - t91: "下載3D模型", - t92: "Bambu聖誕小屋", - wk1: "快速入門指南", - wk2: "本文介紹了 Orca Slicer 的最基本用法。它指導用戶配置軟體,創建項目,並逐步完成第一個列印任務。", - wk3: "基於項目的工作流", - wk4: "Orca Slicer 提出了領先的工作流程,真正實現了“一體化”項目。基於主流的3MF項目格式,它提供了一系列革命性的新功能,如支持多盤、項目資源管理器和裝配/零件視圖。它可以大幅提高模型創作者及普通用戶的使用效率。", - wk5: "質量卓越的高速列印", - wk6: "在保持高品質的前提下進行高速列印是非常具有挑戰性的。Orca Slicer 讓這一切發生。支持“圓弧移動”特性使工具頭移動更加順滑,有效減少機器振動。基於不同線材類型的精細標定過的冷卻控制參數,使得冷卻過程可以自動開展。在懸垂區域進行“自動減速”,可防止高速列印時在此區域的外觀瑕疵。", - wk7: "多色列印", - wk8: "Orca Slicer 提供了多種著色工具來製作彩色模型。您可以在項目中自由添加/移除列印材料,並使用不同的筆刷為模型著色。開始列印時,列印任務中的各個線材將自動映射對應到 AMS 槽位,無需手動調整 AMS 中的線材位置。", - wk9: "切片參數設置指南", - wk10: "Orca Slicer 中的參數管理功能為切片過程提供了非常靈活和強大的控制。本文介紹了切片參數的組織分類和設置方法,並提供了一些使用技巧。", - wk11: "遠端控制和監控", - wk12: "Orca Slicer 支持透過無線網路/區域網路向3D列印機發送列印任務,控制和查看3D列印機和列印任務的各個方面。如果您有多台3D列印機,還可以在設備清單中輕鬆切換。", - wk13: "STEP格式", - wk14: "與 STL 相比,STEP 帶來了更多有效的資訊。由於 STEP 的高精度,切片時可以生成更多的圓弧路徑。STEP 還包括模型每個零件的組裝關係,可分割模型後恢復裝配視圖。", - wk15: "3D文本", - wk16: "使用3D文字工具,使用者可以輕鬆地在項目中建立各種3D文字形狀,使模型更加個性化。Orca Slicer 提供了數十種字體,並支援粗體和斜體樣式,使文字具有更大的靈活性。", - orca1: "編輯專案資訊", - orca2: "沒有模型相關資訊", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - ru_RU: { - t1: "Приветствуем в Orca Slicer!", - t2: "Для настройки Orca Slicer необходимо пройти несколько этапов. Давайте начнём!", - t3: "Пользовательское соглашение", - t4: "Отказаться", - t5: "Принять", - t6: "Мы просим вашей помощи,
чтобы улучшить печать", - t7: "Разрешить отправку анонимных данных для совершенствования программы", - t8: "Назад", - t9: "Далее", - t10: "Выбор принтера", - t11: "Все", - t12: "Очистить", - t13: "мм сопло", - t14: "Выбор материала", - t15: "Принтер", - t16: "Тип материала", - t17: "Производитель", - t18: "Oшибка", - t19: "Должна быть выбрана хотя бы одна пластиковая нить.", - t20: "Выбрать пластиковые нити по умолчанию?", - t21: "Да", - t22: "Нет", - t23: "Информация о версии", - t24: "Начать", - t25: "Закончить", - t26: "Войти", - t27: "Регистрация", - t28: "Недавние", - t29: "Mall", - t30: "Инструкции", - t31: "Новый проект", - t32: "Создать новый проект", - t33: "Открыть проект", - t34: "точка доступа", - t35: "Недавно открытые", - t36: "OK", - t37: "Должен быть выбран хотя бы один принтер.", - t38: "Отмена", - t39: "Принять", - t40: "Сеть отключена. Проверьте подключение и попробуйте снова.", - t47: "Выбор региона", - t48: "Азиатско-Тихоокеанский регион", - t49: "Китай", - t50: "Выйти", - t52: "Пропустить", - t53: "Войти", - t54: "Для поиска наилучших параметров нарезки и улучшения печати участники сообщества 3D-печати учатся на успехах и неудачах друг друга. Orca Slicer следует тому же принципу и использует машинное обучение для улучшения своей работы на основе успешного и неудачного опыта печати наших пользователей. Мы обучаем Orca Slicer быть умнее на основе реальных данных. По вашему согласию эта служба получит доступ к вашим журналам ошибок и журналам использования, в которых содержатся сведения, описанные в ", - t55: "политике конфиденциальности", - t56: ". Мы не собираем никаких личных данных, которые могут прямо или косвенно идентифицировать отдельного человека, включая, помимо прочего, имена, адреса, платёжную информацию или номера телефонов. Разрешая отправку, вы соглашаетесь с этими условиями и заявлением о политике конфиденциальности.", - t57: "", - t58: "", - t59: ".", - t60: "Европа", - t61: "Северная Америка", - t62: "Другой", - t63: "После смены региона произойдёт выход из аккаунта и понадобится войти снова.", - t64: "Сетевой плагин Bambu", - t65: "Имейте в виду, что эти плагины не разрабатываются и не поддерживаются OrcaSlicer. Используйте их на свой страх и риск.", - t66: "Полное дистанционное управление", - t67: "Просмотр прямой трансляции с камеры", - t68: "Синхронизация данных пользователя", - t69: "Установить сетевой плагин Bambu", - t70: "", - t71: "Загрузка", - t72: "Загрузка не удалась", - t73: "Установка выполнена успешно.", - t74: "Перезагрузка", - t75: "Для связи с некоторыми моделями принтеров требуются проприетарные плагины. Выберите соответствующий плагин, если у вас такой принтер.", - t76: "Сетевой плагин Bambu не обнаружен. Нажмите ", - t77: "здесь", - t78: ", чтобы установить его.", - t79: "Ошибка установки плагина. ", - t80: "Попробуйте выполнить следующие действия:", - t81: "1, Нажмите ", - t82: " для открытия папки плагина", - t83: "2, Закройте все окна Orca Slicer", - t84: "3, Удалите все файлы в папке плагина", - t85: "4, Откройте Orca Slicer и снова установите плагин.", - t86: "Закрыть", - t87: "Инструкции", - t88: "Удалить", - t89: "Открыть папку с файлом", - t90: "3D-модель", - t91: "Скачать 3D-модели", - t92: "Автор", - t93: "Модифицировано", - t94: "Поделиться", - t95: "Информация о модели", - t96: "Прикреплённые файлы", - t97: "Информация о профиле", - t98: "Имя модели", - t100: "Описание модели", - t101: "Список материалов", - t102: "Памятка по сборке", - t103: "Прочее", - t104: "Имя профиля", - t105: "Профиль автора", - t106: "Описание профиля", - t107: "Модели в сети", - t108: "Больше", - t109: "Системные материалы", - t110: "Пользовательские материалы", - t111: "Создать новый", - t112: "Присоединяйтесь к программе", - t113: "Вы можете изменить свой выбор в любое время.", - t126: "Загрузка...", - orca1: "Изменить информацию", - orca2: "Информация отсутствует", - orca3: "Режим конфиденциальности", - orca5: "Включить режим конфиденциальности", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - ko_KR: { - t1: "Orca Slicer에 오신 것을 환영합니다", - t2: "Orca Slicer는 여러 단계로 설정됩니다. 시작!", - t3: "사용자 약관", - t4: "거부", - t5: "동의", - t6: "모든 사람의 출력 품질 개선을 위해
여러분의 도움이 필요합니다.", - t7: "익명 데이터 전송 허용", - t8: "뒤로", - t9: "다음", - t10: "프린터 선택", - t11: "전체", - t12: "전체 해제", - t13: "mm 노즐", - t14: "필라멘트 선택", - t15: "프린터", - t16: "필라멘트 종류", - t17: "공급업체", - t18: "오류", - t19: "하나 이상의 필라멘트를 선택해야 합니다.", - t20: "기본 필라멘트를 사용하시겠습니까?", - t21: "예", - t22: "아니오", - t23: "릴리스 노트", - t24: "시작", - t25: "완료", - t26: "로그인", - t27: "등록", - t28: "최근", - t29: "상점", - t30: "메뉴얼", - t31: "새 프로젝트", - t32: "새 프로젝트 생성", - t33: "프로젝트 열기", - t34: "핫스팟", - t35: "최근 사용", - t36: "예", - t37: "하나 이상의 프린터를 선택해야 합니다.", - t38: "취소", - t39: "수락", - t40: "네트워크 연결이 끊겼습니다. 확인하고 나중에 다시 시도하세요.", - t47: "로그인 지역을 선택해주세요", - t48: "아시아 태평양", - t49: "중국", - t50: "로그 아웃", - t52: "건너뛰기", - t53: "가입", - t54: "3D 프린팅 커뮤니티에서 우리는 각자의 슬라이싱 매개변수와 설정을 조정하는 과정에서 서로의 성공과 실패를 통해 배웁니다. Orca Slicer는 동일한 원칙을 따르며 기계 학습을 사용하여 사용자의 방대한 출력물의 성공과 실패를 통해 성능을 향상시킵니다. 우리는 실제 데이터를 제공하여 Orca Slicer가 더욱 똑똑해지도록 교육하고 있습니다. 귀하가 원할 경우 이 서비스는 오류 로그 및 사용 로그의 정보에 액세스합니다. 여기에는 다음에 설명된 정보가 포함될 수 있습니다.", - t55: "개인 정보 정책", - t56: ". 당사는 이름, 주소, 결제 정보 또는 전화번호를 포함하되 이에 국한되지 않고 개인을 직간접적으로 식별할 수 있는 개인 데이터를 수집하지 않습니다. 이 서비스를 활성화함으로써 귀하는 본 약관과 개인정보 보호정책에 대한 설명에 동의하게 됩니다.", - t57: "", - t58: "", - t59: ".", - t60: "유럽", - t61: "북미", - t62: "다른 지역", - t63: "지역을 변경하면 계정이 로그아웃됩니다. 나중에 다시 로그인해 주세요.", - t64: "Bambu 네트워크 플러그인", - t65: "Please be aware that these plugins are not developed or maintained by OrcaSlicer. They should be used at your own discretion and risk.", - t66: "전체 원격 제어", - t67: "라이브뷰 스트리밍", - t68: "사용자 데이터 동기화", - t69: "Bambu 네트워크 플러그인 설치", - t70: "", - t71: "다운로드 중", - t72: "다운로드 실패", - t73: "설치 완료.", - t74: "재시작", - t75: "Some printer vendors require proprietary plugins for communication with their printers. Please select the corresponding plugin if you use such printers.", - t76: "Bambu 네트워크 플러그인이 감지되지 않습니다. 여기를 ", - t77: "클릭", - t78: " 하여 설치하세요.", - t79: "플러그인을 설치하지 못했습니다. ", - t80: "다음 단계를 시도해 보세요:", - t81: "1, 클릭 ", - t82: " 하여 플러그인 디렉토리를 엽니다.", - t83: "2, 열려 있는 모든 Orca Slicer를 닫습니다.", - t84: "3, 플러그인 디렉터리 아래의 모든 파일 삭제합니다", - t85: "4, Orca Slicer를 다시 열고 플러그인을 다시 설치하세요.", - t86: "닫기", - t87: "사용자 메뉴얼", - t88: "제거", - t89: "포함된 폴더 열기", - t90: "3D 모델", - t91: "3D 모델 다운로드", - t92: "Bambu Christmas Cabin", - t93: "프린터 연결", - t94: "장치를 보려면 프린터 연결을 설정하세요.", - t126: "로딩 중……", - orca1: "Edit Project Info", - orca2: "No model information", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - tr_TR: { - t1: "Orca Slicer'a hoş geldiniz", - t2: "Orca Dilimleyici birkaç adımda kurulacaktır. Hadi başlayalım!", - t3: "Kullanıcı Sözleşmesi", - t4: "Reddet", - t5: "Onayla", - t6: "Herkesin yazdırma işini iyileştirmek için
yardımınızı rica ediyoruz", - t7: "Anonim verilerin gönderilmesine izin ver", - t8: "Geri", - t9: "İleri", - t10: "Yazıcı Seçimi", - t11: "Hepsi", - t12: "Hepsini temizle", - t13: "mm nozul", - t14: "Filament Seçimi", - t15: "Yazıcı", - t16: "Filament türü", - t17: "Üretici", - t18: "Hata", - t19: "En az bir filament seçilmelidir.", - t20: "Varsayılan filamenti kullanmak ister misiniz ?", - t21: "Evet", - t22: "Hayır", - t23: "Sürüm notu", - t24: "Başla", - t25: "Bitir", - t26: "Giriş Yap", - t27: "Kayıt Ol", - t28: "Son", - t29: "Mağaza", - t30: "Manual", - t31: "Yeni proje", - t32: "Yeni proje oluştur", - t33: "Projeyi Aç", - t34: "Erişim noktası", - t35: "Yakın zamanda açıldı", - t36: "OK", - t37: "En az bir yazıcı seçilmelidir.", - t38: "İptal Et", - t39: "Onayla", - t40: "Ağ bağlantısı kesildi, lütfen kontrol edin ve daha sonra tekrar deneyin.", - t47: "Lütfen giriş bölgenizi seçin", - t48: "Asya-Pasifik", - t49: "Çin", - t50: "Çıkış Yap", - t52: "Atla", - t53: "Katıl", - t54: "3D Baskı topluluğunda, kendi dilimleme parametrelerimizi ve ayarlarımızı düzenlerken birbirimizin başarılarından ve başarısızlıklarından öğreniyoruz. Orca Slicer da aynı prensibi takip ediyor ve kullanıcılarımızın yaptığı çok sayıda baskının başarı ve başarısızlıklarından performansını artırmak için makine öğrenimini kullanıyor. Orca Slicer'ı gerçek dünya verileriyle besleyerek daha akıllı olması için eğitiyoruz. İsterseniz bu hizmet, hata günlüklerinizden ve kullanım günlüklerinizden, burada açıklanan bilgileri de içerebilecek bilgilere erişecektir. ", - t55: "Gizlilik Politikası", - t56: ". İsimler, adresler, ödeme bilgileri veya telefon numaraları dahil ancak bunlarla sınırlı olmamak üzere, bir bireyin doğrudan veya dolaylı olarak tanımlanmasını sağlayacak hiçbir Kişisel Veri toplamayacağız. Bu hizmeti etkinleştirerek bu şartları ve Gizlilik Politikasına ilişkin beyanı kabul etmiş olursunuz.", - t57: "", - t58: "", - t59: ".", - t60: "Avrupa", - t61: "Kuzey Amerika", - t62: "Diğerleri", - t63: "Bölgeyi değiştirdikten sonra hesabınızdan çıkış yapılacaktır. Lütfen daha sonra tekrar giriş yapın.", - t64: "Bambu Ağı eklentisi", - t65: "Lütfen bu eklentilerin OrcaSlicer tarafından geliştirilmediğini veya bakımının yapılmadığını unutmayın. Kendi takdirinize ve riskinize göre kullanılmalıdırlar.", - t66: "Tam uzaktan kontrol", - t67: "Canlı görüntü akışı", - t68: "Kullanıcı veri senkronizasyonu", - t69: "Bambu Ağı eklentisini yükleyin", - t70: "", - t71: "İndiriliyor", - t72: "İndirme başarısız oldu", - t73: "Kurulum başarılı oldu.", - t74: "Tekrar başlat", - t75: "Bazı yazıcı üreticileri, yazıcılarıyla iletişim için özel eklentilere ihtiyaç duyar. Bu tür yazıcılar kullanıyorsanız lütfen ilgili eklentiyi seçin.", - t76: "Bambu Ağı eklentisi algılanmadı. Yüklemek ", - t77: "için ", - t78: " burayı tıklayın.", - t79: "Eklenti yüklenemedi. ", - t80: "Aşağıdaki adımları deneyin:", - t81: "1, Eklenti ", - t82: " dizinini açmak için tıklayın", - t83: "2, Tüm açık Orca slicerı kapatın", - t84: "3, Eklenti dizini altındaki tüm dosyaları silin", - t85: "4, Orca Slicer'ı yeniden açın ve eklentiyi tekrar yükleyin", - t86: "Kapat", - t87: "Kullanım kılavuzu", - t88: "Kaldır", - t89: "Dosyayı içeren klasörü açınız", - t90: "3D Model", - t91: "3D modelleri indirin", - t92: "Oluşturan", - t93: "Değiştiren", - t94: "Paylaşan", - t95: "Model Bilgileri", - t96: "Aksesuarlar", - t97: "Profil Bilgisi", - t98: "Model adı", - t100: "Model açıklaması", - t101: "Malzeme Listesi", - t102: "Montaj Kılavuzu", - t103: "Diğer", - t104: "Profil ismi", - t105: "Profil Yazarı", - t106: "Profil açıklaması", - t107: "Çevrimiçi Modeller", - t108: "DAHA FAZLA", - t109: "Sistem Filamentleri", - t110: "Özel Filamentler", - t111: "Yeni Oluştur", - t112: "Programa Katılın", - t113: "Tercihinizi istediğiniz zaman değiştirebilirsiniz.", - t126: "Yükleme devam ediyor……", - orca1: "Proje Bilgilerini Düzenle", - orca2: "Model bilgisi yok", - orca3: "Gizli Mod", - orca5: "Gizli Modu etkinleştirin.", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - pl_PL: { - t1: "Witamy w Orca Slicer", - t2: "Orca Slicer zostanie skonfigurowany w kilku krokach. Zacznijmy!", - t3: "Umowa użytkownika", - t4: "Nie zgadzam się", - t5: "Zgadzam się", - t6: "Uprzejmie prosimy o pomoc w ulepszaniu
druku dla każdego", - t7: "Zezwól na wysyłanie anonimowych danych", - t8: "Wstecz", - t9: "Dalej", - t10: "Wybór drukarki", - t11: "Wszystkie", - t12: "Wyczyść wszystko", - t13: "mm dysza", - t14: "Wybór filamentu", - t15: "Drukarka", - t16: "Typ filamentu", - t17: "Dostawca", - t18: "Błąd", - t19: "Przynajmniej jeden filament musi być wybrany.", - t20: "Czy chcesz użyć domyślnego filamentu?", - t21: "Tak", - t22: "Nie", - t23: "Informacje o wydaniu", - t24: "Rozpocznij", - t25: "Zakończ", - t26: "Logowanie", - t27: "Rejestracja", - t28: "Ostatnie", - t29: "Centrum", - t30: "Instrukcja", - t31: "Nowy Projekt", - t32: "Utwórz nowy projekt", - t33: "Otwórz Projekt", - t34: "hotspot", - t35: "Ostatnio otwarte", - t36: "OK", - t37: "Przynajmniej jedna drukarka musi być wybrana.", - t38: "Anuluj", - t39: "Potwierdź", - t40: "Rozłączenie sieci, proszę sprawdzić i spróbować ponownie później.", - t47: "Proszę wybrać swój region logowania", - t48: "Azja-Pacyfik", - t49: "Chiny", - t50: "Wyloguj", - t52: "Pomiń", - t53: "Dołącz", - t54: "W społeczności druku 3D uczymy się od sukcesów i porażek innych, aby dostosować nasze własne parametry i ustawienia krojenia. Orca Slicer podąża tą samą zasadą i wykorzystuje uczenie maszynowe do poprawy swojej wydajności na podstawie sukcesów i porażek dużej liczby wydruków naszych użytkowników. Szkolimy Orca Slicer, aby był mądrzejszy, dostarczając mu danych z rzeczywistego świata. Jeśli chcesz, ta usługa uzyska dostęp do informacji z Twoich logów błędów i logów użytkowania, które mogą zawierać informacje opisane w ", - t55: "Polityka Prywatności", - t56: ". Nie będziemy zbierać żadnych Danych Osobowych, przez które można bezpośrednio lub pośrednio zidentyfikować osobę, w tym bez ograniczeń nazwisk, adresów, informacji o płatnościach lub numerów telefonów. Aktywując tę usługę, zgadzasz się na te warunki i oświadczenie dotyczące Polityki Prywatności.", - t57: "", - t58: "", - t59: ".", - t60: "Europa", - t61: "Ameryka Północna", - t62: "Inne", - t63: "Po zmianie regionu, zostaniesz wylogowany z konta. Proszę zaloguj się ponownie później.", - t64: "Wtyczka Bambu Network", - t65: "Proszę mieć świadomość, że te wtyczki nie są rozwijane ani utrzymywane przez OrcaSlicer. Powinny być używane na własne ryzyko i z rozwagą.", - t66: "Pełna kontrola zdalna", - t67: "Transmisja na żywo", - t68: "Synchronizacja danych użytkownika", - t69: "Zainstaluj wtyczkę Bambu Network", - t70: "", - t71: "Pobieranie", - t72: "Nieudane pobieranie", - t73: "Instalacja zakończona sukcesem.", - t74: "Uruchom ponownie", - t75: "Niektórzy dostawcy drukarek wymagają własnych wtyczek do komunikacji ze swoimi drukarkami. Proszę wybrać odpowiednią wtyczkę, jeśli korzystasz z takich drukarek.", - t76: "Wtyczka Bambu Network nie wykryta. Kliknij ", - t77: "tutaj", - t78: " aby zainstalować.", - t79: "Nie udało się zainstalować wtyczki. ", - t80: "Spróbuj następujących kroków:", - t81: "1, Kliknij ", - t82: " aby otworzyć katalog wtyczek", - t83: "2, Zamknij wszystkie otwarte Orca Slicer", - t84: "3, Usuń wszystkie pliki z katalogu wtyczek", - t85: "4, Ponownie otwórz Orca Slicer i zainstaluj wtyczkę ponownie", - t86: "Zamknij", - t87: "Instrukcja użytkownika", - t88: "Usuń", - t89: "Otwórz folder zawierający", - t90: "Model 3D", - t91: "Pobierz modele 3D", - t92: "Utworzone przez", - t93: "Połączenie z drukarką", - t94: "Proszę skonfigurować połączenie z drukarką, aby wyświetlić urządzenie.", - t95: "Informacje o modelu", - t96: "Akcesoria", - t97: "Informacje o profilu", - t98: "Nazwa modelu", - t100: "Opis modelu", - t101: "BOM", - t102: "Przewodnik montażu", - t103: "Inne", - t104: "Nazwa profilu", - t105: "Autor profilu", - t106: "Opis profilu", - t107: "Modele online", - t108: "WIĘCEJ", - t109: "Systemowe filamenty", - t110: "Niestandardowe filamenty", - t111: "Utwórz nowy", - t112: "Dołącz do programu", - t113: "Możesz zmienić swój wybór w preferencjach w dowolnym momencie.", - t126: "Ładowanie trwa……", - orca1: "Edytuj informacje o projekcie", - orca2: "Brak informacji o modelu", - orca3: "Tryb «Niewidzialny»", - orca5: "Włącz tryb «Niewidzialny»", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - pt_BR: { - t1: "Bem-vindo ao Orca Slicer", - t2: "Orca Slicer será configurado em várias etapas. Vamos começar!", - t3: "Termos de Uso", - t4: "Discordo", - t5: "Concordo", - t6: "Nós pedimos gentilmente sua ajuda para melhorar a impressão de todos.
Venha e junte-se ao nosso Programa de Melhoria de Experiência do Usuário", - t7: "Juntar-se ao nosso Programa de Melhoria de Experiência do Usuário", - t8: "Voltar", - t9: "Próximo", - t10: "Seleção de Impressora", - t11: "Tudo", - t12: "Limpar tudo", - t13: "mm nozzle", - t14: "Seleção de Filamento", - t15: "Impressora", - t16: "Tipo de Filamento", - t17: "Fabricante", - t18: "Erro", - t19: "Pelo menos um filamento deve ser selecionado.", - t20: "Você deseja usar o filamento padrão?", - t21: "Sim", - t22: "Não", - t23: "Notas de Atualização", - t24: "Vamos Começar", - t25: "Terminar", - t26: "Login", - t27: "Registrar", - t28: "Recente", - t29: "Loja", - t30: "Manual", - t31: "Novo Projeto", - t32: "Criar Novo Projeto", - t33: "Abrir Projeto", - t34: "hotspot", - t35: "Aberto Recentemente", - t36: "OK", - t37: "Pelo menos uma impressora deve ser selecionada.", - t38: "Cancelar", - t39: "Confirmar", - t40: "Conexão desconectada, por favor cheque e tente novamente.", - t47: "Por favor, selecione sua região de login", - t48: "Asia-Pacifico", - t49: "China", - t50: "Desconectar", - t52: "Pular", - t53: "Juntar", - t54: "Na comunidade de Impressão 3D, aprendemos com os sucessos e falhas uns dos outros para ajustar nossos próprios parâmetros e configurações de fatiamento. O Orca Slicer segue o mesmo princípio e utiliza aprendizado de máquina para melhorar seu desempenho com base nos sucessos e falhas de um grande número de impressões realizadas por nossos usuários. Estamos treinando o Orca Slicer para ser mais inteligente, alimentando-o com dados do mundo real. Se você concordar, este serviço acessará informações de seus registros de erros e registros de uso, que podem incluir informações descritas em…", - t55: "Política de Privacidade", - t56: ". Não coletaremos nenhum dado pessoal pelo qual um indivíduo possa ser identificado diretamente ou indiretamente, incluindo, sem limitação, nomes, endereços, informações de pagamento ou números de telefone. Ao habilitar este serviço, você concorda com estes termos e com a declaração sobre a Política de Privacidade.", - t57: "", - t58: "", - t59: ".", - t60: "Europa", - t61: "America do Norte", - t62: "Outras", - t63: "Após alterar sua região, sua conta será desconectada. Por favor faça login novamente mais tarde.", - t64: "Plugins Proprietários", - t65: "Por favor seja cuidadoso estes plugins não são desenvolvidos ou mantidos por OrcaSlicer. Eles devem ser usados por sua conta e risco.", - t66: "Controle remoto total", - t67: "Transmissão Ao Vivo", - t68: "Sincronização de Dados do Usuário", - t69: "Instalar Bambu Network plug-in", - t70: "", - t71: "Baixando", - t72: "Falha baixando", - t73: "Instalação concluída.", - t74: "Reiniciar", - t75: "Algumass fabricantes de impressoras exigem plugins proprietários para comunicação com suas impressoras. Se você utiliza tais impressoras, selecione o plug-in correspondente.", - t76: "Bambu Network plug-in não detectado. Clique ", - t77: "Aqui", - t78: " para instalar isto.", - t79: "Instalação do plug-in falhou. ", - t80: "Tente os seguintes passos:", - t81: "1, Clique ", - t82: " para abrir a pasta do plug-in", - t83: "2, Feche totalmente o Orca Slicer", - t84: "3, Delete todos os arquivos na pasta do plug-in", - t85: "4, Reabra o Orca Slicer e instale o plug-in novamente", - t86: "Fechar", - t87: "Manual de Usuário", - t88: "Remover", - t89: "Abrir pasta de Conteúdo", - t90: "Modelo 3D", - t91: "Baixar Modelos 3D", - t92: "Criado por", - t93: "Remixado por", - t94: "Compartilhado por", - t95: "Informações do Modelo", - t96: "Acessórios", - t97: "Informações do Perfil", - t98: "Nome do Modelo", - t100: "Descrição do Modelo", - t101: "BOM", - t102: "Guia de Montagem", - t103: "Outro", - t104: "Nome do Perfil", - t105: "Autor do Perfil", - t106: "Descrição do Perfil", - t107: "Modelos Online", - t108: "MAIS", - t109: "Filamentos do Sistema", - t110: "Filamentos Personalizados", - t111: "Criar Novo", - t112: "Junte-se ao Programa", - t113: "Você pode alterar sua escolha nas Preferências a qualquer momento", - t126: "Carregamento em andamento……", - orca1: "Editar Info do Projeto", - orca2: "Sem informação do modelo", - orca3: "Modo Furtivo", - orca5: "Habilita Modo Furtivo.", - orca6: "Bambu Cloud", - orca7: "Orca Cloud Account", - orca8: "Not signed in", - orca9: "Bambu Cloud Account", - orca10: "Not connected", - orca11: "Connected", - }, - lt_LT: { - t1: "Pasisveikinkite su Orca Slicer", - t2: "Orca Slicer bus nustatyta per kelis žingsnius. Pradėkime!", - t3: "Naudotojo sutartis", - t4: "Nesutinku", - t5: "Sutinku", - t6: "Maloniai prašome jūsų pagalbos, kad pagerintume visų spausdinimą.
Prisijunkite prie mūsų klientų patirties gerinimo programos", - t7: "Prisijunkite prie mūsų klientų patirties gerinimo programos", - t8: "Atgal", - t9: "Pirmyn", - t10: "Spausdintuvo pasirinkimas", - t11: "Visi", - t12: "Išvalyti visus", - t13: "mm purkštukas", - t14: "Gijos pasirinkimas", - t15: "Spausdintuvas", - t16: "Gijos tipas", - t17: "Gamintojas", - t18: "Klaida", - t19: "Turi būti pasirinkta bent viena gija.", - t20: "Ar norite naudoti numatytąją giją?", - t21: "Taip", - t22: "Ne", - t23: "Išleidimo pastabos", - t24: "Pradėti", - t25: "Pabaigti", - t26: "Prisijungti", - t27: "Prisiregistruoti", - t28: "Naujausi", - t29: "Pirkti", - t30: "Rankinis", - t31: "Naujas projektas", - t32: "Sukurti naują projektą", - t33: "Atverti projektą", - t34: "Prieigos taškas", - t35: "Neseniai atidaryti", - t36: "Gerai", - t37: "Turi būti pasirinktas bent vienas spausdintuvas.", - t38: "Atšaukti", - t39: "Patvirtinti", - t40: "Tinklas atjungtas, patikrinkite ir bandykite vėliau.", - t47: "Pasirinkite prisijungimo regioną", - t48: "Azija-Ramusis vandenynas", - t49: "Kinija", - t50: "Atsijungti", - t52: "Praleisti", - t53: "Prisijungti", - t54: "3D spausdinimo bendruomenėje mokomės vieni iš kitų sėkmių ir nesėkmių, kad galėtume pritaikyti savo pjaustymo parametrus ir nustatymus. Orca Slicer vadovaujasi tuo pačiu principu ir naudoja mašininį mokymąsi, kad pagerintų savo veikimą, remdamasi daugybės mūsų naudotojų atspaudų sėkmėmis ir nesėkmėmis. Maitindami Orca Slicer realaus pasaulio duomenimis, mokome ją būti protingesne. Jei pageidaujate, ši paslauga pasieks informaciją iš jūsų klaidų žurnalų ir naudojimo žurnalų, į kuriuos gali būti įtraukta informacija, aprašyta ", - t55: "privatumo politikoje", - t56: ". Nerinksime jokių asmens duomenų, pagal kuriuos galima tiesiogiai ar netiesiogiai nustatyti asmens tapatybę, įskaitant, bet neapsiribojant vardus, adresus, mokėjimo informaciją ar telefono numerius. Įjungdami šią paslaugą sutinkate su šiomis sąlygomis ir privatumo politikos nuostatomis.", - t57: "", - t58: "", - t59: ".", - t60: "Europa", - t61: "Šiaurės Amerika", - t62: "Kiti", - t63: "Pakeitus regioną, jūsų paskyra bus išregistruota. Vėliau vėl prisijunkite.", - t64: "Patentuoti papildiniai", - t65: "Atkreipkite dėmesį, kad OrcaSlicer šių papildinių nesukuria ir neprižiūri. Juos turėtumėte naudoti savo nuožiūra ir rizika.", - t66: "Pilnas nuotolinis valdymas", - t67: "Tiesioginė transliacija", - t68: "Naudotojo duomenų sinchronizavimas", - t69: "Įdiegti Bambu tinklo papildinį", - t70: "", - t71: "Atsisiunčiama", - t72: "Nepavyko atsisiųsti", - t73: "Diegimas sėkmingas.", - t74: "Paleisti iš naujo", - t75: "Kai kurie spausdintuvų gamintojai reikalauja patentuotų priedų, kad būtų galima bendrauti su jų spausdintuvais. Jei naudojate tokius spausdintuvus, pasirinkite atitinkamą įskiepį.", - t76: "Neaptiktas Bambu tinklo papildinys. Spustelėkite ", - t77: "čia", - t78: " jo diegimui.", - t79: "Nepavyko įdiegti papildinio. ", - t80: "Išbandykite šiuos žingsnius:", - t81: "1, Spustelkite ", - t82: " atidaryti papildinių katalogą", - t83: "2, Uždarykite visas veikiančias Orca Slicer programas", - t84: "3, Ištrinkite visus failus iš papildinių katalogo", - t85: "4, Iš naujo atverkite OrcaSlicer ir iš naujo įdiekite papildinį", - t86: "Užverti", - t87: "Naudotojo vadovas", - t88: "Pašalinti", - t89: "Atidaryti katalogą, kuriame yra", - t90: "3D modelis", - t91: "Atsisiųsti 3D modelius", - t92: "Sukurta", - t93: "Perkurta", - t94: "Pasidalinta", - t95: "Modelio informacija", - t96: "Priedai", - t97: "Profilio informacija", - t98: "Modelio pavadinimas", - t100: "Modelio aprašymas", - t101: "BOM", - t102: "Surinkimo vadovas", - t103: "Kita", - t104: "Profilio pavadinimas", - t105: "Profilio autorius", - t106: "Profilio aprašymas", - t107: "Modeliai internete", - t108: "DAUGIAU", - t109: "Sistemos gijos", - t110: "Pasirinktinės gijos", - t111: "Sukurti naują", - t112: "Prisijungti prie programos", - t113: "Savo pasirinkimą galite bet kada pakeisti.", - orca1: "Redaguoti projekto informaciją", - orca2: "Nėra informacijos apie modelį", - orca3: "Slaptas režimas", - orca5: "Įjungti slaptą režimą.", - orca6: "Bambu Cloud", - orca7: "Orca Cloud paskyra", - orca8: "Neprisiregistruota", - orca9: "Bambu Cloud paskyra", - orca10: "Neprisijungta", - orca11: "Prisijungta", - }, -}; - -var LANG_COOKIE_NAME = "BambuWebLang"; -var LANG_COOKIE_EXPIRESECOND = 365 * 86400; - -function TranslatePage() { - let strLang = GetQueryString("lang"); - if (strLang != null) { - //setCookie(LANG_COOKIE_NAME,strLang,LANG_COOKIE_EXPIRESECOND,'/'); - localStorage.setItem(LANG_COOKIE_NAME, strLang); - } else { - //strLang=getCookie(LANG_COOKIE_NAME); - strLang = localStorage.getItem(LANG_COOKIE_NAME); - } - - //alert(strLang); - - if (!LangText.hasOwnProperty(strLang)) strLang = "en"; - - let AllNode = $(".trans"); - let nTotal = AllNode.length; - for (let n = 0; n < nTotal; n++) { - let OneNode = AllNode[n]; - - let tid = $(OneNode).attr("tid"); - if (LangText[strLang].hasOwnProperty(tid)) { - $(OneNode).html(LangText[strLang][tid]); - } - } -} - diff --git a/resources/web/dialog/ExportPresetDialog/index.html b/resources/web/dialog/ExportPresetDialog/index.html index e93af3af28..70f7fd19b6 100644 --- a/resources/web/dialog/ExportPresetDialog/index.html +++ b/resources/web/dialog/ExportPresetDialog/index.html @@ -10,7 +10,7 @@ - + @@ -23,14 +23,14 @@
- printer + Printer
- +
-
No items
+
No items
@@ -38,14 +38,14 @@
- filament + Filament
- +
-
No items
+
No items
@@ -53,22 +53,22 @@
- presets + Process
- +
-
No items
+
No items
-
Export to OrcaCloud
-
Export to folder
-
Close
+
Export to OrcaCloud
+
Export to folder
+
Close
diff --git a/resources/web/dialog/ExportPresetDialog/index.js b/resources/web/dialog/ExportPresetDialog/index.js index e5c172e351..f380650a36 100644 --- a/resources/web/dialog/ExportPresetDialog/index.js +++ b/resources/web/dialog/ExportPresetDialog/index.js @@ -12,8 +12,7 @@ var g_search = { function OnInit() { - if (typeof TranslatePage === "function") - TranslatePage(); + TranslatePage(); InstallInputSafeKeydown(); BindSearchInputs(); diff --git a/resources/web/dialog/PluginsConfigDialog/index.html b/resources/web/dialog/PluginsConfigDialog/index.html index 6ce4d29dcc..e48eeb63dc 100644 --- a/resources/web/dialog/PluginsConfigDialog/index.html +++ b/resources/web/dialog/PluginsConfigDialog/index.html @@ -16,29 +16,31 @@

-
This preset does not use any plugin capabilities
+
This preset does not use any plugin capabilities
-
@@ -48,6 +50,7 @@ + diff --git a/resources/web/dialog/PluginsConfigDialog/index.js b/resources/web/dialog/PluginsConfigDialog/index.js index 8d9b11011f..45ea31d691 100644 --- a/resources/web/dialog/PluginsConfigDialog/index.js +++ b/resources/web/dialog/PluginsConfigDialog/index.js @@ -304,7 +304,7 @@ function ValidateConfigText() { SetConfigValidation(""); return true; } catch (err) { - SetConfigValidation(String(err?.message || "Invalid JSON")); + SetConfigValidation(String(err?.message || T("invalid_json", "Invalid JSON"))); return false; } } @@ -393,6 +393,8 @@ function OnCustomConfigMessage(event) { } document.addEventListener("DOMContentLoaded", () => { + TranslatePage(); + const sidebar = document.getElementById("configSidebar"); if (sidebar) sidebar.addEventListener("click", OnConfigSidebarClick); diff --git a/resources/web/dialog/PluginsDialog/index.html b/resources/web/dialog/PluginsDialog/index.html index 80afee36c4..ae4ffc8b9e 100644 --- a/resources/web/dialog/PluginsDialog/index.html +++ b/resources/web/dialog/PluginsDialog/index.html @@ -12,7 +12,7 @@ - + @@ -32,8 +32,10 @@ - + aria-pressed="false" title="Match case" data-i18n-title="match_case">Aa + aria-pressed="false" title="Match whole word" data-i18n-title="match_whole_word">ab -
@@ -69,15 +72,15 @@
- Activate + Activate Name + title="Sort by name" data-i18n-title="sort_by_name" data-i18n="name">Name Plugin Version + title="Sort by version" data-i18n-title="sort_by_version" data-i18n="plugin_version">Plugin Version Source + title="Sort by source" data-i18n-title="sort_by_source" data-i18n="source">Source Status + title="Sort by status" data-i18n-title="sort_by_status" data-i18n="status">Status
@@ -85,20 +88,21 @@ + aria-label="Resize the plugin list" title="Drag to resize; double-click to reset" + data-i18n-aria-label="resize_list" data-i18n-title="resize_hint">
-
+
+ aria-selected="true" aria-controls="pluginInfoPanel" data-tab="plugin-info" data-i18n="tab_info">Plugin Info + aria-selected="false" aria-controls="descriptionPanel" data-tab="description" data-i18n="description">Description + aria-selected="false" aria-controls="configPanel" data-tab="config" data-i18n="tab_config">Config + aria-selected="false" aria-controls="changelogPanel" data-tab="changelog" data-i18n="tab_changelog">Changelog + aria-selected="false" aria-controls="diagnosticsPanel" data-tab="diagnostics" data-i18n="tab_diagnostics">Diagnostics
@@ -110,31 +114,32 @@
-
Source
+
Source
-
-
Types
+
Types
-
-
Author
+
Author
-
-
Installed Version
+
Installed Version
-
-
Latest Version
+
Latest Version
- + aria-label="Update available" title="Update available" + data-i18n-aria-label="update_available" data-i18n-title="update_available"> + title="Update to the latest version" data-i18n-title="update_title" data-i18n="update">Update
@@ -143,26 +148,27 @@
@@ -182,22 +189,22 @@
diff --git a/resources/web/dialog/PluginsDialog/index.js b/resources/web/dialog/PluginsDialog/index.js index f02cc08855..2b8a8ba4f0 100644 --- a/resources/web/dialog/PluginsDialog/index.js +++ b/resources/web/dialog/PluginsDialog/index.js @@ -1,11 +1,11 @@ const pluginsById = new Map(); const pluginInstallActions = { "explore": { - label: "Install plugin", + label: T("install_plugin", "Install plugin"), command: "open_plugin_hub" }, "install-local": { - label: "Install local plugin", + label: T("install_local_plugin", "Install local plugin"), command: "install_local_plugin" } }; @@ -47,8 +47,7 @@ function OnInit() { exploreMenu = document.getElementById("exploreMenu"); exploreMenuButton = document.getElementById("explore_menu_btn"); - if (typeof TranslatePage === "function") - TranslatePage(); + TranslatePage(); document.getElementById("refresh_btn")?.addEventListener("click", () => SendMessage("refresh_plugins")); document.getElementById("explore_btn")?.addEventListener("click", () => { @@ -449,7 +448,7 @@ function RenderPlugins() { if (pluginsById.size === 0) { const empty = document.createElement("div"); empty.className = "empty-state"; - empty.textContent = "No plugins found"; + empty.textContent = T("no_plugins", "No plugins found"); pluginList.appendChild(empty); SyncPluginListHeaderGutter(); return; @@ -504,11 +503,9 @@ function RenderPlugins() { if (searching && shown === 0) { const empty = document.createElement("div"); empty.className = "empty-state"; - empty.appendChild(document.createTextNode('No plugins match "')); const term = document.createElement("b"); term.textContent = pluginSearch.query; - empty.appendChild(term); - empty.appendChild(document.createTextNode('"')); + AppendTemplate(empty, T("no_match", 'No plugins match "%s"'), term); pluginList.appendChild(empty); } @@ -599,13 +596,13 @@ function IsPluginLoading(plugin) { function SourceLabel(source) { switch (String(source || "").toLowerCase()) { case "mine": - return "Mine"; + return T("source_mine", "Mine"); case "subscribed": - return "Subscribed"; + return T("source_subscribed", "Subscribed"); case "orphaned": - return "Orphaned"; + return T("source_orphaned", "Orphaned"); default: - return "Local"; + return T("source_local", "Local"); } } @@ -641,7 +638,7 @@ function CheckCell(row, plugin) { checkbox.dataset.pluginKey = row.dataset.pluginKey; if (checkbox.indeterminate) { checkbox.setAttribute("aria-checked", "mixed"); - checkbox.setAttribute("aria-label", "Some plugin capabilities are enabled"); + checkbox.setAttribute("aria-label", T("mixed_capabilities", "Some plugin capabilities are enabled")); } const checkboxMark = document.createElement("span"); checkboxMark.className = "plugin-checkbox-mark"; @@ -664,9 +661,14 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges = const expandButton = document.createElement("button"); expandButton.type = "button"; expandButton.className = "plugin-expand-btn"; - expandButton.setAttribute("aria-label", `${isExpanded ? "Collapse" : "Expand"} ${pluginLabelText || "plugin"} capabilities`); + const labelName = pluginLabelText || "plugin"; + expandButton.setAttribute("aria-label", isExpanded + ? T("collapse_named", "Collapse %s capabilities", labelName) + : T("expand_named", "Expand %s capabilities", labelName)); expandButton.setAttribute("aria-expanded", isExpanded ? "true" : "false"); - expandButton.title = isExpanded ? "Collapse capabilities" : "Expand capabilities"; + expandButton.title = isExpanded + ? T("collapse", "Collapse capabilities") + : T("expand", "Expand capabilities"); const icon = document.createElement("span"); icon.className = "plugin-expand-icon"; expandButton.appendChild(icon); @@ -688,7 +690,7 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges = if (hasCloudLink) { labelElement.href = "#"; labelElement.classList.add("plugin-cloud-link"); - labelElement.title = "Open this plugin in your browser"; + labelElement.title = T("open_in_browser", "Open this plugin in your browser"); } nameWrap.appendChild(labelElement); @@ -696,7 +698,7 @@ function LabelCell(plugin, isExpanded = false, capabilityCount = 0, nameRanges = const countBadge = document.createElement("span"); countBadge.className = "plugin-capability-count"; countBadge.textContent = String(capabilityCount); - countBadge.title = `${capabilityCount} capabilities`; + countBadge.title = T("capability_count", "Capabilities: %s", capabilityCount); nameWrap.appendChild(countBadge); } labelCell.appendChild(nameWrap); @@ -722,7 +724,7 @@ function RenderCapabilityTree(plugin, capabilities, capRanges = null) { const tree = document.createElement("div"); tree.className = "capabilities-tree"; tree.setAttribute("role", "group"); - tree.setAttribute("aria-label", "Capabilities"); + tree.setAttribute("aria-label", T("capabilities", "Capabilities")); capabilities.forEach((capability, index) => { tree.appendChild(RenderCapabilityRow(plugin, capability, index === capabilities.length - 1, capRanges)); @@ -769,7 +771,7 @@ function RenderCapabilityRow(plugin, capability, isLast, capRanges = null) { const runButton = document.createElement("button"); runButton.type = "button"; runButton.className = "capability-run-btn script-run-btn"; - runButton.title = `Run "${capabilityName}"`; + runButton.title = T("run_named", 'Run "%s"', capabilityName); runButton.setAttribute("aria-label", runButton.title); const runIcon = document.createElement("span"); runIcon.className = "icon16 plugin-run-icon"; @@ -804,7 +806,7 @@ function CapabilityCheckCell(plugin, capability) { checkbox.dataset.capabilityToggle = "true"; checkbox.dataset.capabilityName = capabilityName; checkbox.dataset.capabilityType = capabilityType; - checkbox.setAttribute("aria-label", `Enable ${capabilityName || "capability"}`); + checkbox.setAttribute("aria-label", T("enable_named", "Enable %s", capabilityName)); const checkboxMark = document.createElement("span"); checkboxMark.className = "plugin-checkbox-mark"; checkboxLabel.appendChild(checkbox); @@ -826,7 +828,7 @@ function VersionCell(plugin) { const versionLabel = document.createElement("span"); versionLabel.className = "version-value"; - versionLabel.textContent = GetDisplayVersion(plugin) || "N/A"; + versionLabel.textContent = GetDisplayVersion(plugin) || T("not_available", "N/A"); cell.appendChild(versionLabel); const updateBadge = UpdateStatusBadge(plugin); @@ -845,11 +847,11 @@ function UpdateStatusBadge(plugin) { badge.className = "version-update-badge"; if (updateStatus === "unauthorized") { badge.classList.add("is-warning"); - badge.title = "Unauthorized for updates"; - badge.setAttribute("aria-label", "Unauthorized for updates"); + badge.title = T("unauthorized", "Unauthorized for updates"); + badge.setAttribute("aria-label", badge.title); } else { - badge.title = "Update available"; - badge.setAttribute("aria-label", "Update available"); + badge.title = T("update_available", "Update available"); + badge.setAttribute("aria-label", badge.title); } return badge; @@ -862,7 +864,7 @@ function StatusCell(plugin) { const statusLabel = document.createElement("span"); statusLabel.className = "status-label"; - statusLabel.textContent = GetStatus(plugin); + statusLabel.textContent = StatusLabel(plugin); cell.appendChild(statusLabel); return cell; @@ -875,7 +877,7 @@ function RenderDetails() { const detailStatusBody = document.getElementById("detailStatusBody"); SetText("detailInstalledVersion", - plugin ? (IsPluginInstalled(plugin) ? (GetInstalledVersion(plugin) || "-") : "Not installed") : "-"); + plugin ? (IsPluginInstalled(plugin) ? (GetInstalledVersion(plugin) || "-") : T("not_installed", "Not installed")) : "-"); SetText("detailLatestVersion", plugin ? (GetLatestVersion(plugin) || "-") : "-"); const detailSource = document.getElementById("detailSource"); if (detailSource) { @@ -933,12 +935,12 @@ function RenderConfig(plugin) { // Capabilities only exist once the plugin is activated: say that, rather than claiming it has // none to configure. empty.textContent = !plugin - ? "Select a plugin to configure its capabilities" + ? T("config_select_plugin", "Select a plugin to configure its capabilities") : (IsPluginLoading(plugin) - ? "Loading the plugin…" + ? T("config_loading", "Loading the plugin…") : (GetStatus(plugin) === "Activated" - ? "This plugin exposes no capabilities" - : "Activate this plugin to configure its capabilities")); + ? T("config_no_capabilities", "This plugin exposes no capabilities") + : T("config_activate", "Activate this plugin to configure its capabilities"))); empty.hidden = false; layout.hidden = true; sidebar.replaceChildren(); @@ -1121,7 +1123,7 @@ function ValidateConfigText() { SetConfigValidation(""); return true; } catch (err) { - SetConfigValidation(String(err?.message || "Invalid JSON")); + SetConfigValidation(String(err?.message || T("invalid_json", "Invalid JSON"))); return false; } } @@ -1237,21 +1239,19 @@ function RenderDescription(plugin) { const isCloud = plugin && (plugin.source === "mine" || plugin.source === "subscribed" || plugin.source === "orphaned"); if (isCloud && String(plugin?.sharing_token || "")) { - node.appendChild(document.createTextNode("View on OrcaCloud ")); const link = document.createElement("a"); link.href = "#"; link.className = "plugin-cloud-link"; - link.textContent = "here"; - link.title = "Open this plugin in your browser"; + link.title = T("open_in_browser", "Open this plugin in your browser"); link.addEventListener("click", (event) => { event.preventDefault(); sendOpenPluginOnCloud(String(plugin.plugin_key || "")); }); - node.appendChild(link); + AppendTemplate(node, T("view_on_cloud", "View on OrcaCloud here"), link); return; } - node.textContent = "No description available"; + node.textContent = T("no_description", "No description available"); } function RenderChangelog(plugin) { @@ -1305,8 +1305,8 @@ function ApplyDetailUpdateBadge(node, plugin) { if (updateStatus === "unauthorized") { node.hidden = false; node.classList.add("is-warning"); - node.title = "Unauthorized for updates"; - node.setAttribute("aria-label", "Unauthorized for updates"); + node.title = T("unauthorized", "Unauthorized for updates"); + node.setAttribute("aria-label", node.title); return; } @@ -1339,19 +1339,37 @@ function UpdateSelectedPlugin() { }); } +// The status arrives as an identifier, which also names the status-* CSS classes. +function StatusLabel(plugin) { + switch (GetStatus(plugin)) { + case "Activated": + return T("status_activated", "Activated"); + case "Loading": + return T("status_loading", "Loading"); + case "Error": + return T("status_error", "Error"); + case "RuntimeError": + return T("status_runtime_error", "Runtime error"); + case "Inactive": + return T("status_inactive", "Inactive"); + default: + return GetStatus(plugin); + } +} + function StatusDescription(plugin) { switch (GetStatus(plugin)) { case "Activated": - return "This plugin is active and ready to be used."; + return T("status_activated_desc", "This plugin is active and ready to be used."); case "Loading": - return "This plugin is still loading."; + return T("status_loading_desc", "This plugin is still loading."); case "Error": - return "This plugin is blocked until its error is fixed."; + return T("status_error_desc", "This plugin is blocked until its error is fixed."); case "RuntimeError": - return "This plugin is loaded but a capability reported an error."; + return T("status_runtime_error_desc", "This plugin is loaded but a capability reported an error."); case "Inactive": default: - return "This plugin is inactive. Activate it to install or load it."; + return T("status_inactive_desc", "This plugin is inactive. Activate it to install or load it."); } } @@ -1359,13 +1377,13 @@ function RenderDetailSummary(container, plugin) { container.replaceChildren(); if (!plugin) { - container.textContent = "Select a plugin to view its status and details."; + container.textContent = T("select_plugin", "Select a plugin to view its status and details."); return; } const statusChip = document.createElement("span"); statusChip.className = `detail-status-chip status-${GetStatus(plugin).toLowerCase()}`; - statusChip.textContent = GetStatus(plugin); + statusChip.textContent = StatusLabel(plugin); container.appendChild(statusChip); const message = document.createElement("div"); @@ -1377,7 +1395,7 @@ function RenderDetailSummary(container, plugin) { if (plugin.orphaned === true) { const warning = document.createElement("div"); warning.className = "detail-description detail-warning-text"; - warning.textContent = "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."; + warning.textContent = T("orphaned_note", "Orphaned: This plugin is no longer subscribed or available in OrcaCloud. The local copy remains installed and can still be used."); container.appendChild(warning); } @@ -1385,14 +1403,14 @@ function RenderDetailSummary(container, plugin) { if (updateStatus === "update_available") { const note = document.createElement("div"); note.className = "detail-description detail-note-text"; - note.textContent = "A newer plugin version is available."; + note.textContent = T("newer_version_note", "A newer plugin version is available."); container.appendChild(note); } if (updateStatus === "unauthorized") { const note = document.createElement("div"); note.className = "detail-description detail-note-text is-warning"; - note.textContent = "Cloud updates are unavailable because this plugin is unauthorized for updates."; + note.textContent = T("unauthorized_note", "Cloud updates are unavailable because this plugin is unauthorized for updates."); container.appendChild(note); } } diff --git a/resources/web/dialog/PresetBundleDialog/index.html b/resources/web/dialog/PresetBundleDialog/index.html index 561e1d86b2..645681147c 100644 --- a/resources/web/dialog/PresetBundleDialog/index.html +++ b/resources/web/dialog/PresetBundleDialog/index.html @@ -11,7 +11,7 @@ - + @@ -21,7 +21,7 @@
- +
- -
Close
+ +
Close
diff --git a/resources/web/dialog/PresetBundleDialog/index.js b/resources/web/dialog/PresetBundleDialog/index.js index 4ff3167d07..bee8227db2 100644 --- a/resources/web/dialog/PresetBundleDialog/index.js +++ b/resources/web/dialog/PresetBundleDialog/index.js @@ -3,8 +3,14 @@ const bundlesById = new Map(); // bundleId -> bundle object const printersByBundle = new Map(); // bundleId -> Map(index -> printerName) const filamentsByBundle = new Map(); // bundleId -> Map(index -> filamentName) const processesByBundle = new Map(); // bundleId -> Map(index -> presetName) -const UPDATE_TOOLTIP = "Update available"; -const UNAUTHORIZED_TOOLTIP = "Unauthorized bundle"; +const UPDATE_TOOLTIP = T("update_available", "Update available"); +const UNAUTHORIZED_TOOLTIP = T("unauthorized_bundle", "Unauthorized bundle"); +// Display names for the bundle types the native side sends (also kept raw in data-bundle-type). +const BUNDLE_TYPE_LABELS = { + Subscribed: T("type_subscribed", "Subscribed"), + Local: T("type_local", "Local"), + Default: T("type_default", "Default") +}; // ========= DOM ========= let topList = null; @@ -230,11 +236,11 @@ function renderTop() { : ``} ${ b.type === "Subscribed" ? - `${escapeHtml(b.name)}` + `${escapeHtml(b.name)}` : `${escapeHtml(b.name)}` }
- ${escapeHtml(b.type)} + ${escapeHtml(BundleTypeLabel(b.type))} ${escapeHtml(b.version)}
+ >${escapeHtml(T("update", "Update"))}
`).join(""); @@ -282,9 +288,9 @@ function renderBottomForBundle(bundleId) { // Convert to a flat list of rows { typeLabel, name } const rows = []; - for (const [, name] of printers) rows.push({ type: "Printer", name }); - for (const [, name] of filaments) rows.push({ type: "Filament", name }); - for (const [, name] of processes) rows.push({ type: "Process", name }); + for (const [, name] of printers) rows.push({ type: T("printer", "Printer"), name }); + for (const [, name] of filaments) rows.push({ type: T("filament", "Filament"), name }); + for (const [, name] of processes) rows.push({ type: T("process", "Process"), name }); bottomList.innerHTML = rows.map((r, idx) => `
@@ -351,6 +357,10 @@ function hideMenu() { contextRow = null; } // ========= Utilities ========= +function BundleTypeLabel(type) { + return BUNDLE_TYPE_LABELS[type] || type; +} + function safeJsonParse(s) { try { return JSON.parse(s); } catch { return null; } } diff --git a/resources/web/dialog/SpeedDial/speeddial.js b/resources/web/dialog/SpeedDial/speeddial.js index bb5c8a167b..6c2758db2f 100644 --- a/resources/web/dialog/SpeedDial/speeddial.js +++ b/resources/web/dialog/SpeedDial/speeddial.js @@ -9,6 +9,8 @@ // - action.input "percent"/"tab" -> NativeCommands catalog (phases handled in activateEntry) // - action.icon SVG base name -> AppAction::icon / resources/images/.svg // - action.desc/wiki -> AppAction::tooltip / help_url (footer detail strip) +// - action.*_en / tab.title_en -> ActionRegistry action_json / tab_options (English search aliases, +// sent only when they differ from the displayed text) // - payload.tooltip_expanded -> ActionRegistry::tooltip_expanded (persisted footer state) // - action list is frecency-sorted -> ActionRegistry::snapshot() @@ -97,45 +99,85 @@ var ghostEl = null, ghostTypedEl = null, ghostSuffixEl = null; var activeCompletion = null; // ---- pure helpers (no DOM; unit-tested) ------------------------------------- -// Pre-normalized haystacks, cached on the action object. The fold is length-preserving (1:1 per -// char) so the ranges FuzzyRangesNorm returns slice the ORIGINAL title/group/source text correctly. -// The action objects arrive from C++ and are stable for the dialog's lifetime, so we compute these once. -function titleNorm(a) { - if (a._tn === undefined) - a._tn = NormText(a.title, false); - return a._tn; +// Every searchable field of an action: its text, its ranking weight (title > group/category > +// source/aliases) and the matchIndex key its highlight ranges go to (null for a search-only field). +// - group vs source: the eyebrow (header) line shows group when present, else source. Settings keep +// an empty group so their source path is the eyebrow; commands / plates / recents carry a non-empty +// group. Splitting the two lets a match range stay aligned to whichever string the eyebrow renders. +// - full_label: search-only alias for the descriptive name when the title differs (e.g. "Reverse on +// even" vs "Overhang reversal"). Never rendered, so no highlight ranges. +// - plugin category / type: the visible "Plugins" category, plus the plugin kind as searchable +// metadata, so typing "plugin" finds runnable plugin actions even when neither their capability +// nor plugin name contains that word. Keep both category forms. +// - *_en: English counterparts of the translated fields, sent by C++ only when they differ from the +// displayed text (a non-English UI), so the page can still be searched in English. Each carries the +// weight of the localized field it mirrors, so a match ranks the same in either language. Search-only, +// except their ranges, which drive the row's English hint (see ENGLISH_HINT_FIELDS). +var SEARCH_FIELDS = [ + { text: function (a) { return a.title; }, weight: SCORE_TITLE, range: "title" }, + { text: function (a) { return a.group; }, weight: SCORE_GROUP, range: "group" }, + { text: function (a) { return a.source; }, weight: 0, range: "source" }, + { text: function (a) { return a.full_label; }, weight: 0, range: null }, + { text: function (a) { return a.kind === "plugin" ? T("sd_plugins", "Plugins") : ""; }, weight: SCORE_GROUP, range: "plugin" }, + { text: function (a) { return a.kind === "plugin" ? "plugin plugins" : ""; }, weight: SCORE_GROUP, range: null }, + { text: function (a) { return a.title_en; }, weight: SCORE_TITLE, range: "title_en" }, + { text: function (a) { return a.group_en; }, weight: SCORE_GROUP, range: "group_en" }, + { text: function (a) { return a.source_en; }, weight: 0, range: "source_en" }, + { text: function (a) { return a.full_label_en; }, weight: 0, range: "full_label_en" } +]; +var MATCH_RANGE_KEYS = SEARCH_FIELDS.map(function (f) { return f.range; }).filter(Boolean); + +// English aliases a row can match through. `range` names the matchIndex key matchFields fills for that +// field; the hint shows the action's English name (title_en), falling back to whichever alias matched. +var ENGLISH_HINT_FIELDS = [ + { range: "title_en", text: function (a) { return a.title_en; } }, + { range: "group_en", text: function (a) { return a.group_en; } }, + { range: "source_en", text: function (a) { return a.source_en; } }, + { range: "full_label_en", text: function (a) { return a.full_label_en; } } +]; + +// The English alias to show as a muted hint on an action row, or null. Only a row whose match came +// through an English alias gets one (a visible translated highlight, or a local-only alias, needs +// none). The hint is the action's English NAME - highlighted when the name itself matched, otherwise +// shown plain - so the row identifies the action instead of repeating its translated eyebrow: a +// "Process : Speed" breadcrumb match still names the setting ("Inner wall"), not the breadcrumb again. +function englishHint(a, mi, visibleMatch) { + if (!mi || visibleMatch) return null; + var matched = null; + for (var i = 0; i < ENGLISH_HINT_FIELDS.length; i++) { + if (mi[ENGLISH_HINT_FIELDS[i].range]) { matched = ENGLISH_HINT_FIELDS[i]; break; } + } + if (!matched) return null; + if (a.title_en) return { text: a.title_en, ranges: mi.title_en || null }; + var text = matched.text(a); + return text ? { text: text, ranges: mi[matched.range] } : null; } -// The eyebrow (header) line shows group when present, else source. Settings keep an empty group so -// their source path is the eyebrow; commands / plates / recents carry a non-empty group. Splitting the -// two lets a match range stay aligned to whichever string the eyebrow actually renders. -function groupNorm(a) { - if (a._gn === undefined) - a._gn = NormText(a.group || "", false); - return a._gn; + +// The English breadcrumb a row matched through (a command's group, a setting's source path), with its +// highlight ranges, or null when neither matched. Shown beside the translated eyebrow so an English +// hit is visible where it landed, alongside the English name hint on the row-name line. +function englishBreadcrumb(a, mi) { + if (!mi) return null; + if (mi.group_en && a.group_en) return { text: a.group_en, ranges: mi.group_en }; + if (mi.source_en && a.source_en) return { text: a.source_en, ranges: mi.source_en }; + return null; } -function sourceNorm(a) { - if (a._sn === undefined) - a._sn = NormText(a.source || "", false); - return a._sn; -} -function pluginCategoryNorm(a) { - if (a._pcn === undefined) - a._pcn = a.kind === "plugin" ? NormText(T("sd_plugins", "Plugins"), false) : ""; - return a._pcn; -} -// Plugin type is searchable metadata, so typing "plugin" can find runnable plugin actions even -// when neither their capability nor plugin name contains that word. Keep both category forms. -function pluginTypeNorm(a) { - if (a._pn === undefined) - a._pn = a.kind === "plugin" ? NormText("plugin plugins", false) : ""; - return a._pn; -} -// Search-only alias for the descriptive name when the title differs (e.g. "Reverse on even" vs -// "Overhang reversal"). Never rendered, so no highlight ranges. -function fullNorm(a) { - if (a._fn === undefined) - a._fn = NormText(a.full_label || "", false); - return a._fn; + +// The action's non-empty SEARCH_FIELDS as pre-normalized haystacks ({norm, weight, range}), cached on +// the action object. The action objects arrive from C++ and are stable for the dialog's lifetime, so +// this runs once per action; skipping empty fields keeps the per-keystroke scan to the text an action +// actually has (an English UI pays nothing for the aliases it never receives). The fold is +// length-preserving (1:1 per char) so the ranges FuzzyRangesNorm returns slice the ORIGINAL text. +function searchFields(a) { + if (a._sf === undefined) { + a._sf = []; + for (var i = 0; i < SEARCH_FIELDS.length; i++) { + var norm = NormText(SEARCH_FIELDS[i].text(a) || "", false); + if (norm) + a._sf.push({ norm: norm, weight: SEARCH_FIELDS[i].weight, range: SEARCH_FIELDS[i].range }); + } + } + return a._sf; } // Match one pre-normalized field vs one pre-normalized needle. Returns {score, ranges, contiguous} @@ -175,26 +217,22 @@ function tokenWordRe(token) { return new RegExp("\\b" + EscapeRegExp(token) + "\\b"); } -// One token's best match across an action's searchable fields, keeping per-field ranges for -// highlighting. Returns {score, title, group, source}, or null if no field matches. -function tokenMatch(a, token, wwRe) { - var t = fieldMatchScore(titleNorm(a), token, wwRe); - var g = fieldMatchScore(groupNorm(a), token, wwRe); - var s = fieldMatchScore(sourceNorm(a), token, wwRe); - var f = fieldMatchScore(fullNorm(a), token, wwRe); - var p = fieldMatchScore(pluginCategoryNorm(a), token, wwRe); - var typeMatch = fieldMatchScore(pluginTypeNorm(a), token, wwRe); - if (!t && !g && !s && !f && !p && !typeMatch) return null; - var score = Math.max( - t ? (t.contiguous ? SCORE_CONTIGUOUS : 0) + SCORE_TITLE + t.score : -Infinity, - g ? (g.contiguous ? SCORE_CONTIGUOUS : 0) + SCORE_GROUP + g.score : -Infinity, - s ? (s.contiguous ? SCORE_CONTIGUOUS : 0) + s.score : -Infinity, - f ? (f.contiguous ? SCORE_CONTIGUOUS : 0) + f.score : -Infinity, - p ? (p.contiguous ? SCORE_CONTIGUOUS : 0) + SCORE_GROUP + p.score : -Infinity, - typeMatch ? (typeMatch.contiguous ? SCORE_CONTIGUOUS : 0) + SCORE_GROUP + typeMatch.score : -Infinity - ); - return { score: score, title: t ? t.ranges : null, group: g ? g.ranges : null, source: s ? s.ranges : null, - plugin: p ? p.ranges : null }; +// One needle (the whole query, or one token of it) against every SEARCH_FIELDS field of an action. +// Returns {score, ranges}: the best weighted field score (contiguous > fuzzy, then field weight, then +// start/gaps) and the ranges of each matching highlighted field keyed by its range name. Null when no +// field matches. +function matchFields(a, needle, wwRe) { + var fields = searchFields(a); + var best = null, ranges = null; // allocated on the first match: most actions match nothing + for (var i = 0; i < fields.length; i++) { + var field = fields[i]; + var m = fieldMatchScore(field.norm, needle, wwRe); + if (!m) continue; + var v = (m.contiguous ? SCORE_CONTIGUOUS : 0) + field.weight + m.score; + if (best === null || v > best) best = v; + if (field.range) (ranges || (ranges = {}))[field.range] = m.ranges; + } + return best === null ? null : { score: best, ranges: ranges || {} }; } // Merge per-field token ranges into sorted, coalesced ranges for highlighting. Overlapping or adjacent @@ -217,24 +255,6 @@ function mergeRanges(ranges) { return out; } -// Combine per-field scores into one value, or null when nothing matched. -// Ranking: contiguous > fuzzy, then title > group/category > source/full alias, then start/gaps. -function scoreFields(t, g, s, f, p, typeMatch) { - var best = null; - function consider(m, weight) { - if (!m) return; - var v = (m.contiguous ? SCORE_CONTIGUOUS : 0) + weight + m.score; - best = best === null ? v : Math.max(best, v); - } - consider(t, SCORE_TITLE); - consider(g, SCORE_GROUP); - consider(s, 0); - consider(f, 0); - consider(p, SCORE_GROUP); - consider(typeMatch, SCORE_GROUP); - return best; -} - // The unified main-phase search: every action (command/plugin/setting) matching the query, ranked // by relevance (not by action type). Sets matchIndex so rows highlight their match ranges. The query // is normalized ONCE per pass - FuzzyRangesNorm then runs against each action's pre-normalized @@ -245,8 +265,8 @@ function scoreFields(t, g, s, f, p, typeMatch) { // - tokens: every whitespace-separated word must match SOME field, but different words may match // different fields. This is what lets "speed acceleration inner" find "Inner wall" whose path is // "Process : Speed : Acceleration" (title + source breadcrumb together). -// full_label and canonical plugin kind are searchable aliases. The visible category is also searchable -// so its own match can be highlighted in plugin rows. +// full_label, canonical plugin kind and the English counterparts (*_en) are searchable aliases. The +// visible category is also searchable so its own match can be highlighted in plugin rows. // A phrase match always outranks a distributed token match. function searchActions(actions, query) { var q = (query || "").trim(); @@ -262,50 +282,43 @@ function searchActions(actions, query) { // Compiled once per pass, reused over every field: non-global so no exec()/lastIndex state leaks // between fields, and EscapeRegExp keeps regex metachars in the query literal. var wwRe = new RegExp("\\b" + EscapeRegExp(searchNeedle) + "\\b"); + // A one-word query's only token is the needle itself, so its token pass would repeat the failed + // phrase match exactly; such an action is dropped without it. + var tokenPass = searchTokens.length !== 1 || searchTokens[0] !== searchNeedle; var scored = []; var seen = {}; for (var i = 0; i < list.length; i++) { var a = list[i]; - var t = fieldMatchScore(titleNorm(a), searchNeedle, wwRe); - var g = fieldMatchScore(groupNorm(a), searchNeedle, wwRe); - var s = fieldMatchScore(sourceNorm(a), searchNeedle, wwRe); - var f = fieldMatchScore(fullNorm(a), searchNeedle, wwRe); - var p = fieldMatchScore(pluginCategoryNorm(a), searchNeedle, wwRe); - var typeMatch = fieldMatchScore(pluginTypeNorm(a), searchNeedle, wwRe); - var phrase = scoreFields(t, g, s, f, p, typeMatch); - var score, ranges; - if (phrase !== null) { - score = phrase + SCORE_PHRASE; - ranges = { title: t ? t.ranges : null, group: g ? g.ranges : null, source: s ? s.ranges : null, - plugin: p ? p.ranges : null }; + var phrase = matchFields(a, searchNeedle, wwRe); + var score, perField; + if (phrase) { + score = phrase.score + SCORE_PHRASE; } else { + if (!tokenPass) continue; // Require every token; a token that matches nothing drops the action immediately. Ranges // from all matching tokens are merged per field so each matched word highlights. - var sum = 0, titleR = null, groupR = null, sourceR = null, pluginR = null, all = true; + var sum = 0, all = true; + perField = {}; for (var tokenIndex = 0; tokenIndex < searchTokens.length; tokenIndex++) { - var m = tokenMatch(a, searchTokens[tokenIndex], searchTokenRes[tokenIndex]); + var m = matchFields(a, searchTokens[tokenIndex], searchTokenRes[tokenIndex]); if (!m) { all = false; break; } sum += m.score; - if (m.title) (titleR || (titleR = [])).push(m.title); - if (m.group) (groupR || (groupR = [])).push(m.group); - if (m.source) (sourceR || (sourceR = [])).push(m.source); - if (m.plugin) (pluginR || (pluginR = [])).push(m.plugin); + for (var key in m.ranges) + (perField[key] || (perField[key] = [])).push(m.ranges[key]); } if (!all) continue; score = sum; - ranges = { title: mergeRanges(titleR), group: mergeRanges(groupR), source: mergeRanges(sourceR), - plugin: mergeRanges(pluginR) }; } - // Ranges are per-field against the ACTUAL text drawn: title for the row-name, and group (or - // source when group is empty) for the eyebrow - so highlight offsets stay aligned to the label. - matchIndex[a.id] = { - title: ranges.title, - group: ranges.group, - source: ranges.source, - plugin: ranges.plugin, - useEyebrowGroup: !!(a.group) - }; + // Ranges are per-field against the ACTUAL text drawn: title for the row-name, group (or source + // when group is empty) for the eyebrow, and title_en for the English hint - so highlight offsets + // stay aligned to the label. + var entry = { useEyebrowGroup: !!(a.group) }; + for (var k = 0; k < MATCH_RANGE_KEYS.length; k++) { + var rangeKey = MATCH_RANGE_KEYS[k]; + entry[rangeKey] = phrase ? phrase.ranges[rangeKey] || null : mergeRanges(perField[rangeKey]); + } + matchIndex[a.id] = entry; scored.push({ a: a, s: score }); seen[a.id] = true; } @@ -350,7 +363,8 @@ function completionFor(query, list) { var top = (list || []).slice(0, 10); for (var i = 0; i < top.length; i++) { var a = top[i]; - var fields = [a.title, a.group, a.source, a.full_label]; + // English aliases after the displayed text, so English typing completes in a localized UI. + var fields = [a.title, a.group, a.source, a.full_label, a.title_en, a.group_en, a.source_en, a.full_label_en]; for (var f = 0; f < fields.length; f++) { var words = completionWords(fields[f]); for (var w = 0; w < words.length; w++) { @@ -427,16 +441,30 @@ function tabTitle(t) { return title || prettySource((t && t.id) || ""); } -// Filter the tab list by a fuzzy title/id match. Pure so the node-vm test can exercise it. +// Filter the tab list by a fuzzy title/id/English-title match (title_en is sent only when the page +// label is translated). Pure so the node-vm test can exercise it. function filterTabs(tabs, query) { var q = (query || "").trim(); if (!q) return (tabs || []).slice(0); return (tabs || []).filter(function (t) { - return FuzzyRanges(tabTitle(t), q, false) || FuzzyRanges(t.id, q, false); + return FuzzyRanges(tabTitle(t), q, false) || FuzzyRanges(t.id, q, false) || + (t.title_en && FuzzyRanges(t.title_en, q, false)); }); } +// The English title of a tab matched only through it, with its highlight ranges, or null when the tab +// matched its translated title or id (so it already shows why) or has no English title. +function tabAliasHint(t, query) { + var q = (query || "").trim(); + if (!q || !t || !t.title_en) + return null; + if (FuzzyRanges(tabTitle(t), q, false) || FuzzyRanges(t.id, q, false)) + return null; + var ranges = FuzzyRanges(t.title_en, q, false); + return ranges ? { text: t.title_en, ranges: ranges } : null; +} + function shouldRenderActionList(query) { return !!((query || "").trim()); } @@ -971,8 +999,21 @@ function renderActionRow(a, i) { var showPluginCategory = a.kind === "plugin" && (typedQuery || isRecent); var eyebrow = actionEyebrow(a, query, isRecent); var eyebrowMatch = mi ? (showPluginCategory ? mi.plugin : (mi.useEyebrowGroup ? mi.group : mi.source)) : null; - shell.left.insertBefore(markedText("row-eyebrow", eyebrow, eyebrowMatch), shell.line); + // The eyebrow line: the translated breadcrumb, and beside it the English breadcrumb when the query + // matched that (non-English UI), so an English hit on a breadcrumb is visible where it landed. + var eyebrowLine = document.createElement("div"); + eyebrowLine.className = "row-eyebrow-line"; + eyebrowLine.appendChild(markedText("row-eyebrow", eyebrow, eyebrowMatch)); + var enBreadcrumb = englishBreadcrumb(a, mi); + if (enBreadcrumb) + eyebrowLine.appendChild(markedText("row-eyebrow-en", enBreadcrumb.text, enBreadcrumb.ranges)); + shell.left.insertBefore(eyebrowLine, shell.line); shell.line.appendChild(markedText("row-name", a.title, mi ? mi.title : null)); + // A row found only through an English alias shows the action's English name, highlighted when the + // name itself matched, so the match makes sense even when the translated row resembles nothing. + var hint = englishHint(a, mi, mi ? (mi.title || eyebrowMatch) : null); + if (hint) + shell.line.appendChild(markedText("row-alias", hint.text, hint.ranges)); var badge = modeBadge(a, USER_MODE); if (badge) { var tag = document.createElement("span"); @@ -1150,6 +1191,11 @@ function renderTabRow(t, i) { name.className = "row-name"; name.textContent = label; shell.line.appendChild(name); + // A tab found only through its English title shows that title, highlighted, so the match is + // explained even when the translated label looks nothing like the query. + var hint = tabAliasHint(t, query); + if (hint) + shell.line.appendChild(markedText("row-alias", hint.text, hint.ranges)); shell.row.onclick = function () { sel = { zone: "list", i: i }; render({ resize: true }); }; shell.row.ondblclick = function () { sel = { zone: "list", i: i }; jumpToTab(t); }; return shell.row; @@ -1421,8 +1467,8 @@ function focusInput() { setTimeout(function () { if (qEl) qEl.focus(); }, 0); } function OnInit() { qEl = $("q"); listEl = $("list"); favEl = $("favBar"); clearEl = $("clear"); eyeEl = $("favEyebrow"); countEl = $("count"); detailEl = $("detail"); ghostEl = $("ghost"); ghostTypedEl = $("ghostTyped"); ghostSuffixEl = $("ghostSuffix"); - // text.js's TranslatePage() targets jQuery `.trans` nodes; this page has none and defines its own - // `$`, so don't call it. Runtime strings go through T() instead. + // This page has no data-i18n markup and defines its own `$` and T(), so it does not load + // include/i18n.js. Its strings all go through T(). qEl.placeholder = T("sd_search", "Search actions"); qEl.setAttribute("aria-label", T("sd_search", "Search actions")); if (clearEl) { diff --git a/resources/web/dialog/SpeedDial/speeddial.test.js b/resources/web/dialog/SpeedDial/speeddial.test.js index 1fda833801..357288d88b 100644 --- a/resources/web/dialog/SpeedDial/speeddial.test.js +++ b/resources/web/dialog/SpeedDial/speeddial.test.js @@ -50,6 +50,25 @@ assert.equal(ctx.filterTabs(tabOptions, "Device").length, 1, "a typed query matches a tab title"); assert.deepEqual(ctx.filterTabs(tabOptions, "zzz"), [], "a typed query with no match returns an empty list"); +// A translated tab whose id is not its English name carries title_en, so English still finds it. +const localizedTabs = [ + { id: "monitor", title: "设备", title_en: "Device" }, + { id: "prepare", title: "准备" } +]; +assert.deepEqual(ctx.filterTabs(localizedTabs, "device").map(function (t) { return t.id; }), ["monitor"], + "a localized tab matches its English title"); +assert.deepEqual(ctx.filterTabs(localizedTabs, "设备").map(function (t) { return t.id; }), ["monitor"], + "a localized tab still matches its translated title"); +// A tab found only through its English title shows it as a hint; one that matched its translated +// title or id already shows why, and one without an English title has nothing to show. +assert.deepEqual(ctx.tabAliasHint(localizedTabs[0], "device"), { text: "Device", ranges: [[0, 6]] }, + "an English-only tab match yields the English title and its highlight ranges"); +assert.equal(ctx.tabAliasHint(localizedTabs[0], "设备"), null, + "a translated-title tab match draws no English hint"); +assert.equal(ctx.tabAliasHint(localizedTabs[0], "monitor"), null, + "a tab matched by its id draws no English hint"); +assert.equal(ctx.tabAliasHint(localizedTabs[1], "Device"), null, + "a tab with no English title has no hint"); // tabTitle: pages added with an empty title (e.g. MainFrame's Home tab) fall back to the id. assert.equal(ctx.tabTitle({ id: "home", title: "" }), "Home", @@ -192,6 +211,89 @@ assert.equal(ctx.completionFor("", compPool), null, "an empty query has no compl assert.equal(ctx.completionFor("zzz", ctx.searchActions(compPool, "zzz")), null, "a query with no match has no completion"); +// English aliases: in a non-English UI each translated field may carry its English counterpart +// (*_en), searched with the weight of the field it mirrors. An English UI sends none. +const zhPool = [ + { id: "rev", title: "反转偶数层悬垂方向", full_label: "悬垂反转", source: "工艺 : 质量 : 悬垂", + title_en: "Reverse on even", full_label_en: "Overhang reversal", source_en: "Process : Quality : Overhangs", + group: "", input: "" }, + { id: "slice", title: "切片并预览", source: "OrcaSlicer", group: "切片和导出", + title_en: "Slice and Preview", group_en: "Slice & Export", input: "" }, + { id: "brim", title: "Brim宽度", source: "工艺 : 其他 : Brim", source_en: "Process : Others : Brim", + group: "", input: "" } +]; +assert.deepEqual(ctx.searchActions(zhPool, "reverse on even").map(function (a) { return a.id; }), ["rev"], + "an English query finds a translated setting through its English title"); +assert.equal(ctx.matchIndex.rev.title, null, "an English-only match does not highlight the translated title"); +assert.deepEqual(ctx.matchIndex.rev.title_en, [[0, 15]], "the English title keeps its ranges for the hint"); +assert.deepEqual(ctx.searchActions(zhPool, "偶数层").map(function (a) { return a.id; }), ["rev"], + "the translated title is still searchable"); +assert.equal(ctx.matchIndex.rev.title_en, null, "a translated-title match leaves no English hint ranges"); +assert.deepEqual(ctx.searchActions(zhPool, "reverse 悬垂").map(function (a) { return a.id; }), ["rev"], + "a mixed query may match one token in English and another in the translation"); +assert.deepEqual(ctx.searchActions(zhPool, "overhang reversal").map(function (a) { return a.id; }), ["rev"], + "the English full_label alias is searchable"); +assert.deepEqual(ctx.searchActions(zhPool, "export").map(function (a) { return a.id; }), ["slice"], + "the English group alias is searchable"); +assert.deepEqual(ctx.searchActions(zhPool, "brim").map(function (a) { return a.id; }), ["brim"], + "a translation that keeps the English word matches the displayed title"); +assert.deepEqual(ctx.matchIndex.brim.title, [[0, 4]], "that match highlights the displayed title, so no hint is drawn"); +// Weights mirror the localized fields: an English title match outranks an English breadcrumb match. +const zhRankPool = [ + { id: "src", title: "内壁", source: "工艺 : 速度", source_en: "Process : Speed", group: "", input: "" }, + { id: "ttl", title: "速度", source: "工艺 : 其他", title_en: "Speed", group: "", input: "" } +]; +assert.deepEqual(ctx.searchActions(zhRankPool, "speed").map(function (a) { return a.id; }), ["ttl", "src"], + "an English title match outranks an English breadcrumb match, as their localized fields do"); +// Absent aliases (an English UI) leave no English hint; every pool above has none and ranks as before. +ctx.searchActions(pool, "layer"); +assert.equal(ctx.matchIndex.c1.title_en, null, "an action without English aliases has no English hint ranges"); +assert.equal(ctx.completionFor("reverse o", ctx.searchActions(zhPool, "reverse o")).suffix, "n", + "completion extends an English word from title_en"); +assert.equal(ctx.completionFor("quality overh", ctx.searchActions(zhPool, "quality overh")).suffix, "angs", + "completion also reaches the English breadcrumb"); +// A row matched only through an English group/source/full_label alias still names the action in +// English: the hint is title_en (the English name), not the alias that matched, so a breadcrumb hit +// does not just repeat the translated eyebrow. +ctx.searchActions(zhPool, "export"); +assert.deepEqual(ctx.matchIndex.slice.group_en, [[8, 14]], "the English group keeps its ranges"); +assert.deepEqual(ctx.englishHint(zhPool[1], ctx.matchIndex.slice, null), { text: "Slice and Preview", ranges: null }, + "an English group match names the action, unhighlighted"); +assert.deepEqual(ctx.englishBreadcrumb(zhPool[1], ctx.matchIndex.slice), { text: "Slice & Export", ranges: [[8, 14]] }, + "an English group match shows the English breadcrumb beside the eyebrow"); +ctx.searchActions(zhPool, "overhang reversal"); +assert.deepEqual(ctx.matchIndex.rev.full_label_en, [[0, 17]], "the English full_label keeps its ranges"); +assert.deepEqual(ctx.englishHint(zhPool[0], ctx.matchIndex.rev, null), { text: "Reverse on even", ranges: null }, + "an English full_label match names the action, unhighlighted"); +ctx.searchActions(zhPool, "quality"); +assert.deepEqual(ctx.matchIndex.rev.source_en, [[10, 17]], "the English breadcrumb keeps its ranges"); +assert.deepEqual(ctx.englishHint(zhPool[0], ctx.matchIndex.rev, null), { text: "Reverse on even", ranges: null }, + "an English breadcrumb match names the action, not the breadcrumb"); +assert.deepEqual(ctx.englishBreadcrumb(zhPool[0], ctx.matchIndex.rev), { text: "Process : Quality : Overhangs", ranges: [[10, 17]] }, + "an English breadcrumb match shows the English breadcrumb beside the eyebrow"); +// The name itself matching is the one case that highlights the hint. +ctx.searchActions(zhPool, "reverse on even"); +assert.deepEqual(ctx.englishHint(zhPool[0], ctx.matchIndex.rev, null), { text: "Reverse on even", ranges: [[0, 15]] }, + "an English title match names and highlights the action"); +assert.equal(ctx.englishBreadcrumb(zhPool[0], ctx.matchIndex.rev), null, + "an English title match shows no breadcrumb hint"); +// A breadcrumb match with no English name falls back to the matched alias. +assert.deepEqual(ctx.englishHint({ title_en: "", source_en: "Process : Speed" }, { source_en: [[10, 15]] }, null), + { text: "Process : Speed", ranges: [[10, 15]] }, "without an English name the matched alias is shown"); +// A visible translated highlight suppresses the hint even when an English alias also matched. +ctx.searchActions(zhPool, "brim"); +assert.equal(ctx.englishHint(zhPool[2], ctx.matchIndex.brim, ctx.matchIndex.brim.title), null, + "a row that highlights its translated title draws no English hint"); +// The reported case: "process speed" matches only the English breadcrumb of "Inner wall", so the hint +// names the setting rather than echoing the breadcrumb. +const zhInner = [{ id: "inner", title: "内壁", title_en: "Inner wall", source: "工艺 : 速度", + source_en: "Process : Speed", group: "", input: "" }]; +ctx.searchActions(zhInner, "process speed"); +assert.deepEqual(ctx.englishHint(zhInner[0], ctx.matchIndex.inner, null), { text: "Inner wall", ranges: null }, + "a breadcrumb-only match names the setting in English"); +assert.deepEqual(ctx.englishBreadcrumb(zhInner[0], ctx.matchIndex.inner), { text: "Process : Speed", ranges: [[0, 8], [10, 15]] }, + "a breadcrumb-only match shows the English breadcrumb beside the eyebrow"); + // actionCategory: a command/dynamic action's group is its category; a setting uses the top-level // source segment; every plugin shares one header; a category-less action falls back to "Other". assert.equal(ctx.actionCategory({ id: "c", group: "Help", source: "OrcaSlicer", kind: "command" }), "Help", @@ -456,9 +558,9 @@ assert.equal(ctx.stateFromPayload({}).tooltipExpanded, true, "expansion defaults assert.equal(ctx.stateFromPayload({ tooltip_expanded: false }).tooltipExpanded, false, "a collapsed payload is honored"); assert.equal(ctx.stateFromPayload({ tooltip_expanded: true }).tooltipExpanded, true, "an expanded payload is honored"); -// resultCountText: a search counts the shown matches only ("Showing N actions"); the total is used +// resultCountText: a search counts the shown matches only ("Matching actions: N"); the total is used // solely for the empty-query count. -assert.equal(ctx.resultCountText(100, 3, "lay"), "Showing 3 actions", "a search reports the shown match count only"); -assert.equal(ctx.resultCountText(100, 100, ""), "100 actions", "an empty query reports the total"); +assert.equal(ctx.resultCountText(100, 3, "lay"), "Matching actions: 3", "a search reports the shown match count only"); +assert.equal(ctx.resultCountText(100, 100, ""), "Actions: 100", "an empty query reports the total"); console.log("ok"); diff --git a/resources/web/dialog/SpeedDial/style.css b/resources/web/dialog/SpeedDial/style.css index 3aaeddb460..a0e2015373 100644 --- a/resources/web/dialog/SpeedDial/style.css +++ b/resources/web/dialog/SpeedDial/style.css @@ -390,7 +390,31 @@ body { flex-direction: column; } +/* Eyebrow line: the translated breadcrumb, plus the English breadcrumb beside it when it matched. */ +.row-eyebrow-line { + display: flex; + align-items: baseline; + gap: 6px; + min-width: 0; + overflow: hidden; +} + .row-eyebrow { + font-size: 10px; + line-height: 1.3; + color: var(--muted, var(--orca-muted, #6b7280)); + opacity: .85; + flex: 0 1 auto; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* English breadcrumb of a row found only through it (non-English UI); gives way to the translation. */ +.row-eyebrow-en { + flex: 0 100 auto; + min-width: 0; font-size: 10px; line-height: 1.3; color: var(--muted, var(--orca-muted, #6b7280)); @@ -414,8 +438,21 @@ body { white-space: nowrap; } +/* English title of a row found only through it (non-English UI); gives way to the title first. */ +.row-alias { + flex: 0 100 auto; + min-width: 0; + font-size: 11px; + color: var(--muted, var(--orca-muted, #6b7280)); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + .row-name mark, -.row-eyebrow mark { +.row-eyebrow mark, +.row-eyebrow-en mark, +.row-alias mark { background: var(--plugin-status-warn-bg); color: var(--plugin-status-warn); border-radius: 2px; diff --git a/resources/web/dialog/TerminalDialog/index.html b/resources/web/dialog/TerminalDialog/index.html index 21fb3aa81b..598a36e89d 100644 --- a/resources/web/dialog/TerminalDialog/index.html +++ b/resources/web/dialog/TerminalDialog/index.html @@ -11,7 +11,7 @@ - + @@ -21,8 +21,8 @@
- - + +
diff --git a/resources/web/dialog/TerminalDialog/index.js b/resources/web/dialog/TerminalDialog/index.js index c4e09bcb64..f5e6abb5ef 100644 --- a/resources/web/dialog/TerminalDialog/index.js +++ b/resources/web/dialog/TerminalDialog/index.js @@ -36,8 +36,7 @@ function WatchXtermTheme() { } function OnInit() { - if (typeof TranslatePage === "function") - TranslatePage(); + TranslatePage(); term = new Terminal({ cursorBlink: true, @@ -77,7 +76,7 @@ function OnInit() { onRun(); }); - term.writeln("Plugin terminal ready."); + term.writeln(T("ready", "Plugin terminal ready.")); } function onRun() { @@ -122,7 +121,7 @@ function HandleStudio(value) { case "process_done": setRunning(false); - term.writeln("\x1b[90mProcess exited with code: " + payload.exit_code + "\x1b[0m"); + term.writeln("\x1b[90m" + T("exit_code", "Process exited with code: %s", payload.exit_code) + "\x1b[0m"); break; case "process_error": diff --git a/resources/web/guide/0/index.html b/resources/web/guide/0/index.html index e759899f73..c379078db5 100644 --- a/resources/web/guide/0/index.html +++ b/resources/web/guide/0/index.html @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@
-
Loading……
+
Loading…
\ No newline at end of file diff --git a/resources/web/guide/1/index.html b/resources/web/guide/1/index.html index 41e7dac7b9..521193706c 100644 --- a/resources/web/guide/1/index.html +++ b/resources/web/guide/1/index.html @@ -9,7 +9,7 @@ - + @@ -17,10 +17,10 @@
-
Welcome to Orca Slicer
-
Orca Slicer will be setup in several steps. Let's start!
+
Welcome to Orca Slicer
+
Orca Slicer will be set up in several steps. Let's start!
diff --git a/resources/web/guide/11/index.html b/resources/web/guide/11/index.html index 19aeae0949..db39174fe3 100644 --- a/resources/web/guide/11/index.html +++ b/resources/web/guide/11/index.html @@ -10,23 +10,23 @@ - +
-
Please select your login region
+
Please select your login region
-
Asia-Pacific
-
China
-
Europe
-
North America
-
Others
+
Asia-Pacific
+
China
+
Europe
+
North America
+
Others
-
Next
+
Next
diff --git a/resources/web/guide/21/common.js b/resources/web/guide/21/common.js index d0cc510540..5f96ebc573 100644 --- a/resources/web/guide/21/common.js +++ b/resources/web/guide/21/common.js @@ -50,17 +50,17 @@ function HandleStudio( pVal ) let hasError = pVal.hasOwnProperty("error"); noticeBar.classList.toggle("notice-error", hasError); if (hasError) { - noticeBar.textContent = "Error"; + noticeBar.textContent = T("error", "Error"); noticeText.textContent = pVal["error"]; } else if (pVal["vendors"] && pVal["vendors"].length > 0) { - noticeBar.textContent = "New printers found"; - noticeText.textContent = "New printer vendors installed: " + pVal["vendors"].join(", "); + noticeBar.textContent = T("new_printers_found", "New printers found"); + noticeText.textContent = T("new_vendors_installed", "New printer vendors installed: %s", pVal["vendors"].join(", ")); } else if (pVal["declined"]) { - noticeBar.textContent = "Information"; - noticeText.textContent = "New printer vendors were found, but installation was cancelled."; + noticeBar.textContent = T("information", "Information"); + noticeText.textContent = T("vendors_declined", "New printer vendors were found, but installation was cancelled."); } else { - noticeBar.textContent = "Information"; - noticeText.textContent = "No new printers found."; + noticeBar.textContent = T("information", "Information"); + noticeText.textContent = T("no_new_printers", "No new printers found."); } ShowNotice(1); @@ -272,7 +272,7 @@ function CreateVendorBlock(vendorName) if( alt == "BBL" ) alt = "Bambu Lab"; if( alt == "Custom") - alt = "Custom Printer"; + alt = T("custom_printer", "Custom Printer"); if( alt == "Other") alt = "Orca colosseum"; @@ -315,7 +315,7 @@ function CreatePrinterBlock(OneModel) '
'+ '
?
'+ '
'+ - '
Nozzle
'+ + '
' + T("nozzle", "Nozzle") + '
'+ '
' + OneModel['nozzle_diameter'].replaceAll(";", " · ") + '
'+ '
'+ '
'+ @@ -377,7 +377,8 @@ function OnExit() if( nTotal==0 ) { let noticeBar = document.getElementById("NoticeBar"); noticeBar.classList.add("notice-error"); - noticeBar.textContent = "Error"; + noticeBar.textContent = T("error", "Error"); + document.getElementById("NoticeText").textContent = T("printer_required", "At least one printer must be selected."); ShowNotice(1); return 0; } diff --git a/resources/web/guide/21/index.html b/resources/web/guide/21/index.html index 7a32a2d103..7a92c15ab4 100644 --- a/resources/web/guide/21/index.html +++ b/resources/web/guide/21/index.html @@ -12,7 +12,7 @@ - + @@ -20,12 +20,12 @@
-
Printer Selection
+
Printer Selection
@@ -75,48 +75,48 @@
- Filter items + Filter items
- Select filtered - Select visible -
all
-
Clear all
+ Select filtered + Select visible +
All
+
Clear all
-
No items
+
No items
-
Back
-
finish
-
Next
+
Back
+
Finish
+
Next
-
error
+
Error
-
At least one filament must be selected.
-
Do you want to use default filament ?
+
At least one filament must be selected.
+
Do you want to use the default filament?
-
Yes
-
No
+
Yes
+
No
diff --git a/resources/web/guide/23/index.html b/resources/web/guide/23/index.html index 0329ef272b..c7f9d9f1ff 100644 --- a/resources/web/guide/23/index.html +++ b/resources/web/guide/23/index.html @@ -11,7 +11,7 @@ - + @@ -19,8 +19,8 @@
-
System Filaments
-
Custom Filaments
+
System Filaments
+
Custom Filaments
@@ -32,14 +32,14 @@
- printer + Printer
- +
-
No items
+
No items
@@ -47,14 +47,14 @@
- filament type + Filament type
- +
-
No items
+
No items
@@ -62,14 +62,14 @@
- vendor + Vendor
- +
-
No items
+
No items
@@ -78,28 +78,28 @@
- Filter items + Filter items
- Select filtered - Select visible -
all
-
Clear all
+ Select filtered + Select visible +
All
+
Clear all
-
No items
+
No items
@@ -108,7 +108,7 @@
-
Create New
+
Create New
@@ -116,19 +116,19 @@
-
Confirm
-
Cancel
+
Confirm
+
Cancel
-
error
+
Error
-
At least one filament must be selected.
-
Do you want to use default filament ?
+
At least one filament must be selected.
+
Do you want to use the default filament?
-
yes
-
no
+
Yes
+
No
diff --git a/resources/web/guide/24/index.html b/resources/web/guide/24/index.html index c736730b62..902736bf5a 100644 --- a/resources/web/guide/24/index.html +++ b/resources/web/guide/24/index.html @@ -12,7 +12,7 @@ - + @@ -20,12 +20,12 @@
-
Printer Selection
+
Printer Selection
@@ -79,7 +79,7 @@ @@ -88,7 +88,7 @@
-
recent
+
Recent
@@ -119,14 +119,14 @@ @@ -135,8 +135,8 @@
-
recent open
-
Clear all
+
Recently opened
+
Clear all
@@ -84,12 +84,12 @@
- Accessories (0) + Accessories (0)
-
BOM (0)
+
BOM (0)
diff --git a/resources/web/model/model.js b/resources/web/model/model.js index 3d7c2fc8ad..7c238c4bf1 100644 --- a/resources/web/model/model.js +++ b/resources/web/model/model.js @@ -221,15 +221,15 @@ function ShowModelInfo( pModel ) switch(UploadType) { case 'remix': - $('#ModelAuthorType').attr('tid','t93'); + $('#ModelAuthorType').text(T('remixed_by', 'Remixed by')); break; case 'shared': - $('#ModelAuthorType').attr('tid','t94'); + $('#ModelAuthorType').text(T('shared_by', 'Shared by')); break; case 'origin': case 'profile': default: - $('#ModelAuthorType').attr('tid','t92'); + $('#ModelAuthorType').text(T('created_by', 'Created by')); break; } diff --git a/resources/web/orca/missing_connection.html b/resources/web/orca/missing_connection.html index e0536532fc..543eb2c787 100644 --- a/resources/web/orca/missing_connection.html +++ b/resources/web/orca/missing_connection.html @@ -6,7 +6,7 @@ Printer Connection Required - + @@ -14,8 +14,8 @@
-

Printer Connection

-

Please set up your printer connection to view the device.

+

Printer Connection

+

Please set up your printer connection to view the device.

Printer connection setup demonstration
diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 1f9d4b7c53..1a7080d5c7 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -325,6 +325,12 @@ set(lisbslic3r_sources Geometry/VoronoiUtils.cpp Geometry/VoronoiUtils.hpp Geometry/VoronoiVisualUtils.hpp + IMEXArrange.cpp + IMEXArrange.hpp + IMEXHelpers.cpp + IMEXHelpers.hpp + IMEXZones.cpp + IMEXZones.hpp InstanceLock.cpp InstanceLock.hpp Int128.hpp @@ -399,6 +405,7 @@ set(lisbslic3r_sources Polyline.hpp PresetBundle.cpp PresetBundle.hpp + PrinterBedAssets.hpp PresetCacheFormat.cpp PresetCacheFormat.hpp Preset.cpp diff --git a/src/libslic3r/FilamentMixer.cpp b/src/libslic3r/FilamentMixer.cpp index 51952c94c9..e4f42cfdb8 100644 --- a/src/libslic3r/FilamentMixer.cpp +++ b/src/libslic3r/FilamentMixer.cpp @@ -18,6 +18,7 @@ #include #include "ColorDecomposeRecipe.hpp" +#include "Config.hpp" #include "FilamentMixerModel.hpp" #include "LocalesUtils.hpp" @@ -427,6 +428,59 @@ std::vector parse_mixed_ratios(const std::string &str, size_t n_componen return ratios; } +std::string format_mixed_components(const std::vector &components) +{ + std::string out; + for (size_t i = 0; i < components.size(); ++i) { + if (i > 0) + out += ","; + out += std::to_string(components[i]); + } + return out; +} + +std::string format_mixed_ratios(const std::vector &weights) +{ + int sum = std::accumulate(weights.begin(), weights.end(), 0); + if (sum <= 0) + sum = 100; + CNumericLocalesSetter c_locale_setter; + std::string out; + for (size_t i = 0; i < weights.size(); ++i) { + if (i > 0) + out += ","; + char buf[32]; + std::snprintf(buf, sizeof(buf), "%.4f", float(weights[i]) / float(sum)); + out += buf; + } + return out; +} + +int find_fixed_mixed_filament(const ConfigBase &project_config, + const std::vector &components, + const std::vector &weights) +{ + const auto *is_mixed = project_config.option("filament_is_mixed"); + const auto *comps = project_config.option("filament_mixed_components"); + const auto *ratios = project_config.option("filament_mixed_sublayer_ratios"); + if (is_mixed == nullptr || comps == nullptr || ratios == nullptr) + return -1; + // Created lazily with the first mixed slot, so an older project may not have it at all. + const auto *gradient = project_config.option("filament_mixed_gradient"); + + const std::string comp_str = format_mixed_components(components); + const std::string ratio_str = format_mixed_ratios(weights); + for (size_t i = 0; i < is_mixed->values.size(); ++i) { + if (!is_mixed->values[i] || i >= comps->values.size() || i >= ratios->values.size()) + continue; + if (gradient != nullptr && i < gradient->values.size() && gradient->values[i]) + continue; + if (comps->values[i] == comp_str && ratios->values[i] == ratio_str) + return int(i); + } + return -1; +} + bool has_any_mixed_filament(const std::vector &is_mixed) { for (unsigned char v : is_mixed) diff --git a/src/libslic3r/FilamentMixer.hpp b/src/libslic3r/FilamentMixer.hpp index 5ea4484437..a14521e1a5 100644 --- a/src/libslic3r/FilamentMixer.hpp +++ b/src/libslic3r/FilamentMixer.hpp @@ -11,6 +11,8 @@ namespace Slic3r { +class ConfigBase; + // Photoshop-style gradient curve control point in [0,1] x [0,1]. // (x, y) is the anchor position; (m_in, m_out) are optional cubic Hermite tangent // overrides. NaN means "use the PCHIP-computed default", which is the case for plain @@ -94,6 +96,22 @@ std::vector parse_mixed_components(const std::string &str); // Normalizes so the sum equals 1.0. std::vector parse_mixed_ratios(const std::string &str, size_t n_components); +// The text a mixed slot stores in filament_mixed_components, e.g. {1, 3} → "1,3". +std::string format_mixed_components(const std::vector &components); + +// The text a mixed slot stores in filament_mixed_sublayer_ratios: the weights normalised to sum to 1, +// four decimals, e.g. {1, 2} → "0.3333,0.6667". A non-positive sum is read as 100. +std::string format_mixed_ratios(const std::vector &weights); + +// The 0-based index of the mixed slot in `project_config` that blends `components` (1-based physical +// filaments) in `weights` at a fixed ratio, or -1 when there is none. Matched on the stored text, as +// format_mixed_components() and format_mixed_ratios() write it. A gradient slot never matches: its +// ratio drifts from layer to layer, so it is not the blend asked for even where its stored ratios +// are the same. +int find_fixed_mixed_filament(const ConfigBase &project_config, + const std::vector &components, + const std::vector &weights); + // Returns true if any element in is_mixed is true. // ConfigOptionBools stores values as std::vector. bool has_any_mixed_filament(const std::vector &is_mixed); diff --git a/src/libslic3r/Format/ModelIO.hpp b/src/libslic3r/Format/ModelIO.hpp index a0751f2d96..0d335c7958 100644 --- a/src/libslic3r/Format/ModelIO.hpp +++ b/src/libslic3r/Format/ModelIO.hpp @@ -1,3 +1,5 @@ +#pragma once + #include namespace Slic3r { diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 4ae316a055..8a22201c51 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -1,5 +1,6 @@ #include "../libslic3r.h" #include "../Exception.hpp" +#include "../IMEXHelpers.hpp" #include "../Model.hpp" #include "../Preset.hpp" #include "../Utils.hpp" @@ -368,6 +369,12 @@ static constexpr const char* FIRST_LAYER_PRINT_SEQUENCE_ATTR = "first_layer_prin static constexpr const char* OTHER_LAYERS_PRINT_SEQUENCE_ATTR = "other_layers_print_sequence"; static constexpr const char* OTHER_LAYERS_PRINT_SEQUENCE_NUMS_ATTR = "other_layers_print_sequence_nums"; static constexpr const char* SPIRAL_VASE_MODE = "spiral_mode"; +static constexpr const char* IMEX_PARALLEL_MODE_ATTR = "imex_parallel_mode"; +// The same attribute before the feature was renamed IMEX. Plate metadata is matched by exact +// string and written with set_key_value, so it never passes through handle_legacy: without this +// a project saved in that window loads every plate back on the Primary mode, silently. +static constexpr const char* IXEX_PARALLEL_MODE_ATTR_LEGACY = "ixex_parallel_mode"; +static constexpr const char* IMEX_HEAD_FILAMENT_MAP_ATTR = "imex_head_filament_map"; static constexpr const char* FILAMENT_MAP_MODE_ATTR = "filament_map_mode"; static constexpr const char* FILAMENT_MAP_ATTR = "filament_maps"; static constexpr const char* FILAMENT_VOL_MAP_ATTR = "filament_volume_maps"; @@ -4576,6 +4583,12 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) std::istringstream(value) >> std::boolalpha >> spiral_mode; m_curr_plater->config.set_key_value("spiral_mode", new ConfigOptionBool(spiral_mode)); } + else if (key == IMEX_PARALLEL_MODE_ATTR || key == IXEX_PARALLEL_MODE_ATTR_LEGACY) { + m_curr_plater->config.set_key_value("imex_parallel_mode", new ConfigOptionString(value)); + } + else if (key == IMEX_HEAD_FILAMENT_MAP_ATTR) { + m_curr_plater->config.set_key_value("imex_head_filament_map", new ConfigOptionString(value)); + } else if (key == FILAMENT_MAP_MODE_ATTR) { FilamentMapMode map_mode = FilamentMapMode::fmmAutoForFlush; @@ -8277,6 +8290,23 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) if (spiral_mode_opt) stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << SPIRAL_VASE_MODE << "\" " << VALUE_ATTR << "=\"" << spiral_mode_opt->getBool() << "\"/>\n"; + { + // Mode names are user supplied free text, so the value has to be escaped for an + // attribute. xml_escape_double_quotes_attribute_value() is used rather than + // xml_escape() because it also emits tab/CR/LF as numeric character references: + // XML normalizes literal whitespace in attribute values on read, which would + // silently rename the mode. The reader takes the value straight from expat, + // which resolves both entities and character references, so this round-trips. + auto* imex_mode_opt = plate_data->config.option("imex_parallel_mode"); + if (imex_mode_opt && !imex_mode_opt->value.empty() && imex_mode_opt->value != kImexPrimaryMode) + stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << IMEX_PARALLEL_MODE_ATTR << "\" " << VALUE_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(imex_mode_opt->value) << "\"/>\n"; + } + { + auto* imex_hfm_opt = plate_data->config.option("imex_head_filament_map"); + if (imex_hfm_opt && !imex_hfm_opt->value.empty()) + stream << " <" << METADATA_TAG << " " << KEY_ATTR << "=\"" << IMEX_HEAD_FILAMENT_MAP_ATTR << "\" " << VALUE_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(imex_hfm_opt->value) << "\"/>\n"; + } + //filament map related ConfigOption* filament_map_mode_opt = plate_data->config.option("filament_map_mode"); t_config_enum_names filament_map_mode_names = ConfigOptionEnum::get_enum_names(); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index accb67b3da..cab75d5034 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -29,6 +29,7 @@ #include "enum_bitmask.hpp" #include "libslic3r.h" #include "I18N.hpp" +#include "IMEXHelpers.hpp" #include "GCode.hpp" #include #include "Exception.hpp" @@ -87,6 +88,7 @@ #include #include #include +#include #include #include @@ -1710,7 +1712,16 @@ static std::vector get_path_of_change_filament(const Print& print) : gcodegen.config().nozzle_temperature.get_at(new_fi); if (std::abs(tcr.print_z) < EPSILON) base_temp = gcodegen.config().nozzle_temperature_initial_layer.get_at(new_fi); - const std::string t_token = " T" + std::to_string(new_extruder_id); + // This pass strips the M109 that OozePrevention::post_toolchange just emitted into + // toolchange_gcode_str, so it must look for the tool index that emission actually + // wrote -- physical, translated by GCodeWriter::set_temperature -- not the logical + // id the temperature lookups above use. Matching on the logical id would leave the + // blocking M109 in place and silently defeat the tower interface temperature. + // (The sibling scan further down reads WipeTower2 output, whose set_extruder_temp + // emits no T at all, so it is deliberately left alone.) + const int heater_id = imex_physical_heater_for( + gcodegen.config().is_imex.value, gcodegen.config().physical_extruder_map, new_extruder_id); + const std::string t_token = " T" + std::to_string(heater_id); std::string out; out.reserve(toolchange_gcode_str.size()); size_t pos = 0; @@ -1731,7 +1742,7 @@ static std::vector get_path_of_change_filament(const Print& print) const std::string t_val = trimmed.substr(t_pos + 1, t_end == std::string::npos ? std::string::npos : t_end - (t_pos + 1)); if (!t_val.empty()) { try { - matches_extruder = std::stoi(t_val) == new_extruder_id; + matches_extruder = std::stoi(t_val) == heater_id; } catch (...) { matches_extruder = false; } @@ -1763,44 +1774,6 @@ static std::vector get_path_of_change_filament(const Print& print) toolchange_gcode_str.swap(out); } - if (toolchange_temp_override > 0) { - const std::string preheat_token = "preheat T" + std::to_string(new_extruder_id); - const int preheat_temp = interface_temp > 0 ? interface_temp : toolchange_temp_override; - std::string out; - out.reserve(tcr_rotated_gcode.size()); - size_t pos = 0; - while (pos < tcr_rotated_gcode.size()) { - size_t line_end = tcr_rotated_gcode.find('\n', pos); - if (line_end == std::string::npos) - line_end = tcr_rotated_gcode.size(); - std::string line = tcr_rotated_gcode.substr(pos, line_end - pos); - std::string trimmed = line; - trimmed.erase(0, trimmed.find_first_not_of(" \t")); - const bool is_preheat_line = (trimmed.find(preheat_token) != std::string::npos); - if (is_preheat_line) { - // Preserve early-preheat timing while forcing interface temp for contact toolchanges. - size_t s_pos = trimmed.find('S'); - if (s_pos != std::string::npos) { - size_t s_end = trimmed.find_first_not_of("0123456789", s_pos + 1); - trimmed.replace(s_pos + 1, - (s_end == std::string::npos ? trimmed.size() : s_end) - (s_pos + 1), - std::to_string(preheat_temp)); - // Reapply left indentation from the original line. - size_t line_prefix = line.find_first_not_of(" \t"); - if (line_prefix != std::string::npos) - line = line.substr(0, line_prefix) + trimmed; - else - line = trimmed; - } - } - out.append(line); - if (line_end < tcr_rotated_gcode.size()) - out.push_back('\n'); - pos = line_end + 1; - } - tcr_rotated_gcode.swap(out); - } - if (toolchange_temp_override > 0 && interface_temp > 0) { const std::string t_token = " T" + std::to_string(new_extruder_id); std::string out; @@ -3251,6 +3224,38 @@ static BambuBedType to_bambu_bed_type(BedType type) return bambu_bed_type; } +// Orca IMEX: Returns the PHYSICAL tool indices the active IMEX mode drives, or an EMPTY +// vector in primary mode -- a single tool, so there are no parallel carriages to list. +// The mode's Primary head IS included in parallel modes; callers handle it themselves. +// In copy/mirror parallel modes, secondary carriages never receive tool-change +// commands — the firmware mirrors the primary's moves — so they don't appear in +// tool_ordering.all_extruders(). This helper extracts the active mode's tool string +// from the Print and delegates parsing to IMEXHelpers::parse_imex_active_tools so the +// "phys[:role]" tokenization matches every other IMEX consumer (PartPlate zones, +// GCodeViewer legend, Plater warnings). +// Indices are PHYSICAL T-indices. Callers that need a filament-slot (for PA / temp +// lookups) must resolve via first_filament_for_physical_head or resolve_filament_for_head. +static std::vector get_imex_active_tools(const Print& print) +{ + std::vector active_tools; + + if (!print.config().is_imex.value || print.objects().empty()) + return active_tools; + + const std::string& raw_mode = print.objects().front()->config().imex_parallel_mode.value; + const std::string active_mode = raw_mode.empty() ? kImexPrimaryMode : raw_mode; + + // Primary mode drives a single tool, so there are no parallel carriages to list. + if (active_mode == kImexPrimaryMode) + return active_tools; + + // An unresolved mode, and a mode the tools array is too short to cover, both hand back an + // empty tools string, which parses to no tools. + for (const auto& [phys, role] : parse_imex_active_tools(find_imex_mode(print.config(), active_mode).active_tools)) + active_tools.push_back(phys); + return active_tools; +} + void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGeneratorCallback thumbnail_cb) { PROFILE_FUNC(); @@ -3660,6 +3665,51 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato std::vector is_extruder_used(std::max(size_t(MAXIMUM_EXTRUDER_NUMBER), print.config().filament_diameter.size()), 0); for (unsigned int extruder : tool_ordering.all_extruders()) is_extruder_used[extruder] = true; + + // Orca IMEX: mark the LOGICAL filament slot each active SECONDARY carriage + // will load during the print. is_extruder_used is logical-slot indexed + // (consumed as `is_extruder_used[N]` in machine_start_gcode templates), but + // get_imex_active_tools returns PHYSICAL extruder indices. On any printer + // with physical_extruder_map size > 1 (MMU/AFC), writing the physical index + // into a logical-indexed array marks the wrong slot. + // + // The primary is intentionally SKIPPED here — its filament is already + // covered by tool_ordering.all_extruders() above (which lists the slots the + // objects on the plate are actually assigned to). Marking the primary + // again via the pem `first_filament_for_physical_head` fallback would + // pollute is_extruder_used with the *first* slot routed to the primary's + // physical extruder, which is generally not the slot the user assigned to + // the printing object. Same skip-primary pattern as the IMEX PA emission + // path in _do_export(). + // + // For secondaries: translate physical -> logical via the per-plate + // imex_head_filament_map (set by the IMEX ghost picker), with + // first_filament_for_physical_head as the fallback when no override is set. + if (print.config().is_imex.value && !print.objects().empty() + && initial_extruder_id != (unsigned int)-1) { + const auto plate_head_map = parse_imex_head_filament_map( + print.objects().front()->config().imex_head_filament_map.value); + const ConfigOptionInts& pem = print.config().physical_extruder_map; + // Bounds-checked, not get_at(): a clamp would suppress whichever head sits at pem[0]. + // A miss stays -1 and matches no head, so nothing is skipped -- see IMEXHelpers.hpp. + const int primary_physical = + ((int) initial_extruder_id >= 0 && + (int) initial_extruder_id < (int) pem.values.size()) + ? pem.values[(int) initial_extruder_id] + : -1; + // Bound by the array, not by the filament count. The array is padded to + // MAXIMUM_EXTRUDER_NUMBER on purpose: start G-code addresses HEADS through it + // (fdm_toolchanger_common.json gates M104 T0..T5 on it), and a parallel copy print has + // more heads than filaments by definition. PlaceholderParser clamps an out-of-range + // first_layer_temperature read to filament 0, which is the right temperature when every + // head is printing the same filament. Narrowing this to the filament count leaves the + // secondary carriages unheated. + for (int logical : imex_secondary_logical_slots( + get_imex_active_tools(print), primary_physical, plate_head_map, pem)) + if (logical >= 0 && logical < (int) is_extruder_used.size()) + is_extruder_used[logical] = true; + } + this->placeholder_parser().set("is_extruder_used", new ConfigOptionBools(is_extruder_used)); { @@ -3900,6 +3950,103 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // Sync variant-mapped params into placeholder_parser before processing start gcode update_placeholder_parser_with_variant_params(); + // IDEX/IQEX: set {imex_mode}, {imex_mode_index}, {imex_mode_gcode} placeholders before + // any G-code script is processed so they are available in machine_start_gcode, + // filament_start_gcode, filament_end_gcode, change_filament_gcode, etc. + // {imex_mode_names} and {imex_mode_gcodes} array placeholders are already accessible + // via the printer config (e.g. {imex_mode_names[0]}, {imex_mode_gcodes[1]}). + std::string imex_active_mode; + int imex_active_mode_index = 0; + std::string imex_active_mode_gcode; + m_imex_parallel_mode.clear(); + m_imex_head_filament_map.clear(); + if (print.config().is_imex.value && !print.objects().empty()) { + const std::string& raw = print.objects().front()->config().imex_parallel_mode.value; + imex_active_mode = raw.empty() ? kImexPrimaryMode : raw; + m_imex_head_filament_map = parse_imex_head_filament_map( + print.objects().front()->config().imex_head_filament_map.value); + // Look `name` up in the printer's mode table, filling in its index, script and + // tool roster. False means the name matches no row, i.e. the mode is unresolved. + // find_imex_mode() owns the "which row, and what if a sibling array is short" + // rule for every IMEX consumer; see IMEXHelpers.hpp. + std::string imex_active_mode_tools; + auto resolve_mode = [&](const std::string& name) { + const ImexMode mode = find_imex_mode(print.config(), name); + if (!mode.found()) + return false; + imex_active_mode_index = mode.index; + imex_active_mode_gcode = mode.gcode; + imex_active_mode_tools = mode.active_tools; + return true; + }; + // An unresolved mode name falls back to Primary rather than being carried into the + // parallel-mode paths. `imex_parallel_mode` is a plain string stored on the plate and + // matched against the printer's `imex_mode_names` by value, so it goes stale whenever + // the two drift apart -- a mode renamed or deleted after a plate was set to it, or a + // project shared between printer presets that name their modes differently. + // + // Without the fallback the exporter took every "not Primary" branch while every lookup + // keyed on the mode name came back empty, and wrote a file that is wrong rather than + // merely unconfigured: the 1st->2nd layer temperature branch is mutually exclusive with + // the standard one, so an empty active-tool roster meant NO head got its transition and + // all of them held nozzle_temperature_initial_layer for the whole print; and + // imex_suppresses_bare_toolchange() dropped the initial T on the assumption that a + // mode script would select the tool, while the mode script -- also looked up by name -- + // did not exist. Print::validate()'s IMEX rules did not catch it either: they resolve + // the same name to an empty tools string, which yields no declared primary and skips + // the guard. Primary is the one interpretation that is always well-formed: single + // carriage, ordinary temperatures, ordinary tool changes. + // + // Warned rather than silent, and warned rather than blocked. Silent is not an option: + // the plate still labels itself with the stale mode and draws no zones (PartPlate's + // zone builder returns early on the same unresolved state), so a user who asked for two + // parts in copy mode would get one with nothing anywhere saying why. Blocking is not an + // option either -- opening someone else's 3MF on a differently-named preset is a + // legitimate way to arrive here, and the Primary interpretation prints correctly, so + // refusing to slice would be a regression for a case that has a good answer. + // + // The second trigger below is the ragged-table case, and it lands here rather than + // anywhere else because the damage is identical: the mode's name resolves, but the + // printer's `imex_mode_active_tools` is too short to reach its row (or the row is + // explicitly empty), so the roster every branch above keys on comes back empty and + // the export takes the parallel path with nothing in it. Nothing used to report + // that -- half the lookup sites in the tree turned a short tools array into "mode + // not found" and the other half did not, and this one did not. One rule now, in + // find_imex_mode(), and one warning, here. + const bool imex_mode_resolved = resolve_mode(imex_active_mode); + if (imex_active_mode != kImexPrimaryMode && (!imex_mode_resolved || imex_active_mode_tools.empty())) { + print.active_step_add_warning( + PrintStateBase::WarningLevel::NON_CRITICAL, + imex_mode_resolved + ? Slic3r::format(_(L("The IDEX/IQEX mode \"%1%\" has no tools assigned on the selected printer. " + "Printing in Primary mode instead. Assign the mode's tools in Printer " + "Settings, or pick another mode from the plate's IDEX/IQEX button.")), + imex_active_mode) + : Slic3r::format(_(L("This plate is set to the IDEX/IQEX mode \"%1%\", which the selected printer " + "does not define. Printing in Primary mode instead. Pick a mode from the " + "plate's IDEX/IQEX button, or restore the mode in Printer Settings.")), + imex_active_mode)); + imex_active_mode = kImexPrimaryMode; + imex_active_mode_index = 0; + imex_active_mode_gcode.clear(); + imex_active_mode_tools.clear(); + // Primary is a real row in the table (always the first one), so it may carry its own + // setup script; resolve it the same way any other selected mode would be. + resolve_mode(imex_active_mode); + } + m_imex_parallel_mode = imex_active_mode; + } + this->placeholder_parser().set("imex_mode", imex_active_mode); + this->placeholder_parser().set("imex_mode_index", imex_active_mode_index); + this->placeholder_parser().set("imex_mode_gcode", imex_active_mode_gcode); + + // IDEX/IQEX: process mode G-code BEFORE machine_start_gcode so that any + // {global abc = 1} declarations in the mode script are visible to machine_start_gcode. + // The processed result is buffered here and written to the file after temp setup below. + std::string imex_processed_gcode; + if (!imex_active_mode_gcode.empty()) + imex_processed_gcode = this->placeholder_parser_process( + "imex_mode_gcode", imex_active_mode_gcode, initial_extruder_id); // Expand the file header only after the start-up placeholders and writer state are ready. // Use the regular custom G-code path so invalid placeholders report the template name. if (!print.config().file_start_gcode.value.empty()) @@ -4073,6 +4220,10 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato file.write(m_writer.set_chamber_temperature(max_chamber_temp, true)); // set chamber_temperature } + // Write IMEX mode G-code first (processed above), then machine_start_gcode. + if (!imex_processed_gcode.empty()) + file.writeln(imex_processed_gcode); + // Write the custom start G-code file.writeln(machine_start_gcode); // Mark the end of the machine start g-code so the GCodeProcessor usage-block builder knows where user @@ -4189,6 +4340,49 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // Set initial extruder only after custom start G-code. // Ugly hack: Do not set the initial extruder if the extruder is primed using the MMU priming towers at the edge of the print bed. file.write(this->set_extruder(initial_extruder_id, 0.)); + + // IMEX parallel modes only: emit PA for all secondary active tools. + // In primary mode, regular tool-change PA handles each tool as it becomes active. + // In parallel modes no tool changes occur, so every carriage must be addressed + // explicitly here before printing starts. + if (!m_imex_parallel_mode.empty() && m_imex_parallel_mode != kImexPrimaryMode + && !m_config.physical_extruder_map.values.empty()) { + // initial_physical: pem-translate the print's initial logical extruder so the + // loop can skip the primary head (which emitted PA via the normal path). + // Then pem-invert each active physical head back to its first routed filament + // for the PA setting lookup. Guarded on non-empty pem above. + // Bounds-checked, not get_at() -- see the note on imex_pem_tool_for in + // IMEXHelpers.hpp. A clamped initial_physical would skip whichever active head + // equals pem[0], leaving it with no PA at all. + const int initial_physical = + ((int) initial_extruder_id >= 0 && + (int) initial_extruder_id < (int) m_config.physical_extruder_map.values.size()) + ? m_config.physical_extruder_map.values[(int) initial_extruder_id] + : -1; + // enable_pressure_advance and pressure_advance are indexed by COLUMN, not by + // filament slot. filament_diameter is one entry per slot and is never + // variant-expanded, so it is the slot-space bound; translate the slot to its column + // with get_filament_config_index(), as the second-layer temperature loop below does. + const int num_pa_filament_slots = (int) print.config().filament_diameter.values.size(); + for (int tool_idx : get_imex_active_tools(print)) { + // Unlike the second-layer temperature loop, the primary is skipped here: + // set_extruder() above already emitted its PA with the pem tool qualifier. + if (tool_idx == initial_physical) continue; + const int logical = resolve_filament_for_head( + m_imex_head_filament_map, m_config.physical_extruder_map, tool_idx); + // resolve_filament_for_head() answers in pem's index space -- one entry per + // NOZZLE -- while these two options are indexed per FILAMENT SLOT. The spaces + // diverge when the printer has more nozzles than the project has filaments, and + // get_at() would clamp a past-the-end index to filament 0 and pin its PA onto a + // secondary carriage. Same guard the second-layer temperature loop uses. + if (logical < 0 || logical >= num_pa_filament_slots) continue; + const size_t pa_fi = get_filament_config_index(logical); + if (!print.config().enable_pressure_advance.get_at(pa_fi)) continue; + file.write(m_writer.set_pressure_advance( + print.config().pressure_advance.get_at(pa_fi), + tool_idx)); + } + } } this->m_objsWithBrim.clear(); @@ -6142,6 +6336,7 @@ std::string GCode::generate_timelapse_gcode(const Print &print, coordf_t print_z // In non-sequential mode, process_layer is called per each print_z height with all object and support layers accumulated. // For multi-material prints, this routine minimizes extruder switches by gathering extruder specific extrusion paths // and performing the extruder specific extrusions together. + LayerResult GCode::process_layer( const Print &print, // Set of object & print layers of the same PrintObject and with the same print_z. @@ -6343,6 +6538,7 @@ LayerResult GCode::process_layer( + "\n"; config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); } + //BBS: set layer time fan speed after layer change gcode gcode += ";_SET_FAN_SPEED_CHANGING_LAYER\n"; @@ -6506,17 +6702,56 @@ LayerResult GCode::process_layer( gcode += m_writer.set_jerk_xy(NOZZLE_CONFIG(default_jerk)); } - // Transition from 1st to 2nd layer. Adjust nozzle temperatures as prescribed by the nozzle dependent - // nozzle_temperature_initial_layer vs. temperature settings. - for (const Extruder& extruder : m_writer.extruders()) { - if ((print.config().single_extruder_multi_material.value || m_ooze_prevention.enable) && - extruder.id() != m_writer.filament()->id()) - // In single extruder multi material mode, set the temperature for the current extruder only. - continue; - size_t fi = get_filament_config_index((int)extruder.id()); - int temperature = print.config().nozzle_temperature.get_at(fi); - if (temperature > 0 && temperature != print.config().nozzle_temperature_initial_layer.get_at(fi)) - gcode += m_writer.set_temperature(temperature, false, extruder.id()); + // Transition from 1st to 2nd layer: set non-initial-layer nozzle temperatures. + // IMEX parallel modes: secondary carriages (T1-T3) never receive tool-change commands, + // so they're not in m_writer.extruders() and multiple_extruders==false (max id==0). + // Use the static set_temperature path for IMEX so the T index is always emitted. + // In primary mode, fall through to the standard path — tool changes handle temps normally. + if (!m_imex_parallel_mode.empty() && m_imex_parallel_mode != kImexPrimaryMode) { + // All active tools need explicit temps — none receive tool-change commands, + // so we can't rely on the condition used for non-IMEX (temp != initial_layer_temp). + // A tool whose initial and regular temps are the same still needs to be set here. + // Mutually exclusive with the `else` below, so a head skipped here gets no + // transition at all. `tool_idx` is physical; the printing head uses this layer's + // own filament, the parallel carriages resolve through the head map. + // nozzle_temperature is indexed by column: bound in slot space, or an out-of-slot + // logical reaches get_filament_config_index and comes back as filament 0. + // filament_diameter is the slot-space yardstick -- one entry per filament slot, + // never variant-expanded -- and is the bound the pressure advance loop uses too. + const int num_filament_slots = (int) print.config().filament_diameter.values.size(); + // Bounds-checked, not get_at() -- see IMEXHelpers.hpp. A clamp would hand the + // "initial" branch below to whichever secondary sits on pem[0], giving it the wrong + // filament's transition temperature and never its own. + const int initial_physical = + ((int) first_extruder_id >= 0 && + (int) first_extruder_id < (int) m_config.physical_extruder_map.values.size()) + ? m_config.physical_extruder_map.values[(int) first_extruder_id] + : -1; + for (int tool_idx : get_imex_active_tools(print)) { + const int logical = (tool_idx == initial_physical) + ? (int)first_extruder_id + : resolve_filament_for_head( + m_imex_head_filament_map, m_config.physical_extruder_map, tool_idx); + if (logical < 0 || logical >= num_filament_slots) continue; + // Variant-expanded printers column each filament; index as the `else` does. + int temperature = print.config().nozzle_temperature.get_at(get_filament_config_index(logical)); + if (temperature > 0) + gcode += GCodeWriter::set_temperature(temperature, m_writer.config.gcode_flavor, false, + tool_idx, "set IMEX tool temperature"); + } + } else { + // Adjust nozzle temperatures as prescribed by the nozzle dependent + // nozzle_temperature_initial_layer vs. temperature settings. + for (const Extruder& extruder : m_writer.extruders()) { + if ((print.config().single_extruder_multi_material.value || m_ooze_prevention.enable) && + extruder.id() != m_writer.filament()->id()) + // In single extruder multi material mode, set the temperature for the current extruder only. + continue; + size_t fi = get_filament_config_index((int)extruder.id()); + int temperature = print.config().nozzle_temperature.get_at(fi); + if (temperature > 0 && temperature != print.config().nozzle_temperature_initial_layer.get_at(fi)) + gcode += m_writer.set_temperature(temperature, false, extruder.id()); + } } // BBS @@ -7898,6 +8133,31 @@ void GCode::append_full_config(const Print &print, std::string &str) // banning it from the dump has no effect on the feature; the only H2C/H2D delta is the M9711/M971 // snapshot reposition. "farthest_point_timelapse"sv, + // The IMEX (IDEX/IQEX parallel printing) keys are newly-registered printer/process keys whose + // defaults are non-nil, so leaving them in the dump would add fourteen `; imex_* = ` + // lines to every printer's config block — an ordinary single-nozzle machine included. Excluding + // them keeps the config-dump byte-identical for the whole shipping fleet; the IMEX printers pay + // the same price the timelapse/prime-volume keys above already pay, and the active mode is still + // visible in the body of their g-code through the injected imex_mode_gcodes macro. Every key is + // read at slice time from m_config (get_imex_active_tools / find_imex_mode / the zone layout + // helpers) and never parsed back out of the dump, so banning them costs the feature nothing: + // the g-code viewer's overlay reads the loaded presets, not the config block, and the two + // per-plate process keys round-trip through the 3MF's model_settings.config plate metadata + // (bbs_3mf.cpp IMEX_PARALLEL_MODE_ATTR / IMEX_HEAD_FILAMENT_MAP_ATTR), not through this dump. + "is_imex"sv, + "imex_firmware_managed_zones"sv, + "imex_gantry_count"sv, + "imex_tools_per_gantry"sv, + "imex_tool_layout"sv, + "imex_nozzle_clearance_x"sv, + "imex_nozzle_clearance_y"sv, + "imex_carriage_margin"sv, + "imex_viz_theme"sv, + "imex_mode_names"sv, + "imex_mode_active_tools"sv, + "imex_mode_gcodes"sv, + "imex_parallel_mode"sv, + "imex_head_filament_map"sv, "compatible_printers"sv, "compatible_prints"sv, "filament_colour_type"sv, @@ -8708,6 +8968,16 @@ static float overhang_fan_overlap_threshold(int overhang_fan_threshold) } } +static bool overhang_fan_active(float overlap, int overhang_fan_threshold, ExtrusionRole role) +{ + if (role == erBridgeInfill || role == erOverhangPerimeter) + return true; + if (overhang_fan_threshold == Overhang_threshold_none) + return is_external_perimeter(role); + const float overlap_threshold = overhang_fan_overlap_threshold(overhang_fan_threshold); + return overlap_threshold >= 0.f && overlap <= overlap_threshold; +} + std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_description, double speed) { std::string gcode; @@ -9066,7 +9336,10 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d } } - bool variable_speed = false; + bool requires_segmented_extrusion = false; + // A uniform fan state can be represented by the normal path-wide marker. Only a + // transition within the path requires point-by-point emission. + bool path_overhang_fan_active = false; std::vector new_points {}; const bool need_overhang_detection = NOZZLE_CONFIG(enable_overhang_speed) || @@ -9138,13 +9411,21 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d ref_speed, speed, NOZZLE_CONFIG(slowdown_for_curled_perimeters), fan_overlap_threshold); } - variable_speed = std::any_of(new_points.begin(), new_points.end(), - [speed](const ProcessedPoint &p) { return fabs(double(p.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec) - if (FILAMENT_CONFIG(enable_overhang_bridge_fan) && m_enable_cooling_markers) { - if (!NOZZLE_CONFIG(enable_overhang_speed)) - for (ProcessedPoint &point : new_points) - point.speed = speed; - variable_speed = new_points.size() > 1; + if (!NOZZLE_CONFIG(enable_overhang_speed)) + for (ProcessedPoint &point : new_points) + point.speed = speed; + requires_segmented_extrusion = std::any_of(new_points.begin(), new_points.end(), + [speed](const ProcessedPoint &point) { return fabs(double(point.speed) - speed) > 1; }); // Ignore small speed variations (under 1mm/sec) + if (FILAMENT_CONFIG(enable_overhang_bridge_fan) && m_enable_cooling_markers && fan_overlap_threshold >= 0.f && + !new_points.empty()) { + path_overhang_fan_active = new_points.front().overlap <= fan_overlap_threshold; + // An overhang-fan state change needs separate extrusion moves so the cooling buffer can insert + // the corresponding fan command between them. + requires_segmented_extrusion = requires_segmented_extrusion || + std::adjacent_find(new_points.begin(), new_points.end(), [fan_overlap_threshold](const ProcessedPoint &previous, + const ProcessedPoint ¤t) { + return (previous.overlap <= fan_overlap_threshold) != (current.overlap <= fan_overlap_threshold); + }) != new_points.end(); } } @@ -9282,22 +9563,17 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d auto overhang_fan_threshold = FILAMENT_CONFIG(overhang_fan_threshold); auto enable_overhang_bridge_fan = FILAMENT_CONFIG(enable_overhang_bridge_fan); + if (enable_overhang_bridge_fan && + (path.role() == erBridgeInfill || path.role() == erOverhangPerimeter || + (overhang_fan_threshold == Overhang_threshold_none && is_external_perimeter(path.role())))) + path_overhang_fan_active = true; + // { "0%", Overhang_threshold_none }, // { "10%", Overhang_threshold_1_4 }, // { "25%", Overhang_threshold_2_4 }, // { "50%", Overhang_threshold_3_4 }, // { "75%", Overhang_threshold_4_4 }, // { "95%", Overhang_threshold_bridge } - auto check_overhang_fan = [&overhang_fan_threshold](float overlap, ExtrusionRole role) { - if (role == erBridgeInfill || role == erOverhangPerimeter) { // ORCA: Split out bridge infill to internal and external to apply separate fan settings - return true; - } - if (overhang_fan_threshold == Overhang_threshold_none) - return is_external_perimeter(role); - const float overlap_threshold = overhang_fan_overlap_threshold(overhang_fan_threshold); - return overlap_threshold >= 0.f && overlap <= overlap_threshold; - }; - std::string comment; if (m_enable_cooling_markers) { comment = ";_EXTRUDE_SET_SPEED"; @@ -9368,7 +9644,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d } }; - if (!variable_speed) { + if (!requires_segmented_extrusion) { // F is mm per minute. if( (std::abs(writer().get_current_speed() - F) > EPSILON) || (std::abs(_mm3_per_mm - m_last_mm3_mm) > EPSILON) ){ // ORCA: Adaptive PA code segment when adjusting PA within the same feature @@ -9418,11 +9694,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d { if (m_enable_cooling_markers) { if (enable_overhang_bridge_fan) { - // BBS: Overhang_threshold_none means Overhang_threshold_1_4 and forcing cooling for all external - // perimeter - append_role_based_fan_marker(erOverhangPerimeter, "_OVERHANG"sv, - (overhang_fan_threshold == Overhang_threshold_none && is_external_perimeter(path.role())) || - (path.role() == erBridgeInfill || path.role() == erOverhangPerimeter)); // ORCA: Add support for separate internal bridge fan speed control + append_role_based_fan_marker(erOverhangPerimeter, "_OVERHANG"sv, path_overhang_fan_active); // ORCA: Add support for separate internal bridge fan speed control append_role_based_fan_marker(erInternalBridgeInfill, "_INTERNAL_BRIDGE"sv, path.role() == erInternalBridgeInfill); @@ -9572,7 +9844,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d bool pre_fan_enabled = false; bool cur_fan_enabled = false; if( m_enable_cooling_markers && enable_overhang_bridge_fan) - pre_fan_enabled = check_overhang_fan(new_points[0].overlap, path.role()); + pre_fan_enabled = overhang_fan_active(new_points[0].overlap, overhang_fan_threshold, path.role()); if(path.role() == erInternalBridgeInfill) // ORCA: Add support for separate internal bridge fan speed control pre_fan_enabled = true; @@ -9586,7 +9858,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d tag_belt_band((pre_processed_point.p.x() + processed_point.p.x()) / 2, (pre_processed_point.p.y() + processed_point.p.y()) / 2); if (m_enable_cooling_markers) { if (enable_overhang_bridge_fan) { - cur_fan_enabled = check_overhang_fan(processed_point.overlap, path.role()); + cur_fan_enabled = overhang_fan_active(processed_point.overlap, overhang_fan_threshold, path.role()); append_role_based_fan_marker(erOverhangPerimeter, "_OVERHANG"sv, pre_fan_enabled && cur_fan_enabled); pre_fan_enabled = cur_fan_enabled; @@ -9689,7 +9961,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, const std::string &path_d m_writer.extrude_to_xyz(gcode, dest3d, dE * e_ratio, flow_description.empty() ? description : flow_description); } - // Inline farthest-point snapshot on the variable-speed emission path. Inert unless the + // Inline farthest-point snapshot on the segmented emission path. Inert unless the // farthest-point subsystem is on, matching the other paths. check_and_insert_timelapse(processed_point.p.to_point()); @@ -10304,9 +10576,21 @@ std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bo gcode += this->placeholder_parser_process("filament_start_gcode", filament_start_gcode, new_filament_id, &config); check_add_eol(gcode); } - gcode += set_filament_pressure_advance(new_filament_id); + // In IMEX parallel modes each carriage needs an explicit tool address. In primary + // mode, and on a non-IMEX printer, imex_pem_tool_for() returns -1 and the qualifier + // is omitted, because regular tool changes already handle PA there. + gcode += set_filament_pressure_advance(new_filament_id, + imex_pem_tool_for((int) new_filament_id, m_imex_parallel_mode, m_config.physical_extruder_map)); - gcode += m_writer.toolchange(new_filament_id, new_extruder_id); + // Same suppression as the long multi-extruder path: at print-start in IMEX + // parallel modes the user's mode_gcode + machine_start_gcode is responsible + // for tool selection, so the slicer's bare T would be a duplicate. Mid- + // print toolchanges (count > 1) emit normally — Print::validate() blocks + // multi-color in configurations where mid-print T wouldn't make sense + // (see imex_multicolor_block_reason). + const std::string toolchange_command = m_writer.toolchange(new_filament_id, new_extruder_id); + if (!imex_suppresses_bare_toolchange(m_imex_parallel_mode, m_toolchange_count)) + gcode += toolchange_command; if (Extruder *fil = m_writer.filament()) fil->set_config_index((int)get_filament_config_index((int)fil->id())); return gcode; @@ -10350,7 +10634,27 @@ std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bo // If ooze prevention is enabled, park current extruder in the nearest // standby point and set it to the standby temperature. - if (m_ooze_prevention.enable && m_writer.filament() != nullptr) + // + // Same-physical short-circuit: on an IMEX printer, skip the standby cool-down when the + // old and new filament both route to the same physical extruder via physical_extruder_map + // (AFC/MMU lane swaps where the active heater stays selected and only the lane changes). + // The cool-down → re-heat round trip is pointless there — same nozzle, same heater, just a + // different filament feeding it. post_toolchange below still emits M109 to the new + // filament's print temp, so per-lane temperature differences are still handled. + // + // Gated on is_imex so ooze prevention behaves exactly as upstream on every other printer. + // 73 shipping profiles enable it by default (Snapmaker, Flashforge, Prusa and others) and + // none of them are asking for this optimisation. + auto same_physical_extruder = [&](int a, int b) { + if (!m_config.is_imex.value) + return false; + const auto& pem = m_config.physical_extruder_map.values; + return !pem.empty() && a >= 0 && b >= 0 + && a < (int)pem.size() && b < (int)pem.size() + && pem[a] == pem[b]; + }; + if (m_ooze_prevention.enable && m_writer.filament() != nullptr + && !same_physical_extruder(m_writer.filament()->id(), (int)new_filament_id)) gcode += m_ooze_prevention.pre_toolchange(*this); // BBS @@ -10620,7 +10924,13 @@ std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bo std::string toolchange_command = m_writer.toolchange(new_filament_id, next_nozzle_id); if (Extruder *fil = m_writer.filament()) fil->set_config_index((int)get_filament_config_index((int)fil->id())); - if (!custom_gcode_changes_tool(toolchange_gcode_parsed, m_writer.toolchange_prefix(), new_filament_id)) + // See imex_suppresses_bare_toolchange() — only suppress the print-start initial + // T in parallel modes (the user's imex_mode_gcode + machine_start_gcode owns + // tool activation there). Mid-print T emits normally; Print::validate blocks + // multi-color setups where it wouldn't make sense. + const bool suppress_imex_bare = imex_suppresses_bare_toolchange(m_imex_parallel_mode, m_toolchange_count); + if (!custom_gcode_changes_tool(toolchange_gcode_parsed, m_writer.toolchange_prefix(), new_filament_id) + && !suppress_imex_bare) gcode += toolchange_command; else { // user provided his own toolchange gcode, no need to do anything @@ -10693,14 +11003,16 @@ std::string GCode::set_extruder(unsigned int new_filament_id, double print_z, bo if (m_ooze_prevention.enable && !defer_temp_wait) gcode += m_ooze_prevention.post_toolchange(*this); - gcode += set_filament_pressure_advance(new_filament_id); + // See the note on the single-extruder path above: -1 outside IMEX parallel modes. + gcode += set_filament_pressure_advance(new_filament_id, + imex_pem_tool_for((int) new_filament_id, m_imex_parallel_mode, m_config.physical_extruder_map)); //Orca: tool changer or IDEX's firmware may change Z position, so we set it to unknown/undefined m_last_pos_defined = false; return gcode; } -std::string GCode::set_filament_pressure_advance(unsigned int filament_id) +std::string GCode::set_filament_pressure_advance(unsigned int filament_id, int tool) { const size_t fi = get_filament_config_index(filament_id); if (!m_config.enable_pressure_advance.get_at(fi)) @@ -10708,7 +11020,9 @@ std::string GCode::set_filament_pressure_advance(unsigned int filament_id) // Orca: Adaptive PA // Reset Adaptive PA processor last PA value m_pa_processor->resetPreviousPA(m_config.pressure_advance.get_at(fi)); - return m_writer.set_pressure_advance(m_config.pressure_advance.get_at(fi)); + // tool >= 0 addresses one IMEX carriage explicitly; -1 omits the qualifier, so every + // caller that does not pass one emits exactly what it did before. + return m_writer.set_pressure_advance(m_config.pressure_advance.get_at(fi), tool); } inline std::string polygon_to_string(const Polygon &polygon, Print *print, bool is_print_space = false) { diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index da78aa0a35..c89b646ae2 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -262,6 +262,15 @@ public: void export_layer_filaments(GCodeProcessorResult* result); //BBS: set offset for gcode writer void set_gcode_offset(double x, double y) { m_writer.set_xy_offset(x, y); m_processor.set_xy_offset(x, y);} + // IMEX firmware-managed slice: writer offset is augmented by the IMEX shift so the + // emitted gcode is centered at bed origin (firmware fans copies/mirrors out from there). + // Processor offset stays at plate_origin only so the gcode-preview visualizer renders + // the centered toolpath at bed center, not at the prepare-view zone placement. When + // imex_x/imex_y are zero this is byte-identical to set_gcode_offset(x, y). + void set_gcode_offset_with_imex_shift(double x, double y, double imex_x, double imex_y) { + m_writer.set_xy_offset(x + imex_x, y + imex_y); + m_processor.set_xy_offset(x, y); + } // Exported for the helper classes (OozePrevention, Wipe) and for the Perl binding for unit tests. const Vec2d& origin() const { return m_origin; } @@ -302,7 +311,11 @@ public: std::string unretract(float extra_retract = 0.f) { return m_writer.unlift() + m_writer.unretract(extra_retract); } std::string set_extruder(unsigned int extruder_id, double print_z, bool by_object=false, int toolchange_temp_override = -1, bool defer_temp_wait = false); // Sets the pressure advance of the filament's extruder variant, if enabled for it. - std::string set_filament_pressure_advance(unsigned int filament_id); + // tool addresses one IMEX carriage explicitly. -1 means no carriage: it omits the tool + // qualifier on Klipper, Marlin and BBL, and keeps RepRapFirmware's historical `D0`, since a + // bare M572 there applies to whatever tool is selected and errors when none is. That is + // what every non-IMEX caller wants, and what imex_pem_tool_for() returns off IMEX. + std::string set_filament_pressure_advance(unsigned int filament_id, int tool = -1); bool is_BBL_Printer(); WipeTowerType wipe_tower_type(); @@ -836,6 +849,14 @@ protected: std::unique_ptr m_pa_processor; + // IMEX: active parallel mode name ("primary", "copy", "iq-copy", etc.). + // Set at the start of export. Empty string means non-IMEX or not yet set. + // PA and temperature tool-qualification is only applied when this is not "primary". + std::string m_imex_parallel_mode; + // IMEX: parsed per-plate head→filament overrides (physical T-index → 1-based filament slot). + // Cached from imex_head_filament_map at print start. Empty map means "fall back to pem". + std::map m_imex_head_filament_map; + std::unique_ptr m_wipe_tower; std::unique_ptr m_small_area_infill_flow_compensator; diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index bd68ec1abd..b2ddc75a34 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -1472,6 +1472,10 @@ public: void set_multi_nozzle_group_result(const MultiNozzleUtils::LayeredNozzleGroupResult *multi_nozzle_group_result) { m_multi_nozzle_group_result = multi_nozzle_group_result; } void set_physical_extruder_map(const std::vector &physical_extruder_map) { m_physical_extruder_map = physical_extruder_map; } + // physical_extruder_map defaults to the single element {0} and is only widened to one entry + // per extruder on IMEX printers, so indexing it by tool is out of range on any other + // multi-extruder machine. Fall back to the tool's own index, matching the bounds-checked + // form GCodeProcessor uses for the same map. private: std::string set_normal_acceleration() { std::vector accelerations = m_is_first_layer ? m_first_layer_normal_accelerations : m_normal_accelerations; diff --git a/src/libslic3r/GCode/WipeTowerEstimate.cpp b/src/libslic3r/GCode/WipeTowerEstimate.cpp index c421689b6d..9b6c7882dd 100644 --- a/src/libslic3r/GCode/WipeTowerEstimate.cpp +++ b/src/libslic3r/GCode/WipeTowerEstimate.cpp @@ -28,6 +28,28 @@ static const ConfigOption *option_of(const ConfigBase &config, const char *key) return nullptr; } +bool prime_tower_is_printed(const ConfigBase &config, int used_filaments, int num_objects, bool has_mixed_filament) +{ + const auto *ept = config.option("enable_prime_tower"); + if (ept == nullptr || !ept->value) + return false; + // normalize_fdm_2 only reconsiders the option when the plate uses a filament; below that it + // leaves the user's choice alone, and there is no tower to reason about either way. + if (used_filaments <= 0) + return true; + + const ConfigOption *timelapse = option_of(config, "timelapse_type"); + const bool smooth_timelapse = timelapse != nullptr && timelapse->getInt() == int(TimelapseType::tlSmooth); + const auto *wrapping = config.option("enable_wrapping_detection"); + const bool enable_wrapping = wrapping != nullptr && wrapping->value; + if (smooth_timelapse || enable_wrapping) + return true; + + const ConfigOption *sequence = option_of(config, "print_sequence"); + const bool by_object = sequence != nullptr && sequence->getInt() == int(PrintSequence::ByObject); + return !((used_filaments == 1 && !has_mixed_filament) || (by_object && num_objects > 1)); +} + WipeTowerType resolve_wipe_tower_type(const ConfigBase &config) { // printer_model is what the CLI keys its Bambu Lab detection on; the GUI's vendor flag diff --git a/src/libslic3r/GCode/WipeTowerEstimate.hpp b/src/libslic3r/GCode/WipeTowerEstimate.hpp index 387028649b..1f0b674a11 100644 --- a/src/libslic3r/GCode/WipeTowerEstimate.hpp +++ b/src/libslic3r/GCode/WipeTowerEstimate.hpp @@ -44,4 +44,17 @@ WipeTowerFootprint estimate_wipe_tower_footprint(const ConfigBase double layer_height, double max_object_height); +// Whether a prime tower is PRINTED for a plate. The footprint estimate above answers how big a +// tower is and never reads enable_prime_tower or print_sequence, so it reports a size for a plate +// that prints no tower at all; the authority is DynamicPrintConfig::normalize_fdm_2(), which clears +// enable_prime_tower before the plate is sliced. This mirrors that rule so pre-slice consumers can +// ask it without mutating a config, and a test pins the two together. +// +// used_filaments: the plate's filament SLOTS as authored - a mixed slot counts once, matching +// Print::extruders(), which is what normalize_fdm_2 is handed. +// num_objects: objects printed on the plate; only ByObject sequencing looks at it. +// has_mixed_filament: filament_is_mixed is a PROJECT option, so it is passed rather than read - +// `config` only has to carry the print preset's own keys. +bool prime_tower_is_printed(const ConfigBase &config, int used_filaments, int num_objects, bool has_mixed_filament); + } // namespace Slic3r diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 6176b6693c..62382f8214 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -6,6 +6,7 @@ #include "Point.hpp" #include "Polygon.hpp" #include "PrintConfig.hpp" +#include "IMEXHelpers.hpp" #include "ClipperUtils.hpp" #include "Geometry/ArcWelder.hpp" #include "Line.hpp" @@ -358,8 +359,16 @@ std::string GCodeWriter::set_temperature(unsigned int temperature, GCodeFlavor f std::string GCodeWriter::set_temperature(unsigned int temperature, bool wait, int tool) const { // set tool to -1 to make sure we won't emit T parameter for single extruder or SEMM - if (!this->multiple_extruders || m_single_extruder_multi_material) + if (!this->multiple_extruders || m_single_extruder_multi_material) { tool = -1; + } else { + // Every caller of this overload addresses filaments by LOGICAL id, but M104/M109 + // name a physical heater -- so translate at the one point they all pass through. + // The static overload below is already physical-in (GCode.cpp:5952, + // GCode/GCodeProcessor.cpp:1410) and must not be remapped, which is why the + // translation lives here and not there. + tool = imex_physical_heater_for(this->config.is_imex.value, this->config.physical_extruder_map, tool); + } return set_temperature(temperature, this->config.gcode_flavor, wait, tool); } @@ -582,26 +591,43 @@ std::string GCodeWriter::set_junction_deviation(double junction_deviation){ return gcode.str(); } -std::string GCodeWriter::set_pressure_advance(double pa) const +std::string GCodeWriter::set_pressure_advance(double pa, int tool) const { std::ostringstream gcode; if (pa < 0) return gcode.str(); - if(m_is_bbl_printers){ - //SoftFever: set L1000 to use linear model - gcode << "M900 K" < targets a specific extruder; a bare M572 applies to whatever tool is + // currently selected and errors when there isn't one. Callers with no tool index keep + // the historical D0 rather than the bare form: PA would otherwise depend on + // tool-selection state for every RRF user, none of whom are asking for IMEX. + gcode << "M572 D" << (tool >= 0 ? tool : 0) + << " S" << std::setprecision(4) << pa << "; Override pressure advance value\n"; + } else if (FLAVOR_IS(gcfRepetier)) { + // Repetier M233: X is quadratic (K), Y is linear (L). + // Applying the value to both parameters simultaneously. + gcode << "M233 X" << std::setprecision(4) << pa << " Y" << std::setprecision(4) << pa << " ; Override pressure advance value\n"; + } else if (FLAVOR_IS(gcfMarlinFirmware)) { + // Marlin 2.x supports T parameter for per-extruder LA + gcode << "M900 K" << std::setprecision(4) << pa; + if (tool >= 0) + gcode << " T" << tool; + gcode << "; Override pressure advance value\n"; + } else { + // Marlin Legacy and everything else: single-extruder M900, no tool parameter + gcode << "M900 K" << std::setprecision(4) << pa << "; Override pressure advance value\n"; } return gcode.str(); } diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 12a56dacdc..3c90a4e9e1 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -72,7 +72,7 @@ public: // Orca: set acceleration and jerk in one command for Klipper std::string set_accel_and_jerk(unsigned int acceleration, double jerk); std::string set_junction_deviation(double junction_deviation); - std::string set_pressure_advance(double pa) const; + std::string set_pressure_advance(double pa, int tool = -1) const; std::string set_input_shaping(char axis, float damp, float freq, std::string type) const; std::string reset_e(bool force = false); std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const; diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index ca134eda79..e8c64867d0 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -428,55 +428,44 @@ Transform3d Transformation::get_offset_matrix() const return translation_transform(get_offset()); } -static Transform3d extract_rotation_matrix(const Transform3d& trafo) -{ - Matrix3d rotation; - Matrix3d scale; - trafo.computeRotationScaling(&rotation, &scale); - return Transform3d(rotation); -} - -static Transform3d extract_scale(const Transform3d& trafo) -{ - Matrix3d rotation; - Matrix3d scale; - trafo.computeRotationScaling(&rotation, &scale); - return Transform3d(scale); -} - +// computeRotationScaling() may put a mirror on any axis; use the local axis needing the least rotation. static std::pair extract_rotation_scale(const Transform3d& trafo) { Matrix3d rotation; Matrix3d scale; - trafo.computeRotationScaling(&rotation, &scale); + if (trafo.linear().determinant() >= 0.0) { + trafo.computeRotationScaling(&rotation, &scale); + return { Transform3d(rotation), Transform3d(scale) }; + } + for (int axis = 0; axis < 3; ++axis) { + Transform3d flipped = trafo; + flipped.linear().col(axis) *= -1.0; + Matrix3d r; + Matrix3d s; + flipped.computeRotationScaling(&r, &s); + // EPSILON keeps the lowest axis on ties, e.g. a mirror rotated by 90 degrees. + if (axis == 0 || r.trace() > rotation.trace() + EPSILON) { + rotation = r; + scale = s; + scale.col(axis) *= -1.0; + } + } return { Transform3d(rotation), Transform3d(scale) }; } +static Transform3d extract_rotation_matrix(const Transform3d& trafo) +{ + return extract_rotation_scale(trafo).first; +} + +static Transform3d extract_scale(const Transform3d& trafo) +{ + return extract_rotation_scale(trafo).second; +} + static bool contains_skew(const Transform3d& trafo) { - Matrix3d rotation; - Matrix3d scale; - trafo.computeRotationScaling(&rotation, &scale); - - if (scale.isDiagonal()) - return false; - - if (scale.determinant() >= 0.0) - return true; - - // the matrix contains mirror - const Matrix3d ratio = scale.cwiseQuotient(trafo.matrix().block<3,3>(0,0)); - - auto check_skew = [&ratio](int i, int j, bool& skew) { - if (!std::isnan(ratio(i, j)) && !std::isnan(ratio(j, i))) - skew |= std::abs(ratio(i, j) * ratio(j, i) - 1.0) > EPSILON; - }; - - bool has_skew = false; - check_skew(0, 1, has_skew); - check_skew(0, 2, has_skew); - check_skew(1, 2, has_skew); - return has_skew; + return !extract_scale(trafo).linear().isDiagonal(); } Vec3d Transformation::get_rotation() const @@ -550,7 +539,8 @@ void Transformation::set_scaling_factor(Axis axis, double scaling_factor) assert(scaling_factor > 0.0); auto [rotation, scale] = extract_rotation_scale(m_matrix); - scale(axis, axis) = scaling_factor; + // Keep a mirror that sits on this axis. + scale(axis, axis) = std::copysign(scaling_factor, scale(axis, axis)); const Vec3d offset = get_offset(); m_matrix = rotation * scale; diff --git a/src/libslic3r/IMEXArrange.cpp b/src/libslic3r/IMEXArrange.cpp new file mode 100644 index 0000000000..ff4007f98a --- /dev/null +++ b/src/libslic3r/IMEXArrange.cpp @@ -0,0 +1,220 @@ +#include "libslic3r/IMEXArrange.hpp" + +#include +#include +#include +#include +#include +#include + +#include + +#include "libslic3r/Arrange.hpp" +#include "libslic3r/BoundingBox.hpp" +#include "libslic3r/ClipperUtils.hpp" +#include "libslic3r/Config.hpp" +#include "libslic3r/IMEXHelpers.hpp" +#include "libslic3r/IMEXZones.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/Polygon.hpp" +#include "libslic3r/PrintConfig.hpp" +#include "libslic3r/libslic3r.h" + +namespace Slic3r { + +namespace { + +// The arranger's names for the keep-outs. finish() leaves the fences out when it arranges a +// plate inside its zone, where the zone itself is the bed shape. +constexpr const char* kFenceName = "IMEXOutsidePrimaryZone"; +constexpr const char* kStripName = "IMEXCollisionZone"; + +// Each plate computes its zones from where it sits, so the same zone differs in the last bits. +bool same_zone(const BoundingBoxf& a, const BoundingBoxf& b) +{ + return is_approx(a.min, b.min) && is_approx(a.max, b.max); +} + +BoundingBox inset(BoundingBox box, const Point& by) +{ + box.min += by; + box.max -= by; + return box; +} + +// The parts of `bed` outside `zone`: full-depth boxes left and right of it, and the pieces in +// front of and behind it. Empty pieces are left out. +std::vector boxes_around(const BoundingBox& bed, const BoundingBox& zone) +{ + std::vector out; + auto add = [&out](coord_t x0, coord_t y0, coord_t x1, coord_t y1) { + if (x1 > x0 && y1 > y0) + out.emplace_back(Point(x0, y0), Point(x1, y1)); + }; + const coord_t x0 = std::max(zone.min.x(), bed.min.x()); + const coord_t x1 = std::min(zone.max.x(), bed.max.x()); + add(bed.min.x(), bed.min.y(), zone.min.x(), bed.max.y()); + add(zone.max.x(), bed.min.y(), bed.max.x(), bed.max.y()); + add(x0, bed.min.y(), x1, zone.min.y()); + add(x0, zone.max.y(), x1, bed.max.y()); + return out; +} + +} // namespace + +std::optional imex_arrange_zones(const ImexZoneLayout& layout) +{ + if (!layout.primary_zone_box) + return std::nullopt; + ImexArrangeZones zones{*layout.primary_zone_box, {}}; + for (const BoundingBoxf3& strip : layout.collision_zones) + zones.collision_zones.emplace_back(Vec2d(strip.min.head<2>()), Vec2d(strip.max.head<2>())); + return zones; +} + +void ImexArrangeInput::read_config(const DynamicPrintConfig& full_config) +{ + // A plate the arrange adds has no mode of its own, so it takes the process preset's. + added_plate.reset(); + if (adds_plates) { + const auto* mode = full_config.option("imex_parallel_mode"); + added_plate = imex_arrange_zones(compute_imex_zone_layout(full_config, kImexPrimaryMode, mode ? mode->value : std::string(), + get_extents(full_config.opt("printable_area")->values))); + } + + // An estimate: auto brim picks its own width, which brim_width stands in for. + const auto* brim_type = full_config.option>("brim_type"); + brim = !brim_type || brim_type->value == btNoBrim || brim_type->value == btInnerOnly ? + 0. : + full_config.opt_float("brim_width") + full_config.opt_float("brim_object_gap"); +} + +ImexArranger::ImexArranger(const ImexArrangeInput& input, const arrangement::ArrangeParams& params, const Points& bed) + : m_bed(bed) + , m_bed_bb(bed) + , m_margin(scaled(std::max(0.f, params.bed_shrink_x)), scaled(std::max(0.f, params.bed_shrink_y))) + , m_adds_plates(input.adds_plates) +{ + for (size_t i = 0; i < input.beds.size(); ++i) + if (input.beds[i]) + m_beds.push_back({int(i), *input.beds[i]}); + + // The bed shape can be a zone only when every plate being arranged has it, and so does every + // plate the arrange may add. + const auto& first = input.beds.empty() ? std::nullopt : input.beds.front(); + if (first && + std::all_of(input.beds.begin(), input.beds.end(), + [&](const std::optional& b) { return b && same_zone(b->primary_zone, first->primary_zone); }) && + (!input.adds_plates || (input.added_plate && same_zone(input.added_plate->primary_zone, first->primary_zone)))) + m_shared_room = room_in(first->primary_zone); + + // The beds past the plates being arranged become new plates. + if (input.adds_plates && input.added_plate) + for (int bed_idx = int(input.beds.size()); bed_idx < MAX_NUM_PLATES; ++bed_idx) + m_beds.push_back({bed_idx, *input.added_plate}); + + // A zone narrower than its margins leaves no room, and its fences then fill the whole bed. + const Point strip_margin = m_margin + Point::Constant(scaled(input.brim)); + for (const Bed& b : m_beds) { + if (!m_shared_room) + for (const BoundingBox& box : boxes_around(m_bed_bb, inset(scaled(b.zones.primary_zone), m_margin))) + m_keep_outs.push_back({b.bed_idx, box, true}); + for (const BoundingBoxf& strip : b.zones.collision_zones) + m_keep_outs.push_back({b.bed_idx, inset(scaled(strip), -strip_margin), false}); + } +} + +std::optional ImexArranger::room_in(const BoundingBoxf& zone) const +{ + BoundingBox room = inset(scaled(zone), m_margin); + room.min = room.min.cwiseMax(m_bed_bb.min); + room.max = room.max.cwiseMin(m_bed_bb.max); + if (room.min.x() >= room.max.x() || room.min.y() >= room.max.y()) + return std::nullopt; + return room; +} + +Points ImexArranger::bed_shape() const { return m_shared_room ? m_shared_room->polygon().points : m_bed; } + +void ImexArranger::add_keep_outs(arrangement::ArrangePolygons& fixed) const +{ + for (const KeepOut& keep_out : m_keep_outs) { + arrangement::ArrangePolygon ap; + ap.poly.contour = keep_out.box.polygon(); + ap.is_virt_object = true; + ap.bed_idx = keep_out.bed_idx; + ap.height = 1; + ap.name = keep_out.fence ? kFenceName : kStripName; + fixed.push_back(std::move(ap)); + } +} + +bool ImexArranger::crosses_keep_out(const arrangement::ArrangePolygon& part, int bed_idx) const +{ + const Polygon hull = part.transformed_poly().contour; + return std::any_of(m_keep_outs.begin(), m_keep_outs.end(), [&](const KeepOut& keep_out) { + return keep_out.bed_idx == bed_idx && !intersection(hull, keep_out.box.polygon()).empty(); + }); +} + +void ImexArranger::finish(arrangement::ArrangePolygons& items, + const arrangement::ArrangePolygons& before, + const arrangement::ArrangePolygons& fixed, + const arrangement::ArrangeParams& params) const +{ + for (arrangement::ArrangePolygon& part : items) + if (crosses_keep_out(part, part.bed_idx)) + part.bed_idx = arrangement::UNARRANGED; + + // Only fenced plates need centering, and arranging one plate never fences. + if (m_shared_room || !m_adds_plates) + return; + + arrangement::ArrangeParams one_plate = params; + one_plate.progressind = {}; + for (const Bed& b : m_beds) { + const std::optional room = room_in(b.zones.primary_zone); + std::vector on_bed; + for (size_t i = 0; i < items.size(); ++i) + if (items[i].bed_idx == b.bed_idx) + on_bed.push_back(i); + if (on_bed.empty() || !room) + continue; + + arrangement::ArrangePolygons parts, bed_fixed; + // Bed 0, where the nester takes a part as placeable rather than as one that does not fit. + for (size_t i : on_bed) { + parts.push_back(before[i]); + parts.back().bed_idx = 0; + } + for (const arrangement::ArrangePolygon& ap : fixed) + if (ap.bed_idx == b.bed_idx && ap.name != kFenceName) { + bed_fixed.push_back(ap); + bed_fixed.back().bed_idx = 0; + } + arrangement::arrange(parts, bed_fixed, room->polygon().points, one_plate); + // A canceled pass leaves parts it never reached on bed 0 with their old ids. + if (one_plate.stopcondition && one_plate.stopcondition()) + return; + + // Keep the first layout when this one does not fit. + if (!std::all_of(parts.begin(), parts.end(), [&](const arrangement::ArrangePolygon& part) { + return part.bed_idx == 0 && !crosses_keep_out(part, b.bed_idx); + })) + continue; + + // By-object printing follows the packing order, which this pass numbered 0..n-1: carry + // it over onto the ids the first pass gave these parts. + std::vector ids; + for (size_t i : on_bed) + ids.push_back(items[i].itemid); + std::sort(ids.begin(), ids.end()); + for (size_t k = 0; k < on_bed.size(); ++k) { + items[on_bed[k]].translation = parts[k].translation; + items[on_bed[k]].rotation = parts[k].rotation; + items[on_bed[k]].itemid = ids[parts[k].itemid]; + } + } +} + +} // namespace Slic3r diff --git a/src/libslic3r/IMEXArrange.hpp b/src/libslic3r/IMEXArrange.hpp new file mode 100644 index 0000000000..c4fd3877c4 --- /dev/null +++ b/src/libslic3r/IMEXArrange.hpp @@ -0,0 +1,101 @@ +#pragma once + +#include +#include + +#include "libslic3r/Arrange.hpp" +#include "libslic3r/BoundingBox.hpp" +#include "libslic3r/Point.hpp" + +namespace Slic3r { + +class DynamicPrintConfig; +struct ImexZoneLayout; + +// A plate's IDEX/IQEX zones as Arrange sees them, in plate-local millimeters. +struct ImexArrangeZones +{ + BoundingBoxf primary_zone; + std::vector collision_zones; +}; + +// The zones of `layout`, none when it has no primary zone, i.e. outside a parallel mode. +std::optional imex_arrange_zones(const ImexZoneLayout& layout); + +// What an arrange needs to know about the plates it packs into. +struct ImexArrangeInput +{ + // Per arranger bed, in order: the zones of the plate it packs into, none for a plate whose + // parts may go anywhere on the bed. + std::vector> beds; + // Whether the beds past `beds` become new plates, as when arranging every plate, and the + // zones such a plate gets. + bool adds_plates = false; + std::optional added_plate; + // Room a strip keeps for the brim: brim width plus its gap to the part, in mm. + double brim = 0.; + + // Sets `added_plate` and `brim` from the full config. Call after setting `adds_plates`. + void read_config(const DynamicPrintConfig& full_config); +}; + +// Keeps an arrange inside each IDEX/IQEX plate's primary zone and out of that zone's carriage +// collision strips. +// +// The arranger packs every bed into one bed shape. When every bed has the same primary zone, +// that shape becomes the zone, which keeps the parts centered in it. Otherwise each plate in a +// parallel mode fences off the rest of its bed with fixed items on its own bed, leaving the +// other plates the whole bed, and finish() arranges each fenced plate again inside its zone, +// since a fenced pile sits against the zone edge nearest the bed's center. +// +// A zone edge inside the bed gets the margin the bed's own edges get, since a copy printed from +// a part at the zone edge sits at the far edge of the bed. A strip also gets the brim, which +// would take the nozzle into it. +class ImexArranger +{ +public: + // `bed` is the arranger's bed shape, shrunk by params.bed_shrink_x/y. + ImexArranger(const ImexArrangeInput& input, const arrangement::ArrangeParams& params, const Points& bed); + + // Whether any bed has a zone. Nothing below has an effect otherwise. + bool active() const { return !m_beds.empty(); } + + // The bed shape to arrange in. + Points bed_shape() const; + + // Adds the fixed items that keep parts out of each bed's keep-outs. + void add_keep_outs(arrangement::ArrangePolygons& fixed) const; + + // Call after arrangement::arrange(items, fixed, bed_shape(), params), with `before` holding + // `items` as they were before it. Leaves unarranged any part across a keep-out: one that does + // not fit an empty bed is retried there without the bed's fixed items, so a part too big for + // its zone comes back across them. Then centers each fenced plate's parts in its zone. + void finish(arrangement::ArrangePolygons& items, const arrangement::ArrangePolygons& before, + const arrangement::ArrangePolygons& fixed, const arrangement::ArrangeParams& params) const; + +private: + struct Bed + { + int bed_idx; + ImexArrangeZones zones; + }; + struct KeepOut + { + int bed_idx; + BoundingBox box; + bool fence; // outside the primary zone, rather than a strip + }; + + std::optional room_in(const BoundingBoxf& zone) const; + bool crosses_keep_out(const arrangement::ArrangePolygon& part, int bed_idx) const; + + Points m_bed; + BoundingBox m_bed_bb; + Point m_margin; + bool m_adds_plates = false; + std::vector m_beds; + std::optional m_shared_room; + std::vector m_keep_outs; +}; + +} // namespace Slic3r diff --git a/src/libslic3r/IMEXHelpers.cpp b/src/libslic3r/IMEXHelpers.cpp new file mode 100644 index 0000000000..fffcdb0876 --- /dev/null +++ b/src/libslic3r/IMEXHelpers.cpp @@ -0,0 +1,712 @@ +#include "libslic3r/IMEXHelpers.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "Config.hpp" +#include "libslic3r.h" +#include "Point.hpp" +#include "BoundingBox.hpp" +#include "Polygon.hpp" +#include "libslic3r/ClipperUtils.hpp" +#include "libslic3r/I18N.hpp" +#include "libslic3r/PresetBundle.hpp" +#include "libslic3r/PrintConfig.hpp" + +// Mark string for localization and translate. +#define L(s) Slic3r::I18N::translate(s) + +namespace Slic3r { + +namespace { +// Strip every whitespace byte from a token in place. +// +// Not `::isspace` directly: it takes an int that must be representable as unsigned char +// (or equal EOF), and `char` is signed on all three targets, so any byte >= 0x80 is sign- +// extended to a negative int and the call is undefined. The strings parsed below come from +// printer profiles and 3MF metadata, neither of which is guaranteed ASCII, so the unsigned +// char cast is the same one the rest of the codebase already applies to std::toupper. +void strip_whitespace(std::string& token) +{ + token.erase(std::remove_if(token.begin(), token.end(), + [](unsigned char c) { return std::isspace(c) != 0; }), + token.end()); +} +} // namespace + +ConfigOptionInts effective_physical_extruder_map(const ConfigOptionInts* explicit_pem, int nozzle_count) +{ + // One entry per logical extruder, so a profile has authored a map only when its length + // matches. The single-element PrintConfig default does not, and is replaced rather than + // treated as a one-extruder machine. + if (explicit_pem && nozzle_count > 0 && (int) explicit_pem->values.size() == nozzle_count) + return *explicit_pem; + + ConfigOptionInts derived; + derived.values.resize(std::max(nozzle_count, 1)); + std::iota(derived.values.begin(), derived.values.end(), 0); + return derived; +} + +ConfigOptionInts effective_physical_extruder_map(const PresetBundle& pb) +{ + const ConfigOptionInts* explicit_pem = pb.project_config.option("physical_extruder_map"); + if (!explicit_pem || explicit_pem->values.size() < 2) + explicit_pem = pb.printers.get_edited_preset().config.option("physical_extruder_map"); + const auto* nozzles = pb.printers.get_edited_preset().config.option("nozzle_diameter"); + return effective_physical_extruder_map(explicit_pem, nozzles ? (int) nozzles->values.size() : 0); +} + +int imex_pem_tool_for(int filament_id, const std::string& parallel_mode, const ConfigOptionInts& pem) +{ + const bool imex_parallel = !parallel_mode.empty() && parallel_mode != kImexPrimaryMode; + if (!imex_parallel || pem.values.empty()) + return -1; + // Bounds-checked, not get_at() -- see the note in IMEXHelpers.hpp for why the two index + // spaces diverge. Emitting no tool qualifier is correct for a miss; pinning PA onto the + // primary's carriage is not. + if (filament_id < 0 || filament_id >= (int) pem.values.size()) + return -1; + return pem.values[filament_id]; +} + +int imex_physical_heater_for(bool is_imex, const ConfigOptionInts& pem, int logical_id) +{ + // Bounds-check rather than get_at(): get_at() CLAMPS to values.front(), which would + // silently retarget an out-of-range id at whatever heater sits in slot 0. + if (!is_imex || logical_id < 0 || logical_id >= (int) pem.values.size()) + return logical_id; + return pem.values[logical_id]; +} + +bool imex_suppresses_bare_toolchange(const std::string& parallel_mode, unsigned int toolchange_count) +{ + return toolchange_count <= 1 + && !parallel_mode.empty() + && parallel_mode != kImexPrimaryMode; +} + +std::string imex_multicolor_block_reason(const std::string& parallel_mode, + const std::string& active_tools_str, + int tools_per_gantry, + const std::vector& used_filaments_0b, + const ConfigOptionInts& pem) +{ + // Not an IMEX parallel print → nothing to validate here. + if (parallel_mode.empty() || parallel_mode == kImexPrimaryMode) return {}; + // Single-color prints have no toolchanges to constrain. + if (used_filaments_0b.size() <= 1) return {}; + + // MMU lane sharing detection: two or more used filaments routed to the same + // physical head means a mid-print MMU swap on that head, which IMEX parallel + // modes can't slave to the secondary gantry. + if (!pem.values.empty()) { + std::unordered_set seen_physicals; + for (int filament : used_filaments_0b) { + if (filament < 0 || filament >= (int)pem.values.size()) continue; + const int phys = pem.values[filament]; // bounds-checked above; get_at would clamp + if (!seen_physicals.insert(phys).second) { + return L("Multi-color prints in IDEX/IQEX parallel modes require each filament " + "to have its own dedicated physical extruder. Two or more of the active " + "filaments are routed to the same physical head via the printer's " + "physical extruder map (an MMU/AFC manifold), which the slaved gantry " + "cannot follow."); + } + } + } + + // Determine which physical head is the primary in this mode. + const int primary_physical = imex_primary_tool_for_mode(active_tools_str); + if (primary_physical < 0) { + return L("The active IDEX/IQEX mode does not define a primary tool, so multi-color " + "printing cannot be scheduled. Open the printer settings IDEX/IQEX Modes " + "editor and assign a Primary role to one tool."); + } + + // Walk the active tools once: collect the set of distinct gantries spanned by + // the mode and check for an explicit Span marker on the primary's gantry. + // Span declares "this tool is the multicolor partner of primary on the same + // gantry" — without it, two tools on primary's gantry mean two independent + // copies, not a within-gantry toolchange topology, which can't carry + // multicolor in a parallel mode. + const int tpg = std::max(1, tools_per_gantry); + const int primary_gantry = primary_physical / tpg; + bool span_on_primary_gantry = false; + std::set active_gantries; + for (const auto& [phys, role] : parse_imex_active_tools(active_tools_str)) { + active_gantries.insert(phys / tpg); + if (phys / tpg == primary_gantry && role == ImexRole::Span) + span_on_primary_gantry = true; + } + + // Single-gantry mode: the active tools all sit on one gantry, so no second + // gantry is being copied/mirrored to. The "Copy"/"Mirror" label is decorative + // — there's no actual parallel printing happening, just a regular multi-tool + // single-gantry print. Multi-color in this configuration is a misconfiguration + // (use Primary mode for that), and the user's mode_gcode would still emit + // parallel-print firmware setup that doesn't apply here. + if (active_gantries.size() < 2) { + return L("Multi-color in this mode isn't a parallel-print scenario — all of the " + "active tools sit on a single gantry, so there's no second gantry being " + "copied or mirrored to. Switch the plate to Primary mode for multi-color " + "printing on a single gantry, or define an IDEX/IQEX mode that includes " + "tools on a second gantry."); + } + + // Dual-gantry mode but no Span tool on the primary's gantry — the slicer would + // emit toolchanges between filaments but the mode doesn't declare a within-gantry + // multicolor partner, so the swap can't carry. The user might intend independent + // copies (each gantry tool prints its own object) which is incompatible with + // mid-print multicolor in a parallel mode. + if (!span_on_primary_gantry) { + return L("Multi-color prints in IDEX/IQEX parallel modes require a Span tool on the " + "primary's gantry — without one, the mode doesn't declare a within-gantry " + "multicolor partner. Either reduce the print to a single filament, switch to " + "Primary mode, or open the printer settings IDEX/IQEX Modes editor and mark a " + "tool on the primary's gantry as Span."); + } + // Only the primary and its Span partners print the plate's colors; every other active head + // replays them. A color routed anywhere else -- a copying head, one the mode leaves inactive, + // or past the end of the map -- has no head of its own to print from. + std::set color_heads{ primary_physical }; + for (const auto& [phys, role] : parse_imex_active_tools(active_tools_str)) + if (phys / tpg == primary_gantry && role == ImexRole::Span) + color_heads.insert(phys); + for (int filament : used_filaments_0b) { + const int phys = pem.values.empty() ? filament + : (filament >= 0 && filament < (int) pem.values.size()) ? pem.values[filament] : -1; + if (color_heads.count(phys)) + continue; + std::string tools; + for (int head : color_heads) + tools += (tools.empty() ? "T" : "/T") + std::to_string(head); + // Filaments are numbered from 1 as the sidebar shows them, heads by their T index; the map + // decides which head a filament is on, so with MMU lanes the two numbers differ. + if (phys < 0) + return (boost::format(L("In this Span mode only %1% print colors, but filament %2% isn't routed to any " + "tool. Use filaments routed to %1%, or switch this plate to Primary mode.")) % + tools % (filament + 1)).str(); + return (boost::format(L("In this Span mode only %1% print colors, but filament %2% is routed to T%3%. Use " + "filaments routed to %1%, or switch this plate to Primary mode.")) % + tools % (filament + 1) % phys).str(); + } + return {}; +} + +int first_filament_for_physical_head(const ConfigOptionInts& pem, int physical) +{ + const auto& v = pem.values; + if (v.empty()) + return (physical == 0) ? 0 : -1; // degenerate: treat as identity on head 0 + for (size_t i = 0; i < v.size(); ++i) { + if (v[i] == physical) + return static_cast(i); + } + return -1; +} + +bool has_mmu(const ConfigOptionInts& pem) +{ + if (pem.values.size() < 2) + return false; + std::unordered_set seen; + for (int pv : pem.values) { + if (!seen.insert(pv).second) + return true; + } + return false; +} + +bool has_non_primary_mmu(const ConfigOptionInts& pem, int primary_physical) +{ + if (pem.values.size() < 2) + return false; + std::unordered_set seen; + for (int pv : pem.values) { + if (pv == primary_physical) + continue; + if (!seen.insert(pv).second) + return true; + } + return false; +} + +// The def-side match is on type() rather than a dynamic_cast: ConfigOptionPercent and +// ConfigOptionFloatOrPercent both derive from ConfigOptionFloat, so a cast would accept a +// registration whose value cfg.option() had just refused, and silently return +// the default while a real value sat in the config. For the int, float and bool accessors here +// both halves therefore agree on the type. imex_cfg_enum() is the exception and goes the other +// way -- dynamic_cast on both halves -- because every ConfigOptionEnum reports coEnum and a +// type() check cannot tell one enum type from another; see the comment on it in IMEXHelpers.hpp. +// +// Reaching the final return means the key is not registered at all -- a typo in the literal, which +// the compiler cannot catch. For the clearances that would be worse than the literal it replaced: +// zero suppresses every collision strip. assert() is compiled out under NDEBUG, so it catches this +// in a debug build only; the log line is what remains in Release, and the return is still a +// degraded value. This is a programming-error path, not a runtime-input one. +void imex_cfg_report_unregistered(const char* fn, const std::string& key) +{ + BOOST_LOG_TRIVIAL(error) << fn << ": no registered default for " << key; +} + +int imex_cfg_int(const ConfigBase& cfg, const std::string& key) +{ + if (const auto* opt = cfg.option(key)) + return opt->value; + if (const ConfigOptionDef* def = print_config_def.get(key)) + if (const ConfigOption* dv = def->default_value.get()) + if (dv->type() == ConfigOptionInt::static_type()) + return static_cast(dv)->value; + assert(false && "imex_cfg_int: key not registered in print_config_def"); + imex_cfg_report_unregistered("imex_cfg_int", key); + return 0; +} + +bool imex_cfg_bool(const ConfigBase& cfg, const std::string& key) +{ + if (const auto* opt = cfg.option(key)) + return opt->value; + if (const ConfigOptionDef* def = print_config_def.get(key)) + if (const ConfigOption* dv = def->default_value.get()) + if (dv->type() == ConfigOptionBool::static_type()) + return static_cast(dv)->value; + assert(false && "imex_cfg_bool: key not registered in print_config_def"); + imex_cfg_report_unregistered("imex_cfg_bool", key); + return false; +} + +double imex_cfg_float(const ConfigBase& cfg, const std::string& key) +{ + if (const auto* opt = cfg.option(key)) + return opt->value; + if (const ConfigOptionDef* def = print_config_def.get(key)) + if (const ConfigOption* dv = def->default_value.get()) + if (dv->type() == ConfigOptionFloat::static_type()) + return static_cast(dv)->value; + assert(false && "imex_cfg_float: key not registered in print_config_def"); + imex_cfg_report_unregistered("imex_cfg_float", key); + return 0.0; +} + +char imex_role_letter(ImexRole role) +{ + for (const ImexRoleDesc& d : kImexRoleTable) + if (d.role == role) + return d.letter; + // Only reachable if a role was added to the enum but not to kImexRoleTable. Serializing + // it as Copy keeps the string parseable rather than emitting a token no parser accepts. + return 'C'; +} + +ImexRole imex_role_from_suffix(const std::string& suffix) +{ + if (suffix.size() == 1) + for (const ImexRoleDesc& d : kImexRoleTable) + if (d.letter == suffix[0]) + return d.role; + return ImexRole::Copy; +} + +std::vector> parse_imex_active_tools(const std::string& active_tools_for_mode) +{ + std::vector> out; + if (active_tools_for_mode.empty()) return out; + std::istringstream ss(active_tools_for_mode); + std::string tok; + while (std::getline(ss, tok, ',')) { + strip_whitespace(tok); + if (tok.empty()) continue; + const auto colon = tok.find(':'); + const std::string idx_str = (colon == std::string::npos) ? tok : tok.substr(0, colon); + int phys = -1; + try { phys = std::stoi(idx_str); } catch (...) { continue; } + if (phys < 0 || phys >= (int)MAXIMUM_EXTRUDER_NUMBER) continue; + // A bare token (no ':') is Copy here by design -- see the header note; the + // "bare == Primary" backwards-compat rule lives in imex_primary_tool_for_mode(). + const ImexRole role = (colon == std::string::npos) + ? ImexRole::Copy + : imex_role_from_suffix(tok.substr(colon + 1)); + out.emplace_back(phys, role); + } + return out; +} + +ImexModeKind imex_mode_kind(const std::string& active_tools_for_mode) +{ + const int primary = imex_primary_tool_for_mode(active_tools_for_mode); + std::set roles; + for (const auto& [phys, role] : parse_imex_active_tools(active_tools_for_mode)) + if (phys != primary && role != ImexRole::Primary) + roles.insert(role); + if (roles.empty()) + return ImexModeKind::Primary; + if (roles.count(ImexRole::Span)) + return ImexModeKind::Custom; + return roles.count(ImexRole::Mirror) ? ImexModeKind::Mirror : ImexModeKind::Copy; +} + +ImexGantryGrouping group_imex_active_tools_by_gantry(const std::string& active_tools_for_mode, + int tools_per_gantry) +{ + ImexGantryGrouping out; + const int tpg = std::max(1, tools_per_gantry); + + const int primary = imex_primary_tool_for_mode(active_tools_for_mode); + if (primary < 0) + return out; + out.primary_phys = primary; + out.primary_gantry = primary / tpg; + + const int primary_col = primary % tpg; + + // Bucket every active tool by its gantry index. Skip the primary entry itself + // since it carries no role-driven semantics for grouping (it's just the source). + std::map>> by_gantry; + bool span_seen = false; + for (const auto& [phys, role] : parse_imex_active_tools(active_tools_for_mode)) { + if (phys < 0) continue; + const int g = phys / tpg; + by_gantry[g].emplace_back(phys, role); + if (g == out.primary_gantry && role == ImexRole::Span) + span_seen = true; + } + out.span_on_primary = span_seen; + + for (auto& [g, tools] : by_gantry) { + ImexGantryGroup grp; + grp.gantry_index = g; + grp.tools = tools; + + // Pick representative: column-paired to primary if active, else lowest phys. + const int paired_phys = g * tpg + primary_col; + auto pick = std::find_if(tools.begin(), tools.end(), + [&](const auto& pr) { return pr.first == paired_phys; }); + if (pick == tools.end()) + pick = std::min_element(tools.begin(), tools.end(), + [](const auto& a, const auto& b) { return a.first < b.first; }); + grp.representative_phys = pick->first; + grp.representative_role = pick->second; + + // Aggregate iff Span is on primary's gantry, this is a non-primary gantry, + // it has ≥2 tools, and all those tools share the same role (so the merged + // visualization is unambiguous). Mixed-role gantries fall back to per-tool. + const bool same_role = std::all_of(tools.begin(), tools.end(), + [&](const auto& pr) { return pr.second == grp.representative_role; }); + grp.aggregate = span_seen + && g != out.primary_gantry + && tools.size() >= 2 + && same_role; + + out.groups.push_back(std::move(grp)); + } + return out; +} + +int imex_primary_tool_for_mode(const std::string& active_tools_for_mode) +{ + if (active_tools_for_mode.empty()) + return -1; + std::istringstream ss(active_tools_for_mode); + std::string token; + int first_bare = -1; + while (std::getline(ss, token, ',')) { + strip_whitespace(token); + if (token.empty()) + continue; + const auto colon = token.find(':'); + const std::string idx_str = (colon == std::string::npos) ? token : token.substr(0, colon); + int idx = -1; + try { + idx = std::stoi(idx_str); + } catch (...) { + continue; + } + if (idx < 0) + continue; + if (colon == std::string::npos) { + // Backwards-compat: a bare index is Primary. + if (first_bare < 0) + first_bare = idx; + continue; + } + // Same suffix reading as parse_imex_active_tools(), so the two can never disagree + // about which letter means Primary. + if (imex_role_from_suffix(token.substr(colon + 1)) == ImexRole::Primary) + return idx; + } + return first_bare; +} + +std::map parse_imex_head_filament_map(const std::string& s) +{ + std::map result; + if (s.empty()) return result; + std::istringstream ss(s); + std::string token; + while (std::getline(ss, token, ',')) { + strip_whitespace(token); + if (token.empty()) continue; + auto colon = token.find(':'); + if (colon == std::string::npos) continue; + try { + int phys = std::stoi(token.substr(0, colon)); + int slot = std::stoi(token.substr(colon + 1)); + // Same absolute sanity cap parse_imex_active_tools applies to its own physical + // index: neither can exceed the slicer-wide extruder ceiling. This only rejects + // nonsense; the bound that matters (slot must index a filament that exists) is + // in resolve_filament_for_head, which is the one that knows the count. + if (phys >= 0 && phys < (int) MAXIMUM_EXTRUDER_NUMBER + && slot >= 1 && slot <= (int) MAXIMUM_EXTRUDER_NUMBER) + result[phys] = slot; + } catch (...) {} + } + return result; +} + +int imex_primary_logical_from_objects(const std::vector& used_slots_1b, + const ConfigOptionInts& pem, + int primary_physical) +{ + if (pem.values.empty()) return -1; + const int pem_size = (int)pem.values.size(); + for (int slot_1b : used_slots_1b) { + const int slot_0b = slot_1b - 1; + if (slot_0b >= 0 && slot_0b < pem_size && pem.values[slot_0b] == primary_physical) + return slot_0b; + } + return -1; +} + +ImexRouting imex_resolve_routing(const ConfigBase& cfg, + const std::string& parallel_mode, + const std::vector& used_slots_1b, + const ConfigOptionInts& pem) +{ + ImexRouting out; + // An empty mode is a plate that never carried one; kImexPrimaryMode is the reserved + // "no parallel printing" sentinel. Neither resolves a row, so neither is looked up. + if (parallel_mode.empty() || parallel_mode == kImexPrimaryMode) + return out; + out.parallel = true; + + // One lookup of the mode table, one parse of its roster, one search for the Primary + // marker. Every field below is derived from these, so no caller can re-derive one of + // them differently. + out.active_tools = find_imex_mode(cfg, parallel_mode).active_tools; + out.tools = parse_imex_active_tools(out.active_tools); + out.primary_phys = imex_primary_tool_for_mode(out.active_tools); + + if (out.primary_phys >= 0) + out.primary_logical = imex_primary_logical_from_objects(used_slots_1b, pem, out.primary_phys); + + // Bounds-checked exactly as imex_primary_logical_from_objects checks: get_at() would + // clamp an out-of-range slot to values.front(), which is how a head that nothing routes + // to can end up listed as a head something routes to. + out.routed_heads.reserve(used_slots_1b.size()); + for (int slot_1b : used_slots_1b) { + const int slot_0b = slot_1b - 1; + if (slot_0b >= 0 && slot_0b < (int) pem.values.size()) + out.routed_heads.push_back(pem.values[slot_0b]); + } + std::sort(out.routed_heads.begin(), out.routed_heads.end()); + out.routed_heads.erase(std::unique(out.routed_heads.begin(), out.routed_heads.end()), + out.routed_heads.end()); + + // The pem emptiness test is not folded into primary_logical: an unpopulated map means + // the printer has declared no routing at all, which is not the same claim as "this + // plate's filaments go somewhere else", and only the latter is an error. + out.primary_unrouted = out.primary_phys >= 0 && !pem.values.empty() && out.primary_logical < 0; + return out; +} + +std::vector imex_secondary_logical_slots(const std::vector& active_physicals, + int primary_physical, + const std::map& plate_head_filament_map, + const ConfigOptionInts& pem) +{ + std::vector out; + std::unordered_set seen; + for (int phys : active_physicals) { + if (phys == primary_physical) continue; + const int logical = resolve_filament_for_head(plate_head_filament_map, pem, phys); + if (logical < 0) continue; + if (seen.insert(logical).second) + out.push_back(logical); + } + return out; +} + +int resolve_filament_for_head(const std::map& plate_map, + const ConfigOptionInts& pem, + int physical) +{ + auto it = plate_map.find(physical); + if (it != plate_map.end()) { + const int zero_based = it->second - 1; + // pem is indexed by filament slot here, so an override outside it names a filament + // this printer cannot route. Bounding here rather + // than at the parse site is deliberate: the parser is handed a raw string with no + // notion of how many filaments the project has, while every consumer of this + // function's result indexes a per-filament array. The picker only ever offers + // indices into pem (IMEXFilamentPickerPopover::build_row), so nothing the UI can + // author is rejected -- only a hand-edited or corrupt 3MF. Such an override falls + // through to the printer's own routing, i.e. it behaves as if it were absent, + // rather than resolving to a wrong filament that get_at() would silently clamp. + if (zero_based >= 0 && zero_based < (int) pem.values.size()) + return zero_based; + } + return first_filament_for_physical_head(pem, physical); +} + +ImexMirrorAxis imex_mirror_axis_for(int primary_phys, int target_phys, int tools_per_gantry) +{ + const int tpg = std::max(1, tools_per_gantry); + return (target_phys / tpg) == (primary_phys / tpg) ? ImexMirrorAxis::X : ImexMirrorAxis::Y; +} + +Transform3d imex_head_transform(int /*primary*/, int /*target*/, ImexRole role, + const Vec2d& gantry_offset, + const Vec2d& primary_zone_center, + ImexMirrorAxis mirror_axis) +{ + switch (role) { + case ImexRole::Primary: + case ImexRole::Span: + // Span is the within-gantry multicolor partner of Primary: it prints the same + // objects in the same zone via mid-print toolchanges, so it has no zone of its own + // to be translated or reflected into. Identity is the only transform that keeps it + // on top of the primary. calc_imex_ghosts skips Span outright (no ghost is baked + // for it, since the primary's ghost already covers that zone), so today this case + // is unreachable — it is here so that a future caller which does reach it gets the + // right answer rather than the fall-through, and so -Wswitch stays quiet. + return Transform3d::Identity(); + case ImexRole::Copy: + return Eigen::Translation3d(gantry_offset.x(), gantry_offset.y(), 0.0) + * Transform3d::Identity(); + case ImexRole::Mirror: { + const double len2 = gantry_offset.squaredNorm(); + if (len2 < 1e-12) + return Transform3d::Identity(); + // True reflection about the zone-boundary plane between the two zones: perpendicular + // to `mirror_axis`, passing through the midpoint of the zone centers along it. The + // ghost lands at the mirrored position within the target zone — matching where the + // mirror tool actually prints — and drag reflects across that plane, so the mirrored + // axis inverts while the other translates 1:1. + // X: linear = diag(-1, 1, 1), translation = (2*center.x + off.x, off.y, 0) + // Y: linear = diag( 1,-1, 1), translation = (off.x, 2*center.y + off.y, 0) + // Both have det = -1: a real mirror image, not a 180° rotation (which would be + // diag(-1,-1,1), det = +1, and would print the primary's part merely turned around). + Transform3d out = Transform3d::Identity(); + if (mirror_axis == ImexMirrorAxis::Y) { + out.linear() = Eigen::DiagonalMatrix(1.0, -1.0, 1.0); + out.translation() = Vec3d(gantry_offset.x(), + 2.0 * primary_zone_center.y() + gantry_offset.y(), + 0.0); + } else { + out.linear() = Eigen::DiagonalMatrix(-1.0, 1.0, 1.0); + out.translation() = Vec3d(2.0 * primary_zone_center.x() + gantry_offset.x(), + gantry_offset.y(), + 0.0); + } + return out; + } + } + return Transform3d::Identity(); +} + +Vec2d compute_imex_slice_offset(bool firmware_managed, + const std::string& parallel_mode, + const std::optional& primary_zone_box) +{ + if (!firmware_managed) return Vec2d::Zero(); + if (parallel_mode.empty()) return Vec2d::Zero(); + if (parallel_mode == kImexPrimaryMode) return Vec2d::Zero(); + if (!primary_zone_box.has_value()) return Vec2d::Zero(); + return primary_zone_box->center(); +} + +namespace { +// Builds the ImexMode for row `i`, padding whatever sibling array does not reach it. +// `names` is known non-null and `i` known in range; `tools` / `gcodes` may be either. +ImexMode imex_mode_at(const ConfigOptionStrings* names, + const ConfigOptionStrings* tools, + const ConfigOptionStrings* gcodes, + size_t i) +{ + ImexMode m; + m.index = (int) i; + m.name = names->values[i]; + const bool has_tools = tools != nullptr && i < tools->values.size(); + const bool has_gcode = gcodes != nullptr && i < gcodes->values.size(); + if (has_tools) m.active_tools = tools->values[i]; + if (has_gcode) m.gcode = gcodes->values[i]; + m.ragged = !has_tools || !has_gcode; + return m; +} +} // namespace + +ImexMode find_imex_mode(const ConfigBase& cfg, const std::string& name) +{ + const auto* names = cfg.option("imex_mode_names"); + if (names == nullptr) + return {}; + // The siblings are fetched once, not per row: a missing option is the same answer for + // every row, and it is padding rather than a reason to fail the lookup. + const auto* tools = cfg.option("imex_mode_active_tools"); + const auto* gcodes = cfg.option("imex_mode_gcodes"); + for (size_t i = 0; i < names->values.size(); ++i) + if (names->values[i] == name) + return imex_mode_at(names, tools, gcodes, i); + return {}; +} + +std::vector imex_mode_table(const ConfigBase& cfg) +{ + std::vector table; + const auto* names = cfg.option("imex_mode_names"); + if (names == nullptr) + return table; + const auto* tools = cfg.option("imex_mode_active_tools"); + const auto* gcodes = cfg.option("imex_mode_gcodes"); + table.reserve(names->values.size()); + for (size_t i = 0; i < names->values.size(); ++i) + table.push_back(imex_mode_at(names, tools, gcodes, i)); + return table; +} + +std::vector imex_plate_mode_choices(const ConfigBase& cfg) +{ + std::vector choices{ kImexPrimaryMode }; + for (const ImexMode& m : imex_mode_table(cfg)) + if (!m.name.empty() && std::find(choices.begin(), choices.end(), m.name) == choices.end()) + choices.push_back(m.name); + return choices; +} + +bool imex_hull_violates_zones(const std::vector& zones, const Polygon& hull) +{ + if (hull.points.empty()) + return false; + for (const auto& box : zones) { + if (!intersection({box.polygon(true)}, {hull}).empty()) + return true; + } + return false; +} + +} // namespace Slic3r diff --git a/src/libslic3r/IMEXHelpers.hpp b/src/libslic3r/IMEXHelpers.hpp new file mode 100644 index 0000000000..bc3d7b0bc9 --- /dev/null +++ b/src/libslic3r/IMEXHelpers.hpp @@ -0,0 +1,609 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include +#include "Config.hpp" +#include "libslic3r/BoundingBox.hpp" +#include "libslic3r/PrintConfig.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/Polygon.hpp" + +namespace Slic3r { + +class PresetBundle; + +// Reserved sentinel name for the always-present, non-deletable Primary mode in +// `imex_mode_names`. Comparison with this constant indicates "no parallel printing +// in effect" — IMEX zone visualization, ghost rendering, secondary-tool PA / temp +// emission, and the 3MF metadata serialization all short-circuit when the active +// plate mode equals this. Treat any value NOT equal to this as a parallel mode. +inline constexpr const char* kImexPrimaryMode = "primary"; + +// ============================================================================= +// The printer's IMEX mode table +// ============================================================================= +// `imex_mode_names`, `imex_mode_active_tools` and `imex_mode_gcodes` are three +// independent ConfigOptionStrings coupled only by POSITION: entry i of each describes +// mode i. Nothing in the config system enforces equal length, and all three are on-disk +// format, so a hand-edited preset, a profile written before a key existed, or a 3MF from +// another build can arrive with a sibling array shorter than `imex_mode_names`. +// +// ImexMode is the in-memory view of one row. It is NOT a config type — nothing +// serializes it, and the three keys keep their names, their types and their on-disk +// representation exactly as before. +// +// Resolution rule. Applied by find_imex_mode() / imex_mode_table() and NOWHERE else; +// every consumer in the tree goes through one of the two: +// * `imex_mode_names` is the roster. A mode exists iff a row of that array carries its +// name, and the FIRST such row wins. (The modes editor makes a name unique when it is +// committed, so duplicates reach here from a hand-edited profile; first-match is what a +// std::find over the names array already did, and what the editor's own row order +// means.) +// * A sibling array too short to reach that row yields an EMPTY string for that field +// and sets `ragged`. It never yields an out-of-range read, and it never degrades to +// "no such mode": a missing script is a mode with no script, and the row's index +// still has to be reported to {imex_mode_index}. Callers that need tools already +// treat an empty tools string as "no tools" (imex_primary_tool_for_mode() returns -1, +// parse_imex_active_tools() returns {}), which is the behavior they had before. +// * `ragged` separates "the profile omitted this row" from "the author wrote an empty +// entry" — a distinction every open-coded call site used to lose. +// +// Reporting: a non-Primary mode that resolves to an empty tool roster produces G-code +// that is wrong rather than merely unconfigured (no per-head temperature transition, and +// a suppressed initial T), so GCode::_do_export() warns and falls back to Primary, +// exactly as it already does for a name that resolves to no row at all. +struct ImexMode +{ + // Position in `imex_mode_names`. -1 means no row carries the requested name — the + // not-found case, explicit rather than implied by an out-of-range index. + int index = -1; + // The row's entry in `imex_mode_names`. Empty when !found(). + std::string name; + // `imex_mode_active_tools[index]`, or "" when that array is shorter than index + 1. + std::string active_tools; + // `imex_mode_gcodes[index]`, or "" when that array is shorter than index + 1. + std::string gcode; + // At least one sibling array was too short to cover `index`. Always false when + // !found(). + bool ragged = false; + + bool found() const { return this->index >= 0; } + explicit operator bool() const { return this->found(); } +}; + +// Resolves `name` against the printer's mode table; see the rule above. `cfg` is any +// config carrying the printer keys (a DynamicPrintConfig, a PrintConfig, ...). A config +// with no `imex_mode_names` yields a not-found ImexMode rather than throwing, so callers +// need no null check of their own. +ImexMode find_imex_mode(const ConfigBase& cfg, const std::string& name); + +// The whole roster: one ImexMode per entry of `imex_mode_names`, in config order, padded +// by the same rule. Empty when `imex_mode_names` is absent. Use this where the caller +// wants every mode (the modes editor, the plate's mode menu) rather than one by name. +std::vector imex_mode_table(const ConfigBase& cfg); + +// The modes a plate can be set to, in the order its mode button cycles them: kImexPrimaryMode, +// then each name in the table once. A repeated name is listed at its first row only, the one +// find_imex_mode() resolves it to, and empty names and rows named kImexPrimaryMode are left out. +std::vector imex_plate_mode_choices(const ConfigBase& cfg); + +// ============================================================================= +// PHYSICAL vs LOGICAL extruder indices — read this before adding a new IMEX call site +// ============================================================================= +// IMEX has two distinct index spaces and they are NOT interchangeable on MMU/AFC +// printers (where multiple logical filament slots share one physical extruder): +// +// * PHYSICAL extruder index — identifies a hardware carriage / hotend. +// Source: `imex_mode_active_tools` ("0:P,1:C,2:M") and `printer_extruder_id`. +// Use for: user-facing labels (shown as "T0", "T1"...), per-firmware tool +// qualifiers (Klipper EXTRUDER=extruderN, RRF M572 D, Marlin T), and +// anything that addresses hardware. +// +// * LOGICAL filament slot index — identifies one filament in the project. +// Source: indexing into per-filament arrays — `filament_presets`, +// `nozzle_temperature_initial_layer`, bed_temp arrays per plate type, etc. +// Use for: looking up filament data by slot. +// +// On a single-extruder or pure-IDEX printer the two indices coincide. On any +// printer with `physical_extruder_map` size > 1 they diverge. Confusing them +// produces silent wrong-filament behavior — the slicer reads the wrong filament +// preset / temperature for a given carriage with no error or log line. +// +// Translate physical → logical via: +// resolve_filament_for_head(plate_head_filament_map, pem, physical_idx) +// (or the simpler `first_filament_for_physical_head` if no per-plate override). +// +// The reverse translation (logical → physical) is `imex_pem_tool_for`. Do NOT reach for +// `pem.get_at(logical_idx)`: get_at() CLAMPS an out-of-range index to values.front(), silently +// answering "physical head pem[0]" for a logical id that has no mapping at all. The map is one +// entry per nozzle while logical ids index filament slots, and nothing caps the slot count at +// the nozzle count, so out-of-range is reachable. Bounds-check and treat the miss as "no +// mapping" (-1). +// +// The same nozzle-vs-slot divergence bites in the other direction: anything derived from pem +// -- `resolve_filament_for_head`, `first_filament_for_physical_head` -- answers in NOZZLE index +// space, so bound it against the FILAMENT SLOT COUNT before using it as a filament id. Not +// against the option you are about to read: a variant-expanded option such as +// nozzle_temperature is as long as its columns, and is_extruder_used is padded to +// MAXIMUM_EXTRUDER_NUMBER, so both admit slots the project does not have. +// +// A miss is -1, and -1 is a correct tool QUALIFIER but not a skip-the-primary sentinel: no +// physical head equals it, so a test written as `head == primary` stops skipping anything. Do +// not substitute the mode's declared primary there. Which head prints a filament is answered by +// the filament and pem, never by a mode role: a primary-mode print may use any or all tools, one +// at a time, and pem is what says which. When pem cannot answer, the head is genuinely unknown - +// an omitted qualifier then applies to the active tool, which is the head printing that filament, +// so the honest options are to leave it unqualified or to emit nothing, not to name a carriage. +// Known gap, unreported: the two skip sites in GCode.cpp therefore skip nothing for a filament +// slot past the end of pem, so a plate with more slots than nozzles double-writes the primary's +// pressure advance and hands it another filament's transition temperature. +// +// -1 as a tool qualifier reaches GCodeWriter::set_pressure_advance, which omits the qualifier +// on Klipper, Marlin and BBL but substitutes the historical `D0` on RepRapFirmware +// (GCodeWriter.cpp, set_pressure_advance) -- deliberate, not a miss. +// +// Past bugs in this class: +// - GCode PA emission used the inline `pem.get_at(filament_id)` form at two +// sites (consolidated into `imex_pem_tool_for` in c2492ccc47). +// - Pre-slice warnings indexed `filament_presets` directly by physical idx, +// causing wrong-filament names on AFC/MMU layouts (fixed in fbc58d2a1d). +// - Ghost color resolution had its own inline pem lookup with a stale default +// (centralized in `effective_physical_extruder_map` in 6a3de6a28f). +// +// New call sites: if you index a per-filament array, you need a logical index. +// If you label a hardware carriage, use the physical index. When in doubt, +// route through one of the helpers below. +// ============================================================================= + +// physical_extruder_map has one entry per LOGICAL extruder -- the index space of +// nozzle_diameter -- with each value a physical extruder index. It is NOT derivable from +// printer_extruder_id, which is indexed by variant slot (one entry per extruder+variant pair): +// an X1 Carbon has one nozzle and printer_extruder_id {1,1}, an H2D two nozzles and {1,1,2,2,2}. +// +// A profile has authored a map only when its length matches nozzle_count; otherwise the identity +// is returned, which is the same default upstream applies (see Plater.cpp's extruder_map). +ConfigOptionInts effective_physical_extruder_map(const ConfigOptionInts* explicit_pem, int nozzle_count); + +// GUI overload: resolves the effective pem from a live PresetBundle using the project_config +// → printer preset fallback. Use this instead of open-coding the lookup at ghost-color, +// tooltip, click-gate and cache-key call sites so they all agree with what the slicer sees. +ConfigOptionInts effective_physical_extruder_map(const PresetBundle& pb); + +// Returns the physical extruder index to emit as a per-tool qualifier (PA / temperature) +// for the given filament slot, or -1 when the current IMEX state does not warrant a +// per-tool qualification: non-IMEX / primary mode, or the pem is empty / unpopulated. +// Used at tool-change and second-layer transition call sites where IMEX parallel modes +// route emission through the physical extruder, while ordinary tool changes emit bare +// firmware commands like any non-IMEX printer. +int imex_pem_tool_for(int filament_id, const std::string& parallel_mode, const ConfigOptionInts& pem); + +// Translate a logical filament id into the physical heater that an M104/M109 `T` must +// name. Applies in every IMEX mode including Primary -- a heater command names hardware, +// so it does not depend on a parallel mode being active the way imex_pem_tool_for does. +// +// Gated on is_imex because physical_extruder_map carries two readings in this tree: the +// BBL paths index it by extruder id (GCode.cpp:3295, WipeTower.cpp:1353), the IMEX paths +// by filament id. Those coincide only when the filament and nozzle counts match, so an +// ungated mapping would impose the IMEX reading on profiles that mean the other one -- +// fdm_bbl_3dp_002_common ships a non-identity [1,0] and is spared today only because +// single_extruder_multi_material suppresses the T qualifier entirely. +// +// Out-of-range ids pass through unchanged, the same rule GCodeProcessor's preheat rewrite +// uses (GCode/GCodeProcessor.cpp:1407), so a printer whose map is the registered +// single-entry default is unaffected. +int imex_physical_heater_for(bool is_imex, const ConfigOptionInts& pem, int logical_id); + +// True when GCode::set_extruder should suppress its bare T at the print-start +// initial-tool selection because the active IMEX parallel mode's setup macro +// (imex_mode_gcode) and machine_start_gcode already activate the primary tool +// (Klipper SET_PRINT_MODE / RRF M567 — both reference an active tool by definition), +// so any slicer-emitted T at print-start is a duplicate. +// +// Mid-print toolchanges in parallel mode are intentionally NOT suppressed: +// - Single-color prints have no mid-print toolchanges anyway +// - Multi-color prints are blocked at slice-time when the active IMEX configuration +// can't physically support multi-color (see imex_multicolor_block_reason). The only +// not-blocked case is IQEX with 2+ tools active on the primary gantry, where mid- +// print T is legitimately needed and the firmware handles the slaved gantry. +// +// Returns false for: non-IMEX printers (empty parallel_mode), Primary mode, and any +// toolchange after the first (toolchange_count > 1). Custom change_filament_gcode that +// contains its own T is handled separately by GCode.cpp's custom_gcode_changes_tool(). +bool imex_suppresses_bare_toolchange(const std::string& parallel_mode, unsigned int toolchange_count); + +// Returns a user-facing block reason when multi-color printing is incompatible with +// the active IMEX parallel mode, or an empty string when the configuration is OK. +// +// Multi-color in a parallel mode requires the firmware to swap tools mid-print on the +// primary gantry while the slaved gantry follows automatically. That works only when +// every used filament has its own dedicated physical head (no MMU lane sharing), the +// active mode definition explicitly marks a Span tool on the primary's gantry (Span +// declares "this tool is the within-gantry multicolor partner of Primary"; it +// disambiguates the multicolor topology from independent same-gantry copies), AND every +// used filament routes to the primary or one of its Span tools, the only heads that print +// colors of their own. +// +// Catches: +// - IDEX (1 tool per gantry): primary's gantry can never carry a Span partner → blocked +// - IQEX 2-tool-active (e.g. T0 primary + T2 copy on different gantries): no Span on +// primary's gantry → blocked +// - MMU/AFC sharing among used filaments: multiple used filaments routed to same +// physical head → blocked (the slaved gantry can't follow MMU lane swaps) +// - IQEX 4-tool independent copies (T0:P,T1:C,T2:M,T3:M): no Span declared, T1 is an +// independent copy → blocked +// - IQEX paired-gantry multicolor (T0:P,T1:S,T2:M,T3:M): Span on T1 declares the +// multicolor partner, no MMU sharing → ALLOWED for colors on T0 and T1; a color +// routed to T2, T3 or past the end of the map → blocked +// +// Returns empty string for: non-IMEX (empty parallel_mode), Primary mode, single-color +// prints, or any configuration where multi-color is physically supportable. +// +// Inputs: +// parallel_mode — m_imex_parallel_mode at slice time +// active_tools_str — the imex_mode_active_tools entry for the active mode, e.g. +// "0:P,1:C,2:M,3:M" +// tools_per_gantry — imex_tools_per_gantry from printer config (>= 1) +// used_filaments_0b — 0-based logical filament indices used by the print +// pem — physical_extruder_map (logical idx → physical head) +std::string imex_multicolor_block_reason(const std::string& parallel_mode, + const std::string& active_tools_str, + int tools_per_gantry, + const std::vector& used_filaments_0b, + const ConfigOptionInts& pem); + +// Returns the lowest 0-based logical filament index L such that pem[L] == physical. +// Returns -1 if no filament routes to `physical`. +// Degenerate case: an empty pem returns 0 when `physical == 0` (identity-on-head-0 +// fallback for printers that never configured a pem) and -1 otherwise. +// With identity pem, the caller sees logical == physical behavior because +// position L holds value L. +int first_filament_for_physical_head(const ConfigOptionInts& pem, int physical); + +// Returns true if the printer has at least one physical head fed by >= 2 logical +// filaments (i.e., an MMU/AFC is present on some head). Drives the plater's +// click-handler branch: true -> open popover; false -> retain cycle-through. +bool has_mmu(const ConfigOptionInts& pem); + +// Returns true if any physical head OTHER than `primary_physical` is fed by +// >= 2 logical filaments. Primary is the head whose filament is already +// controlled by the left sidebar's object->filament assignment, so an MMU +// there needs no popover row; only non-primary MMU heads do. +// Returns false when pem is empty or size < 2. +bool has_non_primary_mmu(const ConfigOptionInts& pem, int primary_physical); + +// Parses one mode's entry from `imex_mode_active_tools` and returns the +// 0-based physical T-index carrying the `:P` (Primary) role marker. +// Accepts two forms: +// "0:P,1:C,2:C" (explicit role suffix) +// "0" (backwards-compat: a bare index == Primary) +// Returns -1 on empty/malformed input or if no primary is found. +// The caller is responsible for indexing into imex_mode_active_tools by mode. +int imex_primary_tool_for_mode(const std::string& active_tools_for_mode); + +// Parses the "phys:slot,phys:slot" serialization of imex_head_filament_map. +// Keys are physical T-indices (0-based); values are 1-based filament slots. +// Returns empty map on empty/malformed input. This string arrives straight from 3MF +// metadata, so tokens outside [0, MAXIMUM_EXTRUDER_NUMBER) are dropped here as an absolute +// sanity cap; the bound against the *project's* filament count lives in +// resolve_filament_for_head, which is where that count is actually known. +std::map parse_imex_head_filament_map(const std::string& s); + +// Resolves which 0-based logical filament to use for a physical head. +// 1. If the plate map overrides `physical` with a slot that indexes an existing filament, +// returns (slot - 1) — 1-based → 0-based. +// 2. Else falls back to first_filament_for_physical_head(pem, physical). +// Returns -1 if neither source yields a valid filament. +// +// `pem` has one entry per logical filament slot, so its size is the slot count and the +// result is always a valid index into it (or -1). An override naming a slot at or past +// that size cannot be honored — every consumer indexes a per-filament array, and the +// ConfigOption get_at() several of them use clamps rather than failing, which would turn a +// corrupt 3MF's "1:9999" into a silently wrong filament. Such an override is ignored and +// the printer's own routing applies, exactly as if the override were absent. +int resolve_filament_for_head(const std::map& plate_map, + const ConfigOptionInts& pem, + int physical); + +// Returns the 0-based logical filament slot the IMEX *primary* tool prints with, +// based on what the plate's objects are actually assigned to. Walks `used_slots_1b` +// (1-based filament indices, e.g. from PartPlate::get_extruders) and returns the +// first one whose pem entry maps to `primary_physical`. Returns -1 if no object on +// the plate routes to the primary's physical extruder, or if pem is empty. +// +// On non-MMU/non-AFC printers (one logical per physical) this is unambiguous; on +// AFC layouts where multiple logicals route to one physical, the first match wins +// — sufficient for warning labels and is_extruder_used marking. Multi-color +// primaries on the AFC manifold may want all matches; that's a separate iteration. +int imex_primary_logical_from_objects(const std::vector& used_slots_1b, + const ConfigOptionInts& pem, + int primary_physical); + +// Returns the 0-based logical filament slots that IMEX *secondary* carriages +// will load during the print. Iterates `active_physicals` (the set returned by +// imex_mode_active_tools parsing — physical extruder indices), skips entries +// equal to `primary_physical` (the primary is owned by tool_ordering / +// per-object filament assignment, not enumerated here), and resolves each +// remaining physical via `resolve_filament_for_head` (per-plate override +// first, then first_filament_for_physical_head as fallback). +// +// Returned slots are deduplicated and -1 entries (no routing found) are +// dropped. Use this for is_extruder_used marking and pre-slice warnings' +// secondary lookup; the caller still owns whatever it does with the slots +// (mark a bool array, compare temps, etc.). +std::vector imex_secondary_logical_slots(const std::vector& active_physicals, + int primary_physical, + const std::map& plate_head_filament_map, + const ConfigOptionInts& pem); + +enum class ImexRole { Primary, Copy, Mirror, Span }; + +// The one table a new role has to be added to. +// +// `letter` is the suffix the role carries in the `imex_mode_active_tools` on-disk format +// ("0:P,1:C,2:M,3:S"). That string is written into printer profiles and into 3MF projects, +// so the letters are FORMAT: never renumber, rename or reorder them, only append. The table +// order is also the order the modes editor cycles its tiles through and lists its color +// legend in, which is why Primary comes first. +// +// Everything that used to open-code the letters or a parallel small-int encoding of the +// enum now goes through this table or through ImexRole itself, so adding a fifth role means +// editing the enum, this table, and the places that must genuinely make a new decision +// about it (the transform switch, the zone/marker classification, the editor's per-role +// color + label) — not a scattered set of int mappings that fail silently when missed. +struct ImexRoleDesc { + ImexRole role; + char letter; +}; +inline constexpr ImexRoleDesc kImexRoleTable[] = { + { ImexRole::Primary, 'P' }, + { ImexRole::Copy, 'C' }, + { ImexRole::Mirror, 'M' }, + { ImexRole::Span, 'S' }, +}; + +// Reads an IMEX geometry key, falling back to the value registered for that option in +// print_config_def when the key is absent from `cfg`, rather than to a literal repeated at the +// call site. Only a partial or hand-built config reaches the fallback -- anything instantiated +// from the ConfigDef carries every key -- but that is exactly the case a literal gets wrong. +int imex_cfg_int(const ConfigBase& cfg, const std::string& key); +double imex_cfg_float(const ConfigBase& cfg, const std::string& key); + +// Enum sibling. ConfigOptionEnum derives from ConfigOptionSingle, not from ConfigOptionInt, +// so it cannot go through imex_cfg_int(). Header-inline because it is a template. +bool imex_cfg_bool(const ConfigBase& cfg, const std::string& key); + +// Logs an unregistered-key lookup. Out-of-line to keep boost.log out of this header. +void imex_cfg_report_unregistered(const char* fn, const std::string& key); + +template +T imex_cfg_enum(const ConfigBase& cfg, const std::string& key) +{ + // Matched by type, not by the coEnum tag. Every ConfigOptionEnum reports coEnum, so the + // type() comparison that option() (Config.hpp:2656) and the int/float accessors rely on + // cannot tell one enum type from another: it would accept a ConfigOptionEnum and + // static_cast it to this T. ConfigOptionEnum and ConfigOptionEnum are unrelated + // siblings (both derive from ConfigOptionSingle), so a dynamic_cast rejects the mismatch. + // + // A coEnum value has a second representation, ConfigOptionEnumGeneric, which derives from + // ConfigOptionInt rather than ConfigOptionSingle - the enum analogue of the + // ConfigOptionPercent : ConfigOptionFloat inheritance that rules dynamic_cast out for + // imex_cfg_float. It is what a config not seeded from the static PrinterConfig holds, so it + // is read here too, keyed on the value map it carries: only T's own map yields a T. + const ConfigOptionDef* def = print_config_def.get(key); + if (const ConfigOption* opt = cfg.option(key)) { + if (const auto* e = dynamic_cast*>(opt)) + return e->value; + // The map the generic option was built from identifies the enum it holds: T's own map + // means T's own enumerators, so the stored int is a T. A key whose definition names a + // different enum carries a different map and falls through to the default below, + // exactly as the typed cast above would reject it. + if (const auto* g = dynamic_cast(opt)) + if (g->keys_map == &ConfigOptionEnum::get_enum_values()) + return static_cast(g->value); + } + if (def) + if (const ConfigOption* dv = def->default_value.get()) + if (const auto* e = dynamic_cast*>(dv)) + return e->value; + // Same policy as imex_cfg_int/_float: an unregistered key is a typo the compiler cannot + // catch, so say so rather than return a silent zero that reads as a legitimate enumerator. + // The log call is out-of-line so this header, which much of libslic3r and the GUI includes, + // does not pull in boost.log for a path that only a typo reaches. + assert(false && "imex_cfg_enum: key not registered in print_config_def"); + imex_cfg_report_unregistered("imex_cfg_enum", key); + return static_cast(0); +} + +// The on-disk suffix letter for `role`. Inverse of imex_role_from_suffix(). +char imex_role_letter(ImexRole role); + +// Reads a whole token suffix — everything after the ':' — back into a role. Anything that +// is not exactly one of the table's letters is Copy: that covers "C" itself, an empty +// suffix ("3:"), a multi-character suffix, and any letter a future build might write that +// this one does not know. Copy is the historical fallback for an unrecognised suffix and +// must stay so, or a project saved by a newer build changes meaning when reopened here. +ImexRole imex_role_from_suffix(const std::string& suffix); + +// Parses `imex_mode_active_tools[mode]` into a list of (physical_head, role) pairs. +// Accepted token forms (comma-separated, whitespace-tolerant): +// "phys" — bare index, role defaults to Copy +// "phys:P" — Primary +// "phys:C" — Copy +// "phys:M" — Mirror +// "phys:S" — Span (multicolor partner of Primary on the same gantry; only +// meaningful on tools sharing primary's gantry, and only on a +// multi-gantry printer. Drives the multicolor-allow path and +// paired-gantry ghost/zone aggregation.) +// "phys:???" — unknown role suffix, treated as Copy +// Malformed tokens (unparseable int, negative phys) are skipped. +// NOTE: the bare-token → Copy default differs from `imex_primary_tool_for_mode`, +// which separately scans for a Primary; callers needing the primary index should +// use that helper. This parser is for call sites that already have the primary +// in hand and need the full head/role list (e.g. ghost factory/updater). +std::vector> parse_imex_active_tools(const std::string& active_tools_for_mode); + +// What a mode does, as the plate's mode icon shows it. The heads beside the primary that +// imex_primary_tool_for_mode() finds decide: none is Primary, any Span head is Custom (the +// multicolor modes), any Mirror head is Mirror, and all heads copying is Copy. One Mirror head is +// enough because an IQEX mirror mode copies within the primary's gantry. +enum class ImexModeKind { Primary, Copy, Mirror, Custom }; +inline constexpr size_t kImexModeKindCount = 4; +static_assert(size_t(ImexModeKind::Custom) + 1 == kImexModeKindCount); +ImexModeKind imex_mode_kind(const std::string& active_tools_for_mode); + +// ============================================================================= +// The one derivation of "what does this plate's mode do, and does its filament reach +// the primary" — shared by the hard block and the pre-slice warning +// ============================================================================= +// Print::validate() refuses a plate whose filaments do not route to the mode's declared +// primary; Plater's collect_imex_warnings() names that same primary's filament in its +// bed-temperature and filament-type warnings. Both need the identical chain: resolve the +// mode row -> parse its tool roster -> find the declared primary -> ask whether any used +// filament slot routes there. Computed twice, the two drift, and the warning ends up +// describing a plate the block describes differently. Computed here, they cannot. +// +// Everything in ImexRouting is a pure function of the four inputs. Deliberately absent: +// the `is_imex` gate (Print::validate's, and only its, outer condition) and any bound on +// the tool roster against the project's filament count (the plater's, and only its, way of +// dropping tools it has no filament preset to name). Those are genuinely per-caller and +// each stays with the caller that owns it. +struct ImexRouting +{ + // The mode is a parallel mode: non-empty and not kImexPrimaryMode. False leaves every + // other field at its default — no mode row is even looked up. + bool parallel = false; + // `imex_mode_active_tools` for this mode, or "" when the mode resolves to no row / a + // ragged table. See find_imex_mode(). + std::string active_tools; + // The parsed roster, physical head + role, in the order the string lists them. + std::vector> tools; + // Declared primary PHYSICAL head, from imex_primary_tool_for_mode(). -1 when the mode + // resolves to no row, an empty roster, or a roster with no Primary marker. + int primary_phys = -1; + // The 0-based LOGICAL filament slot the primary prints with: the first entry of + // `used_slots_1b` whose pem entry maps to `primary_phys`. -1 when nothing on the plate + // routes there (which is exactly what `primary_unrouted` reports as a hard error, and + // what the plater's warning path falls back out of so it still has a filament to name). + int primary_logical = -1; + // Sorted, deduplicated PHYSICAL heads that `used_slots_1b` actually reach. Slots outside + // the pem are dropped rather than clamped: ConfigOption::get_at() clamps to values front, + // which would let an error message name the very head it just said nothing routes to. + std::vector routed_heads; + // The mode declares a primary, the printer has a routing map, and no used filament + // reaches that primary. The precise condition Print::validate refuses the plate on. + bool primary_unrouted = false; + + bool routes_to_primary() const { return this->primary_logical >= 0; } +}; + +// `cfg` is any config carrying the printer's mode-table keys — the Print's applied config +// in the slicer, the edited printer preset in the GUI. `used_slots_1b` is 1-based filament +// indices (Print::extruders() + 1, or PartPlate::get_extruders()). `pem` is the effective +// physical_extruder_map: already normalised on the Print's config by Print::apply(), and +// obtained from effective_physical_extruder_map(PresetBundle) in the GUI. +ImexRouting imex_resolve_routing(const ConfigBase& cfg, + const std::string& parallel_mode, + const std::vector& used_slots_1b, + const ConfigOptionInts& pem); + +// Per-gantry grouping derived from the active_tools string. The single source of +// truth for paired-gantry visualization aggregation: when the primary's gantry +// has at least one Span tool, every non-primary gantry's representative tool +// stands in for the whole gantry (one ghost, one zone strip). Gantries without +// the aggregation trigger keep per-tool semantics. +// +// `representative_phys` is the column-paired tool to primary on that gantry — +// i.e. `gantry_index * tools_per_gantry + (primary_phys % tools_per_gantry)` if +// active, else the lowest active phys on that gantry. Aggregation falls back +// when tools on the same non-primary gantry carry mixed roles (e.g. one Copy +// + one Mirror), since the user explicitly authored two distinct topologies. +struct ImexGantryGroup { + int gantry_index = -1; + int representative_phys = -1; + ImexRole representative_role = ImexRole::Copy; + bool aggregate = false; // collapse this gantry to one ghost/zone + std::vector> tools; // every active tool on this gantry +}; + +struct ImexGantryGrouping { + int primary_phys = -1; + int primary_gantry = -1; + bool span_on_primary = false; // any Span tool on primary's gantry + std::vector groups; // every gantry with ≥1 active tool, sorted by index +}; + +// Groups parsed active tools by gantry (`phys / tools_per_gantry`). Aggregation +// triggers iff `span_on_primary` is true AND a non-primary gantry's tools all +// carry the same role; mixed-role non-primary gantries fall back to per-tool. +// Returns an empty grouping when active_tools_str is empty / has no primary. +ImexGantryGrouping group_imex_active_tools_by_gantry(const std::string& active_tools_for_mode, + int tools_per_gantry); + +// World-space transform composed as `head_xf * primary_instance_world` to place a ghost +// copy of the primary into `target`'s frame under `role`. +// Which boundary a Mirror reflects across. Tools on the primary's own gantry sit beside +// it along X, so they mirror across the vertical boundary between their zones. Tools on a +// different gantry sit in front of / behind it along Y, so they mirror across the +// horizontal boundary between the gantry row strips — the part comes off that gantry as a +// Y-reflection of the tool directly behind it, not an X-reflection. Single-gantry printers +// only ever use X. +enum class ImexMirrorAxis { X, Y }; + +// The single source of truth for that choice. Gantry row is `phys / tools_per_gantry`, the +// same derivation PartPlate and GCodeViewer use to build their zone grids. Keep every caller +// on this helper: if the three of them ever disagree about the axis, the plate ghosts and the +// preview markers place the same tool in different spots for the same mode. +// `tools_per_gantry` is clamped to >= 1, so a zero/negative config divides safely. Note the +// clamp lands on "one tool per gantry", meaning every secondary is then cross-gantry and +// mirrors on Y — not "everything on one gantry". That is the honest reading of tpg = 1. +ImexMirrorAxis imex_mirror_axis_for(int primary_phys, int target_phys, int tools_per_gantry); + +// `gantry_offset` = center_for(target) - center_for(primary) (XY, in mm). +// `primary_zone_center` = XY center of the primary head's zone in world coords. Only +// consulted for Mirror; Copy/Primary ignore it. +// `mirror_axis` = axis the Mirror reflection negates; get it from imex_mirror_axis_for(). +// Deliberately NOT defaulted: a default would silently hand a forgetful caller the X +// reflection, which is wrong for every cross-gantry tool and would fail silently — the +// ghosts would just quietly go back to mirroring on the wrong axis. Ignored by Copy/Primary. +// Copy: pure translation by gantry_offset. Ghost tracks primary 1:1 during drag. +// Mirror: true reflection (det = -1, so chirality flips — a real mirror image) about the +// zone-boundary plane between primary and target, perpendicular to `mirror_axis` +// and passing through the midpoint of the two zone centers along that axis. The +// ghost origin lands at the mirrored position within the target zone, and primary +// drag reflects across that plane, so the mirrored axis moves opposite the primary +// while the other axis tracks 1:1. +// Zero-length gantry_offset degenerates to identity. +// Primary: identity. +// Span: identity, same as Primary. A Span tool shares the primary's gantry AND its zone, +// printing the same objects through mid-print toolchanges rather than a duplicate +// placed elsewhere, so there is nothing to translate or reflect. calc_imex_ghosts +// bakes no ghost for a Span head, so no caller reaches this today. +Transform3d imex_head_transform(int primary, int target, ImexRole role, + const Vec2d& gantry_offset, + const Vec2d& primary_zone_center, + ImexMirrorAxis mirror_axis); + +// Slice-time XY shift for printers that delegate copy/mirror placement to firmware. +// When `imex_firmware_managed_zones` is on AND the active mode is non-primary, returns +// the primary zone's plate-local center so gcode emission can subtract it (yielding a +// centered slice the firmware can fan out). Returns Vec2d::Zero() in every other case: +// flag off, primary/empty mode, or no zone box (IMEX disabled, primary-only, etc.). +Vec2d compute_imex_slice_offset(bool firmware_managed, + const std::string& parallel_mode, + const std::optional& primary_zone_box); + +// True if `hull` (scaled Clipper coords) overlaps any of `zones` (unscaled mm) — +// the one definition of "overlap" shared by the object and prime-tower placement +// checks. Area-based: Clipper yields no result for shapes sharing only an edge, so +// a hull flush against a zone boundary is NOT reported, it has to cross. That +// matches the long-standing object behavior. An empty hull never violates. +bool imex_hull_violates_zones(const std::vector& zones, const Polygon& hull); + +} // namespace Slic3r diff --git a/src/libslic3r/IMEXZones.cpp b/src/libslic3r/IMEXZones.cpp new file mode 100644 index 0000000000..f5164f0500 --- /dev/null +++ b/src/libslic3r/IMEXZones.cpp @@ -0,0 +1,379 @@ +#include "libslic3r/IMEXZones.hpp" + +#include +#include +#include +#include +#include +#include + +#include "PrintConfig.hpp" +#include "BoundingBox.hpp" +#include "Config.hpp" +#include "libslic3r/IMEXHelpers.hpp" + +namespace Slic3r { + +ImexZoneLayout compute_imex_zone_layout(const DynamicPrintConfig& printer_cfg, + const std::string& plate_mode, + const std::string& process_mode, + const BoundingBoxf& bed_extents) +{ + ImexZoneLayout out; + + auto* is_imex_opt = printer_cfg.option("is_imex"); + if (!is_imex_opt || !is_imex_opt->value) + return out; + + // Per-plate mode takes priority over the process preset. + std::string active_mode = plate_mode; + if (active_mode == kImexPrimaryMode && !process_mode.empty()) + active_mode = process_mode; + if (active_mode == kImexPrimaryMode || active_mode.empty()) + return out; + + // Grid dimensions and tool layout from printer config + + int n_cols = std::max(1, imex_cfg_int(printer_cfg, "imex_tools_per_gantry")); + int n_rows = std::max(1, imex_cfg_int(printer_cfg, "imex_gantry_count")); + + // Which corner is T0? flip_x: col 0 is right(max-X); flip_y: row 0 is rear(max-Y) + const ImexToolLayout layout = imex_cfg_enum(printer_cfg, "imex_tool_layout"); + bool flip_x = (layout == ImexToolLayout::FrontRight || layout == ImexToolLayout::RearRight); + bool flip_y = (layout == ImexToolLayout::RearLeft || layout == ImexToolLayout::RearRight); + + // Convert tool index to physical (col=X-index, row=Y-index), col/row 0 = min-X/min-Y + auto tool_to_phys = [&](int idx) -> std::pair { + int raw_col = idx % n_cols, raw_row = idx / n_cols; + return { flip_x ? (n_cols - 1 - raw_col) : raw_col, + flip_y ? (n_rows - 1 - raw_row) : raw_row }; + }; + + int pri_col = 0, pri_row = 0; + + if (n_cols == 1 && n_rows == 1) + return out; // nothing to dim with a single zone + + // Look up secondary tool indices (active in mode, but NOT the primary tool). + // An unresolved mode, and a mode whose row the tools array does not reach, both come + // back as an empty string; the zone_roles guard below then returns an empty layout. + const std::string active_tools_str = find_imex_mode(printer_cfg, active_mode).active_tools; + + // Which heads own a zone cell, and in what role. Roles carry through from + // parse_imex_active_tools() rather than being flattened into small ints, so the + // classification below is a comparison the compiler checks and a new role cannot slip + // through as an unhandled number. + // + // imex_primary_tool_for_mode handles the Primary slot (it owns the bare-legacy-token → + // Primary rule); parse_imex_active_tools fills in the Copy/Mirror secondaries. Mode + // strings use physical T-indices directly; filament routing is separate + // (imex_head_filament_map). + // + // Only Primary / Copy / Mirror land in this map. A Span head shares the primary's zone + // instead of owning one, so it deliberately gets no entry (and hence no zone center -- + // see ImexZoneLayout::head_zone_centers), and an extra Primary entry beyond the first is + // ignored. Any further role must decide here whether it owns a cell. + std::map zone_roles; + { + const int primary = imex_primary_tool_for_mode(active_tools_str); + if (primary >= 0 && primary < n_rows * n_cols) + zone_roles[primary] = ImexRole::Primary; + for (const auto& [phys_idx, role] : parse_imex_active_tools(active_tools_str)) { + if (phys_idx < 0 || phys_idx >= n_rows * n_cols) continue; + if (phys_idx == primary) continue; + // Exhaustive on purpose, with no default: a role added to the enum has to answer + // "does this own a zone cell?" here, and -Wswitch asks the question at compile + // time instead of letting the head silently vanish from the layout. + switch (role) { + case ImexRole::Copy: + case ImexRole::Mirror: + zone_roles[phys_idx] = role; + break; + case ImexRole::Primary: // an extra Primary beyond the first is ignored + case ImexRole::Span: // shares the primary's zone rather than owning one + break; + } + } + } + + // If the mode name was found but has no tools (e.g. stale process-preset mode on a new + // printer that has no modes defined yet), there is nothing to compute. + if (zone_roles.empty()) + return out; + + // Identify the Primary tool from the mode definition + for (const auto& [idx, role] : zone_roles) { + if (role == ImexRole::Primary) { auto [c, r] = tool_to_phys(idx); pri_col = c; pri_row = r; + out.primary_head = idx; break; } + } + + // No Primary landed inside the grid. Either the mode declares none at all, or its `:P` + // index is off-grid: the modes editor deliberately preserves tool assignments across + // imex_gantry_count changes, so a mode authored on a 4-tool IQEX with Primary on T3 keeps + // that assignment when the printer is reconfigured as a 2-tool IDEX, and the + // `primary < n_rows * n_cols` bound above then drops it from zone_roles. + // + // Every zone, strip, ghost center and slice offset below is derived from pri_col/pri_row, + // which would still be sitting at their (0,0) initializers — a position no active tool + // occupies. That yields a primary zone and a secondary zone that both claim the whole bed: + // imex_primary_zone() reports the plate clear while the blocking boxes report it full, and + // under imex_firmware_managed_zones compute_imex_slice_offset() shifts the slice by the bed + // center. Degrade to "this plate has no IMEX zones" instead — the same answer the earlier + // early returns give, and the one every consumer already handles. + if (out.primary_head < 0) + return ImexZoneLayout{}; + + // Per-gantry grouping drives Span-based aggregation. When the mode declares a + // Span partner on primary's gantry, non-primary gantries with multiple same-role + // tools collapse to one cell each (placed at primary's column so has_col_sep + // stays false and make_boxes expands the cell into a full-X row-strip). + // Mixed-role / single-tool / no-Span configurations keep per-tool cells. + const ImexGantryGrouping grouping = + group_imex_active_tools_by_gantry(active_tools_str, n_cols); + std::map group_by_gantry; + for (const auto& grp : grouping.groups) + group_by_gantry[grp.gantry_index] = &grp; + + // Separate copy and mirror secondary cells using physical coordinates + std::set> copy_cells, mirror_cells; + for (const auto& [idx, role] : zone_roles) { + if (role == ImexRole::Primary) continue; // primary handled separately + + const int phys_gantry = idx / n_cols; + auto git = group_by_gantry.find(phys_gantry); + const ImexGantryGroup* grp = (git == group_by_gantry.end()) ? nullptr : git->second; + + if (grp && grp->aggregate) { + // Only the representative contributes a cell; non-reps are folded into + // the same row-strip and skipped entirely. + if (idx != grp->representative_phys) continue; + auto [rep_c, r] = tool_to_phys(idx); + (void)rep_c; // intentionally discarded — aggregated cell pins to pri_col + if (role == ImexRole::Copy) copy_cells.insert({pri_col, r}); + else if (role == ImexRole::Mirror) mirror_cells.insert({pri_col, r}); + } else { + auto [c, r] = tool_to_phys(idx); + if (role == ImexRole::Copy) copy_cells.insert({c, r}); + else if (role == ImexRole::Mirror) mirror_cells.insert({c, r}); + } + } + + // All active secondary cells combined (for separation axis computation) + std::set> all_secondary; + for (auto& p : copy_cells) all_secondary.insert(p); + for (auto& p : mirror_cells) all_secondary.insert(p); + + double x_min = bed_extents.min(0), x_max = bed_extents.max(0); + double y_min = bed_extents.min(1), y_max = bed_extents.max(1); + + // Zone sizing is based on ACTIVE tool count per axis, not total grid dimensions. + // Inactive tools (absent from zone_roles) donate their bed share to active neighbors. + // Sorted active col/row lists map physical index k → zone index k. + std::vector active_cols_v, active_rows_v; + { + std::set ac_set, ar_set; + for (const auto& [idx, role] : zone_roles) { + auto [c, r] = tool_to_phys(idx); + ac_set.insert(c); ar_set.insert(r); + } + active_cols_v.assign(ac_set.begin(), ac_set.end()); // sorted ascending + active_rows_v.assign(ar_set.begin(), ar_set.end()); + } + int n_active_cols = std::max(1, (int)active_cols_v.size()); + int n_active_rows = std::max(1, (int)active_rows_v.size()); + + std::map col_to_zone, row_to_zone; + for (int k = 0; k < n_active_cols; ++k) col_to_zone[active_cols_v[k]] = k; + for (int k = 0; k < n_active_rows; ++k) row_to_zone[active_rows_v[k]] = k; + + double zone_w = (x_max - x_min) / n_active_cols; + double zone_h = (y_max - y_min) / n_active_rows; + + // Zone index of the primary tool + int pri_col_k = col_to_zone.count(pri_col) ? col_to_zone[pri_col] : 0; + int pri_row_k = row_to_zone.count(pri_row) ? row_to_zone[pri_row] : 0; + + // Zone center per physical head — ghost placement consumes this so that + // ghosts land in their own secondary zone instead of stacking on primary. + // Every active tool (including primary) gets an entry; ghost offset math is + // simply center[head] - center[primary]. + for (const auto& [idx, role] : zone_roles) { + auto [c, r] = tool_to_phys(idx); + int ck = col_to_zone.count(c) ? col_to_zone.at(c) : 0; + int rk = row_to_zone.count(r) ? row_to_zone.at(r) : 0; + out.head_zone_centers[idx] = Vec2d( + x_min + (ck + 0.5) * zone_w, + y_min + (rk + 0.5) * zone_h); + } + + // Separation axes: row-sep = secondaries on a different gantry, col-sep = different column + bool has_row_sep = false, has_col_sep = false; + for (const auto& [sc, sr] : all_secondary) { + if (sr != pri_row) has_row_sep = true; + if (sc != pri_col) has_col_sep = true; + } + + // Build expanded zone rects for a set of cells. + // When secondaries share only a row difference (same column as primary) → expand to full X width. + // When secondaries share only a column difference → expand to full Y height. + // When both axes differ → per-quadrant. + auto make_boxes = [&](const std::set>& cells) -> std::vector { + std::vector boxes; + if (cells.empty()) return boxes; + auto ck = [&](int c) { return col_to_zone.count(c) ? col_to_zone.at(c) : 0; }; + auto rk = [&](int r) { return row_to_zone.count(r) ? row_to_zone.at(r) : 0; }; + if (has_row_sep && !has_col_sep) { + std::set rows; for (auto& [c,r] : cells) rows.insert(r); + for (int sr : rows) { + int k = rk(sr); + boxes.emplace_back(Vec2d(x_min, y_min + k*zone_h), Vec2d(x_max, y_min + (k+1)*zone_h)); + } + } else if (has_col_sep && !has_row_sep) { + std::set cols; for (auto& [c,r] : cells) cols.insert(c); + for (int sc : cols) { + int k = ck(sc); + boxes.emplace_back(Vec2d(x_min + k*zone_w, y_min), Vec2d(x_min + (k+1)*zone_w, y_max)); + } + } else { + for (auto& [sc,sr] : cells) { + int ck_ = ck(sc), rk_ = rk(sr); + boxes.emplace_back(Vec2d(x_min + ck_*zone_w, y_min + rk_*zone_h), + Vec2d(x_min + (ck_+1)*zone_w, y_min + (rk_+1)*zone_h)); + } + } + return boxes; + }; + + out.copy_zones = make_boxes(copy_cells); + out.mirror_zones = make_boxes(mirror_cells); + + // --- Secondary zone blocking --- + // The expanded bounding boxes for all secondary (copy+mirror) zones. check_outside() + // uses these to prevent objects being placed outside the primary zone. + auto push_secondary_box = [&](const std::vector& boxes) { + for (const auto& b : boxes) + out.secondary_zone_boxes.emplace_back(Vec3d(b.min.x(), b.min.y(), -1.0), + Vec3d(b.max.x(), b.max.y(), 1e4)); + }; + push_secondary_box(out.copy_zones); + push_secondary_box(out.mirror_zones); + + // --- Carriage collision danger strips --- + // Only add strips at boundaries of the PRIMARY zone — objects are only placed in the + // primary zone, so secondary-to-secondary boundaries have no relevance. + // + // Strip width is the literal nozzle clearance value on the primary side only: + // right X boundary: [bnd_x - nozzle_clearance_x, bnd_x] + // left X boundary: [bnd_x, bnd_x + nozzle_clearance_x] + // top Y boundary: [bnd_y - nozzle_clearance_y, bnd_y] + // bottom Y boundary:[bnd_y, bnd_y + nozzle_clearance_y] + // + // Strip length matches the primary zone extent (same expansion logic as make_boxes): + // !has_row_sep → full bed height; has_row_sep → primary row only + // !has_col_sep → full bed width; has_col_sep → primary column only + + // Both strip blocks below are gated on `carriage_w > 0.0` / `carriage_h > 0.0`, so a zero + // clearance emits no collision strips at all while the preview still draws toolhead boxes. + // That is why these read through imex_cfg_float() rather than carrying a literal: the value + // for an absent key comes from the option's own registration, not from a number repeated here. + double carriage_w = imex_cfg_float(printer_cfg, "imex_nozzle_clearance_x"); + double carriage_h = imex_cfg_float(printer_cfg, "imex_nozzle_clearance_y"); + double margin = imex_cfg_float(printer_cfg, "imex_carriage_margin"); + + // Primary zone extent (the clear printable area): + // row-sep only → full bed width × primary row's Y band + // col-sep only → primary col's X band × full bed height + // both → primary quadrant + // Uses zone indices so inactive tools don't shrink the zone. + double pz_x0 = has_col_sep ? x_min + pri_col_k * zone_w : x_min; + double pz_x1 = has_col_sep ? x_min + (pri_col_k + 1) * zone_w : x_max; + double pz_y0 = has_row_sep ? y_min + pri_row_k * zone_h : y_min; + double pz_y1 = has_row_sep ? y_min + (pri_row_k + 1) * zone_h : y_max; + out.primary_zone_box = BoundingBoxf(Vec2d(pz_x0, pz_y0), Vec2d(pz_x1, pz_y1)); + + auto add_strip = [&](double sx0, double sx1, double sy0, double sy1) { + out.collision_zones.emplace_back(Vec3d(sx0, sy0, -1.0), Vec3d(sx1, sy1, 1e4)); + }; + auto add_margin_band = [&](double sx0, double sx1, double sy0, double sy1) { + out.margin_bands.emplace_back(Vec2d(sx0, sy0), Vec2d(sx1, sy1)); + }; + + // Determine which directions have mirror secondaries adjacent to the primary. + // Only mirror tools can cause carriage collisions — they move toward each other. + // Copy tools always move in the same direction, so no collision strip is needed. + // + // Driven by `mirror_cells`, not by zone_roles: on an AGGREGATED gantry the cell is + // pinned to the primary's column and make_boxes then expands it into a full-width row + // strip, so the painted zone — not any one head's own cell — is what the primary's + // carriage can meet. Reading each head's own cell instead lost the strip whenever the + // representative's column differed from the primary's: at tpg=3, gantry_count=2, mode + // "0:P,1:S,4:M,5:M" the rear gantry paints a full-width mirror strip against the + // primary's rear boundary, yet neither T4 (col 1) nor T5 (col 2) is in the primary's + // column, so no strip and no margin band were emitted at all. + // + // Both axes require zone-adjacent AND same row/column on the OTHER axis: a mirror + // diagonally offset from primary (different row AND different column) can't collide + // with primary's carriage on either axis since the gantries don't overlap there. + // Without these checks, paired-gantry mc-mirror (`0:P,1:S,2:M,3:M`) would draw a + // spurious right-edge strip from T3 even though T3 lives on the other gantry's row. + // + // The adjacency tests (±1) are in ZONE indices so an inactive column or row between + // two active ones cannot hide the boundary they really share (see "inactive tools + // donate their bed share"), while the co-linearity test on the other axis stays in + // physical indices. The two forms agree for any cell that owns a zone — col_to_zone + // and row_to_zone are order-preserving bijections over exactly the active indices — + // so this is one rule written two ways, not two rules. + bool has_right_sec = false, has_left_sec = false; + bool has_top_sec = false, has_bottom_sec = false; + for (const auto& [sc, sr] : mirror_cells) { + int zc = col_to_zone.count(sc) ? col_to_zone.at(sc) : -1; + int zr = row_to_zone.count(sr) ? row_to_zone.at(sr) : -1; + if (zc < 0 || zr < 0) continue; // no zone of its own, so no boundary with primary + // X-boundary strips: mirror zone-adjacent in X, same physical row as primary. + if (zr == pri_row_k && zc == pri_col_k + 1) has_right_sec = true; + if (zr == pri_row_k && zc == pri_col_k - 1) has_left_sec = true; + // Y-boundary strips: mirror zone-adjacent in Y, same physical column as primary. + if (zr == pri_row_k + 1 && sc == pri_col) has_top_sec = true; + if (zr == pri_row_k - 1 && sc == pri_col) has_bottom_sec = true; + } + + // X-axis boundaries (vertical strips, width = nozzle_clearance_x on primary side) + if (carriage_w > 0.0) { + if (has_right_sec) { + double bnd_x = x_min + (pri_col_k + 1) * zone_w; + double strip_inner = bnd_x - carriage_w; + add_strip(strip_inner, bnd_x, pz_y0, pz_y1); + if (margin > 0.0) + add_margin_band(strip_inner - margin, strip_inner, pz_y0, pz_y1); + } + if (has_left_sec) { + double bnd_x = x_min + pri_col_k * zone_w; + double strip_inner = bnd_x + carriage_w; + add_strip(bnd_x, strip_inner, pz_y0, pz_y1); + if (margin > 0.0) + add_margin_band(strip_inner, strip_inner + margin, pz_y0, pz_y1); + } + } + + // Y-axis boundaries (horizontal strips, width = nozzle_clearance_y on primary side) + if (carriage_h > 0.0) { + if (has_top_sec) { + double bnd_y = y_min + (pri_row_k + 1) * zone_h; + double strip_inner = bnd_y - carriage_h; + add_strip(pz_x0, pz_x1, strip_inner, bnd_y); + if (margin > 0.0) + add_margin_band(pz_x0, pz_x1, strip_inner - margin, strip_inner); + } + if (has_bottom_sec) { + double bnd_y = y_min + pri_row_k * zone_h; + double strip_inner = bnd_y + carriage_h; + add_strip(pz_x0, pz_x1, bnd_y, strip_inner); + if (margin > 0.0) + add_margin_band(pz_x0, pz_x1, strip_inner, strip_inner + margin); + } + } + + return out; +} + +} // namespace Slic3r diff --git a/src/libslic3r/IMEXZones.hpp b/src/libslic3r/IMEXZones.hpp new file mode 100644 index 0000000000..45bc959101 --- /dev/null +++ b/src/libslic3r/IMEXZones.hpp @@ -0,0 +1,94 @@ +#pragma once + +#include +#include +#include +#include + +#include "libslic3r/BoundingBox.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/PrintConfig.hpp" + +namespace Slic3r { + +// Where every IMEX bed zone, carriage collision strip and advisory margin band sits, in +// plate-local millimetres. Purely geometric: no rendering, no clipping against the bed +// outline, no GUI types. PartPlate turns the rectangles into GLModels (clipping each one +// to the bed polygon as it goes) and copies the boxes straight into the members that +// check_outside() consults, so this struct is the whole answer to "which boxes". +// +// Every list is empty and `primary_zone_box` unset when no parallel mode is in effect — +// IMEX off, Primary mode, a 1x1 tool grid, a mode whose tool roster is empty, or a mode +// whose Primary tool is not on the current grid (no `:P` marker, or a `:P` index left +// over from a wider grid). The whole layout hangs off the primary's cell, so without one +// there is nothing to divide and consumers must see the same "no zones" answer. +struct ImexZoneLayout +{ + // Physical T-index of the active mode's Primary tool; -1 when the layout is empty. + int primary_head = -1; + + // Physical head -> XY center of that head's zone. One entry per tool the mode makes + // active, Primary included. A Span tool has no entry: it shares the primary's zone + // rather than owning one. Ghost placement offsets by center[head] - center[primary]. + // + // EXCEPTION, read before using the X component. These centers are built from the head's + // OWN grid cell, but an AGGREGATED representative's zone rectangle is pinned to the + // primary's column and then expanded to a full-width row strip. So for an aggregated head + // whose own column differs from the primary's, center[head].x names a column its painted + // zone does not have, and `center[head] - center[primary]` carries a bogus X offset. + // Reachable at imex_tools_per_gantry >= 3 when the primary-column tool on the aggregated + // gantry is inactive (e.g. tpg=3, gantry_count=2, mode "0:P,1:S,4:M,5:M"). + // Both current consumers pin X to the primary's center for aggregated heads -- + // PartPlate::calc_imex_ghosts() via bed_x_center, GCodeViewer via sec_center_of() -- and a + // new consumer must do the same until this is either pinned here or the aggregate flag is + // exposed on the layout. + std::map head_zone_centers; + + // The clear printable area — the primary tool's zone. Objects go here and nowhere else. + std::optional primary_zone_box; + + // Copy / Mirror zone rectangles, already expanded along whichever axis carries no + // separation: secondaries differing from primary only by row give full-bed-width + // strips, only by column give full-bed-height strips, and differing on both axes give + // per-tool quadrants. + std::vector copy_zones; + std::vector mirror_zones; + + // `copy_zones` followed by `mirror_zones`, as full-height boxes for the placement + // check. An object overlapping one of these is outside the primary zone. + std::vector secondary_zone_boxes; + + // Carriage danger strips lying just inside the primary zone's boundary, one per + // boundary that faces an adjacent Mirror ZONE -- an aggregated gantry contributes the + // one pinned zone it paints, not one per head -- in right / left / top / bottom order. + // Width is the literal nozzle clearance for that axis. Copy tools never contribute: + // they travel in the same direction as the primary and cannot close on it. + std::vector collision_zones; + + // Advisory (non-blocking) bands immediately inside each collision strip, present only + // when imex_carriage_margin > 0. Same boundary order as `collision_zones`. + std::vector margin_bands; +}; + +// Computes the IMEX zone layout for one plate. +// +// `printer_cfg` — the edited printer preset's config. Read for is_imex, the tool grid +// (imex_gantry_count / imex_tools_per_gantry / imex_tool_layout), the +// mode roster (imex_mode_names / imex_mode_active_tools) and the strip +// widths (imex_nozzle_clearance_x / _y, imex_carriage_margin). A key absent +// from the config falls back to the value registered for that option in +// print_config_def, via the imex_cfg_* accessors. +// `plate_mode` — the plate's own IMEX mode. Wins over the process preset unless it is +// `kImexPrimaryMode`. +// `process_mode` — the process preset's `imex_parallel_mode`, used only as the fallback +// when `plate_mode` is `kImexPrimaryMode`. Pass "" when unavailable. +// `bed_extents` — XY extents of the plate shape, in plate-local mm. Zones subdivide it. +// +// Zone sizing keys off the count of ACTIVE tools per axis rather than the grid dimensions, +// so a tool the mode leaves out donates its share of the bed to its active neighbours. +ImexZoneLayout compute_imex_zone_layout(const DynamicPrintConfig& printer_cfg, + const std::string& plate_mode, + const std::string& process_mode, + const BoundingBoxf& bed_extents); + +} // namespace Slic3r diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 5b8127b122..78fa0785ef 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1473,6 +1473,9 @@ static std::vector s_Preset_print_options{ "interlocking_boundary_avoidance", "interlocking_beam_width", "calib_flowrate_topinfill_special_order", + // IDEX/IQEX parallel print mode (per-print selection) + "imex_parallel_mode", + "imex_head_filament_map", // Z Anti-Aliasing (ZAA) "zaa_enabled", "zaa_minimize_perimeter_height", @@ -1591,6 +1594,11 @@ static std::vector s_Preset_printer_options { "z_offset", "disable_m73", "preferred_orientation", "emit_machine_limits_to_gcode", "pellet_modded_printer", "support_multi_bed_types", "use_3mf", "default_bed_type", "bed_mesh_min","bed_mesh_max","bed_mesh_probe_distance", "adaptive_bed_mesh_margin", "enable_long_retraction_when_cut","long_retractions_when_cut","retraction_distances_when_cut", "bed_temperature_formula", "nozzle_flush_dataset", + // IDEX/IQEX (independent X extruder) — printer capability and user-defined modes + "is_imex", "imex_firmware_managed_zones", + "imex_gantry_count", "imex_tools_per_gantry", "imex_tool_layout", + "imex_nozzle_clearance_x", "imex_nozzle_clearance_y", "imex_carriage_margin", "imex_viz_theme", + "imex_mode_names", "imex_mode_active_tools", "imex_mode_gcodes", // Multi-nozzle count + pre-heat model printer options "extruder_max_nozzle_count", "group_algo_with_time", "enable_pre_heating", "hotend_heating_rate", "hotend_cooling_rate", "machine_hotend_change_time", "machine_prepare_compensation_time", diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 7ec2b59ca0..8215cb3aef 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -29,6 +30,7 @@ #include #include "PresetBundle.hpp" +#include "PrinterBedAssets.hpp" #include "Config.hpp" #include "Exception.hpp" @@ -64,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -114,6 +117,12 @@ static std::vector s_project_options { "nozzle_volume_type", "filament_map_mode", "filament_map", + // physical_extruder_map intentionally NOT here: it's owned by the printer + // preset (s_Preset_printer_options). Listing it project-scoped caused + // project_config's default [0] to clobber the preset's authored value + // (e.g. AFC-shaped [0,1,1,1,1]) during full_fff_config() merge, and the + // clobbered value then rode into saved 3mfs and back into the edited + // preset on reload. // Per-filament nozzle-volume choice; project-level like filament_map so the per-filament // slot resolution survives preset switches. "filament_volume_map", @@ -1672,6 +1681,258 @@ bool PresetBundle::apply_vendor_config( return true; } +namespace { + +// The two bed files a printer bundle can carry. Zip names are bed//, never the source basename. +struct BedAssetSlot { + const char *option; + const char *stem; +}; + +constexpr BedAssetSlot k_bed_asset_slots[] = { + {"bed_custom_texture", "texture"}, + {"bed_custom_model", "model"}, +}; + +std::string zip_slashes(std::string name) +{ + for (char &c : name) + if (c == '\\') + c = '/'; + return name; +} + +// The bed dialog loads only png/svg textures and stl models. Anything else is not a bed asset. +bool bed_extension_allowed(const char *option, const std::string &ext) +{ + if (std::string(option) == "bed_custom_texture") + return boost::iequals(ext, ".png") || boost::iequals(ext, ".svg"); + if (std::string(option) == "bed_custom_model") + return boost::iequals(ext, ".stl"); + return false; +} + +// Extension including the dot, or empty when this option may not use it. +std::string bed_asset_extension(const std::string &path, const char *option) +{ + const auto slash = path.find_last_of("/\\"); + const auto base = slash == std::string::npos ? 0 : slash + 1; + const auto dot = path.find_last_of('.'); + if (dot == std::string::npos || dot < base || dot + 1 >= path.size()) + return {}; + const std::string ext = path.substr(dot); + if (!bed_extension_allowed(option, ext)) + return {}; + return ext; +} + +bool utf8_is_file(const std::string &path) +{ + if (path.empty()) + return false; + boost::system::error_code ec; +#ifdef _WIN32 + // A narrow path is the ANSI code page unless nowide_filesystem() has run. + const std::wstring wide = boost::nowide::widen(path); + if (wide.empty()) + return false; + return boost::filesystem::is_regular_file(boost::filesystem::path(wide), ec) && !ec; +#else + return boost::filesystem::is_regular_file(path, ec) && !ec; +#endif +} + +std::string bed_asset_dest_utf8(const fs::path &dest) +{ +#ifdef _WIN32 + return boost::nowide::narrow(dest.wstring()); +#else + return dest.string(); +#endif +} + +// True only for bed// with an extension the bed dialog accepts for this field. +bool accepted_bed_zip_name(const std::string &raw, const BedAssetSlot &slot, const fs::path &bundle_dir, + std::string &zip_name, std::string &folder) +{ + const std::string name = zip_slashes(raw); + if (name.find("..") != std::string::npos) + return false; + if (name.size() < 8 || name.compare(0, 4, "bed/") != 0) + return false; + const auto slash = name.find('/', 4); + if (slash == std::string::npos || slash == 4 || name.find('/', slash + 1) != std::string::npos) + return false; + const std::string digits = name.substr(4, slash - 4); + for (unsigned char c : digits) { + if (!std::isdigit(c)) + return false; + } + const std::string filename = name.substr(slash + 1); + const std::string ext = bed_asset_extension(filename, slot.option); + if (ext.empty() || filename != std::string(slot.stem) + ext) + return false; + if (!is_path_within_root(name, bundle_dir)) + return false; + zip_name = name; + folder = digits; + return true; +} + +struct PendingBedAsset { + std::string option; + std::string zip_name; + std::string dest; + std::string printer_key; + fs::path final_path; + fs::path staged; +}; + +// Validated asset names only. A raw manifest value that fails the check is not skipped later, +// so a value like printer/Name.json cannot hide that preset. +// printer_asset is keyed by printer_config zip entry. A flat (unkeyed) object is not read. +std::vector pending_bed_assets(const json &bundle_json, const fs::path &bundle_dir, + std::unordered_set &skip_names, + const std::unordered_set &zip_entries) +{ + std::vector pending; + if (!bundle_json.contains("printer_asset") || !bundle_json["printer_asset"].is_object()) + return pending; + const json &assets = bundle_json["printer_asset"]; + for (auto it = assets.begin(); it != assets.end(); ++it) { + const std::string printer_key = it.key(); + if (zip_entries.count(printer_key) == 0) { + BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset entry is ignored, no matching printer in the zip: " << printer_key; + continue; + } + if (!it.value().is_object()) + continue; + const json &per_printer = it.value(); + for (const BedAssetSlot &slot : k_bed_asset_slots) { + if (!per_printer.contains(slot.option) || !per_printer[slot.option].is_string()) + continue; + const std::string raw = per_printer[slot.option].get(); + std::string zip_name; + std::string folder; + if (!accepted_bed_zip_name(raw, slot, bundle_dir, zip_name, folder)) { + BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset path is rejected: " << raw; + continue; + } + const std::string filename = zip_name.substr(zip_name.rfind('/') + 1); + const fs::path final_path = fs::absolute(bundle_dir / "bed" / folder / filename); + pending.push_back({slot.option, zip_name, bed_asset_dest_utf8(final_path), printer_key, final_path, {}}); + skip_names.insert(zip_name); + } + } + return pending; +} + +// Stage under temp_folder. The bundle bed/ directory is not touched until a printer preset keeps the path. +bool stage_bed_asset(mz_zip_archive &zip, PendingBedAsset &asset, const fs::path &temp_folder) +{ + size_t size = 0; + void *buf = mz_zip_reader_extract_file_to_heap(&zip, asset.zip_name.c_str(), &size, MZ_ZIP_FLAG_CASE_SENSITIVE); + if (buf == nullptr) { + BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset is missing, skipping " << asset.option << ": " << asset.zip_name; + return false; + } + const std::string filename = asset.zip_name.substr(asset.zip_name.rfind('/') + 1); + asset.staged = temp_folder / "bed" / asset.final_path.parent_path().filename() / filename; + boost::system::error_code ec; + fs::create_directories(asset.staged.parent_path(), ec); + const std::string staged_utf8 = bed_asset_dest_utf8(asset.staged); + bool wrote = false; + if (!ec) { + boost::nowide::ofstream out(staged_utf8, std::ios::binary | std::ios::trunc); + wrote = static_cast(out); + if (wrote && size > 0) + wrote = static_cast(out.write(static_cast(buf), static_cast(size))); + } + mz_free(buf); + if (!wrote) { + BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset could not be written, skipping " << asset.option << ": " << staged_utf8; + fs::remove(asset.staged, ec); + return false; + } + return true; +} + +bool install_bed_asset(const PendingBedAsset &asset) +{ + boost::system::error_code ec; + fs::create_directories(asset.final_path.parent_path(), ec); + if (!ec) + fs::copy_file(asset.staged, asset.final_path, fs::copy_options::overwrite_existing, ec); + if (ec) { + BOOST_LOG_TRIVIAL(warning) << "Printer bundle asset could not be installed: " << asset.dest; + return false; + } + return true; +} + +bool is_pending_bed_asset_entry(const std::string &entry, const std::unordered_set &names) +{ + return names.count(entry) != 0 || names.count(zip_slashes(entry)) != 0; +} + +bool printer_kept_bed_paths(const PresetCollection &printers, const std::map &paths) +{ + if (paths.empty()) + return false; + for (const Preset &preset : printers.get_presets()) { + for (const auto &entry : paths) + if (preset.config.opt_string(entry.first) == entry.second) + return true; + } + return false; +} + +} // namespace + +bool append_printer_bed_assets(mz_zip_archive &zip, const DynamicPrintConfig &config, json &bundle_structure, + const std::string &printer_config_entry, int printer_index) +{ + if (printer_config_entry.empty() || printer_index < 0) + return true; + json assets = json::object(); + for (const BedAssetSlot &slot : k_bed_asset_slots) { + if (!config.has(slot.option)) + continue; + const std::string stored = config.opt_string(slot.option); + if (stored.empty()) + continue; + if (!utf8_is_file(stored)) { + BOOST_LOG_TRIVIAL(warning) << "Bed asset file is missing, skipping " << slot.option << ": " << stored; + continue; + } + const std::string ext = bed_asset_extension(stored, slot.option); + if (ext.empty()) { + BOOST_LOG_TRIVIAL(warning) << "Bed asset extension is not packable, skipping " << slot.option << ": " << stored; + continue; + } + boost::nowide::ifstream in(stored, std::ios::binary); + if (!in) { + BOOST_LOG_TRIVIAL(warning) << "Bed asset file cannot be read, skipping " << slot.option << ": " << stored; + continue; + } + const std::string bytes((std::istreambuf_iterator(in)), std::istreambuf_iterator()); + if (in.bad()) { + BOOST_LOG_TRIVIAL(warning) << "Bed asset file cannot be read, skipping " << slot.option << ": " << stored; + continue; + } + const std::string zip_name = std::string("bed/") + std::to_string(printer_index) + "/" + slot.stem + ext; + const void *data = bytes.empty() ? static_cast("") : static_cast(bytes.data()); + if (mz_zip_writer_add_mem(&zip, zip_name.c_str(), data, bytes.size(), MZ_DEFAULT_COMPRESSION) == MZ_FALSE) { + BOOST_LOG_TRIVIAL(error) << "Failed to add bed asset to printer bundle: " << zip_name; + return false; + } + assets[slot.option] = zip_name; + } + if (!assets.empty()) + bundle_structure["printer_asset"][printer_config_entry] = std::move(assets); + return true; +} + // Import presets from UI control PresetsConfigSubstitutions PresetBundle::import_presets(std::vector & files, std::function override_confirm, @@ -1767,14 +2028,44 @@ PresetsConfigSubstitutions PresetBundle::import_presets(std::vector BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " No bundle_structure.json found, importing presets into the user preset directory"; } + json bundle_json = json::object(); + std::unordered_set bed_asset_entries; + std::vector bed_assets; + std::map> bed_paths_by_printer; + bool bed_paths_loaded = false; + if (has_bundle_structure && !bundle_base_dir.empty()) { + try { + boost::nowide::ifstream manifest_in(metadata_path.string()); + manifest_in >> bundle_json; + } catch (const std::exception &err) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << " failed to read bundle manifest: " << err.what(); + bundle_json = json::object(); + } + std::unordered_set zip_entries; + const int zip_file_count = mz_zip_reader_get_num_files(&zip_archive); + for (int zi = 0; zi < zip_file_count; ++zi) { + mz_zip_archive_file_stat st; + if (mz_zip_reader_file_stat(&zip_archive, zi, &st)) + zip_entries.insert(zip_slashes(st.m_filename)); + } + bed_assets = pending_bed_assets(bundle_json, bundle_base_dir, bed_asset_entries, zip_entries); + for (PendingBedAsset &asset : bed_assets) + if (stage_bed_asset(zip_archive, asset, temp_folder)) + bed_paths_by_printer[asset.printer_key].emplace(asset.option, asset.dest); + } + // Extract Files int num_files = mz_zip_reader_get_num_files(&zip_archive); + const std::map no_bed_paths; for (int i = 0; i < num_files; i++) { mz_zip_archive_file_stat file_stat; status = mz_zip_reader_file_stat(&zip_archive, i, &file_stat); if (status) { std::string file_name = file_stat.m_filename; + const std::string zip_entry = zip_slashes(file_name); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " From zip file: " << file << ". Read file name: " << file_stat.m_filename; + if (is_pending_bed_asset_entry(file_name, bed_asset_entries)) + continue; size_t index = file_name.find_last_of("/\\"); if (std::string::npos != index) { file_name = file_name.substr(index + 1); @@ -1792,13 +2083,26 @@ PresetsConfigSubstitutions PresetBundle::import_presets(std::vector if (MZ_FALSE == status) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Failed to open target file: " << target_file_path; } else { + const auto paths_it = bed_paths_by_printer.find(zip_entry); + const std::map &this_bed_paths = + paths_it != bed_paths_by_printer.end() ? paths_it->second : no_bed_paths; bool is_success = import_json_presets(substitutions, target_file_path, override_confirm, rule, overwrite, result, - has_bundle_structure ? bundle_base_dir.string() : std::string()); + has_bundle_structure ? bundle_base_dir.string() : std::string(), + this_bed_paths, &bed_paths_loaded); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " import target file: " << target_file_path << " import result" << is_success; } } } + // Copy into bed/ only after this import loads a printer that still holds the staged path. + // A preset left from an earlier import must not count: declining this import leaves its files alone. + if (bed_paths_loaded) { + for (const PendingBedAsset &asset : bed_assets) { + if (printer_kept_bed_paths(printers, {{asset.option, asset.dest}})) + install_bed_asset(asset); + } + } + // Set imported_time to current time if not already set if (metadata.imported_time == 0) { metadata.imported_time = std::time(nullptr); @@ -1840,7 +2144,9 @@ bool PresetBundle::import_json_presets(PresetsConfigSubstitutions & s ForwardCompatibilitySubstitutionRule rule, int & overwrite, std::vector & result, - const std::string & bundle_dir) + const std::string & bundle_dir, + const std::map & bed_asset_paths, + bool * bed_paths_loaded) { try { DynamicPrintConfig config; @@ -1904,6 +2210,10 @@ bool PresetBundle::import_json_presets(PresetsConfigSubstitutions & s if (inherit_preset) inherits_value = inherit_preset->name; // keep the base_id redo below in sync } + if (collection == &printers) { + for (const auto &entry : bed_asset_paths) + config.option(entry.first, true)->value = entry.second; + } if (inherit_preset) { new_config = inherit_preset->config; new_config.apply(std::move(config)); @@ -1921,6 +2231,8 @@ bool PresetBundle::import_json_presets(PresetsConfigSubstitutions & s new_config.apply(std::move(config)); extend_default_config_length(new_config, true, default_preset.config); } + if (bed_paths_loaded != nullptr && collection == &printers && !bed_asset_paths.empty()) + *bed_paths_loaded = true; Preset &preset = collection->load_preset(collection->path_from_name(name, inherit_preset == nullptr), preset_name, std::move(new_config), false); preset.bundle_id = load_origin.bundle_id; diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 797602922b..c6f79b741e 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -319,7 +319,9 @@ public: ForwardCompatibilitySubstitutionRule rule, int& overwrite, std::vector& result, - const std::string& bundle_dir = ""); + const std::string& bundle_dir = "", + const std::map &bed_asset_paths = {}, + bool *bed_paths_loaded = nullptr); void save_user_presets(AppConfig& config, std::map& need_to_delete_list); void check_and_fix_user_presets_syncinfo(const std::string& user_id); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 5603716064..026a6fce9b 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -55,6 +55,8 @@ #include "TriangleMesh.hpp" #include "Config.hpp" #include "Exception.hpp" +#include "IMEXHelpers.hpp" +#include "IMEXZones.hpp" #include "Print.hpp" #include "BoundingBox.hpp" #include "Brim.hpp" @@ -519,6 +521,12 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n } else if (opt_key == "z_hop_types") { osteps.emplace_back(posDetectOverhangsForLift); + } + // The bed-zone colour scheme and the advisory margin bands are drawn from the printer + // config but never reach the slice: compute_imex_zone_layout keeps the margin out of + // primary_zone_box, which is the only part of the layout update_imex_slice_offset reads. + // imex_tool_layout does move that box, so it is left to the fallback below. + else if (opt_key == "imex_viz_theme" || opt_key == "imex_carriage_margin") { } else { // for legacy, if we can't handle this option let's invalidate all steps //FIXME invalidate all steps of all objects as well? @@ -1851,6 +1859,132 @@ StringObjectException Print::validate(std::vector *warnin if (extruders.empty()) return { L("No extrusions under current settings.") }; + // IDEX/IQEX: block multi-color in non-primary parallel modes when the active + // configuration can't physically support it (no within-gantry toolchange path + // or MMU lane sharing). See imex_multicolor_block_reason() for the full rule. + // Both IMEX checks below need the active mode's tools string and its declared primary, + // so imex_resolve_routing() derives them once for the whole block -- and is the same call + // the plater's pre-slice warning makes, so the two cannot describe the plate differently. + // Note this block is NOT gated on extruders.size() > 1: the primary + // routing check applies to a single-filament plate too, which is its most common case. + if (m_config.is_imex.value && !m_objects.empty()) { + const std::string& parallel_mode = m_objects.front()->config().imex_parallel_mode.value; + if (!parallel_mode.empty() && parallel_mode != kImexPrimaryMode) { + // Tool changes added from the layer slider switch heads mid-print as a painted color + // does, so they count here, as the plate's warning badge counts them. + const std::vector imex_extruders = this->extruders(/*conside_custom_gcode=*/true); + std::vector used_filaments_0b; + std::vector used_slots_1b; + used_filaments_0b.reserve(imex_extruders.size()); + used_slots_1b.reserve(imex_extruders.size()); + for (unsigned int e : imex_extruders) { + used_filaments_0b.push_back((int)e); + used_slots_1b.push_back((int)e + 1); + } + + // The active mode's tools string, its declared primary, and whether this plate's + // filaments reach that primary are all derived ONCE, here. The plater's pre-slice + // warning (collect_imex_warnings) makes the identical call, so the sentence it + // shows before slicing and the refusal below cannot describe the plate + // differently. An unresolved mode, and a mode the tools array is too short to + // cover, both yield an empty roster and no primary. + const ImexRouting routing = imex_resolve_routing(m_config, parallel_mode, used_slots_1b, + m_config.physical_extruder_map); + + // A mixed filament is blended at the nozzle by its component toolheads, and a + // parallel mode is already using those toolheads to print copies or mirrors, so + // the two cannot run at once -- regardless of where the components are routed. + // + // Runs before BOTH rules below. Against the routing rule it would otherwise be + // reported as merely unrouted: mixed slots are kept at the tail of the filament + // arrays, past the physical filament count, so on a printer whose logical extruder + // count equals that count they fall outside physical_extruder_map and resolve to no + // head. Against the multi-color rule, a mixed slot plus any second filament trips + // the >1 gate and earns a lecture about gantry topology the user never configured. + // Being unsupported outright, this dominates both. + { + const auto& is_mixed = m_config.filament_is_mixed.values; + if (std::any_of(used_filaments_0b.begin(), used_filaments_0b.end(), + [&](int slot) { return slot >= 0 && slot < (int) is_mixed.size() && is_mixed[slot]; })) { + StringObjectException err; + // "Mixed filament" is the term the rest of the UI uses -- the button that + // creates one, and the sibling refusal for the wipe tower filament. + err.string = L("Mixed filaments are not supported in IDEX/IQEX parallel modes. " + "Switch this plate to Primary mode."); + err.object = m_objects.front(); + return err; + } + } + + // Multi-color has the more specific rule and its remedies are self-contained + // (an MMU manifold sharing one head cannot be fixed by switching mode), so it runs + // ahead of the routing block below, which would otherwise mask it with advice that + // leads to this error on the next slice. validate() returns on the first error. + if (used_filaments_0b.size() > 1) { + const std::string reason = imex_multicolor_block_reason( + parallel_mode, + routing.active_tools, + m_config.imex_tools_per_gantry.value, + used_filaments_0b, + m_config.physical_extruder_map); + if (!reason.empty()) + return { reason }; + } + + // The IMEX Primary tool prints the sliced paths directly, so it can only use a + // filament the printer's physical_extruder_map routes to it. The ghost filament + // picker already enforces this for the secondary tools; the primary's filament + // comes from the ordinary object filament selector, which has no IMEX awareness, + // so nothing detected the mismatch. collect_imex_warnings() reads the SAME + // routing.primary_logical off the same derivation, and discards it into a display + // fallback so its warning still has a filament to name. + // + // Blocks rather than warns, matching the multi-color rule above -- but on intent, + // not on physics, and the distinction matters to anyone tempted to relax it. The + // emitter does not use the declared primary: it re-derives an effective one from + // the filament actually in use (GCode.cpp's initial_extruder_id -> pem lookups), so + // a plate whose only filament sits on a Span tool sharing the primary's gantry does + // produce coherent G-code. It is refused anyway. A parallel mode exists to run + // carriages in parallel; a single-colour plate riding one span lane is not that, and + // silently accepting it would make the mode's declared roster meaningless. + // + // Where the routed head is absent from the mode's active tools the plate is broken + // outright, not merely off-intent: the 1st->2nd layer temperature + // branch (GCode.cpp, mutually exclusive with the standard path) skips it too, so + // that head holds nozzle_temperature_initial_layer for the whole job. First-layer + // temperatures are unaffected -- _print_first_layer_extruder_temperatures is not + // IMEX-branched -- so this is a stuck-hot nozzle, not a cold one. + // + // `primary_unrouted` is the whole condition: a declared primary, a populated + // routing map, and nothing used reaching it. Blended slots would also read as + // unrouted -- they sit past the map by construction -- but they never get here, + // the mixed-filament rule above returns first. + if (routing.primary_unrouted) { + std::string routed_list; + for (int head : routing.routed_heads) + routed_list += (routed_list.empty() ? "T" : ", T") + std::to_string(head); + // Print::apply() normalises physical_extruder_map through + // effective_physical_extruder_map (PrintApply.cpp) before validate() runs, so + // an unauthored map arrives here as the identity and every slot is in range. + // What is left is a printer with more filaments than logical extruders, where + // the tail slots fall outside the map. Narrow, but without this the sentence + // ends in a dangling "on .". + if (routed_list.empty()) + routed_list = L("no configured tool"); + + StringObjectException err; + err.string = Slic3r::format( + L("IDEX/IQEX mode \"%1%\" prints with T%2%, but this plate's filaments are on %3%. " + "Assign a filament loaded on T%2%, or switch this plate to Primary mode."), + parallel_mode, routing.primary_phys, routed_list); + // Gives the notification a "Jump to " link, which selects the object + // and switches to Prepare -- directly enabling the first suggested remedy. + err.object = m_objects.front(); + return err; + } + } + } + // Belt printer validation: incompatible features. if (m_config.belt_printer.value) { for (const PrintObject *object : m_objects) { @@ -2969,6 +3103,10 @@ void Print::process(long long *time_cost_with_cache, bool use_cache) name_tbb_thread_pool_threads_set_locale(); + // IMEX firmware-managed zones: settle the emission-frame shift from the applied config + // before anything runs. Zero for every printer that is not IMEX + firmware-managed. + this->update_imex_slice_offset(); + //compute the PrintObject with the same geometries BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": this=%1%, enter, use_cache=%2%, object size=%3%")%this%use_cache%m_objects.size(); if (m_objects.empty()) @@ -3688,7 +3826,16 @@ std::string Print::export_gcode(const std::string& path_template, GCodeProcessor gcode = std::make_unique(); //BBS: compute plate offset for gcode-generator const Vec3d origin = this->get_plate_origin(); - gcode->set_gcode_offset(origin(0), origin(1)); + // IMEX firmware-managed zones: writer offset gets the IMEX shift so emitted gcode is + // centered at bed origin; processor offset stays at plate_origin so the gcode-preview + // visualizer renders the centered slice at the bed center rather than the prepare-view + // zone placement. Both arms reduce to set_gcode_offset() semantics when shift is zero. + // Derived here rather than read as pushed-in state, so an exporter reached without a + // preceding process() (or after a config change that only invalidated psGCodeExport) + // still emits in the frame the current config asks for. + this->update_imex_slice_offset(); + const Vec2d imex_off = this->get_imex_slice_offset(); + gcode->set_gcode_offset_with_imex_shift(origin(0), origin(1), imex_off.x(), imex_off.y()); gcode->do_export(this, path.c_str(), result, thumbnail_cb); gcode->export_layer_filaments(result); //BBS @@ -4116,14 +4263,60 @@ Points Print::first_layer_wipe_tower_corners(bool check_wipe_tower_existance) co return corners; } +// IMEX firmware-managed zones: derive the slice-time XY shift from the config that has +// already been applied to this Print, so the engine never has to be told what it can work +// out. Deriving it here rather than taking a push from PartPlate is what makes a headless +// slice correct: the CLI builds a PartPlateList but drives no plater, so nothing ever ran +// the GUI-side handoff and the shift silently stayed at zero while the mode G-code told the +// firmware to fan copies out — parts in the wrong place, no diagnostic. +// +// Inputs, all reachable without a GUI: +// * m_full_print_config — the printer preset's IMEX keys, read from the full config so this +// sees the same values the preset holds whichever representation carries them. +// * the plate's `imex_parallel_mode`, read off the object config. That is the same source +// GCode.cpp and validate() resolve the active mode from (the plate's own config is +// merged into the full config before apply() by BackgroundSlicingProcess in the GUI and +// by CLI_Main in the CLI), so the shift can never disagree with the mode actually +// emitted. compute_imex_zone_layout() yields no zones for a mode the printer does not +// define, matching GCode.cpp's fallback to Primary for an unresolved mode name. +// * printable_area — the bed in PLATE-LOCAL mm. This must not be the plate's world-frame +// outline: translate_to_print_space() and the writer offset already subtract m_origin, +// so an offset carrying the plate origin would subtract it twice and put every plate +// but the first one a full plate stride out. +// +// A non-IMEX printer, or one with firmware-managed zones off, costs two bool reads and +// keeps m_imex_slice_offset at exactly Vec2d::Zero() — which is what keeps its G-code +// byte-identical. +void Print::update_imex_slice_offset() +{ + m_imex_slice_offset = Vec2d::Zero(); + if (!m_config.is_imex.value || !m_config.imex_firmware_managed_zones.value || m_objects.empty()) + return; + + // Already the resolved plate-or-process mode: the plate config overrides the process + // preset's key on the way in, exactly as PartPlate::get_imex_mode() prefers the plate. + const std::string& active_mode = m_objects.front()->config().imex_parallel_mode.value; + const ImexZoneLayout layout = compute_imex_zone_layout(m_full_print_config, active_mode, + std::string(), + get_extents(m_config.printable_area.values)); + // Empty / Primary mode and an empty layout both come back as Vec2d::Zero() here. + m_imex_slice_offset = compute_imex_slice_offset(true, active_mode, layout.primary_zone_box); +} + //SoftFever +// "Print space" is the frame the emitted gcode uses. IMEX firmware-managed mode +// shifts that frame by `m_imex_slice_offset` (the primary zone center in plate-local +// coords) so the centered slice can be fanned out by firmware. Offset is zero in +// every other case → identical behavior for non-firmware-managed printers. Vec2d Print::translate_to_print_space(const Vec2d &point) const { //const BoundingBoxf bed_bbox(config().printable_area.values); - return Vec2d(point(0) - m_origin(0), point(1) - m_origin(1)); + return Vec2d(point(0) - m_origin(0) - m_imex_slice_offset.x(), + point(1) - m_origin(1) - m_imex_slice_offset.y()); } Vec2d Print::translate_to_print_space(const Point &point) const { - return Vec2d(unscaled(point.x()) - m_origin(0), unscaled(point.y()) - m_origin(1)); + return Vec2d(unscaled(point.x()) - m_origin(0) - m_imex_slice_offset.x(), + unscaled(point.y()) - m_origin(1) - m_imex_slice_offset.y()); } FilamentTempType Print::get_filament_temp_type(const std::string& filament_type) diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 45e8703168..735edac824 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -1287,6 +1287,18 @@ public: //BBS: plate's origin related functions void set_plate_origin(Vec3d origin) { m_origin = origin; } const Vec3d get_plate_origin() const { return m_origin; } + // IMEX firmware-managed zones: additional XY shift applied at gcode emission so the + // primary zone's contents land at bed origin (0,0). Non-zero only when + // `imex_firmware_managed_zones` is on AND the active mode is non-primary; Vec2d::Zero() + // in every other case → byte-identical gcode output for everyone else. + // + // Derived, never pushed in: update_imex_slice_offset() recomputes it from the applied + // config, so a headless slice gets the same shift a GUI slice does. It is a pure + // function of the config + printable_area, so calling it twice is a no-op; process() + // and export_gcode() both call it, which is what settles it ahead of every consumer + // (the writer offset in export_gcode(), and translate_to_print_space()). + void update_imex_slice_offset(); + Vec2d get_imex_slice_offset() const { return m_imex_slice_offset; } //BBS: export gcode from previous gcode file from 3mf void set_gcode_file_ready(); void set_gcode_file_invalidated(); @@ -1539,6 +1551,9 @@ private: //BBS: plate's origin Vec3d m_origin {0, 0, 0}; + // IMEX firmware-managed slice offset (plate-local primary-zone center, or zero). + // Cache of update_imex_slice_offset(); nothing outside that function writes it. + Vec2d m_imex_slice_offset { Vec2d::Zero() }; //BBS: modified_count int m_modified_count {0}; //BBS diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index 096f505542..5fed82211d 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -1,4 +1,5 @@ #include "ClipperUtils.hpp" +#include "IMEXHelpers.hpp" #include "Geometry.hpp" #include "CustomGCode.hpp" #include "Config.hpp" @@ -1385,6 +1386,35 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ } } + // Fill in physical_extruder_map when the printer profile has not authored one. It has one + // entry per logical extruder, so it is sized from the nozzle count -- not from + // printer_extruder_id, which is indexed by variant slot. + // + // IMEX printers only. physical_extruder_map carries two readings in this tree (see + // IMEXHelpers.hpp): the IMEX paths need one entry per logical extruder, the inherited BBL + // paths read it through the clamping get_at(), which collapses every logical extruder to + // physical 0 while the profile default is the single-element {0}. Deriving the identity + // unconditionally would impose the IMEX reading on printers that mean the other one and + // change what they emit -- {first_tools}/{first_filaments}/{first_non_support_*} and + // {most_used_physical_extruder_id}/{curr_physical_extruder_id} in custom start G-code, plus + // the `; physical_extruder_map =` line in the G-code config block -- for every multi-nozzle + // profile that never authored a map. Non-IMEX printers therefore keep the config value + // exactly as it arrives, which is what upstream slices with. + const auto* is_imex_opt = new_full_config.option("is_imex"); + if (is_imex_opt && is_imex_opt->value) { + auto* pem = new_full_config.option("physical_extruder_map", true); + if (pem) { + pem->values = effective_physical_extruder_map(pem, extruder_count).values; + // m_ori_full_print_config was snapshotted above, before this derivation, and the + // selector write-back path rebuilds m_full_print_config from that snapshot. Without + // mirroring the derived map into it, m_full_print_config keeps the unexpanded default + // while every later apply re-derives the expanded one, so an unchanged config diffs + // on physical_extruder_map forever and invalidates all steps on every re-apply. + if (auto* ori_pem = m_ori_full_print_config.option("physical_extruder_map", true)) + ori_pem->values = pem->values; + } + } + auto opt_filament_map = new_full_config.option("filament_map"); std::vector filament_maps = opt_filament_map ? opt_filament_map->values : std::vector(); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index cf9b79367e..9e3958bc25 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -274,6 +274,7 @@ static t_config_enum_values s_keys_map_WipeTowerType { }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(WipeTowerType) + static t_config_enum_values s_keys_map_FuzzySkinMode { { "displacement", int(FuzzySkinMode::Displacement) }, { "extrusion", int(FuzzySkinMode::Extrusion) }, @@ -720,6 +721,24 @@ static const t_config_enum_values s_keys_map_FilamentMapMode = { }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(FilamentMapMode) +// IMEX: keep the legacy hyphenated wire strings so existing presets / 3MFs +// deserialize unchanged after the coString -> coEnum migration. +static const t_config_enum_values s_keys_map_ImexToolLayout = { + { "front-left", int(ImexToolLayout::FrontLeft) }, + { "front-right", int(ImexToolLayout::FrontRight) }, + { "rear-left", int(ImexToolLayout::RearLeft) }, + { "rear-right", int(ImexToolLayout::RearRight) } +}; +CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(ImexToolLayout) + +static const t_config_enum_values s_keys_map_ImexVizTheme = { + { "standard", int(ImexVizTheme::Standard) }, + { "deuteranopia", int(ImexVizTheme::Deuteranopia) }, + { "tritanopia", int(ImexVizTheme::Tritanopia) }, + { "high_contrast", int(ImexVizTheme::HighContrast) } +}; +CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(ImexVizTheme) + // PrimeVolumeMode. Serialized string keys must stay stable; they round-trip through .3mf. static const t_config_enum_values s_keys_map_PrimeVolumeMode = { { "Default", pvmDefault }, @@ -1129,6 +1148,8 @@ void PrintConfigDef::init_common_params() def = this->add("print_host", coString); def->label = L("Hostname, IP or URL"); + // The URL is an example of the format to type, not a link, so it stays in the text. + // xgettext:no-url-check def->tooltip = L("Orca Slicer can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance. " "Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL " @@ -6904,6 +6925,139 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(true)); + // IDEX/IQEX (independent X extruder) — parallel printing support for IDEX/IQEX printers. + // Every key in this group is read at slice time from m_config, and the two per-plate process + // keys (imex_parallel_mode, imex_head_filament_map) round-trip through the 3MF's + // model_settings.config plate metadata, so none of them needs to appear in the exported + // g-code. They all carry non-nil defaults, so emitting them would add a line to every + // printer's dump. Kept out of the g-code config block (banned_keys). + def = this->add("is_imex", coBool); + def->label = L("IDEX/IQEX Printer"); + def->tooltip = L("Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar)."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + + // Firmware-managed zones: slice the primary zone's contents at bed origin (0,0) + // so a center-origin printer firmware can apply its own copy/mirror offsets to + // each toolhead. The slicer's zone overlay, placement check, and mode signaling + // are unchanged; only the gcode emission frame shifts. + def = this->add("imex_firmware_managed_zones", coBool); + def->label = L("Firmware-managed zones"); + def->tooltip = L("When enabled, the slicer emits g-code with the primary zone's " + "contents centered on bed origin (0,0). The printer firmware is " + "responsible for placing copies/mirrors at each physical zone " + "position. Enable only on printers whose firmware applies its own " + "zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX " + "duplication mode). Has no effect in Primary mode."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + + def = this->add("imex_gantry_count", coInt); + def->label = L("Gantry Count"); + def->tooltip = L("Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows)."); + def->min = 1; + def->max = 2; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionInt(1)); + + def = this->add("imex_tools_per_gantry", coInt); + def->label = L("Tools per Gantry"); + def->tooltip = L("Number of independent toolheads per gantry along X. 2 for IDEX-style."); + def->min = 1; + def->max = 4; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionInt(2)); + + def = this->add("imex_tool_layout", coEnum); + def->label = L("Tool 0 Position"); + def->tooltip = L("Physical position on the bed where tool T0 (index 0) is located. " + "Determines how tool indices map to bed zones. " + "For single-gantry setups (IDEX) only left/right matters; " + "for dual-gantry setups (IQEX) all four corners are selectable " + "(front = lower Y / near the operator, rear = higher Y / back of machine)."); + def->mode = comAdvanced; + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("front-left"); + def->enum_values.push_back("front-right"); + def->enum_values.push_back("rear-left"); + def->enum_values.push_back("rear-right"); + def->enum_labels.push_back(L("Front-left")); + def->enum_labels.push_back(L("Front-right")); + def->enum_labels.push_back(L("Rear-left")); + def->enum_labels.push_back(L("Rear-right")); + def->set_default_value(new ConfigOptionEnum(ImexToolLayout::FrontLeft)); + + def = this->add("imex_nozzle_clearance_x", coFloat); + def->label = L("Nozzle Clearance X"); + def->tooltip = L("Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(30.0)); + + def = this->add("imex_nozzle_clearance_y", coFloat); + def->label = L("Nozzle Clearance Y"); + def->tooltip = L("Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(30.0)); + + def = this->add("imex_carriage_margin", coFloat); + def->label = L("Safety Margin"); + def->tooltip = L("Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge."); + def->sidetext = L("mm"); + def->min = 0; + def->max = 200; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.0)); + + def = this->add("imex_viz_theme", coEnum); + def->label = L("Visualization Theme"); + def->tooltip = L("Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed."); + def->mode = comAdvanced; + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("standard"); + def->enum_values.push_back("deuteranopia"); + def->enum_values.push_back("tritanopia"); + def->enum_values.push_back("high_contrast"); + def->enum_labels.push_back(L("Standard")); + def->enum_labels.push_back(L("Deuteranopia / Protanopia (red-green)")); + def->enum_labels.push_back(L("Tritanopia (blue-yellow)")); + def->enum_labels.push_back(L("High Contrast")); + def->set_default_value(new ConfigOptionEnum(ImexVizTheme::Standard)); + + def = this->add("imex_parallel_mode", coString); + def->label = L("IDEX/IQEX Print Mode"); + def->tooltip = L("Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer \u2192 Multimaterial \u2192 IDEX/IQEX Configuration)."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionString("primary")); + + def = this->add("imex_head_filament_map", coString); + def->label = L("IDEX/IQEX head filament map"); + def->tooltip = L("Per-plate override mapping physical heads to filament slots " + "(1-based). Empty means use pem-inversion defaults."); + def->mode = comDevelop; + def->set_default_value(new ConfigOptionString("")); + + def = this->add("imex_mode_names", coStrings); + def->label = L("IDEX/IQEX Mode Names"); + def->tooltip = L("Display names for each user-defined IDEX/IQEX parallel print mode."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionStrings()); + + def = this->add("imex_mode_active_tools", coStrings); + def->label = L("IDEX/IQEX Mode Active Tools"); + def->tooltip = L("Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionStrings()); + + def = this->add("imex_mode_gcodes", coStrings); + def->label = L("IDEX/IQEX Mode G-codes"); + def->tooltip = L("G-code or macro call to inject at print start for each mode."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionStrings()); + def = this->add("manual_filament_change", coBool); def->label = L("Manual Filament Change"); def->tooltip = L("Enable this option to omit the custom Change filament G-code only at the beginning of the print. " @@ -9711,6 +9865,24 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va else if (opt_key == "wall_direction" && value == "auto") { value = "ccw"; } + // Orca: the IDEX/IQEX parallel printing keys shipped to testers as ixex_* before the feature + // was renamed IMEX, and the two clearance keys were renamed again to say what they measure: + // nozzle to carriage edge on the collision side, not the carriage's full width. Without this + // an existing printer profile loses every one of these values silently. + // is_ixex is the master gate: without it every other key below migrates into a feature that + // stays switched off, which is worse than losing them all, because the settings then look + // configured. ixex_primary_col/_row are the only era-1 keys with no modern counterpart (the + // primary is a role in the mode's tools string now); they were never in an option list, so no + // saved file carries them, and the has() check at the end of this function drops them anyway. + else if (opt_key == "is_ixex") { + opt_key = "is_imex"; + } else if (opt_key.compare(0, 5, "ixex_") == 0) { + opt_key = "imex_" + opt_key.substr(5); + if (opt_key == "imex_carriage_width_x") + opt_key = "imex_nozzle_clearance_x"; + else if (opt_key == "imex_carriage_width_y") + opt_key = "imex_nozzle_clearance_y"; + } // Ignore the following obsolete configuration keys: static std::set ignore = { @@ -13064,6 +13236,9 @@ OtherSlicingStatesConfigDef::OtherSlicingStatesConfigDef() new_def("initial_no_support_extruder", coInt, "Initial no support extruder", "Zero-based index of the first extruder used for printing without support. Same as initial_no_support_tool."); new_def("in_head_wrap_detect_zone", coBool, "In head wrap detect zone", "Indicates if the first layer overlaps with the head wrap zone."); new_def("curr_bed_type", coString, "Current bed type", "Name of the currently selected bed plate type (e.g. 'Textured PEI Plate', 'Smooth High Temp Plate')."); + new_def("imex_mode", coString, "IDEX/IQEX active mode", "Name of the active IDEX/IQEX parallel print mode for this plate (e.g. 'primary', 'mirror', 'copy'). Empty string if IDEX/IQEX is not enabled."); + new_def("imex_mode_index", coInt, "IDEX/IQEX active mode index", "Zero-based index of the active IDEX/IQEX parallel print mode within imex_mode_names."); + new_def("imex_mode_gcode", coString, "IDEX/IQEX active mode G-code", "The raw mode G-code template for the active IDEX/IQEX parallel print mode, after placeholder evaluation. Globals defined here flow into machine_start_gcode."); } PrintStatisticsConfigDef::PrintStatisticsConfigDef() diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 0e1e146c72..8b724a7058 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -250,6 +250,26 @@ enum class WallDirection Count, }; +// IMEX: physical bed corner where tool T0 sits. Determines how tool indices +// map to bed zones (front = lower Y near operator, rear = higher Y). +enum class ImexToolLayout { + FrontLeft, + FrontRight, + RearLeft, + RearRight, + Count, +}; + +// IMEX: color theme for the bed-zone visualization. Colorblind-friendly variants +// are provided for users with color-vision differences. +enum class ImexVizTheme { + Standard, + Deuteranopia, + Tritanopia, + HighContrast, + Count, +}; + // Orca: print order of surface fill loops/fragments for center-based fill patterns // (Concentric, Archimedean Chords, Octagram Spiral). enum class SurfaceFillOrder { @@ -1396,6 +1416,13 @@ PRINT_CONFIG_CLASS_DEFINE( // Orca: internal use only ((ConfigOptionBool, calib_flowrate_topinfill_special_order)) // ORCA: special flag for flow rate calibration + + // IDEX/IQEX parallel print mode (per-print selection, stores mode name or "primary") + ((ConfigOptionString, imex_parallel_mode)) + // Per-plate head→filament override for MMU-equipped printers. + // Serialized as compact "phys:slot,phys:slot" (1-based filament slots, matches UI). + // Empty string means "use first_filament_for_physical_head defaults everywhere". + ((ConfigOptionString, imex_head_filament_map)) ) // This object is mapped to Perl as Slic3r::Config::PrintRegion. @@ -1768,6 +1795,19 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionStrings, filament_start_gcode)) ((ConfigOptionBool, single_extruder_multi_material)) ((ConfigOptionBool, manual_filament_change)) + // IDEX/IQEX (independent X extruder) — parallel printing support for IDEX/IQEX printers + ((ConfigOptionBool, is_imex)) + ((ConfigOptionBool, imex_firmware_managed_zones)) + ((ConfigOptionInt, imex_gantry_count)) + ((ConfigOptionInt, imex_tools_per_gantry)) + ((ConfigOptionFloat, imex_nozzle_clearance_x)) + ((ConfigOptionFloat, imex_nozzle_clearance_y)) + ((ConfigOptionFloat, imex_carriage_margin)) + ((ConfigOptionEnum, imex_tool_layout)) + ((ConfigOptionEnum, imex_viz_theme)) + ((ConfigOptionStrings, imex_mode_names)) + ((ConfigOptionStrings, imex_mode_active_tools)) + ((ConfigOptionStrings, imex_mode_gcodes)) ((ConfigOptionBool, single_extruder_multi_material_priming)) ((ConfigOptionEnum, toolchange_ordering)) ((ConfigOptionString, toolchange_cyclic_order)) diff --git a/src/libslic3r/PrinterBedAssets.hpp b/src/libslic3r/PrinterBedAssets.hpp new file mode 100644 index 0000000000..74f0c767aa --- /dev/null +++ b/src/libslic3r/PrinterBedAssets.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "miniz_extension.hpp" + +#include + +#include +#include + +namespace Slic3r { + +class DynamicPrintConfig; + +// Not on PresetBundle.hpp: miniz.h's zlib-compat macros rename GUI methods (GLTexture::Compressor::compress). +// printer_config_entry is the zip name also pushed onto bundle_structure["printer_config"]. +// printer_index is that entry's 0-based index in the exported printer_config list. +bool append_printer_bed_assets(mz_zip_archive &zip, const DynamicPrintConfig &config, nlohmann::json &bundle_structure, + const std::string &printer_config_entry, int printer_index); + +} // namespace Slic3r diff --git a/src/libslic3r/QuadricEdgeCollapse.hpp b/src/libslic3r/QuadricEdgeCollapse.hpp index c7330bfc5f..3da59c20e9 100644 --- a/src/libslic3r/QuadricEdgeCollapse.hpp +++ b/src/libslic3r/QuadricEdgeCollapse.hpp @@ -1,3 +1,5 @@ +#pragma once + // paper: https://people.eecs.berkeley.edu/~jrs/meshpapers/GarlandHeckbert2.pdf // sum up: https://users.csc.calpoly.edu/~zwood/teaching/csc570/final06/jseeba/ // inspiration: https://github.com/sp4cerat/Fast-Quadric-Mesh-Simplification diff --git a/src/libslic3r/TextureDisplacement.cpp b/src/libslic3r/TextureDisplacement.cpp index d0bbb114c6..ec9d9a2e11 100644 --- a/src/libslic3r/TextureDisplacement.cpp +++ b/src/libslic3r/TextureDisplacement.cpp @@ -247,6 +247,20 @@ void smooth_height_pixels(std::vector &pixels, int width, int height, f } } // namespace +bool height_texture_has_color(const TextureDisplacementLayer &layer) +{ + if (layer.empty()) + return false; + { + std::lock_guard lock(g_decoded_texture_cache.mutex); + const auto it = g_decoded_texture_cache.entries.find(layer.image_data.get()); + if (it != g_decoded_texture_cache.entries.end() && it->second.first.lock() == layer.image_data) + return it->second.second.has_color(); + } + // Not decoded yet. Decoding caches the raw image, so this happens once per image. + return decode_height_texture(layer).has_color(); +} + DecodedHeightTexture decode_height_texture(const TextureDisplacementLayer &layer) { DecodedHeightTexture result; diff --git a/src/libslic3r/TextureDisplacement.hpp b/src/libslic3r/TextureDisplacement.hpp index 34c3543088..d61739c7d8 100644 --- a/src/libslic3r/TextureDisplacement.hpp +++ b/src/libslic3r/TextureDisplacement.hpp @@ -1,6 +1,7 @@ #ifndef slic3r_TextureDisplacement_hpp_ #define slic3r_TextureDisplacement_hpp_ +#include #include #include #include @@ -387,6 +388,10 @@ struct TextureDisplacementOptions // image (TextureDetail::flat_colors): a texture of flat colours prints in single filaments, a // photograph or gradient in mixes. Off forces single filaments everywhere. bool color_mix_enabled = true; + // The most mixes the palette may offer. Every mix a bake paints with becomes a mixed filament slot, + // so this is also the most slots one bake can add. The mixes themselves are picked from the + // texture's colours, those that improve the match the most coming first. + int color_mix_count = 8; // Majority-filter passes over the assigned colours. See TextureColorRequest::despeckle_passes - // this is the control for it, and 2 is enough to clear the salt-and-pepper an image with detail // finer than the mesh leaves behind, without eating features that are genuinely a facet wide. @@ -396,7 +401,7 @@ struct TextureDisplacementOptions { ar(displace_border, smooth_enabled, smooth_strength, smooth_iterations, smooth_skip_border, pipeline_v2, v2_refine_mm, v2_regularize, v2_max_triangles_k, - v2_relocate, color_mix_enabled, color_despeckle); + v2_relocate, color_mix_enabled, color_despeckle, color_mix_count); } }; @@ -480,6 +485,10 @@ struct DecodedHeightTexture // DecodedHeightTexture if image_data is empty or is not a PNG at all. DecodedHeightTexture decode_height_texture(const TextureDisplacementLayer &layer); +// decode_height_texture(layer).has_color(), answered from the decode cache rather than from a copy of the +// texture - cheap enough to ask every frame. Smoothing does not change it, so the raw decode is what is read. +bool height_texture_has_color(const TextureDisplacementLayer &layer); + // Maps a linear RGB colour in [0, 1] to an index into the caller's palette, or -1 for "no colour". // // Deliberately a callback rather than a function here: matching a colour to a filament is a @@ -494,12 +503,14 @@ using ColorQuantizeFn = std::function; // interleaving, which the slicer does per print layer. Plain data, so it can be captured into a job. struct PrintableColor { - Vec3f rgb = Vec3f::Zero(); // what it looks like; for a mix, the perceptual average of the two + Vec3f rgb = Vec3f::Zero(); // what it looks like; for a mix, the colour its mixed filament slot shows int a = 0; // filament index int b = 0; // the second filament; == a for a pure entry int num = 1; // a's share of the interleave, out of `den` int den = 1; bool is_mix() const { return a != b; } + // a's share in percent, the form a mixed filament slot is created from. + int a_percent() const { return int(std::lround(100.0 * double(num) / double(den))); } }; // Everything needed to colour a mesh, captured on the main thread and handed to a job. An empty @@ -762,9 +773,10 @@ struct TextureColorRequest float min_color_region_mm2 = 0.5f; // Filled per *base mesh* triangle (the bake is topology-preserving, so this indexes the returned // mesh too): the quantize callback's index plus one, or 0 for "this triangle takes no colour from - // the texture". The +1 is not arbitrary - it lines up with EnforcerBlockerType, where 0 is NONE - // ("use the volume's own filament") and 1..16 are Extruder1..16, so the caller can hand these - // straight to a TriangleSelector without a second mapping table. + // the texture". The +1 lines up with EnforcerBlockerType, where 0 is NONE ("use the volume's own + // filament"): where every palette entry is a filament, these go straight to a TriangleSelector. A + // palette with mixes maps each index to the mix's filament slot first (see + // GLGizmoTextureDisplacement::palette_filaments()). std::vector *out_triangle = nullptr; }; diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index de3b69565d..65c8384ef2 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -283,6 +283,10 @@ set(SLIC3R_GUI_SOURCES GUI/FilamentMapDialog.hpp GUI/IconManager.cpp GUI/IconManager.hpp + GUI/IMEXFilamentPickerPopover.cpp + GUI/IMEXFilamentPickerPopover.hpp + GUI/IMEXModesCtrl.cpp + GUI/IMEXModesCtrl.hpp GUI/IdleScheduler.cpp GUI/IdleScheduler.hpp GUI/ImageGrid.cpp @@ -567,8 +571,6 @@ set(SLIC3R_GUI_SOURCES GUI/UserNotification.hpp GUI/UVEditorCanvas.cpp GUI/UVEditorCanvas.hpp - GUI/WebDownPluginDlg.cpp - GUI/WebDownPluginDlg.hpp GUI/WebGuideDialog.cpp GUI/WebGuideDialog.hpp GUI/WebUserLoginDialog.cpp diff --git a/src/slic3r/GUI/ActionRegistry.cpp b/src/slic3r/GUI/ActionRegistry.cpp index 5b1e6f5957..6956423bc6 100644 --- a/src/slic3r/GUI/ActionRegistry.cpp +++ b/src/slic3r/GUI/ActionRegistry.cpp @@ -206,19 +206,52 @@ constexpr const char* kPlateGotoPrefix = "orca_plate_goto"; constexpr const char* kRecentProjectPrefix = "orca_recent_project"; // Display context for a setting action's eyebrow, e.g. the "Process" in "Process : Quality : Layers". -// Keyed by the option's preset type so the palette reads like the settings sidebar tabs. -std::string setting_type_context(Preset::Type type) +// Keyed by the option's preset type so the palette reads like the settings sidebar tabs. Untranslated: +// the caller translates it for the displayed breadcrumb and keeps it for the English one. +const char* setting_type_context(Preset::Type type) { switch (type) { case Preset::TYPE_FILAMENT: - case Preset::TYPE_SLA_MATERIAL: return _u8L("Filament"); - case Preset::TYPE_PRINTER: return _u8L("Printer"); + case Preset::TYPE_SLA_MATERIAL: return L("Filament"); + case Preset::TYPE_PRINTER: return L("Printer"); case Preset::TYPE_PRINT: case Preset::TYPE_SLA_PRINT: - default: return _u8L("Process"); + default: return L("Process"); } } +// A setting's text in one language. The displayed text and its English search aliases both come from +// here, so in an English UI the two are equal and no alias is sent. +struct SettingText +{ + std::string title; // the label the settings row draws + std::string full_label; // the descriptive ConfigOptionDef name when it differs from title: a + // search-only alias ("overhang reversal" still finds "Reverse on even") + std::string source; // the full settings path "Process : Quality : Layers". The JS renders + // group || source and searches every field, so putting the whole path in + // source both displays it and makes it matchable by any segment. +}; + +SettingText setting_text(const std::wstring& def_label, const std::string& display_label, const wxString& row_label, bool row_multi, + const std::string& type_name, const std::wstring& category, const std::wstring& group) +{ + SettingText text; + const std::string def = boost::nowide::narrow(def_label); + text.title = into_u8(Search::resolve_setting_title(from_u8(display_label), row_label, row_multi)); + if (text.title.empty()) + text.title = def; + if (text.title != def) + text.full_label = def; + + std::wstring path = boost::nowide::widen(type_name); + if (!category.empty()) + path += L" : " + category; + if (!group.empty()) + path += L" : " + group; + text.source = boost::nowide::narrow(path); + return text; +} + // Stable, non-localized mode token for the webview, which maps it to a badge ("Developer" etc.). const char* mode_key(ConfigOptionMode mode) { @@ -305,8 +338,9 @@ struct PlateAction : AppAction PlateAction(int index, std::string title, std::string source_name) : AppAction(AppActionId{id_for(index)}, std::move(title), kOrcaSourceKey, std::move(source_name)), plate_index(index) { - this->kind = AppActionKind::Command; - this->group = _u8L("Plate"); + this->kind = AppActionKind::Command; + this->group_en = L("Plate"); + this->group = I18N::translate_utf8(this->group_en); } AppActionRunResult run(const std::string& /*param*/) const override @@ -328,8 +362,9 @@ struct RecentProjectAction : AppAction RecentProjectAction(std::string path, std::string title, std::string source) : AppAction(AppActionId{id_for(path)}, std::move(title), kOrcaSourceKey, std::move(source)), file_path(std::move(path)) { - this->kind = AppActionKind::Command; - this->group = _u8L("Recent Projects"); + this->kind = AppActionKind::Command; + this->group_en = L("Recent Projects"); + this->group = I18N::translate_utf8(this->group_en); } AppActionRunResult run(const std::string& /*param*/) const override @@ -342,6 +377,30 @@ struct RecentProjectAction : AppAction } // namespace +nlohmann::json action_json(const AppAction& a) +{ + nlohmann::json j({{"id", a.id()}, + {"title", a.title()}, + {"full_label", a.full_label}, + {"source", a.source_name()}, + {"group", a.group}, + {"kind", a.kind == AppActionKind::Plugin ? "plugin" : "command"}, + {"input", a.input}, + {"icon", a.icon}, + {"mode", mode_key(a.required_mode)}, + {"desc", a.tooltip}, + {"wiki", !a.help_url.empty()}}); + auto add_alias = [&j](const char* key, const std::string& english, const std::string& local) { + if (!english.empty() && english != local) + j[key] = english; + }; + add_alias("title_en", a.title_en, a.title()); + add_alias("group_en", a.group_en, a.group); + add_alias("source_en", a.source_en, a.source_name()); + add_alias("full_label_en", a.full_label_en, a.full_label); + return j; +} + ActionRegistry::~ActionRegistry() = default; void ActionRegistry::init() @@ -430,7 +489,8 @@ void ActionRegistry::relocalize_builtins() // Drop only the built-in commands; plugins and the dynamically materialised families are // either unlocalized or rebuilt per snapshot. remove() only erases the map entry, and upsert() - // re-seeds favourites/stats from config, so key-based ids keep their pinned state. + // re-seeds favourites/stats from config, so key-based ids keep their pinned state. make_action() + // translates in the new locale. std::vector stale; for (const auto& [id, action] : m_actions) if (action->source_key() == kOrcaSourceKey && action->kind == AppActionKind::Command) @@ -438,7 +498,6 @@ void ActionRegistry::relocalize_builtins() for (const std::string& id : stale) remove(id); - NativeCommands::rebuild_catalog(); for (const NativeCommand& c : NativeCommands::catalog()) upsert(NativeCommands::make_action(c)); } @@ -672,28 +731,22 @@ void ActionRegistry::materialize_setting_actions() const std::string id = SettingAction::id_for(opt.opt_key(), opt.type); seen.insert(id); - // The page draws Line::label; the descriptive ConfigOptionDef name stays a search-only alias - // ("overhang reversal" still finds "Reverse on even"). - const std::string search_label = boost::nowide::narrow(opt.label_local.empty() ? opt.label : opt.label_local); - std::string title = into_u8(Search::resolve_setting_title(from_u8(opt.display_label), row.label, row.multi)); - if (title.empty()) - title = search_label; + // The localized text the page shows, and its English search aliases from the untranslated row + // label, def name and breadcrumb. + const char* type_context = setting_type_context(opt.type); + SettingText local = setting_text(opt.label_local.empty() ? opt.label : opt.label_local, opt.display_label, row.label, row.multi, + I18N::translate_utf8(type_context), opt.category_local, opt.group_local); + SettingText english = setting_text(opt.label, opt.display_label_en, row.label_en, row.multi, type_context, + Tab::translate_category(opt.category, opt.type, false).ToStdWstring(), opt.group); - // Eyebrow/source = the full settings path "Process : Quality : Layers" (localized). The JS - // renders group || source and searches source + " " + group, so putting the whole path in - // source both displays it and makes it matchable by any segment (e.g. a "quality" query). - std::wstring path = boost::nowide::widen(setting_type_context(opt.type)); - if (!opt.category_local.empty()) - path += L" : " + opt.category_local; - if (!opt.group_local.empty()) - path += L" : " + opt.group_local; - - // title = the label the settings row draws; group stays empty so the source path (above) is - // the single display/search breadcrumb rather than being duplicated. - auto action = std::make_unique(opt.opt_key(), opt.type, title, std::string(), opt.category, - boost::nowide::narrow(path), opt.mode); - if (title != search_label) - action->full_label = search_label; + // group stays empty so the source path is the single display/search breadcrumb rather than + // being duplicated. + auto action = std::make_unique(opt.opt_key(), opt.type, local.title, std::string(), opt.category, local.source, + opt.mode); + action->full_label = std::move(local.full_label); + action->title_en = std::move(english.title); + action->full_label_en = std::move(english.full_label); + action->source_en = std::move(english.source); // Tile pictogram = the icon of the setting's own group header (e.g. Advanced -> param_advanced), // the one shown next to it in the page. Fall back to the page/category icon for groups @@ -751,13 +804,14 @@ void ActionRegistry::materialize_plate_actions() seen.insert(id); // "Go to Plate N" + " (name)" when the plate is named, matching the object-list label. - std::string title(_u8L("Go to Plate")); - title += " " + std::to_string(i + 1); - const std::string name = plate->get_plate_name(); + const char* go_to_plate = L("Go to Plate"); + std::string suffix = " " + std::to_string(i + 1); + const std::string name = plate->get_plate_name(); if (!name.empty()) - title += " (" + name + ")"; + suffix += " (" + name + ")"; - auto action = std::make_unique(int(i), title, kOrcaSourceName); + auto action = std::make_unique(int(i), I18N::translate_utf8(go_to_plate) + suffix, kOrcaSourceName); + action->title_en = go_to_plate + suffix; seed_from(stats, favs, id, *action); auto const action_id = action->id(); auto const app_action = std::shared_ptr(std::move(action)); @@ -868,23 +922,9 @@ nlohmann::json ActionRegistry::snapshot() return a->id() < b->id(); }); - auto action_to_json = [](const AppAction* a) { - return nlohmann::json({{"id", a->id()}, - {"title", a->title()}, - {"full_label", a->full_label}, - {"source", a->source_name()}, - {"group", a->group}, - {"kind", a->kind == AppActionKind::Plugin ? "plugin" : "command"}, - {"input", a->input}, - {"icon", a->icon}, - {"mode", mode_key(a->required_mode)}, - {"desc", a->tooltip}, - {"wiki", !a->help_url.empty()}}); - }; - nlohmann::json actions = nlohmann::json::array(); for (const AppAction* a : sorted) - actions.push_back(action_to_json(a)); + actions.push_back(action_json(*a)); // why: favourites is the ORDERED pin list - it must come from favourite_actions // as stored, not be re-derived from the frecency-sorted actions (that would @@ -917,7 +957,7 @@ nlohmann::json ActionRegistry::snapshot() recent.resize(recent_limit); nlohmann::json recent_json = nlohmann::json::array(); for (const AppAction* a : recent) - recent_json.push_back(action_to_json(a)); + recent_json.push_back(action_json(*a)); return {{"actions", std::move(actions)}, {"favourites", std::move(favourites)}, @@ -937,14 +977,21 @@ nlohmann::json ActionRegistry::tab_options() const MainFrame* mf = wxGetApp().mainframe; if (!mf || !mf->m_tabpanel) return out; + // English labels of the built-in pages whose id is not already their English name, so the tab + // picker can be searched in English in any UI language. + static const std::unordered_map english_labels{ + {TAB_ID_MONITOR, L("Device")}, {TAB_ID_MONITOR_WEB, L("Device (Web)")}, {TAB_ID_MULTI_DEVICE, L("Multi-device")}}; + Notebook* notebook = mf->m_tabpanel; for (size_t i = 0; i < notebook->GetPageCount(); ++i) { const wxString id = notebook->GetPageName(i); if (id.empty()) continue; - out.push_back({{"id", id.ToStdString()}, - {"title", notebook->GetPageLabel(i).ToStdString()}, - {"icon", notebook->GetPageIcon(i)}}); + const std::string title = notebook->GetPageLabel(i).ToStdString(); + nlohmann::json tab({{"id", id.ToStdString()}, {"title", title}, {"icon", notebook->GetPageIcon(i)}}); + if (auto it = english_labels.find(id.ToStdString()); it != english_labels.end() && title != it->second) + tab["title_en"] = it->second; + out.push_back(std::move(tab)); } return out; } diff --git a/src/slic3r/GUI/ActionRegistry.hpp b/src/slic3r/GUI/ActionRegistry.hpp index 4d5800907f..60bb2089ec 100644 --- a/src/slic3r/GUI/ActionRegistry.hpp +++ b/src/slic3r/GUI/ActionRegistry.hpp @@ -88,6 +88,14 @@ struct AppAction // Search-only alias when the title differs from the descriptive ConfigOptionDef name (e.g. title // "Reverse on even", full_label "Overhang reversal"). Empty when the two agree. std::string full_label; + // Search-only English counterparts of title(), group, source_name() and full_label, so a + // localized UI can still be searched in English. Each is derived exactly like the localized + // text it mirrors, minus the translation, so in an English UI it equals that text. Empty when + // there is no translated counterpart. + std::string title_en; + std::string group_en; + std::string source_en; + std::string full_label_en; // Full wiki URL, when the action has one (SettingActions whose row declared a label_path). std::string help_url; @@ -138,6 +146,11 @@ inline bool requires_mode_switch(ConfigOptionMode setting_mode, ConfigOptionMode // hand-edited config must never grow the quick-launch bar past `limit`, and a duplicated id must collapse to its first pin. std::vector cap_favourites(const std::vector& ids, size_t limit); +// One action as the Speed Dial page receives it. Each English alias (title_en, group_en, source_en, +// full_label_en) is sent only when it is non-empty and differs from its localized counterpart, so an +// English UI receives none and searches exactly the displayed text. +nlohmann::json action_json(const AppAction& a); + // Self-contained sink and single owner of runnable actions for the app session. // // Workflow: diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index cfd985b64b..da5acf8272 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -1020,7 +1020,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, in const BrimType brim_type = config->opt_enum("brim_type"); const bool have_auto_brim_ear = brim_type == btEar && !is_belt_tilted; const bool have_painted_brim_ear = brim_type == btPainted && !is_belt_tilted; - set_option_label("brim_width", have_auto_brim_ear ? _L("Brim ear radius") : _L("Brim width")); + set_option_label("brim_width", have_auto_brim_ear ? L("Brim ear radius") : L("Brim width")); const auto brim_width = config->opt_float("brim_width"); // Automatic brim ear settings require a non-zero brim width. toggle_field("brim_ears_max_angle", brim_width > 0.0f); diff --git a/src/slic3r/GUI/ConfigManipulation.hpp b/src/slic3r/GUI/ConfigManipulation.hpp index d2316e69bb..320987621d 100644 --- a/src/slic3r/GUI/ConfigManipulation.hpp +++ b/src/slic3r/GUI/ConfigManipulation.hpp @@ -80,6 +80,8 @@ public: t_config_option_keys const &applying_keys() const; void toggle_field(const std::string& field_key, const bool toggle, int opt_index = -1); void toggle_line(const std::string& field_key, const bool toggle, int opt_index = -1); + // Renames an option's row. `label` is the untranslated English msgid (an L("...") string); the + // row translates it for display. void set_option_label(const std::string& field_key, const wxString& label, int opt_index = -1); // FFF print diff --git a/src/slic3r/GUI/CreatePresetsDialog.cpp b/src/slic3r/GUI/CreatePresetsDialog.cpp index 1ae4e3b81b..c0dcddc2d5 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.cpp +++ b/src/slic3r/GUI/CreatePresetsDialog.cpp @@ -65,6 +65,7 @@ #include #include #include "libslic3r/PresetBundle.hpp" +#include "libslic3r/PrinterBedAssets.hpp" #include "I18N.hpp" #include "GUI_App.hpp" #include "MsgDialog.hpp" @@ -1112,7 +1113,7 @@ wxWindow *CreateFilamentPresetDialog::create_dialog_buttons() if (!m_can_not_find_vendor_checkbox->GetValue()) { if (_L("Select Vendor") == vendor_str) { MessageDialog dlg(this, _L("Vendor is not selected; please reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return; } else { @@ -1121,14 +1122,14 @@ wxWindow *CreateFilamentPresetDialog::create_dialog_buttons() } else { if (m_filament_custom_vendor_input->GetTextCtrl()->GetValue().empty()) { MessageDialog dlg(this, _L("Custom vendor missing; please input custom vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return; } else { vendor_name = into_u8(m_filament_custom_vendor_input->GetTextCtrl()->GetValue()); if (vendor_name == "Bambu" || vendor_name == "Generic") { MessageDialog dlg(this, _L("\"Bambu\" or \"Generic\" cannot be used as a Vendor for custom filaments."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return; } @@ -1139,7 +1140,7 @@ wxWindow *CreateFilamentPresetDialog::create_dialog_buttons() wxString type_str = m_filament_type_combobox->GetLabel(); std::string type_name; if (_L("Select Type") == type_str) { - MessageDialog dlg(this, _L("Filament type is not selected, please reselect type."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + MessageDialog dlg(this, _L("Filament type is not selected, please reselect type."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); return; } else { @@ -1150,7 +1151,7 @@ wxWindow *CreateFilamentPresetDialog::create_dialog_buttons() std::string serial_name; if (serial_str.empty()) { MessageDialog dlg(this, _L("Filament serial missing; please input serial."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return; } else { @@ -1161,7 +1162,7 @@ wxWindow *CreateFilamentPresetDialog::create_dialog_buttons() if (vendor_name.empty() || serial_name.empty()) { MessageDialog dlg(this, _L("There may be disallowed characters in the vendor or serial input of the filament. Please delete and re-enter."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return; } @@ -1169,20 +1170,20 @@ wxWindow *CreateFilamentPresetDialog::create_dialog_buttons() boost::algorithm::trim(serial_name); if (vendor_name.empty() || serial_name.empty()) { MessageDialog dlg(this, _L("All inputs in the custom vendor or serial are spaces. Please re-enter."), - wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); return; } if (m_can_not_find_vendor_checkbox->GetValue() && str_is_all_digit(vendor_name)) { MessageDialog dlg(this, _L("The vendor cannot be a number; please re-enter."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return; } if (!is_check_box_selected()) { MessageDialog dlg(this, _L("You have not selected a printer or preset yet. Please select at least one."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return; } @@ -1818,7 +1819,7 @@ wxBoxSizer *CreatePrinterPresetDialog::create_printer_item(wxWindow *parent) m_select_model->SetLabelColor(*wxBLACK); } } else { - MessageDialog dlg(this, _L("The model was not found; please reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + MessageDialog dlg(this, _L("The model was not found; please reselect vendor."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); } @@ -2818,14 +2819,14 @@ wxWindow *CreatePrinterPresetDialog::create_page2_dialog_buttons(wxWindow *paren // Confirm if the printer preset exists if (!m_printer_preset) { MessageDialog dlg(this, _L("You have not yet chosen which printer preset to create based on. Please choose the vendor and model of the printer"), - wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); return; } if (!save_printable_area_config(m_printer_preset)) { MessageDialog dlg(this, _L("You have entered a disallowed character in the printable area section on the first page. Please use only numbers."), - wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); show_page1(); return; @@ -2865,7 +2866,7 @@ wxWindow *CreatePrinterPresetDialog::create_page2_dialog_buttons(wxWindow *paren } } if (selected_filament_presets.empty() && !filament_preset_is_exist) { - MessageDialog dlg(this, _L("You need to select at least one filament preset."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + MessageDialog dlg(this, _L("You need to select at least one filament preset."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); return; } @@ -2880,7 +2881,7 @@ wxWindow *CreatePrinterPresetDialog::create_page2_dialog_buttons(wxWindow *paren } } if (selected_process_presets.empty() && !process_preset_is_exist) { - MessageDialog dlg(this, _L("You need to select at least one process preset."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + MessageDialog dlg(this, _L("You need to select at least one process preset."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); return; } @@ -3125,7 +3126,7 @@ void CreatePrinterPresetDialog::on_select_printer_model(wxCommandEvent &e) wxArrayString printer_preset_model = printer_preset_sort_with_nozzle_diameter(m_printer_preset_vendor_selected, nozzle); if (printer_preset_model.size() == 0) { - MessageDialog dlg(this, _L("Current vendor has no models, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + MessageDialog dlg(this, _L("Current vendor has no models, please reselect."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); return; } @@ -3386,7 +3387,7 @@ bool CreatePrinterPresetDialog::validate_input_valid() std::string model_name = get_printer_model(); if ((vendor_name.empty() || model_name.empty())) { MessageDialog dlg(this, _L("You have not selected the vendor and model or input the custom vendor and model."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return false; } @@ -3395,7 +3396,7 @@ bool CreatePrinterPresetDialog::validate_input_valid() model_name = remove_special_key(model_name); if (vendor_name.empty() || model_name.empty()) { MessageDialog dlg(this, _L("There may be escape characters in the custom printer vendor or model. Please delete and re-enter."), - wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); return false; } @@ -3403,13 +3404,13 @@ bool CreatePrinterPresetDialog::validate_input_valid() boost::algorithm::trim(model_name); if (vendor_name.empty() || model_name.empty()) { MessageDialog dlg(this, _L("All inputs in the custom printer vendor or model are spaces. Please re-enter."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return false; } if (check_printable_area() == false) { - MessageDialog dlg(this, _L("Please check bed printable shape and origin input."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + MessageDialog dlg(this, _L("Please check bed printable shape and origin input."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); return false; } @@ -3417,7 +3418,7 @@ bool CreatePrinterPresetDialog::validate_input_valid() wxString printer_name = m_select_printer->GetStringSelection(); if (printer_name.empty()) { MessageDialog dlg(this, _L("You have not yet selected the printer to replace the nozzle for; please choose a printer."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return false; } @@ -3674,30 +3675,41 @@ ExportConfigsDialog::~ExportConfigsDialog() } void ExportConfigsDialog::on_dpi_changed(const wxRect &suggested_rect) { + if (m_include_bed_assets) + m_include_bed_assets->Rescale(); Layout(); } +void ExportConfigsDialog::update_include_bed_assets_enabled() +{ + const bool on = get_curr_radio_type(m_export_type_btns) == m_exprot_type.preset_bundle; + if (m_include_bed_assets) + m_include_bed_assets->Enable(on); + if (m_include_bed_assets_label) + m_include_bed_assets_label->Enable(on); +} + void ExportConfigsDialog::show_export_result(const ExportCase &export_case) { MessageDialog *msg_dlg = nullptr; switch (export_case) { case ExportCase::INITIALIZE_FAIL: - msg_dlg = new MessageDialog(this, _L("initialize fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + msg_dlg = new MessageDialog(this, _L("initialize fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); break; case ExportCase::ADD_FILE_FAIL: - msg_dlg = new MessageDialog(this, _L("add file fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + msg_dlg = new MessageDialog(this, _L("add file fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); break; case ExportCase::ADD_BUNDLE_STRUCTURE_FAIL: - msg_dlg = new MessageDialog(this, _L("add bundle structure file fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + msg_dlg = new MessageDialog(this, _L("add bundle structure file fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); break; case ExportCase::FINALIZE_FAIL: - msg_dlg = new MessageDialog(this, _L("finalize fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + msg_dlg = new MessageDialog(this, _L("finalize fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); break; case ExportCase::OPEN_ZIP_WRITTEN_FILE: - msg_dlg = new MessageDialog(this, _L("open zip written fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + msg_dlg = new MessageDialog(this, _L("open zip written fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); break; case ExportCase::EXPORT_SUCCESS: - msg_dlg = new MessageDialog(this, _L("Export successful"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + msg_dlg = new MessageDialog(this, _L("Export successful"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); break; } @@ -3768,7 +3780,7 @@ std::string ExportConfigsDialog::initial_file_name(const wxString &path, const s MessageDialog dlg(this, wxString::Format(_L("The file: %s\nmay have been opened by another program.\nPlease close it and try again."), encode_path(printer_export_path.string().c_str())), - wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); + wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxOK | wxCENTRE); dlg.ShowModal(); return "initial_failed"; } @@ -3819,6 +3831,17 @@ wxBoxSizer *ExportConfigsDialog::create_export_config_item(wxWindow *parent) static_export_printer_preset_bundle_text->SetFont(Label::Body_12); static_export_printer_preset_bundle_text->SetForegroundColour(wxColour("#6B6B6B")); radioBoxSizer->Add(static_export_printer_preset_bundle_text, 0, wxEXPAND | wxLEFT, FromDIP(22)); + wxBoxSizer *include_bed_sizer = new wxBoxSizer(wxHORIZONTAL); + m_include_bed_assets = new ::CheckBox(parent); + m_include_bed_assets->SetValue(true); + include_bed_sizer->Add(m_include_bed_assets, 0, wxALIGN_CENTER_VERTICAL, 0); + m_include_bed_assets_label = new wxStaticText(parent, wxID_ANY, _L("Include custom bed texture and model")); + m_include_bed_assets_label->SetFont(Label::Body_12); + m_include_bed_assets_label->SetForegroundColour(wxColour("#6B6B6B")); + include_bed_sizer->Add(m_include_bed_assets_label, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(5)); + radioBoxSizer->Add(0, 0, 0, wxTOP, FromDIP(6)); + radioBoxSizer->Add(include_bed_sizer, 0, wxEXPAND | wxLEFT, FromDIP(22)); + update_include_bed_assets_enabled(); radioBoxSizer->Add(create_radio_item(m_exprot_type.filament_bundle, parent, wxEmptyString, m_export_type_btns), 0, wxEXPAND | wxTOP, FromDIP(10)); wxStaticText *static_export_filament_preset_bundle_text = new wxStaticText(parent, wxID_ANY, _L("User's filament preset set.\nCan be shared with others."), wxDefaultPosition, wxDefaultSize); @@ -3988,9 +4011,10 @@ void ExportConfigsDialog::select_curr_radiobox(std::vectorSetValue(false); } } + update_include_bed_assets_enabled(); } -ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_preset_bundle_to_file(const wxString &path) +ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_preset_bundle_to_file(const wxString &path, bool include_bed_assets) { std::string export_path = initial_file_path(path, ""); if (export_path.empty() || "initial_failed" == export_path) return ExportCase::EXPORT_CANCEL; @@ -4092,6 +4116,12 @@ ExportConfigsDialog::ExportCase ExportConfigsDialog::archive_preset_bundle_to_fi bundle_structure["filament_config"] = filament_configs; bundle_structure["process_config"] = process_configs; + if (include_bed_assets && + !append_printer_bed_assets(zip_archive, printer_preset->config, bundle_structure, printer_config_file_name, 0)) { + mz_zip_writer_end(&zip_archive); + return ExportCase::ADD_FILE_FAIL; + } + std::string bundle_structure_str = bundle_structure.dump(); status = mz_zip_writer_add_mem(&zip_archive, BUNDLE_STRUCTURE_JSON_NAME, bundle_structure_str.data(), bundle_structure_str.size(), MZ_DEFAULT_COMPRESSION); if (MZ_FALSE == status) { @@ -4324,7 +4354,7 @@ wxWindow *ExportConfigsDialog::create_dialog_buttons(wxWindow* parent) dlg_btns->GetOK()->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { if (!has_check_box_selected()) { MessageDialog dlg(this, _L("Please select at least one printer or filament."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return; } @@ -4339,7 +4369,7 @@ wxWindow *ExportConfigsDialog::create_dialog_buttons(wxWindow* parent) const wxString curr_radio_type = get_curr_radio_type(m_export_type_btns); if (curr_radio_type == m_exprot_type.preset_bundle) { - export_case = archive_preset_bundle_to_file(path); + export_case = archive_preset_bundle_to_file(path, m_include_bed_assets->GetValue()); } else if (curr_radio_type == m_exprot_type.filament_bundle) { export_case = archive_filament_bundle_to_file(path); } else if (curr_radio_type == m_exprot_type.printer_preset) { @@ -5042,7 +5072,7 @@ wxWindow *CreatePresetForPrinterDialog::create_dialog_buttons() } else { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "filament choice not find filament preset and choice is:" << filament_preset_name; MessageDialog dlg(this, _L("The filament choice not find filament preset, please reselect it"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); dlg.ShowModal(); return; } diff --git a/src/slic3r/GUI/CreatePresetsDialog.hpp b/src/slic3r/GUI/CreatePresetsDialog.hpp index 39714af1fe..197dfdf142 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.hpp +++ b/src/slic3r/GUI/CreatePresetsDialog.hpp @@ -271,6 +271,7 @@ protected: private: void data_init(); void select_curr_radiobox(std::vector> &radiobox_list, int btn_idx); + void update_include_bed_assets_enabled(); void on_dpi_changed(const wxRect &suggested_rect) override; void show_export_result(const ExportCase &export_case); bool has_check_box_selected(); @@ -284,7 +285,7 @@ private: int initial_zip_archive(mz_zip_archive &zip_archive, const std::string &file_path); ExportCase save_zip_archive_to_file(mz_zip_archive &zip_archive); ExportCase save_presets_to_zip(const std::string &export_file, const std::vector> &config_paths); - ExportCase archive_preset_bundle_to_file(const wxString &path); + ExportCase archive_preset_bundle_to_file(const wxString &path, bool include_bed_assets); ExportCase archive_filament_bundle_to_file(const wxString &path); ExportCase archive_printer_preset_to_file(const wxString &path); ExportCase archive_filament_preset_to_file(const wxString &path); @@ -304,6 +305,8 @@ private: wxGridSizer * m_preset_sizer = nullptr; wxPanel * m_presets_window = nullptr; wxStaticText * m_serial_text = nullptr; + ::CheckBox * m_include_bed_assets = nullptr; + wxStaticText * m_include_bed_assets_label = nullptr; }; class CreatePresetForPrinterDialog : public DPIDialog diff --git a/src/slic3r/GUI/ExportPresetBundleDialog.cpp b/src/slic3r/GUI/ExportPresetBundleDialog.cpp index 9af3e3c7bc..3e6fdcfd90 100644 --- a/src/slic3r/GUI/ExportPresetBundleDialog.cpp +++ b/src/slic3r/GUI/ExportPresetBundleDialog.cpp @@ -64,6 +64,20 @@ void ExportPresetBundleDialog::Init() wxSize(820, 660), wxSize(640, 640)); } +nlohmann::json ExportPresetBundleDialog::localized_strings() const +{ + return { + {"printer", _u8L("Printer")}, + {"filament", _u8L("Filament")}, + {"process", _u8L("Process")}, + {"all", _u8L("All")}, + {"no_items", _u8L("No items")}, + {"export_cloud", _u8L("Export to OrcaCloud")}, + {"export_folder", _u8L("Export to folder")}, + {"close", _u8L("Close")}, + }; +} + void ExportPresetBundleDialog::on_script_message(const nlohmann::json& j) { if (handle_common_script_command(j)) @@ -477,27 +491,27 @@ void ExportPresetBundleDialog::show_export_result(const ExportCase& export_case) switch (export_case) { case ExportCase::INITIALIZE_FAIL: msg_dlg = new MessageDialog(this, _L("initialize fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); break; case ExportCase::ADD_FILE_FAIL: msg_dlg = new MessageDialog(this, _L("add file fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); break; case ExportCase::ADD_BUNDLE_STRUCTURE_FAIL: msg_dlg = new MessageDialog(this, _L("add bundle structure file fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); break; case ExportCase::FINALIZE_FAIL: msg_dlg = new MessageDialog(this, _L("finalize fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); break; case ExportCase::OPEN_ZIP_WRITTEN_FILE: msg_dlg = new MessageDialog(this, _L("open zip written fail"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); break; case ExportCase::EXPORT_SUCCESS: msg_dlg = new MessageDialog(this, _L("Export successful"), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), - wxYES | wxYES_DEFAULT | wxCENTRE); + wxOK | wxCENTRE); break; } diff --git a/src/slic3r/GUI/ExportPresetBundleDialog.hpp b/src/slic3r/GUI/ExportPresetBundleDialog.hpp index a2a66ddbe6..d2ed29082c 100644 --- a/src/slic3r/GUI/ExportPresetBundleDialog.hpp +++ b/src/slic3r/GUI/ExportPresetBundleDialog.hpp @@ -8,6 +8,7 @@ #include "libslic3r/AppConfig.hpp" #include "libslic3r/Preset.hpp" #include +#include #include #include #include @@ -66,6 +67,7 @@ public: void InitExportData(); void on_script_message(const nlohmann::json& payload) override; + nlohmann::json localized_strings() const override; void OnRequestPresets(); void OnExportData(const wxString& path, const wxString& name, nlohmann::json data); diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index fda86e854d..c7d98bfd6f 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -559,7 +559,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true else if(m_opt_id == "filament_retraction_distances_when_cut" || opt_key_without_idx == "retraction_distances_when_cut"){ if (m_value.empty() || boost::any_cast(m_value) != val) { wxString msg_text = format_wxstr(_L("Value %s is out of range. The valid range is from %d to %d."), str, m_opt.min, m_opt.max); - WarningDialog dialog(m_parent, msg_text, _L("Parameter validation") + ": " + m_opt_id, wxYES); + WarningDialog dialog(m_parent, msg_text, _L("Parameter validation") + ": " + m_opt_id, wxOK); if (dialog.ShowModal()) { if (m_value.empty()) { if (m_opt.min > val) val = m_opt.min; diff --git a/src/slic3r/GUI/FilamentGroupPopup.cpp b/src/slic3r/GUI/FilamentGroupPopup.cpp index bb081a6fc1..9675aadf63 100644 --- a/src/slic3r/GUI/FilamentGroupPopup.cpp +++ b/src/slic3r/GUI/FilamentGroupPopup.cpp @@ -379,14 +379,24 @@ void FilamentGroupPopup::OnTimer(wxTimerEvent &event) // leaving event got triggered. So the timer is stopped first, then started // again, causing the popup being dismissed immediately. // To fix this, we check if cursor is still inside the popup window before - // dismissing. + // dismissing, and keep checking while it is: a leave event is not guaranteed + // to follow, and a popup left open keeps grabbing the mouse capture. wxPoint pos = this->ScreenToClient(wxGetMousePosition()); - if (this->GetClientRect().Contains(pos)) return; + if (this->GetClientRect().Contains(pos)) { + StartTimer(); + return; + } #endif Dismiss(); } +FilamentGroupPopup::~FilamentGroupPopup() +{ + m_timer->Stop(); + delete m_timer; +} + void FilamentGroupPopup::Dismiss() { m_active = false; PopupWindow::Dismiss(); @@ -405,7 +415,10 @@ void FilamentGroupPopup::OnEnterWindow(wxMouseEvent &) // Ignore spurious ENTER synthesized by PopupWindow::OnMouseEvent2 on macOS. wxPoint pos = this->ScreenToClient(wxGetMousePosition()); if (!this->GetClientRect().Contains(pos)) return; + // On macOS the timer keeps running instead, and OnTimer closes the popup once the cursor has left it. +#ifndef __APPLE__ ResetTimer(); +#endif } void FilamentGroupPopup::UpdateButtonStatus(int hover_idx) diff --git a/src/slic3r/GUI/FilamentGroupPopup.hpp b/src/slic3r/GUI/FilamentGroupPopup.hpp index bc43876af7..4e70518091 100644 --- a/src/slic3r/GUI/FilamentGroupPopup.hpp +++ b/src/slic3r/GUI/FilamentGroupPopup.hpp @@ -27,6 +27,7 @@ class FilamentGroupPopup : public PopupWindow { public: FilamentGroupPopup(wxWindow *parent); + ~FilamentGroupPopup() override; void tryPopup(Plater* plater,PartPlate* plate, bool slice_all); void tryClose(); void Dismiss() override; diff --git a/src/slic3r/GUI/FilamentMapDialog.cpp b/src/slic3r/GUI/FilamentMapDialog.cpp index 5c3a72596b..00fdfe6d21 100644 --- a/src/slic3r/GUI/FilamentMapDialog.cpp +++ b/src/slic3r/GUI/FilamentMapDialog.cpp @@ -20,6 +20,8 @@ #include #include #include "slic3r/GUI/FilamentMapPanel.hpp" +#include "slic3r/GUI/FilamentGroupPopup.hpp" +#include "slic3r/GUI/MainFrame.hpp" namespace Slic3r { namespace GUI { @@ -377,6 +379,13 @@ FilamentMapMode FilamentMapDialog::get_mode() int FilamentMapDialog::ShowModal() { + // The Slice-plate hover popup is a transient popup that keeps grabbing the mouse + // capture while shown. Left behind this modal dialog it would starve the dialog of + // mouse events, so close it synchronously first, whichever path opened the dialog. + if (MainFrame* frame = wxGetApp().mainframe; + frame && frame->m_filament_group_popup && frame->m_filament_group_popup->IsShown()) + frame->m_filament_group_popup->Dismiss(); + update_panel_status(m_page_type); return wxDialog::ShowModal(); } diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 988fe4d22d..44201b34ae 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4,10 +4,13 @@ #include "libslic3r/BuildVolume.hpp" #include "libslic3r/Print.hpp" #include "libslic3r/Geometry.hpp" +#include "libslic3r/TriangleMesh.hpp" #include "libslic3r/Model.hpp" #include "libslic3r/Utils.hpp" #include "libslic3r/LocalesUtils.hpp" #include "libslic3r/PresetBundle.hpp" +#include "libslic3r/IMEXHelpers.hpp" +#include "libslic3r/IMEXZones.hpp" //BBS: add convex hull logic for toolpath check #include "GUI_App.hpp" @@ -25,6 +28,7 @@ #include "MsgDialog.hpp" #include #include "slic3r/GUI/MeshUtils.hpp" +#include #include #include "libvgcode/include/Types.hpp" #include @@ -89,6 +93,7 @@ #include #include #include +#include #include #include #include @@ -320,7 +325,7 @@ void GCodeViewer::SequentialView::Marker::init(std::string filename) } else { m_model.init_from_file(filename); } - m_model.set_color({ 1.0f, 1.0f, 1.0f, 0.5f }); + m_model.set_color(default_color()); } //BBS: GUI refactor: add canvas size from parameters @@ -1094,9 +1099,13 @@ void GCodeViewer::SequentialView::GCodeWindow::stop_mapping_file() } void GCodeViewer::SequentialView::render_marker(const bool has_render_path, int canvas_width, int canvas_height, const libvgcode::EViewType& view_type) { - if (has_render_path && m_show_marker) + if (has_render_path && m_show_marker) { // marker.set_world_offset(current_offset); marker.render(canvas_width, canvas_height, view_type); + // IDEX/IQEX secondary carriage markers + for (auto& sec : m_imex_secondary_markers) + sec.render(canvas_width, canvas_height, view_type); + } } void GCodeViewer::SequentialView::render_overlay(const bool has_render_path, float legend_height, const libvgcode::Viewer* viewer, uint32_t gcode_id, int canvas_width, int canvas_height, int right_margin, const libvgcode::EViewType& view_type) @@ -1156,6 +1165,7 @@ void GCodeViewer::init(ConfigOptionMode mode, PresetBundle* preset_bundle) } } + m_marker_filename = filename; m_sequential_view.marker.init(filename); // initializes point sizes @@ -1973,6 +1983,223 @@ void GCodeViewer::reset() m_contained_in_bed = true; } +// IDEX/IQEX: resolve where every secondary carriage marker sits, relative to the primary, +// for one (printer preset, active mode, plate bed) triple. This parses the mode string +// several times over and rebuilds the zone grid, and every one of its inputs is preset or +// plate state, so render_scene() runs it only when GCodeViewer::ImexMarkerKey changes and replays +// the returned plan on all the frames in between. +// +// `mode` is already resolved (the plate's mode beats the process preset). An empty +// `carriages` list means "no secondary markers for this configuration" — IMEX off in this +// mode, firmware-managed zones, or a mode whose roster has no zone-owning secondary. +GCodeViewer::ImexMarkerPlan GCodeViewer::resolve_imex_marker_plan(const DynamicPrintConfig& printer_cfg, + const std::string& mode, + const BoundingBoxf& bed_extents) +{ + ImexMarkerPlan plan; + + // Firmware-managed-zones centers the slice at bed origin, so prim_pos + // and the preview toolpaths sit in a shifted frame relative to the + // plate-local bed bounds the zone math uses. Computing secondaries here + // would place them off-bed. The firmware physically fans the centered + // toolpath out into the zones, so the centered preview with no + // secondaries is the honest representation. + if (imex_cfg_bool(printer_cfg, "imex_firmware_managed_zones")) + return plan; + if (mode.empty() || mode == kImexPrimaryMode) + return plan; + + // Only the gantry grouping and the mirror axis are decided here; the zone grid itself comes + // from compute_imex_zone_layout() below, which reads the same keys through the same accessor. + const int tools_per_gantry = std::max(1, imex_cfg_int(printer_cfg, "imex_tools_per_gantry")); + plan.box_wx = (float)imex_cfg_float(printer_cfg, "imex_nozzle_clearance_x"); + plan.box_wy = (float)imex_cfg_float(printer_cfg, "imex_nozzle_clearance_y"); + + // Parse "idx:P/C/M" via shared helpers — matches PartPlate::calc_imex_zones. + // The role travels as an ImexRole all the way to the marker placement + // below; there is no int encoding in between, so a role added to the enum + // cannot silently fall into the "not Mirror, therefore Copy" branch. + int pri_tool = -1; + std::vector sec_tool_ids; + std::map sec_tool_roles; // tool_id -> Copy or Mirror + std::set sec_aggregated; // representatives standing in for a whole gantry + { + // Same lookup rule as PartPlate's zones and ghosts, and as the slicer: + // an unresolved mode, and a mode the tools array is too short to cover, + // both come back empty and leave the marker roster empty. + const std::string entry = find_imex_mode(printer_cfg, mode).active_tools; + pri_tool = imex_primary_tool_for_mode(entry); + // Aggregate per gantry via the same source of truth as PartPlate's + // zone/ghost aggregation: in Span modes only one tool prints per + // zone at a time, so a non-primary gantry collapses to one + // representative marker. Non-Span gantries keep per-tool markers. + const ImexGantryGrouping grouping = + group_imex_active_tools_by_gantry(entry, tools_per_gantry); + auto add_tool = [&](int phys_idx, ImexRole role, bool aggregated) { + if (phys_idx < 0 || phys_idx == pri_tool) return; + // Only Copy and Mirror print in a zone of their own, so only they + // get a marker. Exhaustive with no default so -Wswitch makes a new + // role answer "does this carriage get its own marker?" rather than + // defaulting into a Copy-shaped one. + switch (role) { + case ImexRole::Copy: + case ImexRole::Mirror: + break; + case ImexRole::Primary: // not a secondary carriage + case ImexRole::Span: // rides in the primary's zone + return; + } + sec_tool_roles[phys_idx] = role; + sec_tool_ids.push_back(phys_idx); + if (aggregated) sec_aggregated.insert(phys_idx); + }; + // Out-of-grid tool indices (a stale mode string carried over from a + // printer with more tools) are handled inconsistently by the code we + // must agree with: compute_imex_zone_layout drops them, so they own no + // zone, while calc_imex_ghosts still bakes a ghost for them. No single + // policy matches both, so the marker roster is left exactly as it was + // and such a tool simply falls back to the first zone below. Clamping + // pri_tool instead is a trap: the -1 sentinel truncates to gantry 0 in + // imex_mirror_axis_for and flips the marker to the opposite mirror + // axis from the ghost. It is also why the layout's own `primary_head` + // cannot stand in for `pri_tool` here — the layout reports -1 for an + // off-grid primary, this roster has to keep the authored index. + for (const auto& grp : grouping.groups) { + // Markers: an aggregated non-primary gantry shows only its rep. + if (grp.aggregate && grp.gantry_index != grouping.primary_gantry) + add_tool(grp.representative_phys, grp.representative_role, true); + else + for (const auto& [phys_idx, role] : grp.tools) + add_tool(phys_idx, role, false); + } + } + const int sec_count = (int)sec_tool_ids.size(); + if (sec_count == 0) + return plan; + + // The zone grid is not re-derived here: this is the same call + // PartPlate::calc_imex_zones() makes, with the same printer config and the + // same bed extents, so the preview and the plate cannot place a tool + // differently for the same mode. The T0-corner flips, the active + // column/row sets and the zone pitch all live inside the library; the + // markers need nothing from it but `head_zone_centers`. + // `mode` is already resolved (per-plate mode beats the process preset), + // so it goes in as the plate mode with no process fallback. + const ImexZoneLayout zone_layout = + compute_imex_zone_layout(printer_cfg, mode, std::string(), bed_extents); + + // Centre of zone (0,0), the fallback for any head the layout gave no zone — + // a mode string naming a tool outside this printer's grid. Zone indices are + // dense, so the lowest centre on each axis IS zone 0's. An empty layout + // means one undivided zone, whose centre is the bed's. + Vec2d zone0_center = bed_extents.center(); + if (!zone_layout.head_zone_centers.empty()) { + zone0_center = zone_layout.head_zone_centers.begin()->second; + for (const auto& head_center : zone_layout.head_zone_centers) { + zone0_center.x() = std::min(zone0_center.x(), head_center.second.x()); + zone0_center.y() = std::min(zone0_center.y(), head_center.second.y()); + } + } + auto zone_center_of = [&](int tid) -> Vec2d { + auto it = zone_layout.head_zone_centers.find(tid); + return (it == zone_layout.head_zone_centers.end()) ? zone0_center : it->second; + }; + const Vec2d pri_center = zone_center_of(pri_tool); + + // An aggregated gantry's zone is a full-X row strip with no column of its + // own, so its marker tracks primary's X. calc_imex_ghosts() reaches the same + // zero X offset by putting both frames on the bed centreline; for a single + // marker, pinning the centre says it directly. + auto sec_center_of = [&](int tid) -> Vec2d { + Vec2d c = zone_center_of(tid); + if (sec_aggregated.count(tid)) + c.x() = pri_center.x(); + return c; + }; + + // Primary carriage box: seeded from whether primary holds the leftmost zone + // column, then turned by any secondary sitting to one side of it. + plan.pri_box_offset_x = (pri_center.x() <= zone0_center.x()) ? 0.0f : -plan.box_wx; + plan.pri_box_offset_y = -plan.box_wy; + for (int i = 0; i < sec_count; ++i) { + const Vec2d sc = sec_center_of(sec_tool_ids[i]); + if (sc.x() > pri_center.x()) { plan.pri_box_offset_x = 0.0f; } + else if (sc.x() < pri_center.x()) { plan.pri_box_offset_x = -plan.box_wx; } + if (sc.y() > pri_center.y()) { plan.pri_box_offset_y = 0.0f; } + else if (sc.y() < pri_center.y()) { plan.pri_box_offset_y = -plan.box_wy; } + } + + plan.pri_head = pri_tool; + plan.carriages.reserve(sec_count); + for (int i = 0; i < sec_count; ++i) { + const int sec_tool = sec_tool_ids[i]; + const Vec2d sec_center = sec_center_of(sec_tool); + const ImexRole sec_role = sec_tool_roles[sec_tool]; + + // A carriage stays inside its own zone; a Mirror reflects its + // zone-relative offset about that zone's centerline, on the axis of the + // boundary it shares with primary — the same rule the ghosts use: + // Copy → tracks primary on both axes. + // Mirror, same gantry → reflect X (zones sit side by side). + // Mirror, other gantry → reflect Y (zones sit front-to-back); X + // tracks primary, since the part off that + // gantry is a Y-reflection of the tool + // directly behind it. + // The axis comes from the shared helper, so the markers can never drift + // out of step with the plate ghosts. + const bool is_mirror = (sec_role == ImexRole::Mirror); + const bool cross_gantry = imex_mirror_axis_for(pri_tool, sec_tool, + tools_per_gantry) == ImexMirrorAxis::Y; + + // Tracking an axis translates by the gap between the two zone centres. + // Mirroring it reflects primary about the midpoint of those centres — + // the zones being equal-sized, that midpoint is the boundary between + // them, so the carriage still lands inside its own zone. Both are a + // single term applied to the live primary position each frame: + // `term - pos` when mirrored, `pos + term` when tracked. + ImexMarkerPlan::Carriage carriage; + carriage.phys_head = sec_tool; + carriage.mirror_x = is_mirror && !cross_gantry; + carriage.mirror_y = is_mirror && cross_gantry; + carriage.x_term = carriage.mirror_x ? (float)(sec_center.x() + pri_center.x()) + : (float)(sec_center.x() - pri_center.x()); + carriage.y_term = carriage.mirror_y ? (float)(sec_center.y() + pri_center.y()) + : (float)(sec_center.y() - pri_center.y()); + + // The box shows the side a toolhead could COLLIDE from, not merely which + // way its body hangs. Tools sharing a gantry share an X rail and can + // actually run into each other, and only in a same-gantry (X-axis) mirror + // do they converge — so that is the one case where the secondary's box + // flips to face the primary. Tools on different gantries cannot collide + // in X at all, so a cross-gantry mirror keeps the primary's facing, the + // same as a Copy. Do not "fix" this to follow carriage geometry: a box on + // the far side would point away from the only tool it can hit. + if (is_mirror && !cross_gantry) { + if (sec_center.x() > pri_center.x()) carriage.box_offset_x = -plan.box_wx; + else if (sec_center.x() < pri_center.x()) carriage.box_offset_x = 0.0f; + else carriage.box_offset_x = plan.pri_box_offset_x; + } else { + carriage.box_offset_x = plan.pri_box_offset_x; + } + // Y follows the same collision rule: face the gantry you could hit. A tool + // on ANOTHER row faces the primary's row; a tool on the primary's OWN row + // shares its gantry and can only hit the same other gantry, so it faces + // wherever the primary faces. The old `else` hardcoded -imex_box_wy, which + // happens to equal pri_box_offset_y on the rear-* layouts (primary's row + // sits above the others, so the loop above settles on -box_wy anyway) + // — hence a no-op there. On the front-* layouts the primary flips to 0.0f + // and the hardcoded value pointed the same-gantry secondary away from the + // only tools it could run into. + if (sec_center.y() > pri_center.y()) carriage.box_offset_y = -plan.box_wy; + else if (sec_center.y() < pri_center.y()) carriage.box_offset_y = 0.0f; + else carriage.box_offset_y = plan.pri_box_offset_y; + + plan.carriages.push_back(carriage); + } + + return plan; +} + //BBS: GUI refactor: add canvas width and height void GCodeViewer::render_scene(int canvas_width, int canvas_height) { @@ -1990,7 +2217,242 @@ void GCodeViewer::render_scene(int canvas_width, int canvas_height) const libvgcode::PathVertex& curr_vertex = m_viewer.get_current_vertex(); m_sequential_view.marker.set_world_position(libvgcode::convert(curr_vertex.position)); m_sequential_view.marker.set_z_offset(m_z_offset + 0.5f); + + // IDEX/IQEX: compute all carriage positions; update secondary nozzle markers; + // carriage_box_draws is populated for toolhead footprint rendering after render_marker(). + // Okabe-Ito colorblind-safe palette — excludes orange (#E69F00) and sky blue (#56B4E9) + // which are used by the bed zone fills, ensuring the markers contrast against the background. + // It identifies the carriages in the views that colour by anything but filament; in Filament + // view a carriage takes its own head's filament colour instead, so a marker, the ghost of + // what it prints and the toolpaths under it all agree on what is loaded there. + static const std::array s_carriage_colors = {{ + { 1.000f, 1.000f, 1.000f, 0.65f }, // primary — white + { 0.941f, 0.894f, 0.259f, 0.65f }, // secondary 1 — yellow (#F0E442) + { 0.835f, 0.369f, 0.000f, 0.65f }, // secondary 2 — vermilion (#D55E00) + { 0.800f, 0.475f, 0.655f, 0.65f }, // secondary 3 — reddish purple (#CC79A7) + }}; + struct CarriageDraw { Vec3f pos; ColorRGBA color; float box_offset_x = 0.0f; float box_offset_y = 0.0f; }; + std::vector carriage_box_draws; + float imex_box_wx = 0.0f, imex_box_wy = 0.0f; + { + PresetBundle* preset_bundle = wxGetApp().preset_bundle; + bool imex_active = false; + if (preset_bundle && m_sequential_view.m_show_marker) { + const DynamicPrintConfig& printer_cfg = preset_bundle->printers.get_edited_preset().config; + auto* is_imex_opt = printer_cfg.opt("is_imex"); + if (is_imex_opt && is_imex_opt->value) { + const DynamicPrintConfig& process_cfg = preset_bundle->prints.get_edited_preset().config; + auto* mode_opt = process_cfg.opt("imex_parallel_mode"); + std::string mode = mode_opt ? mode_opt->value : kImexPrimaryMode; + // Per-plate mode overrides the process preset. + PartPlateList& plate_list = wxGetApp().plater()->get_partplate_list(); + PartPlate* curr_plate = plate_list.get_curr_plate(); + if (curr_plate) { + // Same resolution the plate itself uses, rather than a fourth copy of it. + const std::string plate_mode = curr_plate->get_effective_imex_mode(); + if (plate_mode != kImexPrimaryMode) + mode = plate_mode; + } + + // Bed X and Y bounds — read from the current plate's shape, which is + // in world/GL coordinates (same space as curr_vertex.position), and is + // the exact same source PartPlate::calc_imex_zones() hands to the library. + BoundingBoxf bed_extents; + { + const Pointfs& plate_shape = curr_plate ? curr_plate->get_shape() : Pointfs{}; + if (!plate_shape.empty()) { + bed_extents = get_extents(plate_shape); + } else { + // Fallback: use toolpath bounding box extent + bed_extents = BoundingBoxf(Vec2d(m_paths_bounding_box.min.x(), m_paths_bounding_box.min.y()), + Vec2d(m_paths_bounding_box.max.x(), m_paths_bounding_box.max.y())); + } + } + + // Cache guard. The marker plan below is resolved from preset/plate state only, + // so it is rebuilt when that state moves and reused otherwise — the sequential + // slider is sticky, and re-resolving the zone layout on every frame of the rest + // of the session showed up as a measurable per-frame cost. The comparison is + // deliberately made against the live config rather than against a freshly built + // key, so an unchanged frame allocates nothing at all. + static const std::vector s_no_strings; + auto* names_opt = printer_cfg.opt("imex_mode_names"); + auto* tools_opt = printer_cfg.opt("imex_mode_active_tools"); + const std::vector& mode_names = names_opt ? names_opt->values : s_no_strings; + const std::vector& active_tools = tools_opt ? tools_opt->values : s_no_strings; + + ImexMarkerKey::Scalars key; + key.plate_index = plate_list.get_curr_plate_index(); + // Same accessor the plan is built from: a key holding a different fallback than + // the value actually laid out would compare equal across a real change. + key.gantry_count = imex_cfg_int(printer_cfg, "imex_gantry_count"); + key.tools_per_gantry = imex_cfg_int(printer_cfg, "imex_tools_per_gantry"); + key.tool_layout = (int)imex_cfg_enum(printer_cfg, "imex_tool_layout"); + key.clearance_x = imex_cfg_float(printer_cfg, "imex_nozzle_clearance_x"); + key.clearance_y = imex_cfg_float(printer_cfg, "imex_nozzle_clearance_y"); + key.firmware_managed = imex_cfg_bool(printer_cfg, "imex_firmware_managed_zones"); + key.bed_min_x = bed_extents.min.x(); + key.bed_min_y = bed_extents.min.y(); + key.bed_max_x = bed_extents.max.x(); + key.bed_max_y = bed_extents.max.y(); + + if (!(m_imex_marker_key.s == key) || m_imex_marker_key.mode != mode || + m_imex_marker_key.mode_names != mode_names || + m_imex_marker_key.mode_active_tools != active_tools) { + m_imex_marker_key = ImexMarkerKey{ key, mode, mode_names, active_tools }; + m_imex_marker_plan = resolve_imex_marker_plan(printer_cfg, mode, bed_extents); + // The carriage roster — and with it the marker count — can change with any + // of those inputs, so drop the markers and let the lazy init below rebuild + // them. Their colours are restamped every frame regardless. + m_sequential_view.m_imex_secondary_markers.clear(); + } + + const ImexMarkerPlan& plan = m_imex_marker_plan; + const int sec_count = (int)plan.carriages.size(); + + // Filament view colours the toolpaths by the filament printing them, so a + // carriage takes its own head's filament colour there and the palette + // everywhere else. get_imex_head_filament_color() answers UNPRINTABLE_COLOR + // for a head it cannot resolve, which is alpha 0.5 where a filament colour + // decodes opaque - that difference, not the black, is what distinguishes it, + // and a head with no filament keeps the palette rather than borrowing a + // colour that would read as a real assignment - the one point where a marker + // and the ghost of what it prints differ, the ghost having no palette to fall + // back to. + // + // The map and the pem are hoisted and each head resolved once, as + // PartPlate::update_imex_ghost_colors() does for the ghosts: both the marker + // and the toolhead box of a carriage want the same answer, and rebuilding it + // per draw parses the plate's map string and rebuilds the pem vector. + const bool color_by_filament = m_viewer.get_view_type() == libvgcode::EViewType::ColorPrint; + std::vector carriage_colors(sec_count + 1); + if (sec_count > 0) { + const ConfigOptionInts pem = effective_physical_extruder_map(*preset_bundle); + const auto plate_map = curr_plate ? curr_plate->get_imex_head_filament_map() + : std::map{}; + std::map head_colors; + auto color_for = [&](int phys_head, size_t palette_index) { + const ColorRGBA fallback = s_carriage_colors[palette_index % s_carriage_colors.size()]; + if (!color_by_filament || curr_plate == nullptr || phys_head < 0) + return fallback; + auto hc = head_colors.find(phys_head); + if (hc == head_colors.end()) + hc = head_colors.emplace(phys_head, + curr_plate->get_imex_head_filament_color(phys_head, pem, plate_map)).first; + if (hc->second == GLVolume::UNPRINTABLE_COLOR) + return fallback; + ColorRGBA c = hc->second; + c.a(fallback.a()); // as translucent as the palette makes them + return c; + }; + carriage_colors[0] = color_for(plan.pri_head, 0); + for (int i = 0; i < sec_count; ++i) + carriage_colors[i + 1] = color_for(plan.carriages[i].phys_head, i + 1); + } + if (sec_count > 0) { + imex_active = true; + imex_box_wx = plan.box_wx; + imex_box_wy = plan.box_wy; + + // Lazy init secondary nozzle markers + if ((int)m_sequential_view.m_imex_secondary_markers.size() != sec_count) { + m_sequential_view.m_imex_secondary_markers.resize(sec_count); + for (int i = 0; i < sec_count; ++i) { + m_sequential_view.m_imex_secondary_markers[i].init(m_marker_filename); + } + } + // Set every frame, not once at init: the view type and the filament palette + // both change without the marker list being rebuilt. The primary marker is + // one of the carriages here, so it is coloured alongside them - and restored + // below when no mode is active, since it is the same marker every non-IMEX + // preview draws. + m_sequential_view.marker.set_color(carriage_colors[0]); + for (int i = 0; i < sec_count; ++i) + m_sequential_view.m_imex_secondary_markers[i].set_color(carriage_colors[i + 1]); + + const Vec3f prim_pos = libvgcode::convert(curr_vertex.position); + carriage_box_draws.push_back({ prim_pos, carriage_colors[0], + plan.pri_box_offset_x, plan.pri_box_offset_y }); + + for (int i = 0; i < sec_count; ++i) { + const ImexMarkerPlan::Carriage& carriage = plan.carriages[i]; + // Tracking an axis translates the primary by the gap between the two + // zone centres; mirroring reflects it about the midpoint of those + // centres — the zones being equal-sized, that midpoint is the boundary + // between them, so the carriage still lands inside its own zone. Which + // axis does which, and both terms, come from resolve_imex_marker_plan(). + const Vec3f sec_pos{ carriage.mirror_x ? carriage.x_term - prim_pos.x() + : prim_pos.x() + carriage.x_term, + carriage.mirror_y ? carriage.y_term - prim_pos.y() + : prim_pos.y() + carriage.y_term, + prim_pos.z() }; + m_sequential_view.m_imex_secondary_markers[i].set_world_position(sec_pos); + m_sequential_view.m_imex_secondary_markers[i].set_z_offset(m_z_offset + 0.5f); + carriage_box_draws.push_back({ + sec_pos, carriage_colors[i + 1], + carriage.box_offset_x, carriage.box_offset_y }); + } + } + } + } + if (!imex_active) { + m_sequential_view.m_imex_secondary_markers.clear(); + // The primary marker is the one every preview draws, so the carriage colour it may + // have been given has to come back off when no parallel mode is active. + m_sequential_view.marker.set_color(SequentialView::Marker::default_color()); + } + } m_sequential_view.render_marker(!m_no_render_path, canvas_width, sequential_view_height(canvas_height), m_viewer.get_view_type()); + + // IDEX/IQEX: render toolhead footprint boxes for each active carriage. + // Each box is imex_nozzle_clearance_x × imex_nozzle_clearance_y, sitting above the nozzle tip. + // Hidden when the user toggles off "Show IDEX/IQEX Toolhead Boxes" in the View menu — gives + // an unobstructed view of the toolpaths during sequential playback. Default-on; the absence + // of an app_config entry is also treated as on. + const bool show_toolhead_boxes = wxGetApp().app_config->get("show_imex_toolhead_boxes") != "false"; + if (show_toolhead_boxes && !carriage_box_draws.empty() && imex_box_wx > 0.0f && imex_box_wy > 0.0f) { + // The mesh depends only on the two clearance dimensions, which a config edit can + // change without a G-code reload — so rebuild it when they move (or when it has not + // been built yet) rather than on every frame. + // Mesh origin: nozzle at x=0, centered in Y, Z starts at nozzle tip level. + // Per-carriage box_offset_x shifts the mesh left or right so the nozzle lands + // at the correct (collision-side) edge. + if (!m_imex_toolhead_box.is_initialized() || + m_imex_box_mesh_wx != imex_box_wx || m_imex_box_mesh_wy != imex_box_wy) { + const float box_h = std::max(imex_box_wx, imex_box_wy); + indexed_triangle_set its = its_make_cube((double)imex_box_wx, (double)imex_box_wy, (double)box_h); + // No vertex pre-shifting — box_offset_x/y in the per-carriage transform + // positions the nozzle at the correct collision-side edge. + m_imex_toolhead_box.reset(); + m_imex_toolhead_box.init_from(its); + m_imex_box_mesh_wx = imex_box_wx; + m_imex_box_mesh_wy = imex_box_wy; + } + + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader) { + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + shader->start_using(); + shader->set_uniform("emission_factor", 0.0f); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Transform3d& view_matrix = camera.get_view_matrix(); + for (const auto& draw : carriage_box_draws) { + const Transform3d model_matrix = Geometry::translation_transform( + (draw.pos + Vec3f(draw.box_offset_x, draw.box_offset_y, m_z_offset)).cast()); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = + view_matrix.matrix().block(0, 0, 3, 3) * + model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + m_imex_toolhead_box.set_color(draw.color); + m_imex_toolhead_box.render(); + } + shader->stop_using(); + glsafe(::glDisable(GL_BLEND)); + } + } } size_t GCodeViewer::shadow_casters_signature() const @@ -3291,6 +3753,7 @@ void GCodeViewer::render_all_plates_stats(const std::vector #include "slic3r/GUI/MeshUtils.hpp" #include +#include #include #include #include @@ -116,6 +117,9 @@ public: bool is_visible() const { return m_visible; } void set_visible(bool visible) { m_visible = visible; } + // What a marker looks like when no IDEX/IQEX carriage colour applies to it. + static ColorRGBA default_color() { return { 1.0f, 1.0f, 1.0f, 0.5f }; } + void set_color(const ColorRGBA& color) { m_model.set_color(color); } void render(int canvas_width, int canvas_height, const libvgcode::EViewType& view_type); void render_position_window(const libvgcode::Viewer* viewer, int canvas_width, int canvas_height, const libvgcode::EViewType& view_type); @@ -164,6 +168,7 @@ public: }; Marker marker; + std::vector m_imex_secondary_markers; // one per active secondary carriage in IDEX/IQEX mode GCodeWindow gcode_window; float m_scale = 1.0; bool m_show_marker = false; @@ -228,6 +233,95 @@ private: ConfigOptionMode m_user_mode; bool m_fold = {false}; + std::string m_marker_filename; // cached for lazy secondary marker init + + // IDEX/IQEX: everything render_scene() needs to place the secondary carriage markers and the + // toolhead footprint boxes, resolved from the printer preset, the active mode and the + // plate bed. Resolving it walks the mode string through compute_imex_zone_layout() + // (several string parses plus a zone-grid rebuild), and none of its inputs change + // between frames, so it is resolved once per input change -- see ImexMarkerKey -- and + // replayed on every other frame. + struct ImexMarkerPlan + { + // One entry per secondary carriage that owns a zone, in marker order. Each axis + // either TRACKS the primary (pos + term) or MIRRORS it about the boundary the two + // zones share (term - pos); which of the two, and the term itself, depend only on + // the zone geometry, so both are resolved up front. + struct Carriage + { + int phys_head = -1; // physical head this carriage is, for its filament colour + bool mirror_x = false; + bool mirror_y = false; + float x_term = 0.0f; + float y_term = 0.0f; + float box_offset_x = 0.0f; + float box_offset_y = 0.0f; + }; + std::vector carriages; // empty => no secondary carriages to draw + int pri_head = -1; // the primary's physical head, same purpose + float pri_box_offset_x = 0.0f; + float pri_box_offset_y = 0.0f; + float box_wx = 0.0f; // imex_nozzle_clearance_x / _y + float box_wy = 0.0f; + }; + + // Invalidation key for the plan above: every input the plan is derived from, and + // nothing that changes between frames. A stale plan would put the preview markers + // somewhere the plate's own zones and ghosts do not agree with, which is exactly the + // drift the shared layout call exists to prevent -- so this deliberately mirrors + // PartPlate::build_imex_cache_key(). The two keys are not field-for-field identical, and + // the differences are deliberate rather than incidental: + // - bed extents and plate_index are here and not there. Zone centres scale with the + // extents, and one preview serves every plate, so the preview must key what the plate + // gets for free -- it re-bakes on set_shape() and is keyed by being that plate. + // - mode_names / mode_active_tools hold the printer's WHOLE mode table; the plate resolves + // one active mode and keys that roster plus its primary head. Same information reached + // two ways, so a change to the active mode moves both keys. + // - imex_carriage_margin is there and not here: it only sizes the plate's advisory bands, + // which the preview never draws. + // imex_tool_layout is in both, which the plate's key gained for the reason this one has it: + // the T0-corner flip moves every zone rectangle while nothing else keyed changes. + struct ImexMarkerKey + { + // Scalar half. Built fresh on the stack each frame -- it allocates nothing -- and + // compared as a tuple. + struct Scalars + { + int plate_index = -1; + int gantry_count = 0; + int tools_per_gantry = 0; + int tool_layout = -1; + double clearance_x = 0.0; + double clearance_y = 0.0; + bool firmware_managed = false; + double bed_min_x = 0.0, bed_min_y = 0.0, bed_max_x = 0.0, bed_max_y = 0.0; + + auto tied() const { + return std::tie(plate_index, gantry_count, tools_per_gantry, tool_layout, + clearance_x, clearance_y, firmware_managed, + bed_min_x, bed_min_y, bed_max_x, bed_max_y); + } + bool operator==(const Scalars& rhs) const { return tied() == rhs.tied(); } + }; + Scalars s; + // Resolved active mode (the plate's mode beats the process preset), plus the printer + // preset's whole mode table. The name alone is not identity: two presets can carry + // the same mode name over different tool rosters, and editing a roster in place + // moves neither the name nor any scalar above. Compared by value, never copied + // unless something actually changed. + std::string mode; + std::vector mode_names; + std::vector mode_active_tools; + }; + ImexMarkerKey m_imex_marker_key; + ImexMarkerPlan m_imex_marker_plan; + static ImexMarkerPlan resolve_imex_marker_plan(const DynamicPrintConfig& printer_cfg, + const std::string& mode, + const BoundingBoxf& bed_extents); + + GLModel m_imex_toolhead_box; // shared box mesh for all carriage footprint overlays + float m_imex_box_mesh_wx{ 0.0f }; // clearance dimensions m_imex_toolhead_box was built for + float m_imex_box_mesh_wy{ 0.0f }; size_t m_extruders_count; std::vector m_filament_diameters; @@ -306,7 +400,7 @@ public: //BBS: add all plates filament statistics void render_all_plates_stats(const std::vector& gcode_result_list, bool show = true) const; //BBS: GUI refactor: add canvas width and height - // Shells, toolpaths and the sequential marker, drawn in 3D. + // Shells, toolpaths, the sequential markers and the IDEX/IQEX toolhead boxes, drawn in 3D. void render_scene(int canvas_width, int canvas_height); // Legend, sliders, the marker's position window and the G-code window, all ImGui. void render_overlay(int canvas_width, int canvas_height, int right_margin); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e1c8b9935c..c509e5d6f8 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1,5 +1,6 @@ #include "libslic3r/libslic3r.h" #include "libslic3r/Point.hpp" +#include #include #include #include @@ -2658,11 +2659,19 @@ void GLCanvas3D::_render_frame(bool scene_dirty, bool only_init) #endif } + // Suppress the regular object-name/toolbar tooltip while hovering an IMEX + // ghost; the swatch overlay below stands in for it. + if (m_hover_ghost_head >= 0) + tooltip.clear(); + set_tooltip(tooltip); if (m_tooltip_enabled) m_tooltip.render(m_mouse.position, *this); + // IMEX ghost hover overlay: layered on top of the normal tooltip pass. + _render_imex_ghost_tooltip(); + wxGetApp().plater()->get_mouse3d_controller().render_settings_dialog(*this); if (m_canvas_type != ECanvasType::CanvasAssembleView) { @@ -5066,6 +5075,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) TransformationType trafo_type; trafo_type.set_relative(); m_selection.translate(cur_pos - m_mouse.drag.start_position_3D, trafo_type); + // Ghost transforms refresh from _render_imex_ghosts via the live GLVolume + // lookup, so no explicit update call is needed here. if (current_printer_technology() == ptFFF) { if (fff_print()->config().print_sequence == PrintSequence::ByObject) update_sequential_clearance(); @@ -5239,6 +5250,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_rectangle_selection.stop_dragging(); } + else if (evt.LeftUp() && !m_mouse.dragging && m_hover_ghost_head >= 0) { + // IMEX ghost click: dispatch to Plater (filament picker). The else-if chain + // already prevents deselect/plate-select from firing on the same event; we + // fall through to mouse_up_cleanup() below so mouse capture and drag state + // get reset like every other branch in this chain. + wxGetApp().plater()->on_imex_ghost_click(m_hover_ghost_head); + } else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_hover_volume_idxs.empty() && m_hover_plate_idxs.empty() && !is_layers_editing_enabled()) { // deselect and propagate event through callback if (!evt.ShiftDown() && (!any_gizmo_active || !evt.CmdDown()) && m_picking_enabled) @@ -5283,9 +5301,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } //BBS change plate selection + bool plate_icon_popup_shown = false; if (!m_hover_plate_idxs.empty() && (m_canvas_type == CanvasView3D) && !m_mouse.dragging) { int hover_idx = m_hover_plate_idxs.front(); - wxGetApp().plater()->select_plate_by_hover_id(hover_idx, true); + plate_icon_popup_shown = (wxGetApp().plater()->select_plate_by_hover_id(hover_idx, true) == 1); if (m_hover_volume_idxs.empty()) deselect_all(); render(); @@ -5305,10 +5324,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (!m_mouse.ignore_right_up && m_gizmos.get_current_type() == GLGizmosManager::EType::Undefined) { //BBS post right click event - if (!m_hover_plate_idxs.empty()) { + if (!m_hover_plate_idxs.empty() && !plate_icon_popup_shown) { post_event(RBtnPlateEvent(EVT_GLCANVAS_PLATE_RIGHT_CLICK, { logical_pos, m_hover_plate_idxs.front() })); } - else { + else if (!plate_icon_popup_shown) { // do not post the event if the user is panning the scene // or if right click was done over the wipe tower bool post_right_click_event = m_hover_volume_idxs.empty() || !m_volumes.volumes[get_first_hover_volume_idx()]->is_wipe_tower; @@ -5618,6 +5637,10 @@ void GLCanvas3D::do_move(const std::string& snapshot_type) reset_sequential_print_clearance(); + // IMEX: selection commit may have moved/added/removed objects — ghost cache key + // doesn't encode per-instance transforms, so force a full rebuild on next render. + wxGetApp().plater()->get_partplate_list().invalidate_all_imex_ghosts(); + m_dirty = true; } @@ -5728,6 +5751,9 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type) post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_ROTATED)); } + // IMEX: rotate changes per-instance transforms without touching the ghost cache key. + wxGetApp().plater()->get_partplate_list().invalidate_all_imex_ghosts(); + m_dirty = true; } @@ -5828,6 +5854,9 @@ void GLCanvas3D::do_scale(const std::string& snapshot_type) post_event(SimpleEvent(EVT_GLCANVAS_INSTANCE_SCALED)); } + // IMEX: scale changes per-instance transforms without touching the ghost cache key. + wxGetApp().plater()->get_partplate_list().invalidate_all_imex_ghosts(); + m_dirty = true; } @@ -5939,6 +5968,9 @@ void GLCanvas3D::do_mirror(const std::string& snapshot_type) post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + // IMEX: mirror changes per-instance transforms without touching the ghost cache key. + wxGetApp().plater()->get_partplate_list().invalidate_all_imex_ghosts(); + m_dirty = true; } @@ -7961,6 +7993,11 @@ void GLCanvas3D::_picking_pass() _update_volumes_hover_state(); + // IMEX ghost picking runs unconditionally after the normal pass: ghosts visually + // occlude the main volumes, so their tooltip/click handling must fire even when a + // regular volume hit also occurred underneath. + _picking_pass_imex_ghosts(); + #if ENABLE_RAYCAST_PICKING_DEBUG ImGuiWrapper& imgui = *wxGetApp().imgui(); imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); @@ -8061,6 +8098,180 @@ void GLCanvas3D::_picking_pass() #endif // ENABLE_RAYCAST_PICKING_DEBUG } +void GLCanvas3D::_picking_pass_imex_ghosts() +{ + m_hover_ghost_head = -1; + m_hover_ghost_plate = -1; + + if (!m_picking_enabled || m_mouse.dragging || m_mouse.position == Vec2d(DBL_MAX, DBL_MAX) || m_gizmos.is_dragging()) + return; + + // Build a world-space ray from the mouse: mouse_ray(pos) returns the near/far + // world-space points, so direction is b - a. + const Linef3 ray = mouse_ray(Point(static_cast(m_mouse.position.x()), + static_cast(m_mouse.position.y()))); + const Vec3d ray_origin = ray.a; + const Vec3d ray_dir = ray.b - ray.a; + if (ray_dir.squaredNorm() == 0.0) + return; + + // Standard slab ray-vs-AABB test. Accept a hit when the nearest plane entry is + // closer than the farthest plane exit and the exit is in front of the origin. + auto ray_hits_bbox = [](const Vec3d& o, const Vec3d& d, const BoundingBoxf3& bb) -> bool { + double tmin = -std::numeric_limits::infinity(); + double tmax = std::numeric_limits::infinity(); + for (int i = 0; i < 3; ++i) { + if (std::abs(d[i]) < 1e-12) { + if (o[i] < bb.min[i] || o[i] > bb.max[i]) + return false; + } + else { + double t1 = (bb.min[i] - o[i]) / d[i]; + double t2 = (bb.max[i] - o[i]) / d[i]; + if (t1 > t2) std::swap(t1, t2); + tmin = std::max(tmin, t1); + tmax = std::min(tmax, t2); + if (tmin > tmax) return false; + } + } + return tmax >= 0.0; + }; + + // Match _render_imex_ghosts: only hit-test ghosts on the active plate. Picking + // through ghosts on background plates would hand the user a stale plate index + // for the head-filament popover and let them edit a plate they aren't looking at. + PartPlateList& ppl = wxGetApp().plater()->get_partplate_list(); + PartPlate* active_plate = ppl.get_curr_plate(); + if (active_plate) { + const auto& ghosts = active_plate->get_imex_ghost_volumes(); + for (const auto& g : ghosts) { + if (!g || !g->is_active || !g->picking) continue; + const BoundingBoxf3 bbox = g->transformed_bounding_box(); + if (ray_hits_bbox(ray_origin, ray_dir, bbox)) { + m_hover_ghost_head = PartPlate::imex_ghost_head_from_composite_id(g->composite_id.object_id); + m_hover_ghost_plate = ppl.get_curr_plate_index(); + return; // first hit wins + } + } + } +} + +void GLCanvas3D::_render_imex_ghosts(bool xray_pass) +{ + // Draws through whichever shader the caller bound: the shaded pass leaves gouraud current, + // the X-Ray pass its own program. Both are fed per volume below; the uniforms a pass sets + // once for itself are the caller's (see _render_imex_ghosts_xray for the X-Ray pass's). + // GLVolume::render() only binds its mesh, so we must set the per-volume + // matrices AND uniform_color that GLVolumeCollection::render would normally + // set; otherwise ghosts pick up whatever the last main volume left behind. + GLShaderProgram* shader = wxGetApp().get_current_shader(); + if (shader == nullptr) + return; + + // Primary-volume live transform lookup: during a gizmo drag the GLVolume's + // instance_transformation is the source of truth (the ModelInstance matrix + // only catches up on mouse-up). Returning it from here makes ghosts track + // the drag every frame instead of snapping when the user releases. + auto primary_live_xf = [this](int obj_idx, int inst_idx) -> std::optional { + for (const GLVolume* v : m_volumes.volumes) { + if (!v) continue; + if (v->composite_id.object_id == obj_idx && + v->composite_id.instance_id == inst_idx) + return v->get_instance_transformation().get_matrix(); + } + return std::nullopt; + }; + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + // Ghosts live outside the build volume check; disable the partly-inside path. + shader->set_uniform("print_volume.type", -1); + shader->set_uniform("slope.actived", false); + + // Only render ghosts for the active plate. Iterating every plate here causes + // ghosts from background plates to bleed through into the active scene + // (e.g. when entering paint mode), since the GL state is shared across the + // whole canvas. Per-plate ghost volumes still live on each PartPlate so they + // round-trip through 3MF saves; we just don't draw them when their plate + // isn't the one the user is currently looking at. + PartPlateList& ppl = wxGetApp().plater()->get_partplate_list(); + PartPlate* active_plate = ppl.get_curr_plate(); + if (active_plate) { + // Refresh per-frame so ghost positions reflect the primary's live drag state, + // and restamp ghost RGB from the live filament palette so color-only changes + // (palette edits, late-loading project colors) never leave stale ghosts. + active_plate->update_imex_ghost_transforms(primary_live_xf); + active_plate->update_imex_ghost_colors(); + const auto& ghosts = active_plate->get_imex_ghost_volumes(); + for (const auto& g : ghosts) { + if (!g || !g->is_active) continue; + const Transform3d model_matrix = g->world_matrix(); + shader->set_uniform("volume_world_matrix", model_matrix); + shader->set_uniform("slope.volume_world_normal_matrix", + static_cast(model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose().cast())); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) + * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + g->set_render_color(); + // GLModel::render() pushes its own data.color into uniform_color, + // so we must stamp the ghost's color onto the model before render + // or it draws black. Pattern matches 3DScene.cpp:1099. + // X-Ray derives its own coverage from view angle and multiplies the colour's alpha + // into it, so a ghost carrying its translucency as well composites about three times + // fainter than the body it mirrors. Hand that pass an opaque colour and let its + // density be the only source of translucency. + ColorRGBA ghost_color = g->render_color; + if (xray_pass) + ghost_color.a(1.0f); + g->model.set_color(ghost_color); + g->render(); + } + } +} + +void GLCanvas3D::_render_imex_ghost_tooltip() +{ + if (m_hover_ghost_head < 0) + return; + + // Hover state can outlive the ghosts that produced it: _picking_pass_imex_ghosts + // only resets m_hover_ghost_head when it runs, and _picking_pass early-returns + // (mouse drag, mouse off-canvas, gizmo drag) skip that reset. If the user switches + // from an IMEX printer to a non-IMEX one during such a window, the plate clears its + // ghost volumes but the stale head index survives — producing an orphan tooltip. + // Validate against live ghosts and self-heal before rendering. + const PartPlate* plate = wxGetApp().plater()->get_partplate_list().get_plate(m_hover_ghost_plate); + if (!plate || plate->get_imex_ghost_volumes().empty()) { + m_hover_ghost_head = -1; + m_hover_ghost_plate = -1; + return; + } + + const auto t = wxGetApp().plater()->format_imex_ghost_tooltip(m_hover_ghost_head); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + const Vec2i32 mouse = m_mouse.position.cast(); + const float cursor_offset = imgui.scaled(1.6f); // ~16px @ 100%, scales with DPI + imgui.set_next_window_pos(float(mouse.x()) + cursor_offset, float(mouse.y()) + cursor_offset, + ImGuiCond_Always, 0.0f, 0.0f); + imgui.begin(std::string("##imex_ghost_tooltip"), + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | + ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | + ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoMouseInputs); + // Color swatch + label on the same row. imgui.scaled() keeps it readable on high-DPI. + const ImVec4 col(t.swatch.r(), t.swatch.g(), t.swatch.b(), t.swatch.a()); + const float swatch_size = imgui.scaled(1.4f); + ImGui::ColorButton("##swatch", col, + ImGuiColorEditFlags_NoBorder | ImGuiColorEditFlags_NoTooltip, + ImVec2(swatch_size, swatch_size)); + ImGui::SameLine(); + imgui.text(t.label); + imgui.end(); +} + void GLCanvas3D::_rectangular_selection_picking_pass() { m_gizmos.set_hover_id(-1); @@ -9210,6 +9421,8 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with if (_is_xray_view_active()) { if (type == GLVolumeCollection::ERenderType::Opaque) _render_xray_volumes(); + else + _render_imex_ghosts_xray(); m_camera_clipping_plane = ClippingPlane::ClipsNothing(); return; } @@ -9337,6 +9550,9 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type, bool with } }, partly_inside_enable, printable_heights); + // IMEX ghosts are transparent and share the same shader/camera state; + // render them right after the main transparent pass while the shader is still bound. + _render_imex_ghosts(); break; } } @@ -9439,6 +9655,36 @@ void GLCanvas3D::_render_xray_volumes() glsafe(::glDepthMask(GL_TRUE)); } +// The IDEX/IQEX ghosts are not in m_volumes, so the X-Ray pass that replaces both shaded passes +// does not reach them on its own. They go through the X-Ray shader here rather than their own, +// which is what makes a ghost read as one more see-through body. +void GLCanvas3D::_render_imex_ghosts_xray() +{ + GLShaderProgram* shader = wxGetApp().get_shader("xray"); + if (shader == nullptr) + return; + + // The blend and depth state _render_xray_volumes() uses, plus its two-sided drawing: the + // shader shades back faces too, so a hollow ghost shows its far wall like a real body does. + glsafe(::glDepthMask(GL_FALSE)); + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + glsafe(::glDisable(GL_CULL_FACE)); + + shader->start_using(); + // _render_imex_ghosts() sets the per-volume matrices and the color, but the two uniforms + // the volume collection would have set for the whole pass are this pass's to supply, and + // the vertex shader discards everything outside z_range - an unset one hides every ghost. + shader->set_uniform("z_range", m_volumes.get_z_range()); + shader->set_uniform("clipping_plane", m_volumes.get_clipping_plane()); + _render_imex_ghosts(/*xray_pass=*/true); + shader->stop_using(); + + glsafe(::glEnable(GL_CULL_FACE)); + glsafe(::glDisable(GL_BLEND)); + glsafe(::glDepthMask(GL_TRUE)); +} + void GLCanvas3D::_render_wireframe_overlay() { if (!wxGetApp().plater()->is_show_wireframe()) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 70ef0d52b3..bb148234d1 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -776,6 +776,9 @@ private: //BBS:add plate related logic mutable std::vector m_hover_volume_idxs; std::vector m_hover_plate_idxs; + // IMEX ghost hover state (plate-owned transparent ghost volumes). + int m_hover_ghost_head { -1 }; // physical head index, -1 when not hovering a ghost + int m_hover_ghost_plate { -1 }; // plate index for the hovered ghost, -1 when none //BBS if explosion_ratio is changed, need to update volume bounding box mutable float m_explosion_ratio = 1.0; mutable Vec3d m_rotation_center{ 0.0, 0.0, 0.0}; @@ -1313,6 +1316,8 @@ public: int get_move_volume_id() const { return m_mouse.drag.move_volume_idx; } int get_first_hover_volume_idx() const { return m_hover_volume_idxs.empty() ? -1 : m_hover_volume_idxs.front(); } + int get_hover_ghost_head() const { return m_hover_ghost_head; } + int get_hover_ghost_plate() const { return m_hover_ghost_plate; } void set_selected_extruder(int extruder) { m_selected_extruder = extruder;} class WipeTowerInfo { @@ -1480,6 +1485,8 @@ private: void _picking_pass(); void _rectangular_selection_picking_pass(); + // IMEX ghost picking (ray vs. ghost bbox). Runs at the end of _picking_pass. + void _picking_pass_imex_ghosts(); bool _is_fxaa_enabled() const; bool _is_realistic_view_enabled() const; bool _is_ssao_enabled() const; @@ -1521,6 +1528,12 @@ private: void _render_cad_grid(const Transform3d& view_matrix, const Transform3d& projection_matrix); //BBS: add outline drawing logic void _render_objects(GLVolumeCollection::ERenderType type, bool with_outline = true); + // IMEX ghost volumes owned by PartPlate, drawn through the shader the caller bound: + // the shaded pass's transparent half, or the X-Ray pass below. + void _render_imex_ghosts(bool xray_pass = false); + void _render_imex_ghosts_xray(); + // IMEX ghost hover tooltip: filament swatch + label drawn as an ImGui overlay. + void _render_imex_ghost_tooltip(); void _render_section_view_caps(); void _render_wireframe_overlay(); bool _is_xray_view_active() const; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 756775a4d9..8940e13e6e 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1861,6 +1861,17 @@ namespace { constexpr int FINAL_DRAIN_TIMEOUT_MS = 100; // Final event processing before destruction constexpr int POLL_INTERVAL_MS = 50; // Polling interval for state checks constexpr int MAX_YIELD_ITERATIONS = 20; // Maximum wxYield calls per drain cycle + + // The Orca agent's health check reports into GUI_App from a worker thread, and the agent can + // outlive GUI_App's use of it (the plugin service keeps a reference), so stop the check before + // the agent is deleted or replaced. The cast is null when no Orca agent is attached. + void stop_orca_health_check(NetworkAgent* agent) + { + if (!agent) + return; + if (auto orca_agent = std::dynamic_pointer_cast(agent->get_cloud_agent())) + orca_agent->stop_health_check(); + } } // Process pending wx events with bounded iteration count @@ -1993,6 +2004,10 @@ bool GUI_App::hot_reload_network_plugin() } if (m_agent) { + // Stop the health check first: a result it posts after the Phase 2 drain would run while + // m_agent is null or replaced. + stop_orca_health_check(m_agent); + // Phase 1: Clear all callbacks (stops new invocations) BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": Phase 1 - clearing callbacks"; m_agent->set_on_ssdp_msg_fn(nullptr); @@ -2639,9 +2654,10 @@ void GUI_App::init_webview_runtime() BOOST_LOG_TRIVIAL(info) << "WebView2 runtime installed successfully."; } else { BOOST_LOG_TRIVIAL(error) << "WebView2 runtime installation failed or still not detected."; - wxMessageBox(_L("The Microsoft WebView2 Runtime could not be installed.\n" - "Some features, including the setup wizard, may appear blank until it is installed.\n" - "Please install it manually from https://developer.microsoft.com/microsoft-edge/webview2/ and restart Orca Slicer."), + wxMessageBox(format_wxstr(_L("The Microsoft WebView2 Runtime could not be installed.\n" + "Some features, including the setup wizard, may appear blank until it is installed.\n" + "Please install it manually from %1% and restart Orca Slicer."), + "https://developer.microsoft.com/microsoft-edge/webview2/"), _L("WebView2 Runtime"), wxOK | wxICON_WARNING); } } @@ -2860,6 +2876,7 @@ int GUI_App::OnExit() NetworkAgentFactory::clear_printer_agent_cache(); if (m_agent) { + stop_orca_health_check(m_agent); // BBS avoid a crash on mac platform #ifdef __WINDOWS__ m_agent->start_discovery(false, false); @@ -2893,6 +2910,14 @@ int GUI_App::OnExit() return wxApp::OnExit(); } +void GUI_App::CleanUp() +{ + // OnExit() does not run when OnInit() fails, and m_agent is then still set. Stop the check before + // wxApp::CleanUp() resets wxTheApp, which a result posted from the worker would still be using. + stop_orca_health_check(m_agent); + wxApp::CleanUp(); +} + class wxBoostLog : public wxLog { void DoLogText(const wxString &msg) override { @@ -3115,9 +3140,11 @@ bool GUI_App::on_init_inner() // OnExit() and ~GUI_App() never run. Shut the plugins and Python down here as ~GUI_App() does. Left to // PluginManager's static destructor, the shutdown locks hook state that has already been destroyed and aborts. // Unload the Bambu network plugin too. Its static destructors abort if its agent's threads are still running. + // Stop the Orca Cloud health check as OnExit() does, so no request is in flight while exit() tears down. wxGetApp().Bind(wxEVT_END_SESSION, [this](wxCloseEvent &e) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "received wxEVT_END_SESSION"; stop_sync_user_preset(); + stop_orca_health_check(m_agent); Slic3r::NetworkAgent::unload_network_module(); Slic3r::PluginManager::instance().shutdown(); Slic3r::PythonInterpreter::instance().shutdown(); @@ -3975,6 +4002,9 @@ bool GUI_App::on_init_network(bool try_backup) // m_agent = new Slic3r::NetworkAgent(data_directory); std::unique_ptr agent_ptr = Slic3r::create_agent_from_config(data_directory, app_config); + // A direct restart_networking() replaces m_agent without deleting it, so a health check in flight + // on the old agent would still report into the GUI. + stop_orca_health_check(m_agent); m_agent = agent_ptr.release(); if (!m_device_manager) diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 361693ed42..0a2ddc5f17 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -373,6 +373,7 @@ public: std::string get_local_models_path(); bool OnInit() override; int OnExit() override; + void CleanUp() override; bool initialized() const { return m_initialized; } inline bool is_enable_multi_machine() { return this->app_config&& this->app_config->get("enable_multi_machine") == "true"; } #ifdef SLIC3R_CAD @@ -396,6 +397,8 @@ public: Slic3r::TaskManager* getTaskManager() { return m_task_manager; } HMSQuery* get_hms_query() { return hms_query; } NetworkAgent* getAgent() { return m_agent; } + // Version that wrote the app config before this run; empty when there was no app config. + const boost::optional& last_config_version() const { return m_last_config_version; } // Reconcile the live printer agent with the stored preset selection. void switch_printer_agent(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 81d4252be5..4bae9a28fe 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -113,7 +113,7 @@ Vec3f GLGizmoPainterBase::get_tilt_up_direction() const return build_plate_tilt_up_direction().cast(); } -void GLGizmoPainterBase::render_triangles(const Selection& selection) const +void GLGizmoPainterBase::render_triangles(const Selection& selection, const ModelVolume* skip) const { auto* shader = wxGetApp().get_shader("mm_gouraud"); if (!shader) @@ -135,6 +135,8 @@ void GLGizmoPainterBase::render_triangles(const Selection& selection) const continue; ++mesh_id; + if (mv == skip) + continue; Transform3d trafo_matrix; if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index 60ae6f02a3..96871ae5dc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -48,6 +48,9 @@ public: virtual ~TriangleSelectorGUI() = default; virtual void render(ImGuiWrapper* imgui, const Transform3d& matrix); + // The seed-fill contour alone, as render() last built it - for a gizmo that draws over the selector + // and has to put the contour back on top. + void render_paint_contour(const Transform3d& matrix); //void render(const Transform3d& matrix) { this->render(nullptr, matrix); } void set_wireframe_needed(bool need_wireframe) { m_need_wireframe = need_wireframe; } bool get_wireframe_needed() { return m_need_wireframe; } @@ -90,7 +93,6 @@ protected: GLModel m_paint_contour; void update_paint_contour(); - void render_paint_contour(const Transform3d& matrix); bool m_need_wireframe {false}; }; @@ -231,7 +233,8 @@ public: bool on_mouse(const wxMouseEvent &mouse_event) override; protected: - virtual void render_triangles(const Selection& selection) const; + // Draws every model part's selector, except `skip`'s when given. + virtual void render_triangles(const Selection& selection, const ModelVolume* skip = nullptr) const; void render_cursor(); void render_cursor_circle(); void render_cursor_sphere(const Transform3d& trafo) const; @@ -328,6 +331,9 @@ protected: TriangleSelector::ClippingPlane get_clipping_plane_in_volume_coordinates(const Transform3d &trafo) const; + // True while a paint or erase stroke is under way. + bool is_painting() const { return m_button_down != Button::None; } + private: std::vector> get_projected_mouse_positions(const Vec2d &mouse_position, double resolution, const std::vector &trafo_matrices) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.cpp b/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.cpp index b6d68383fe..96af821505 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.cpp @@ -8,6 +8,7 @@ #include "ColorSpaceConvert.hpp" #include "libslic3r/AABBTreeIndirect.hpp" #include "libslic3r/Color.hpp" +#include "libslic3r/FilamentMixer.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/MeshBoolean.hpp" #include "libslic3r/Model.hpp" @@ -69,6 +70,7 @@ #include #include #include +#include #include #include #include @@ -257,11 +259,54 @@ TriangleSelector::TriangleSplittingData remap_texture_paint_spatial( // entry to fill. constexpr int PALETTE_LUT_EDGE = 24; -// Ceiling on the printable palette, which bounds that fill cost (and the shader's uniform array). +// The shaded preview shader's palette arrays. The palette itself stays within the paint mask's +// EnforcerBlockerType::ExtruderMax states, since every entry has to become a filament. constexpr int PALETTE_MAX_ENTRIES = 64; -// Ceiling on the filaments the palette's entries can refer to (the shaded preview shader's filament_rgb[]); -// mmu segmentation stops at Extruder16 anyway. -constexpr int PALETTE_MAX_FILAMENTS = 16; + +// A mix is an interleave that only reads as its colour from a distance; up close it is stripes. So it +// is spent only where it beats the nearest single filament by this much (CIEDE2000). Two is about +// where a side-by-side difference stops being arguable; a margin of ten already turns most of a +// greyscale ramp - the shape a height texture actually traces - back into single filaments. The +// quantizer, the mix ranking and the shaded preview shader all apply it, so they agree on where a mix +// is used. +constexpr float PREFER_PURE_DE = 2.f; + +// mix_targets(): the most pixels read per layer, and the histogram bins kept over all layers. Together +// they bound rank_mixes() to candidates x MIX_TARGET_BINS colour differences, the same order as filling +// the quantizer's lookup cube. +constexpr size_t MIX_TARGET_SAMPLES = size_t(1) << 20; +constexpr size_t MIX_TARGET_BINS = 256; +// rank_mixes() stops once the best remaining mix would improve the match by less than this, in +// CIEDE2000 averaged over every pixel of the colouring layers (see mix_targets()): a mix that only +// touches a few stray pixels is not worth a filament slot. +constexpr float MIN_MIX_GAIN = 0.05f; + +// The project's mixed filament slots, one string each, as the palette cache compares them: anything +// that changes which of them a mix can reuse changes this. +std::vector mixed_slot_signature(const DynamicPrintConfig &project_config) +{ + std::vector out; + const auto *is_mixed = project_config.option("filament_is_mixed"); + const auto *comps = project_config.option("filament_mixed_components"); + const auto *ratios = project_config.option("filament_mixed_sublayer_ratios"); + const auto *gradient = project_config.option("filament_mixed_gradient"); + if (is_mixed == nullptr || comps == nullptr || ratios == nullptr) + return out; + for (size_t i = 0; i < is_mixed->values.size(); ++i) + if (is_mixed->values[i]) + out.push_back(std::to_string(i) + ':' + (i < comps->values.size() ? comps->values[i] : std::string()) + '|' + + (i < ratios->values.size() ? ratios->values[i] : std::string()) + '|' + + (gradient != nullptr && i < gradient->values.size() && gradient->values[i] ? "g" : "")); + return out; +} + +// Whether two palettes would draw and print the same. +bool same_palette(const std::vector &l, const std::vector &r) +{ + return std::equal(l.begin(), l.end(), r.begin(), r.end(), [](const PrintableColor &x, const PrintableColor &y) { + return x.a == y.a && x.b == y.b && x.num == y.num && x.den == y.den && x.rgb == y.rgb; + }); +} // sRGB (0..1) <-> CIELAB, D65. Exactly what the preview shader's srgb_to_lab() computes, so the CPU // quantizer, the mixed-palette entries and the per-fragment preview all match in the same space. @@ -458,6 +503,11 @@ std::string GLGizmoTextureDisplacement::on_get_name() const return _u8L("Texture displacement"); } +bool GLGizmoTextureDisplacement::on_is_activable() const +{ + return m_parent.get_canvas_type() != GLCanvas3D::CanvasAssembleView && GLGizmoPainterBase::on_is_activable(); +} + void GLGizmoTextureDisplacement::on_shutdown() { m_parent.toggle_model_objects_visibility(true); @@ -465,10 +515,25 @@ void GLGizmoTextureDisplacement::on_shutdown() m_shaded_preview_glmodel.reset(); m_paint_overlay_glmodel.reset(); m_paint_overlay_dirty = false; + m_painted_colors = PaintedColors{}; + m_painted_colors_key.clear(); + m_painted_colors_glmodel.reset(); + m_painted_colors_drawn_key.clear(); + m_painted_colors_runs.clear(); + m_seed_fill_last_mesh_id = -1; // a hover from this session must not count in the next // Any preview still in flight is superseded: raising the shared counter makes it abort at its next // progress poll, and its completion handler then finds nothing to do. m_preview_generation->fetch_add(1); m_preview_job_pending = false; + // The palette caches hold the last volume's images; a closed gizmo should not keep them alive. + m_palette_cache.clear(); + m_palette_quantizer = nullptr; + m_palette_pure_quantizer = nullptr; + m_palette_filaments.clear(); + m_palette_images.clear(); + m_mix_ranking.reset(); + m_palette_slots.clear(); + m_palette_changed = false; m_uvcheck_glmodel.reset(); m_wireframe_overlay_glmodel.reset(); m_wireframe_overlay_vcount = 0; @@ -527,22 +592,17 @@ void GLGizmoTextureDisplacement::render_painter_gizmo() glsafe(::glEnable(GL_DEPTH_TEST)); // Once anything is painted, m_preview_glmodel holds the true displaced result (same algorithm - // Bake uses). The untouched original topology (what render_triangles() draws) coincides - // exactly with it everywhere except the painted/displaced area, so both are drawn: the real - // preview geometry first, then the usual selection-highlight overlay with a small depth bias - // so it wins the depth test on the coincident (unpainted) surface - keeping the familiar - // enforcer/blocker highlight for precise brush editing there. Where the surface has actually - // been displaced, the raised preview geometry legitimately occludes the flat overlay - that - // visible relief is itself the "this is painted" indicator in that area. + // Bake uses). The untouched original topology (what render_triangles() draws) coincides exactly + // with it everywhere except the displaced area, so both can be drawn: the real preview geometry + // first, then the selectors' highlight with a small depth bias so it wins the depth test on the + // coincident surface. Where the surface has actually been displaced, the raised preview geometry + // legitimately occludes the flat highlight - that visible relief is itself the "this is painted" + // indicator in that area. // - // The shaded preview is different: it never actually moves geometry (it only shades), so - // its depth is identical to the overlay's *everywhere*, not just in the unpainted area - the - // depth-biased opaque overlay would win the depth test across the whole surface and hide the relief - // shading entirely. So render_triangles() is skipped for it. What is *not* skipped is - // render_paint_overlay(): leaving the shading as the only paint feedback meant a stroke that - // erased paint, or added it with no texture picked, changed nothing on screen until the whole - // preview rebuilt at stroke end - and in the true-displacement view the opaque overlay is hidden - // by the raised surface for the same reason. The translucent tint covers both cases. + // The shaded preview never actually moves geometry (it only shades), so its depth is identical to + // the highlight's *everywhere*: the depth-biased opaque highlight would win the depth test across the + // whole surface and hide the shading entirely. So render_triangles() leaves the textured volume out + // there, and the translucent tint drawn further down is the paint feedback instead. // Coalesced shaded-preview rebuild from an in-progress UV island drag (see on_island_edited): done here, at // most once per drawn frame, rather than synchronously in the UV canvas's mouse-move handler. if (m_use_shaded_preview && m_shaded_preview_dirty) { @@ -579,24 +639,34 @@ void GLGizmoTextureDisplacement::render_painter_gizmo() // Hide the real volume only when something is actually going to be drawn in its place; otherwise // put it back. Getting this wrong leaves an invisible model, so it is decided once, here, rather // than per branch below. + ModelVolume *mv = texture_volume(); m_parent.toggle_model_objects_visibility(true); - if (use_shaded || use_true_preview) { - if (ModelVolume *mv = texture_volume()) - m_parent.toggle_model_objects_visibility(false, m_c->selection_info()->model_object(), - m_c->selection_info()->get_active_instance(), mv); - } + if ((use_shaded || use_true_preview) && mv != nullptr) + m_parent.toggle_model_objects_visibility(false, m_c->selection_info()->model_object(), + m_c->selection_info()->get_active_instance(), mv); + // Over a preview, the paint feedback - the selectors' highlight in the Normal view, the tint in both - + // is drawn only while a mouse button is down: during a stroke, a fill click included. Between strokes + // it would cover the preview: the highlight buries it under a flat plane wherever the relief does not + // rise, and the tint washes it green. The debug view shows a captured stage rather than a preview, so + // it keeps the feedback. + const bool paint_feedback = is_painting() || m_debug_stage >= 0; + + // Whether the textured volume's selector - and with it a fill tool's contour - is drawn this frame. + bool textured_selector_drawn = true; if (use_shaded) { render_shaded_preview_mesh(); + // The shaded mesh is the textured volume alone, so the other model parts are still the selectors' to draw. + render_triangles(selection, mv); + textured_selector_drawn = false; } else if (use_true_preview) { render_preview_mesh(); - - if (show_paint_overlay) { - glsafe(::glEnable(GL_POLYGON_OFFSET_FILL)); - glsafe(::glPolygonOffset(-1.0f, -1.0f)); - render_triangles(selection); - glsafe(::glDisable(GL_POLYGON_OFFSET_FILL)); - } + glsafe(::glEnable(GL_POLYGON_OFFSET_FILL)); + glsafe(::glPolygonOffset(-1.0f, -1.0f)); + // Without paint feedback, only the other model parts: render_preview_mesh() draws the textured one. + render_triangles(selection, paint_feedback ? nullptr : mv); + glsafe(::glDisable(GL_POLYGON_OFFSET_FILL)); + textured_selector_drawn = paint_feedback; } else { // render_triangles() *is* the model in a painter gizmo (it draws every model-part volume with the // selector's colours), not an overlay on top of one - so it still has to run under a UV-check @@ -607,6 +677,10 @@ void GLGizmoTextureDisplacement::render_painter_gizmo() render_triangles(selection); } + // The model's colour paint, over whichever surface was drawn, left out where that surface's preview shows + // paint of its own: every layer's for the Normal mesh, the active layer's otherwise. + const bool painted_colors_drawn = show_paint_overlay && m_debug_stage < 0 && render_painted_colors(use_true_preview); + // Every other layer's paint, in muted grey, so all layers stay visible while one of them is edited. Drawn // before the active layer's tint so that one reads on top where the two overlap. if (show_paint_overlay) @@ -615,10 +689,32 @@ void GLGizmoTextureDisplacement::render_painter_gizmo() // The translucent paint tint. Needed in the shaded view because the opaque highlight above is // skipped there, and in the true-displacement view because the displaced surface rises *above* // the undisplaced overlay geometry and hides it exactly where the relief is strongest - in both - // cases leaving an erase stroke with no visible effect until the next full preview rebuild. - if (show_paint_overlay && (use_shaded || use_true_preview)) + // cases leaving an erase stroke with no visible effect until the next full preview rebuild. With no + // preview, the highlight is the selectors' own, except during a stroke over the colour paint: the paint + // there is not flushed yet, so the colours are still drawn over the stroke's highlight. + const bool preview_drawn = use_shaded || use_true_preview; + if (show_paint_overlay && (preview_drawn ? paint_feedback : painted_colors_drawn && is_painting())) render_paint_overlay(m_paint_overlay_glmodel); + // A fill tool's contour is drawn with the selectors, under the colour paint drawn since - which covers it + // on a steep face, where the paint's slope-scaled offset outruns the contour's fixed one. Put it back on top, + // at the depth its first draw stored, hence LEQUAL. Only where the selector was drawn this frame: drawing it + // is what rebuilds the contour. The tool test matters because the base keeps the last hovered mesh when the + // tool changes. + const bool fill_tool = m_tool_type == ToolType::SMART_FILL || m_tool_type == ToolType::BUCKET_FILL || + (m_tool_type == ToolType::BRUSH && m_cursor_type == TriangleSelector::CursorType::POINTER); + const int textured_mesh_id = texture_volume_raycaster_index(); + if (painted_colors_drawn && textured_selector_drawn && fill_tool && textured_mesh_id >= 0 && + textured_mesh_id == m_seed_fill_last_mesh_id && size_t(textured_mesh_id) < m_triangle_selectors.size()) { + const ModelObject *mo = m_c->selection_info()->model_object(); + GLint depth_func = GL_LESS; + glsafe(::glGetIntegerv(GL_DEPTH_FUNC, &depth_func)); + glsafe(::glDepthFunc(GL_LEQUAL)); + m_triangle_selectors[size_t(textured_mesh_id)]->render_paint_contour( + mo->instances[selection.get_instance_idx()]->get_transformation().get_matrix() * mv->get_matrix()); + glsafe(::glDepthFunc(GLenum(depth_func))); + } + // The UV editor's island selection, shown on the model. Polled here rather than pushed: the pane // changes its selection in its own mouse handling, and a compare of a few ints per frame is free. { @@ -1495,10 +1591,9 @@ void GLGizmoTextureDisplacement::render_shaded_preview_mesh() shader->set_uniform("patch_center", m_shaded_patch_center); shader->set_uniform("patch_axis", m_shaded_patch_axis); - // The filament palette the mesh's per-triangle indices refer to. Count 0 means "no layer is - // colouring", and the shader keeps the model's own colour for every fragment. - // The printable palette, in RGB for display and in Lab for the match. Uploaded rather than - // matched on the CPU because the quantization is per fragment here. + // The printable palette, in RGB for display and in Lab for the match. Uploaded rather than matched + // on the CPU because the quantization is per fragment here. Count 0 means "no layer is colouring", + // and the shader keeps the model's own colour for every fragment. const GLTexture *color_tex = get_layer_color_texture(*layer); const int palette_count = (color_tex != nullptr) ? int(std::min(m_shaded_preview_palette.size(), size_t(PALETTE_MAX_ENTRIES))) : 0; @@ -1506,24 +1601,17 @@ void GLGizmoTextureDisplacement::render_shaded_preview_mesh() shader->set_uniform("has_color_tex", color_tex != nullptr); // A flat-colour image is matched against single filaments only, as the bake does. shader->set_uniform("pure_only", color_tex != nullptr && analyze_texture_detail(*layer).flat_colors); + shader->set_uniform("prefer_pure_de", PREFER_PURE_DE); for (int i = 0; i < palette_count; ++i) { const PaletteEntry &e = m_shaded_preview_palette[size_t(i)]; const std::string idx = "[" + std::to_string(i) + "]"; + // An entry's colour is what it prints as: its filament's, or for a mix its mixed filament slot's. shader->set_uniform(("palette_rgb" + idx).c_str(), e.rgb); shader->set_uniform(("palette_lab" + idx).c_str(), srgb_to_lab(e.rgb)); - // How the entry prints: its filament, or for a mix the two it interleaves and in what ratio. + // Only so the shader can tell a mix (a != b) from a single filament. shader->set_uniform(("palette_a" + idx).c_str(), e.a); shader->set_uniform(("palette_b" + idx).c_str(), e.b); } - // The filaments those indices refer to, and the interleave the shader resolves a mix with - the - // the mix's smooth average colour. m_palette_filaments is what m_shaded_preview_palette was built from. - const int filament_count = - (palette_count > 0) ? int(std::min(m_palette_filaments.size(), size_t(PALETTE_MAX_FILAMENTS))) : 0; - shader->set_uniform("filament_count", filament_count); - for (int i = 0; i < filament_count; ++i) { - const ColorRGBA &c = m_palette_filaments[size_t(i)]; - shader->set_uniform(("filament_rgb[" + std::to_string(i) + "]").c_str(), Vec3f(c.r(), c.g(), c.b())); - } if (color_tex != nullptr) { shader->set_uniform("color_tex", 1); glsafe(::glActiveTexture(GL_TEXTURE1)); @@ -1617,6 +1705,150 @@ void GLGizmoTextureDisplacement::rebuild_other_paint_overlay() m_other_paint_glmodel.set_color(ColorRGBA(0.55f, 0.58f, 0.60f, 0.35f)); } +std::vector GLGizmoTextureDisplacement::PaintedColors::outside(const std::vector &excluded) const +{ + std::vector out; + out.reserve(source.size()); + for (size_t i = 0; i < source.size(); ++i) + if (size_t(source[i]) >= excluded.size() || !excluded[size_t(source[i])]) + out.push_back(i); + return out; +} + +GLGizmoTextureDisplacement::PaintedColors GLGizmoTextureDisplacement::painted_colors(const TriangleMesh &mesh, + const TriangleSelector::TriangleSplittingData &paint) +{ + PaintedColors out; + TriangleSelector selector(mesh); + selector.deserialize(paint, false); + for (const EnforcerBlockerType state : TriangleSelector::extract_used_facet_states(paint)) { + if (state == EnforcerBlockerType::NONE) + continue; + std::vector source; + const indexed_triangle_set part = selector.get_facets_strict(state, &source); + // Every state comes back over the same vertex array, only the triangles differ. + if (out.facets.vertices.empty()) + out.facets.vertices = part.vertices; + out.facets.indices.insert(out.facets.indices.end(), part.indices.begin(), part.indices.end()); + out.source.insert(out.source.end(), source.begin(), source.end()); + out.state.resize(out.facets.indices.size(), int(state)); + } + return out; +} + +void GLGizmoTextureDisplacement::rebuild_painted_colors(bool whole_stack) +{ + const ModelVolume *mv = texture_volume(); + const bool shown = mv != nullptr && any_layer_colors(*mv) && !mv->mmu_segmentation_facets.empty(); + + // The sub-triangles, keyed on what they were read from: the volume, its mesh and the paint. + std::string key; + if (shown) + key = std::to_string(mv->id().id) + ":" + std::to_string(reinterpret_cast(mv->mesh_ptr().get())) + ":" + + std::to_string(mv->mmu_segmentation_facets.timestamp()); + if (key != m_painted_colors_key) { + m_painted_colors_key = std::move(key); + m_painted_colors = shown ? painted_colors(mv->mesh(), mv->mmu_segmentation_facets.get_data()) : PaintedColors{}; + m_painted_colors_drawn_key.clear(); + m_painted_colors_glmodel.reset(); + m_painted_colors_runs.clear(); + } + if (m_painted_colors.state.empty()) + return; + + // The part drawn, keyed on whose paint is left out and on that paint. + std::string drawn_key = m_painted_colors_key + (whole_stack ? std::string(":all") : ":" + std::to_string(m_active_layer_slot)); + for (const TextureDisplacementLayer &l : mv->texture_displacement_layers) + if (l.slot >= 0 && l.slot < int(TEXTURE_DISPLACEMENT_MAX_LAYERS)) + drawn_key += "|" + std::to_string(l.slot) + "@" + std::to_string(mv->texture_displacement_facet(l.slot).timestamp()); + if (drawn_key == m_painted_colors_drawn_key) + return; + m_painted_colors_drawn_key = std::move(drawn_key); + m_painted_colors_glmodel.reset(); + m_painted_colors_runs.clear(); + + // Whole model triangles, as the facets record what they touch: a triangle the paint only partly covers + // is left to the preview. + std::vector excluded(mv->mesh().its.indices.size(), false); + for (const TextureDisplacementLayer &l : mv->texture_displacement_layers) { + if (l.slot < 0 || l.slot >= int(TEXTURE_DISPLACEMENT_MAX_LAYERS) || (!whole_stack && l.slot != m_active_layer_slot)) + continue; + for (const TriangleSelector::TriangleBitStreamMapping &m : mv->texture_displacement_facet(l.slot).get_data().triangles_to_split) + if (m.triangle_idx >= 0 && size_t(m.triangle_idx) < excluded.size()) + excluded[size_t(m.triangle_idx)] = true; + } + + // One model, its triangles in filament order (painted_colors() groups them), drawn a range per filament. + const std::vector kept = m_painted_colors.outside(excluded); + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(kept.size() * 3); + init_data.reserve_indices(kept.size() * 3); + unsigned n = 0; + for (const size_t t : kept) { + const int state = m_painted_colors.state[t]; + if (m_painted_colors_runs.empty() || m_painted_colors_runs.back().first != state) + m_painted_colors_runs.push_back({ state, { size_t(n), size_t(n) } }); + for (int i = 0; i < 3; ++i) + init_data.add_vertex(m_painted_colors.facets.vertices[size_t(m_painted_colors.facets.indices[t][i])]); + init_data.add_triangle(n, n + 1, n + 2); + n += 3; + m_painted_colors_runs.back().second.second = size_t(n); + } + if (!init_data.is_empty()) + m_painted_colors_glmodel.init_from(std::move(init_data)); +} + +bool GLGizmoTextureDisplacement::render_painted_colors(bool whole_stack) +{ + rebuild_painted_colors(whole_stack); + const ModelObject *mo = m_c->selection_info()->model_object(); + const ModelVolume *mv = texture_volume(); + GLShaderProgram *shader = wxGetApp().get_shader("mm_gouraud"); + if (mo == nullptr || mv == nullptr || shader == nullptr || !m_painted_colors_glmodel.is_initialized()) + return false; + + const Selection &selection = m_parent.get_selection(); + const Transform3d trafo_matrix = mo->instances[selection.get_instance_idx()]->get_transformation().get_matrix() * mv->get_matrix(); + const Camera &camera = wxGetApp().plater()->get_camera(); + const Transform3d &view_matrix = camera.get_view_matrix(); + const Matrix3d normal_matrix = trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + const std::vector colors = wxGetApp().plater()->get_extruders_colors(); + + shader->start_using(); + // Set up as render_triangles() sets it up, so the colours are lit, clipped and slope-marked exactly as the + // neutral surface they cover. + const ClippingPlaneDataWrapper clp_data = get_clipping_plane_data(); + shader->set_uniform("clipping_plane", clp_data.clp_dataf); + shader->set_uniform("z_range", clp_data.z_range); + shader->set_uniform("view_model_matrix", view_matrix * trafo_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + shader->set_uniform("view_normal_matrix", Matrix3d(view_matrix.matrix().block(0, 0, 3, 3) * normal_matrix)); + shader->set_uniform("volume_world_matrix", trafo_matrix); + shader->set_uniform("volume_mirrored", trafo_matrix.matrix().determinant() < 0.); + shader->set_uniform("slope.actived", m_parent.is_using_slope()); + shader->set_uniform("slope.volume_world_normal_matrix", Matrix3f(normal_matrix.cast())); + shader->set_uniform("slope.normal_z", float(-std::cos(Geometry::deg2rad(m_highlight_by_angle_threshold_deg)))); + shader->set_uniform("slope.up_direction", get_tilt_up_direction()); + shader->set_uniform("show_wireframe", false); + // Pulled forward and without depth writes, as the tint is (see render_paint_overlay()). The tint is + // drawn after this, so it shows on top. + glsafe(::glEnable(GL_POLYGON_OFFSET_FILL)); + glsafe(::glPolygonOffset(-2.f, -2.f)); + glsafe(::glDepthMask(GL_FALSE)); + bool drawn = false; + for (const auto &[state, range] : m_painted_colors_runs) + if (state >= 1 && size_t(state) <= colors.size()) { + m_painted_colors_glmodel.set_color(adjust_color_for_rendering(colors[size_t(state - 1)])); + m_painted_colors_glmodel.render(range, shader); + drawn = true; + } + glsafe(::glDepthMask(GL_TRUE)); + glsafe(::glDisable(GL_POLYGON_OFFSET_FILL)); + shader->stop_using(); + return drawn; +} + void GLGizmoTextureDisplacement::rebuild_paint_overlay() { m_paint_overlay_glmodel.reset(); @@ -1671,11 +1903,12 @@ void GLGizmoTextureDisplacement::render_paint_overlay(GLModel &overlay) shader->set_uniform("view_model_matrix", camera.get_view_matrix() * trafo_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); // Translucent, and pulled toward the camera so it wins the depth test against the coincident - // shaded surface. Depth writes are off: this is a tint, and letting it own the depth buffer would - // make the wireframe and seam overlays drawn after it fight with geometry that is not really - // there. Blending is already enabled by render_painter_gizmo(). + // shaded surface - and against the selectors' highlight at -1 in the Normal view, by the full depth + // unit OpenGL guarantees to tell apart. Depth writes are off: this is a tint, and letting it own the + // depth buffer would make the wireframe and seam overlays drawn after it fight with geometry that is + // not really there. Blending is already enabled by render_painter_gizmo(). glsafe(::glEnable(GL_POLYGON_OFFSET_FILL)); - glsafe(::glPolygonOffset(-1.5f, -1.5f)); + glsafe(::glPolygonOffset(-2.f, -2.f)); glsafe(::glDepthMask(GL_FALSE)); overlay.render(); glsafe(::glDepthMask(GL_TRUE)); @@ -1991,6 +2224,9 @@ void GLGizmoTextureDisplacement::rebuild_preview() // finishes after the job queued below - and, since the counter is shared with the worker, that // job also notices mid-run and aborts rather than computing a result nobody will use. m_preview_generation->fetch_add(1); + // Everything rebuilt from here on reads the current palette. Cleared before any of the early returns + // below, which would otherwise leave it set and re-run this every frame. + m_palette_changed = false; update_uv_editor(); rebuild_shaded_preview_mesh(); rebuild_paint_overlay(); @@ -2061,25 +2297,21 @@ void GLGizmoTextureDisplacement::queue_preview_job() input.volume_to_world = texture_displacement_volume_to_world(*mv); for (int i = 0; i < int(TEXTURE_DISPLACEMENT_MAX_LAYERS); ++i) input.facets_data[size_t(i)] = mv->texture_displacement_facet(i).get_data(); - // Captured here rather than read in the handler: get_extruders_colors() is main-thread state and - // the preview has to be grouped against the same palette it was computed with, not whatever is - // loaded by the time it lands. + // Captured here rather than read in the handler: the palette is main-thread state, and the preview + // has to be grouped against the same palette it was computed with, not whatever it is by the time + // the result lands. input.color = color_settings_for(*mv); - // The filament list the result's indices refer to, captured with the job rather than read back - // when it lands - loading a filament meanwhile must not recolour a preview computed against a - // different list. - // Every extruder, not the palette's physical-only list: the bake writes the filament it resolved - // to, and a mix resolves to a *mixed filament slot*, which is an extruder past the physical ones. - // Grouping against the shorter list dropped every triangle carrying such a slot out of the mesh - // entirely - the relief vanished and left only the few triangles that happened to print in a plain - // filament. The palette still has to be built from physical filaments alone (see filament_palette()), - // which is why these two are not the same list. - const std::vector filaments = wxGetApp().plater()->get_extruders_colors(); + // The result names a palette entry per triangle (index + 1), so these are the colours to draw it in: + // a single filament's own, or for a mix the colour its slot will show once a bake creates it. + std::vector entry_colors; + entry_colors.reserve(input.color.palette.size()); + for (const PrintableColor &e : input.color.palette) + entry_colors.emplace_back(e.rgb.x(), e.rgb.y(), e.rgb.z(), 1.f); m_preview_job_running = true; auto &worker = wxGetApp().plater()->get_ui_job_worker(); queue_job(worker, std::make_unique(std::move(input), generation, m_preview_generation, - [this, filaments](TextureDisplacementPreviewResult result, uint64_t result_generation) { + [this, entry_colors](TextureDisplacementPreviewResult result, uint64_t result_generation) { indexed_triangle_set its = std::move(result.mesh); m_preview_job_running = false; if (result_generation != m_preview_generation->load()) { @@ -2093,14 +2325,11 @@ void GLGizmoTextureDisplacement::queue_preview_job() } else { m_preview_glmodel.reset(); m_preview_color_runs.clear(); - if (result.triangle_color.size() == its.indices.size() && !filaments.empty()) { - // Group by *filament*, not by palette entry: what the bake wrote is the resolved - // filament, interleaving already applied, so this shows the real banding rather - // than the flat average the eye will turn it into. + if (result.triangle_color.size() == its.indices.size() && !entry_colors.empty()) { indexed_triangle_set sorted; sorted.vertices = its.vertices; sorted.indices.reserve(its.indices.size()); - for (int want = 0; want <= int(filaments.size()); ++want) { + for (int want = 0; want <= int(entry_colors.size()); ++want) { const size_t first = sorted.indices.size(); for (size_t i = 0; i < its.indices.size(); ++i) if (int(result.triangle_color[i]) == want) @@ -2109,7 +2338,7 @@ void GLGizmoTextureDisplacement::queue_preview_job() continue; m_preview_color_runs.push_back( { { first * 3, sorted.indices.size() * 3 }, - want == 0 ? GLVolume::NEUTRAL_COLOR : filaments[size_t(want - 1)] }); + want == 0 ? GLVolume::NEUTRAL_COLOR : entry_colors[size_t(want - 1)] }); } m_preview_glmodel.init_from(sorted); } else { @@ -3366,6 +3595,9 @@ void GLGizmoTextureDisplacement::update_from_model_object(bool first_update) const ModelObject *mo = m_c->selection_info()->model_object(); m_triangle_selectors.clear(); + // The base keeps the last mesh a fill tool hovered, and render_painter_gizmo() reads it as a hover that is + // still on: a new set of selectors has none. + m_seed_fill_last_mesh_id = -1; std::vector ebt_colors; ebt_colors.push_back(GLVolume::NEUTRAL_COLOR); @@ -4266,84 +4498,101 @@ TextureDisplacementFacetsData GLGizmoTextureDisplacement::facets_data_of(const M bool GLGizmoTextureDisplacement::any_layer_colors(const ModelVolume &mv) { for (const TextureDisplacementLayer &layer : mv.texture_displacement_layers) - if (layer.color_enabled && !layer.empty() && decode_height_texture(layer).has_color()) + if (layer.color_enabled && !layer.empty() && height_texture_has_color(layer)) return true; return false; } -void GLGizmoTextureDisplacement::bind_mixes_to_filament_slots(std::vector &palette) -{ - Sidebar *sidebar = &wxGetApp().plater()->sidebar(); - if (sidebar == nullptr) - return; - for (PaletteEntry &e : palette) { - if (!e.is_mix()) - continue; - // Components are 1-based in the config; the ratios are percentages summing to 100, which is the - // form create_mixed_filament_from_result() normalises from. - const int a_pct = int(std::lround(100.0 * double(e.num) / double(e.den))); - const int slot = sidebar->ensure_mixed_filament({ unsigned(e.a + 1), unsigned(e.b + 1) }, - { a_pct, 100 - a_pct }); - if (slot >= 0) { - e.a = e.b = slot; - e.num = e.den = 1; - } else { - // No room for another slot. Collapse to the component that dominates the blend, which is what - // the old per-triangle path did on a surface it could not band anyway. - const int dominant = (e.num * 2 >= e.den) ? e.a : e.b; - e.a = e.b = dominant; - e.num = e.den = 1; - } - } -} - TextureColorSettings GLGizmoTextureDisplacement::color_settings_for(const ModelVolume &mv) { TextureColorSettings out; if (!any_layer_colors(mv)) return out; // nothing is colouring: every colour path stays switched off out.palette = cached_palette(); - out.palette_pure = make_palette(m_palette_filaments, /* mixing */ false, PALETTE_MAX_ENTRIES); - // Done here rather than in cached_palette(): this runs when a preview or a bake is queued, off a - // user action, while that one is also touched from the render path - and creating filament slots - // there would mutate the project mid-frame. - bind_mixes_to_filament_slots(out.palette); + out.palette_pure = make_palette(m_palette_filaments, {}); out.despeckle_passes = mv.texture_displacement_options.color_despeckle; return out; } const std::vector &GLGizmoTextureDisplacement::cached_palette() { - // Rebuilt only when the loaded filaments or the mixing setting actually change. The shaded preview - // rebuilds on every paint stroke and the subdivide preview on every slider frame, and filling the - // quantizer's lookup cube for a 64-entry palette is tens of milliseconds - paying that per stroke - // is the difference between painting that keeps up and painting that stutters. - const ModelVolume *mv = texture_volume(); - const bool mixing = mv != nullptr && mv->texture_displacement_options.color_mix_enabled; + // Rebuilt only when something it depends on actually changes. The shaded preview rebuilds on every + // paint stroke and the panel asks every frame, while ranking the mixes and filling the quantizer's + // lookup cube each take tens of milliseconds - paying that per stroke is the difference between + // painting that keeps up and painting that stutters. + // + // Two levels. The ranking depends only on the filaments and the images, so dragging the count, or a + // bake creating slots, re-picks from it without ranking again; the palette and its quantizers depend + // on that pick as well. + const ModelVolume *mv = texture_volume(); + const bool mixing = mv != nullptr && mv->texture_displacement_options.color_mix_enabled; + const int mix_count = mv != nullptr ? std::max(0, mv->texture_displacement_options.color_mix_count) : 0; std::vector filaments = filament_palette(); - // Every mix costs a filament slot once they are bound to one, and the mask can name only so many - // states, so the palette has to leave room beside the physical filaments it already counts. - const int cap = int(EnforcerBlockerType::ExtruderMax); - if (m_palette_cache.empty() || filaments != m_palette_filaments || mixing != m_palette_mixing || - cap != m_palette_cap) { + // The images themselves rather than their addresses, so a freed and reallocated image can never + // pass for the old one. Whether one has colour, and whether its colours are flat, follows from it. + std::vector>> images; + if (mv != nullptr) + for (const TextureDisplacementLayer &layer : mv->texture_displacement_layers) + if (layer.color_enabled && !layer.empty()) + images.push_back(layer.image_data); + + const bool ranking_stale = filaments != m_palette_filaments || images != m_palette_images; + if (ranking_stale) { m_palette_filaments = std::move(filaments); - m_palette_mixing = mixing; - m_palette_cap = cap; - m_palette_cache = make_palette(m_palette_filaments, mixing, cap); - m_palette_quantizer = make_palette_quantizer(m_palette_cache); + m_palette_images = std::move(images); + m_mix_ranking.reset(); + } + if (mixing && !m_mix_ranking) + m_mix_ranking = rank_mixes(m_palette_filaments, mix_targets(mv->texture_displacement_layers), + int(EnforcerBlockerType::ExtruderMax) - int(m_palette_filaments.size())); + + // Which mixes the project can still print: those it has a fixed slot for, plus as many new ones as + // there are free slots. + const PresetBundle &bundle = *wxGetApp().preset_bundle; + const int free_slots = std::max(0, int(EnforcerBlockerType::ExtruderMax) - int(bundle.filament_presets.size())); + const std::vector slots = mixed_slot_signature(bundle.project_config); + if (ranking_stale || m_palette_cache.empty() || mixing != m_palette_mixing || mix_count != m_palette_mix_count || + free_slots != m_palette_free_slots || slots != m_palette_slots) { + m_palette_mixing = mixing; + m_palette_mix_count = mix_count; + m_palette_free_slots = free_slots; + m_palette_slots = slots; + std::vector mixes; + if (mixing && m_mix_ranking) + mixes = pick_mixes(*m_mix_ranking, mix_count, free_slots, [&bundle](const PaletteEntry &e) { + return find_fixed_mixed_filament(bundle.project_config, {unsigned(e.a + 1), unsigned(e.b + 1)}, + {e.a_percent(), 100 - e.a_percent()}) >= 0; + }); + std::vector palette = make_palette(m_palette_filaments, mixes); + // The previews keep what they were drawn with, so a palette that really changed under them - + // a filament or a mixed slot edited in the sidebar - has to send them round again. + m_palette_changed = m_palette_changed || (!m_palette_cache.empty() && !same_palette(palette, m_palette_cache)); + m_palette_cache = std::move(palette); + m_palette_quantizer = nullptr; + m_palette_pure_quantizer = nullptr; } return m_palette_cache; } +std::pair GLGizmoTextureDisplacement::palette_quantizers() +{ + cached_palette(); + if (!m_palette_quantizer) { + m_palette_quantizer = make_palette_quantizer(m_palette_cache); + const bool has_mixes = m_palette_cache.size() > m_palette_filaments.size(); + m_palette_pure_quantizer = has_mixes ? make_palette_quantizer(make_palette(m_palette_filaments, {})) : m_palette_quantizer; + } + return { m_palette_quantizer, m_palette_pure_quantizer }; +} + std::vector GLGizmoTextureDisplacement::filament_palette() { std::vector all = wxGetApp().plater()->get_extruders_colors(); - // Physical filaments only. The mixes this palette produces each become a mixed filament slot of - // their own (see bind_mixes_to_filament_slots()), and those slots are extruders too - so taking the - // list as it comes meant the next rebuild mixed *them* again, and handed components naming a - // virtual slot to a blend that can only name physical ones. That is what left entries reading - // "filament 1 plus nothing" and raised "Mixed filament has invalid or mismatched components". + // Physical filaments only. A mix bakes into a mixed filament slot of its own, and those slots are + // extruders too - mixing them again would hand a blend components naming a virtual slot, where it + // can only name physical ones ("Mixed filament has invalid or mismatched components"). Mixed slots + // are kept after the physical ones, so filament i here is extruder i. const auto *is_mixed = wxGetApp().preset_bundle->project_config.option("filament_is_mixed"); std::vector palette; palette.reserve(all.size()); @@ -4357,44 +4606,211 @@ std::vector GLGizmoTextureDisplacement::filament_palette() return palette; } - -std::vector GLGizmoTextureDisplacement::make_palette( - const std::vector &filaments, bool mixing, int max_entries) +std::vector GLGizmoTextureDisplacement::mix_targets( + const std::vector &layers) { - std::vector out; - const int n = int(filaments.size()); - for (int i = 0; i < n; ++i) - out.push_back({ Vec3f(filaments[size_t(i)].r(), filaments[size_t(i)].g(), filaments[size_t(i)].b()), - i, i, 1, 1 }); - if (!mixing || n < 2) - return out; + // Each layer's bins, weighted by their share of that layer's pixels. + std::vector> per_layer; + for (const TextureDisplacementLayer &layer : layers) { + if (!layer.color_enabled || layer.empty() || analyze_texture_detail(layer).flat_colors) + continue; + TextureDisplacementLayer raw = layer; + raw.smoothing = 0.f; + const DecodedHeightTexture tex = decode_height_texture(raw); + if (!tex.has_color()) + continue; - // How many intermediate steps each pair gets, chosen so the whole palette stays under - // PALETTE_MAX_ENTRIES. Fewer filaments means more room for mixes, which is also what you want: - // with two filaments the mixes are the only way to get anywhere, and with sixteen there is little - // point mixing at all. `den` is also the band/dither repeat, so a small one is a short pattern. - const int pairs = n * (n - 1) / 2; - int steps = 0; - for (int s = 5; s >= 1; --s) - if (n + pairs * s <= max_entries) { - steps = s; - break; + // 16 levels per channel, each bin keeping the mean of the colours that fell in it: a coarse grid + // to gather on, without snapping every colour to a bin corner. + struct Bin + { + double r = 0., g = 0., b = 0.; + uint32_t n = 0; + }; + std::vector bins(size_t(16 * 16 * 16)); + // Past the budget, one pixel from each run of `stride`, at an offset jittered by a fixed-seed + // generator. A fixed step would sample a lattice that a striped texture can line up with, so + // that only one of its colours is ever seen; jittered, stripes of any period or orientation are + // sampled in proportion, and the same image still always gives the same targets. The offset + // comes from the generator's high bits: a power-of-two LCG's low bits repeat every 2, 4, 8... + // steps, and the stride is a power of two for exactly the images large enough to need this. + const size_t npx = size_t(tex.width) * size_t(tex.height); + const size_t stride = std::max(1, npx / MIX_TARGET_SAMPLES); + uint64_t state = 0x9E3779B97F4A7C15ull; + size_t sampled = 0; + for (size_t start = 0; start < npx; start += stride) { + state = state * 6364136223846793005ull + 1442695040888963407ull; + const size_t i = start + size_t((uint64_t(uint32_t(state >> 32)) * uint64_t(stride)) >> 32); + if (i >= npx) + break; + const uint8_t *px = &tex.rgb[i * 3]; + Bin &bin = bins[size_t(px[0] >> 4) * 256 + size_t(px[1] >> 4) * 16 + size_t(px[2] >> 4)]; + bin.r += px[0]; + bin.g += px[1]; + bin.b += px[2]; + ++bin.n; + ++sampled; } - if (steps == 0) - return out; - const int den = steps + 1; + std::vector targets; + for (const Bin &bin : bins) + if (bin.n > 0) { + const double inv = 1. / (255. * double(bin.n)); + targets.push_back({ srgb_to_lab(Vec3f(float(bin.r * inv), float(bin.g * inv), float(bin.b * inv))), + float(double(bin.n) / double(sampled)) }); + } + per_layer.push_back(std::move(targets)); + } + // The layers weigh the same and together 1, settled before the pruning below: what rank_mixes() sums + // over the kept bins is then a mean over every pixel of the colouring layers, with the pixels of a + // dropped bin counted as no better off. + std::vector out; + for (std::vector &targets : per_layer) + for (MixTarget &t : targets) { + t.weight /= float(per_layer.size()); + out.push_back(t); + } + if (out.size() > MIX_TARGET_BINS) { + std::partial_sort(out.begin(), out.begin() + MIX_TARGET_BINS, out.end(), + [](const MixTarget &l, const MixTarget &r) { return l.weight > r.weight; }); + out.resize(MIX_TARGET_BINS); + } + return out; +} + +std::vector GLGizmoTextureDisplacement::rank_mixes( + const std::vector &filaments, const std::vector &targets, int limit) +{ + const int n = int(filaments.size()); + if (n < 2 || targets.empty() || limit <= 0) + return {}; + + // Every pair at every short-cycle ratio, coloured as its slot will be. + std::vector hex(filaments.size()); for (int i = 0; i < n; ++i) - for (int j = i + 1; j < n; ++j) { - const Vec3f lab_i = srgb_to_lab(Vec3f(filaments[size_t(i)].r(), filaments[size_t(i)].g(), filaments[size_t(i)].b())); - const Vec3f lab_j = srgb_to_lab(Vec3f(filaments[size_t(j)].r(), filaments[size_t(j)].g(), filaments[size_t(j)].b())); - for (int k = 1; k <= steps; ++k) { - // k/den of filament i, the rest of j - averaged in Lab, which is what the eye does - // when the two are interleaved too finely to resolve. - const float t = float(k) / float(den); - out.push_back({ lab_to_srgb(lab_i * t + lab_j * (1.f - t)), i, j, k, den }); + hex[size_t(i)] = encode_color(filaments[size_t(i)]); + std::vector candidates; + for (int i = 0; i < n; ++i) + for (int j = i + 1; j < n; ++j) + for (int den = 2; den <= 6; ++den) + for (int num = 1; num < den; ++num) { + if (std::gcd(num, den) != 1) + continue; // 2/4 is 1/2, already there + PaletteEntry e{ Vec3f::Zero(), i, j, num, den }; + ColorRGB blended; + if (!decode_color(blend_color_multi({ hex[size_t(i)], hex[size_t(j)] }, + { e.a_percent(), 100 - e.a_percent() }), + blended)) + continue; + e.rgb = Vec3f(blended.r(), blended.g(), blended.b()); + candidates.push_back(e); + } + + // How far each target is from the nearest single filament, and from every candidate. + const size_t nt = targets.size(), nc = candidates.size(); + std::vector filament_lab(size_t(n), Vec3f::Zero()); + for (int i = 0; i < n; ++i) + filament_lab[size_t(i)] = srgb_to_lab(Vec3f(filaments[size_t(i)].r(), filaments[size_t(i)].g(), filaments[size_t(i)].b())); + const auto de = [](const Vec3f &l, const Vec3f &r) { return DeltaE00(l.x(), l.y(), l.z(), r.x(), r.y(), r.z()); }; + std::vector pure_d(nt, std::numeric_limits::max()); + for (size_t t = 0; t < nt; ++t) + for (const Vec3f &lab : filament_lab) + pure_d[t] = std::min(pure_d[t], de(targets[t].lab, lab)); + std::vector dist(nc * nt); + tbb::parallel_for(tbb::blocked_range(0, nc), [&](const tbb::blocked_range &range) { + for (size_t c = range.begin(); c < range.end(); ++c) { + const Vec3f lab = srgb_to_lab(candidates[c].rgb); + for (size_t t = 0; t < nt; ++t) + dist[c * nt + t] = de(targets[t].lab, lab); + } + }); + + // Greedy: each round takes the candidate that lowers the weighted error the most. A candidate only + // counts where it beats the single filament by PREFER_PURE_DE, since everywhere else the quantizer + // picks the filament anyway. + std::vector current = pure_d; + std::vector taken(nc, 0); + std::vector out; + const auto counts = [&](size_t c, size_t t) { + const float d = dist[c * nt + t]; + return d < current[t] && d <= pure_d[t] - PREFER_PURE_DE; + }; + while (int(out.size()) < limit) { + size_t best = nc; + double best_gain = 0.; + for (size_t c = 0; c < nc; ++c) { + if (taken[c]) + continue; + double gain = 0.; + for (size_t t = 0; t < nt; ++t) + if (counts(c, t)) + gain += double(targets[t].weight) * double(current[t] - dist[c * nt + t]); + if (gain > best_gain) { + best_gain = gain; + best = c; } } + if (best == nc || best_gain < double(MIN_MIX_GAIN)) + break; + taken[best] = 1; + out.push_back(candidates[best]); + for (size_t t = 0; t < nt; ++t) + if (counts(best, t)) + current[t] = dist[best * nt + t]; + } + return out; +} + +std::vector GLGizmoTextureDisplacement::pick_mixes( + const std::vector &ranking, int count, int free_slots, const std::function &reusable) +{ + std::vector out; + for (const PaletteEntry &e : ranking) { + if (int(out.size()) >= count) + break; + // Out of free slots, a later mix that already has one still fits. + if (reusable && reusable(e)) { + out.push_back(e); + } else if (free_slots > 0) { + out.push_back(e); + --free_slots; + } + } + return out; +} + +std::vector GLGizmoTextureDisplacement::make_palette( + const std::vector &filaments, const std::vector &mixes) +{ + std::vector out; + out.reserve(filaments.size() + mixes.size()); + for (int i = 0; i < int(filaments.size()); ++i) + out.push_back({ Vec3f(filaments[size_t(i)].r(), filaments[size_t(i)].g(), filaments[size_t(i)].b()), i, i, 1, 1 }); + out.insert(out.end(), mixes.begin(), mixes.end()); + return out; +} + +std::vector GLGizmoTextureDisplacement::palette_filaments(const std::vector &palette, + const std::vector &triangle_color, + const std::function &slot_for_mix) +{ + std::vector used(palette.size(), 0); + for (const uint8_t v : triangle_color) + if (v > 0 && size_t(v) <= palette.size()) + used[size_t(v) - 1] = 1; + + std::vector out(palette.size(), -1); + for (size_t i = 0; i < palette.size(); ++i) { + const PaletteEntry &e = palette[i]; + if (!e.is_mix()) { + out[i] = e.a; + } else if (used[i]) { + const int slot = slot_for_mix ? slot_for_mix(e) : -1; + // No room for another slot: the component that dominates the blend is the nearest the print + // can come. + out[i] = slot >= 0 ? slot : (e.num * 2 >= e.den ? e.a : e.b); + } + } return out; } @@ -4434,15 +4850,7 @@ ColorQuantizeFn GLGizmoTextureDisplacement::make_palette_quantizer(const std::ve best_pure = int(i); } } - // A mix is an interleave that only reads as its colour from a distance; up close it is - // stripes. So it is spent only where it buys a better match than the nearest single - // filament - but "better" was set at ten Delta E, which is not a visible step, it is a - // different colour. Measured over the whole cube that threshold turned 94% of the - // lookups that wanted a mix back into a pure filament, leaving 38%; along a greyscale - // ramp, the shape a height texture actually traces, it cut 80% to 66%. Two Delta E is - // about where a side-by-side difference stops being arguable, which is the right place - // to start paying for stripes. - constexpr float PREFER_PURE_DE = 2.f; + // A mix only where it clearly beats the nearest single filament, see PREFER_PURE_DE. if (best_pure >= 0 && palette[size_t(best)].is_mix() && best_pure_d - best_d < PREFER_PURE_DE) best = best_pure; (*lut)[(size_t(r) * E + size_t(g)) * E + size_t(b)] = uint8_t(best); @@ -4461,7 +4869,7 @@ ColorQuantizeFn GLGizmoTextureDisplacement::make_palette_quantizer(const std::ve TextureDisplacementPrepareResult GLGizmoTextureDisplacement::prepare_mesh( const indexed_triangle_set &base, const TextureDisplacementFacetsData &masks, const std::vector &layers, const TextureDisplacementPrepareParams ¶ms, - const std::vector &palette, const DisplacementProgressFn &progress, + const TextureColorSettings &color_settings, const DisplacementProgressFn &progress, BakeStageRecorder *debug) { TextureDisplacementPrepareResult out; @@ -4539,10 +4947,13 @@ TextureDisplacementPrepareResult GLGizmoTextureDisplacement::prepare_mesh( // Colour boundaries need triangles of their own - the chord test cannot see them, since // the height field is perfectly smooth across a change of filament. ColorFieldSampler color; - if (params.subdiv_color_edge_mm > 0.f && !palette.empty()) - color = make_combined_color_sampler(mesh.its, layers, current, make_palette_quantizer(palette)); - // Note the sampler is built on the *quantizer* alone - the refinement follows perceived - // colour, never the interleaving that realises a mix - the slicer does that per layer. + // A flat-colour layer is matched against single filaments only, as the bake does, so its + // boundaries are refined where the bake will actually change filament. + if (params.subdiv_color_edge_mm > 0.f && !color_settings.empty()) + color = make_combined_color_sampler(mesh.its, layers, current, make_palette_quantizer(color_settings.palette), + make_palette_quantizer(color_settings.palette_pure)); + // The refinement follows perceived colour: a mix is one colour here, however the slicer + // interleaves its filaments layer by layer. // "Min edge" is a feature-mode control (it is the floor the curvature test refines down // to); in plain adaptive mode the target edge length is the only criterion, so the floor // must not be allowed to silently override a target the user set below it. @@ -4830,9 +5241,9 @@ void GLGizmoTextureDisplacement::rebuild_subdivide_preview() // Same colour criterion Apply will use, so the previewed wireframe is the mesh that commits. ColorFieldSampler color; if (m_subdivide_color_mm > 0.f && any_layer_colors(*mv)) { - cached_palette(); // refreshes m_palette_quantizer if the filaments changed - color = make_combined_color_sampler(mv->mesh().its, mv->texture_displacement_layers, facets, - m_palette_quantizer); + const auto [quantize, quantize_pure] = palette_quantizers(); + color = make_combined_color_sampler(mv->mesh().its, mv->texture_displacement_layers, facets, quantize, + quantize_pure); } its = subdivide_mesh_adaptive(mv->mesh().its, region, m_subdivide_target_mm, int(mv->mesh().its.indices.size()) + m_subdivide_budget_k * 1000, @@ -5344,6 +5755,12 @@ void GLGizmoTextureDisplacement::on_render_input_window(float x, float y, float return; ModelVolume *mv = texture_volume(); + // The palette also follows project state nobody tells this gizmo about - the filaments and mixed + // slots in the sidebar - so it is checked once a frame, and a change re-runs the previews. + cached_palette(); + if (m_palette_changed) + m_preview_params_dirty = true; + float scale = m_parent.get_scale(); #ifdef WIN32 int dpi = get_dpi_for_window(wxGetApp().GetTopWindow()); @@ -6127,6 +6544,15 @@ void GLGizmoTextureDisplacement::on_render_input_window(float x, float y, float "of filaments can cover a photo or a gradient. An image of flat colors " "prints the same either way. Off uses one filament per area.")); if (opts.color_mix_enabled) { + cached_palette(); // brings m_palette_filaments up to date + // Every mix can become a filament slot, and there are only so many beside the + // physical filaments. + const int max_mixes = std::max(1, int(EnforcerBlockerType::ExtruderMax) - int(m_palette_filaments.size())); + if (int_row("##color_mix_count", _L("Mixed colors"), &opts.color_mix_count, 1, max_mixes, "%d", card_pad)) + m_preview_params_dirty = true; + hover_tip(_u8L("The most mixed filaments a bake may add. They are picked from the " + "texture's colors, and only the ones the bake actually uses are created.")); + // After the slider, so a change shows in the same frame. ImGui::TextDisabled("%s", Slic3r::format(_u8L("%1% printable colors from %2% filaments"), int(cached_palette().size()), int(m_palette_filaments.size())).c_str()); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.hpp b/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.hpp index 2406ddbe84..48e0ab72f6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoTextureDisplacement.hpp @@ -16,11 +16,15 @@ #include "libslic3r/Color.hpp" #include #include "libslic3r/TriangleSelector.hpp" +#include "libslic3r/TriangleMesh.hpp" +#include "admesh/stl.h" #include +#include #include "libslic3r/Point.hpp" #include #include #include +#include #include "slic3r/GUI/Gizmos/GLGizmoBase.hpp" #include #include @@ -58,7 +62,7 @@ public: const TextureDisplacementFacetsData &masks, const std::vector &layers, const TextureDisplacementPrepareParams ¶ms, - const std::vector &palette, + const TextureColorSettings &color_settings, const DisplacementProgressFn &progress, // Optional step capture: receives the mesh // after the remesh and after the refinement, @@ -70,22 +74,43 @@ public: using PaletteEntry = PrintableColor; - // The printable palette: the loaded filaments (clamped to the sixteen mmu_segmentation_facets can - // address), plus - when `mixing` - every pair of them at evenly spaced ratios. + // One colour mixes are meant to reach: a bin of the textures' colour histogram, in CIELAB, and how + // much of the image it covers. + struct MixTarget + { + Vec3f lab = Vec3f::Zero(); + float weight = 0.f; + }; + + // The colours worth mixing for: those of the colouring layers in `layers` whose image is not made of + // flat colours (TextureDetail::flat_colors - those print in single filaments only, so no mix could + // serve them). The layers weigh the same and, before only the heaviest bins are kept (which is what + // bounds rank_mixes()), together 1. Read from the image as imported, as analyze_texture_detail() + // does, so the Smoothing slider does not move the palette around. + static std::vector mix_targets(const std::vector &layers); + + // Mixes of pairs of `filaments`, best first and at most `limit` of them. Each is the one that most + // improves the match to `targets` given those ranked before it, counted only where it beats the + // nearest single filament by the quantizer's prefer-pure margin - which is where the quantizer will + // actually pick it. Stops early once another mix would make no noticeable difference, so a texture + // the filaments already cover gets few mixes or none. // - // Mixes are averaged in **CIELAB**, not RGB and not subtractively: two filaments interleaved too - // finely to resolve are averaged by the eye, which is what a perceptual space models. Yellow and - // blue banded together read as a desaturated grey-green, and that is what the preview must promise - // - blending them subtractively would show a green the printer cannot produce this way. - // - // How many ratios depends on how many filaments there are, so the palette stays bounded: the - // quantizer's lookup cube costs one DeltaE00 per cell per entry to fill, and with sixteen - // filaments there are already plenty of colours without mixing any of them. - // `max_entries` bounds the whole palette. It is normally the quantizer's own limit, but when the - // mixes become filament slots it has to be the paint mask's instead: a mask can name only - // EnforcerBlockerType::ExtruderMax states, and every mix now occupies one of them. - static std::vector make_palette(const std::vector &filaments, bool mixing, - int max_entries); + // Ratios are the short-cycle ones (k/d for d up to 6): the slicer interleaves a mix layer by layer, + // and a long cycle prints as visible bands rather than as a colour. A mix's `rgb` is the colour its + // mixed filament slot will show (blend_color_multi(), as the sidebar computes it), so the match, the + // preview and the slot all agree on what the mix looks like. + static std::vector rank_mixes(const std::vector &filaments, + const std::vector &targets, int limit); + + // The first `count` mixes of `ranking` the project can give a filament slot to. A mix `reusable` + // reports as already having a fixed slot costs nothing; any other uses up one of `free_slots`, and + // is skipped once they run out - so the palette never offers a colour a bake could not print. + static std::vector pick_mixes(const std::vector &ranking, int count, int free_slots, + const std::function &reusable); + + // The printable palette: the loaded filaments, entry i being filament i, followed by `mixes`. + static std::vector make_palette(const std::vector &filaments, + const std::vector &mixes); // Maps an image colour to the closest entry of `palette`, perceptually (CIEDE2000 over CIELAB - a // plain RGB distance picks visibly wrong filaments, most obviously between a saturated colour and @@ -97,40 +122,49 @@ public: // to a worker thread and outlives the palette it was built from. static ColorQuantizeFn make_palette_quantizer(const std::vector &palette); - // Turns a palette index plus a position into the filament to print there, interleaving the two - // filaments of a mixed entry per `mode`. `layer_height` sizes the Z bands; `cell_mm` the dither + // The filament (0-based) each entry of `palette` prints in, by palette index: a single filament is + // itself, a mix is the slot `slot_for_mix` returns for it. Only the mixes `triangle_color` actually + // uses (palette index + 1 per triangle, 0 for none) are asked for, since asking is what creates a + // slot. A mix that gets no slot (-1) prints in its dominant component; one nothing uses maps to -1. + // + // This is what the bake writes into the paint: a palette index is a filament only for the single + // filaments, while a mix's slot can sit anywhere among the project's mixed slots. + static std::vector palette_filaments(const std::vector &palette, + const std::vector &triangle_color, + const std::function &slot_for_mix); - // Everything the jobs need to colour with, for the current volume: palette, mix mode, layer - // height, despeckle. Empty when no layer is actually colouring. + // Everything the jobs need to colour with, for the current volume: the palette, its single-filament + // part, and the despeckle passes. Empty when no layer is actually colouring. Read-only: no filament + // slot is created here, only when a bake commits (see palette_filaments()). TextureColorSettings color_settings_for(const ModelVolume &mv); - // The printable palette for the current filaments and mixing setting, rebuilt only when either - // actually changes - see the definition for why that caching is not optional. + // The printable palette for the current volume and project, rebuilt only when what it depends on + // changes - see the definition for why that caching is not optional. const std::vector &cached_palette(); - // Turns every mix in `palette` into a mixed filament slot and rewrites the entry to name that slot - // as a plain filament, so nothing downstream has to know a mix is involved: is_mix() goes false and - // the resolver simply returns it. The per-layer interleaving then happens in the slicer, where it is - // not limited by how fine the mesh is. Entries whose slot could not be created (the paint-state cap) - // fall back to the nearer of the two components. - void bind_mixes_to_filament_slots(std::vector &palette); - std::vector m_palette_cache; - std::vector m_palette_filaments; - int m_palette_cap = 0; // the max_entries m_palette_cache was built with - bool m_palette_mixing = false; - ColorQuantizeFn m_palette_quantizer; + // The quantizers for the cached palette and for its single filaments alone (flat-colour images), + // filled on first use. Only the subdivide preview matches colours on this thread - the jobs build + // their own from the palette they capture - so a palette rebuild, such as every step of a count + // drag, costs no lookup cube unless that preview asks for one. + std::pair palette_quantizers(); + std::vector m_palette_cache; + ColorQuantizeFn m_palette_quantizer; + ColorQuantizeFn m_palette_pure_quantizer; + // Set when a rebuild changed the palette the previews were drawn with; cleared by rebuild_preview(). + bool m_palette_changed = false; + // What the cache was built from. + std::vector m_palette_filaments; + std::vector>> m_palette_images; // the colouring layers' images + std::optional> m_mix_ranking; // rank_mixes(), computed on demand + bool m_palette_mixing = false; + int m_palette_mix_count = 0; + int m_palette_free_slots = 0; + std::vector m_palette_slots; // the project's mixed slots - // The loaded filaments, clamped to the sixteen mmu_segmentation_facets can address. + // The loaded physical filaments, clamped to the states mmu_segmentation_facets can address. static std::vector filament_palette(); - // The Z band height, in mm. One print layer is the ideal, but the interleave is realised per - // *facet*: a band thinner than the mesh can resolve does not dither, it beats against the triangle - // grid and comes out as broad horizontal stripes - and since MMU segmentation reads facet colour, - // it does so in the print too, not only on screen. The refinement edge is chosen from the model's - // diagonal and knows nothing about the layer height, so the band is rounded up to a whole number of - // layers at least two facet rows tall: still exact on the printer, and representable by the mesh - // that has to carry it. Used by both the bake settings and the preview shader, so the two agree. - // The Normal preview's triangles, grouped by the filament they will print in. Colour is per facet - // and there are at most sixteen filaments, so the mesh is uploaded once with its index buffer + // The Normal preview's triangles, grouped by the palette entry they will print in. Colour is per facet + // and the palette is small, so the mesh is uploaded once with its index buffer // sorted by colour and drawn as one GLModel::render(range) per group - which needs no per-vertex // colour attribute, and so no change to GLModel's vertex layouts. // @@ -148,6 +182,21 @@ public: // and so whether the colour criterion and the mmu write ever run. static bool any_layer_colors(const ModelVolume &mv); + // The model's own colour paint (mmu_segmentation_facets) as the gizmo draws it over its surface: the + // sub-triangles painted in a filament, grouped by that filament. NONE - the volume's own filament - is + // left out, so those triangles keep the gizmo's neutral, as they do in the preview. + struct PaintedColors + { + indexed_triangle_set facets; // over the paint's whole vertex array + std::vector source; // per triangle of `facets`: the model triangle it lies in + std::vector state; // per triangle of `facets`: its filament state, 1-based + + // The triangles of `facets` outside the model triangles `excluded` marks, in order. A model + // triangle past the end of `excluded` is not excluded. + std::vector outside(const std::vector &excluded) const; + }; + static PaintedColors painted_colors(const TriangleMesh &mesh, const TriangleSelector::TriangleSplittingData &paint); + void render_painter_gizmo() override; // Intercepts mouse input while "Adjust Texture" mode is on (dragging the on-canvas offset/ @@ -157,6 +206,9 @@ public: protected: void on_render_input_window(float x, float y, float bottom_limit) override; std::string on_get_name() const override; + // Never in the assemble view: its toolbar does not offer this gizmo, and every preview here is drawn + // with the main canvas's instance transform. The base alone would let the keyboard shortcut open it there. + bool on_is_activable() const override; wxString handle_snapshot_action_name(bool shift_down, Button button_down) const override; @@ -675,13 +727,9 @@ private: bool m_shaded_preview_dirty = false; GLModel m_shaded_preview_glmodel; - // Translucent tint over the active layer's painted triangles, drawn on top of whichever preview - // is showing. The base painter's own opaque paint highlight (render_triangles()) cannot be used - // in either preview mode - it is coincident with the surface and simply covers it - so the only - // paint feedback the gizmo had was the relief itself, which meant erasing showed nothing at all - // until the stroke ended and the whole preview rebuilt. This is that feedback: cheap (the painted - // patch only), translucent (the preview stays visible through it) and rebuilt live during a - // stroke. + // Translucent tint over the active layer's painted triangles: the paint feedback over a preview (see + // render_painter_gizmo()). Cheap (the painted patch only), translucent so the preview shows through, + // and rebuilt live during a stroke. GLModel m_paint_overlay_glmodel; // The islands selected in the UV editor, tinted on the model so the pane's selection can be seen // in place. Rebuilt whenever the pane's selection differs from the one it was built for. @@ -699,6 +747,23 @@ private: GLModel m_other_paint_glmodel; std::string m_other_paint_key; void rebuild_other_paint_overlay(); + // The model's colour paint, drawn over the surface so the colours a bake wrote stay visible - the + // canvas draws no volume while a paint gizmo is open, and the selectors hold only displacement paint. + // Left out wherever the preview on screen shows paint of its own (`whole_stack`: every layer's, as the + // Normal preview does; otherwise the active layer's), since an opaque overlay there would hide that + // preview. Only while a layer colours: it is the colour workflow's result, and every other paint gizmo + // shows the model neutral. + // + // Two levels: the paint's sub-triangles, which take a selector over the whole mesh and change only with + // the paint itself, and the part drawn, which follows every flushed stroke. + PaintedColors m_painted_colors; + std::string m_painted_colors_key; + GLModel m_painted_colors_glmodel; + std::string m_painted_colors_drawn_key; + std::vector>> m_painted_colors_runs; // filament state, index range + void rebuild_painted_colors(bool whole_stack); + // False when there was nothing to draw. + bool render_painted_colors(bool whole_stack); // Whether render_shaded_preview_mesh() would actually draw something. Checked before the real volume // is hidden: with no layer, no texture or no shader the shaded path draws nothing, and hiding the // volume for it left the model invisible. @@ -712,11 +777,9 @@ private: int m_shaded_projection_mode = 0; Vec3f m_shaded_patch_center = Vec3f::Zero(); Vec3f m_shaded_patch_axis = Vec3f::UnitZ(); - // The palette the fast preview's per-triangle filament indices were built against, captured when - // the mesh was. Empty when the active layer is not colouring, which is what tells the shader to - // fall back to the model's own colour. Held rather than re-read at draw time so the indices baked - // into the mesh can never be resolved against a different set of filaments than they were computed - // from - loading a filament mid-session would otherwise recolour a stale preview at random. + // The palette the fast preview matches each fragment against, captured with its mesh. Empty when the + // active layer is not colouring, which is what tells the shader to fall back to the model's own + // colour. Every entry carries the colour it prints in, so drawing it needs nothing else. std::vector m_shaded_preview_palette; // GPU island drag: while an island is dragged in the UV editor, the displacement mesh is baked once (with diff --git a/src/slic3r/GUI/IMEXFilamentPickerPopover.cpp b/src/slic3r/GUI/IMEXFilamentPickerPopover.cpp new file mode 100644 index 0000000000..d0fb83f869 --- /dev/null +++ b/src/slic3r/GUI/IMEXFilamentPickerPopover.cpp @@ -0,0 +1,146 @@ +#include "slic3r/GUI/IMEXFilamentPickerPopover.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libslic3r/IMEXHelpers.hpp" +#include "libslic3r/PresetBundle.hpp" +#include "slic3r/GUI/BitmapComboBox.hpp" +#include "slic3r/GUI/PartPlate.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/wxExtensions.hpp" + +namespace Slic3r { namespace GUI { + +IMEXFilamentPickerPopover::IMEXFilamentPickerPopover( + wxWindow* parent, PartPlate* plate, + const ConfigOptionInts& pem, int physical_head, + CommitCallback on_commit) + : wxPopupTransientWindow(parent, wxBORDER_SIMPLE) + , m_plate(plate) + , m_pem(pem) + , m_physical_head(physical_head) + , m_on_commit(std::move(on_commit)) +{ + m_root_sizer = new wxBoxSizer(wxHORIZONTAL); + SetSizer(m_root_sizer); + + build_row(); + + m_root_sizer->SetSizeHints(this); + SetClientSize(m_root_sizer->ComputeFittingClientSize(this)); + Layout(); +} + +void IMEXFilamentPickerPopover::popup_at_cursor() +{ + Position(wxGetMousePosition(), wxSize(0, 0)); + Popup(); +} + +void IMEXFilamentPickerPopover::OnDismiss() +{ + wxPopupTransientWindow::OnDismiss(); + // No CallAfter needed: wxPopupTransientWindowBase::Destroy() already defers by appending to + // wxPendingDelete, and guards a second call with a wxCHECK rather than double-freeing. + Destroy(); +} + +void IMEXFilamentPickerPopover::build_row() +{ + m_root_sizer->Clear(true); + + m_root_sizer->AddSpacer(10); + + auto* label = new wxStaticText(this, wxID_ANY, + wxString::Format("T%d", m_physical_head)); + m_root_sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM, 6); + + m_root_sizer->AddSpacer(10); + + std::vector lane_logicals; + for (size_t L = 0; L < m_pem.values.size(); ++L) + if (m_pem.values[L] == m_physical_head) + lane_logicals.push_back((int)L); + + std::vector bmps = get_extruder_color_icons(false /*thin_icon*/); + + auto* choice = new BitmapComboBox(this, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxSize(140, -1), + 0, nullptr, wxCB_READONLY); + const int left_pad_px = 8; + auto pad_left = [&](const wxBitmap& src) -> wxBitmap { + if (!src.IsOk()) return src; + wxImage im(src.GetWidth() + left_pad_px, src.GetHeight()); + im.InitAlpha(); + unsigned char* a = im.GetAlpha(); + std::fill(a, a + im.GetWidth() * im.GetHeight(), (unsigned char)0); + wxBitmap out(im); + wxMemoryDC dc(out); + dc.DrawBitmap(src, left_pad_px, 0, true); + dc.SelectObject(wxNullBitmap); + return out; + }; + + for (int L : lane_logicals) { + const wxString label = wxString::Format("filament %d", L + 1); + if (L >= 0 && L < (int)bmps.size() && bmps[L] && bmps[L]->IsOk()) + choice->Append(label, pad_left(*bmps[L])); + else + choice->Append(label, wxNullBitmap); + } + + const auto map = m_plate->get_imex_head_filament_map(); + auto it = map.find(m_physical_head); + int selected_slot_1based = (it != map.end()) + ? it->second + : (lane_logicals.empty() ? -1 : lane_logicals.front() + 1); + + for (int i = 0; i < (int)lane_logicals.size(); ++i) { + if (lane_logicals[i] + 1 == selected_slot_1based) { + choice->SetSelection(i); + break; + } + } + + choice->Bind(wxEVT_COMBOBOX, [this, lane_logicals, choice](wxCommandEvent&) { + int sel = choice->GetSelection(); + if (sel < 0 || sel >= (int)lane_logicals.size()) return; + on_filament_selected(lane_logicals[sel] + 1); + // DismissAndNotify(), not Dismiss(): Dismiss() is only PopHandlers()+Hide() and never + // reaches OnDismiss(), so destroying from OnDismiss() would miss this path entirely -- + // which is the one users take on every successful pick. + DismissAndNotify(); + }); + + m_root_sizer->Add(choice, 0, wxALIGN_CENTER_VERTICAL | wxALL, 6); + m_root_sizer->AddSpacer(4); +} + +void IMEXFilamentPickerPopover::on_filament_selected(int slot_1_based) +{ + auto map = m_plate->get_imex_head_filament_map(); + // Erase when the user reselects the pem default for this head, so the 3mf + // doesn't carry no-op overrides (same invariant as PR3b). + const int default_logical = first_filament_for_physical_head(m_pem, m_physical_head); + if (default_logical >= 0 && slot_1_based == default_logical + 1) + map.erase(m_physical_head); + else + map[m_physical_head] = slot_1_based; + m_plate->set_imex_head_filament_map(map); + if (m_on_commit) m_on_commit(); +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/IMEXFilamentPickerPopover.hpp b/src/slic3r/GUI/IMEXFilamentPickerPopover.hpp new file mode 100644 index 0000000000..0a51b91f86 --- /dev/null +++ b/src/slic3r/GUI/IMEXFilamentPickerPopover.hpp @@ -0,0 +1,50 @@ +#ifndef slic3r_IMEXFilamentPickerPopover_hpp_ +#define slic3r_IMEXFilamentPickerPopover_hpp_ + +#include +#include +#include +#include + +#include + +#include "libslic3r/PrintConfig.hpp" + +namespace Slic3r { +namespace GUI { + +class PartPlate; + +class IMEXFilamentPickerPopover : public wxPopupTransientWindow +{ +public: + using CommitCallback = std::function; + + IMEXFilamentPickerPopover(wxWindow* parent, PartPlate* plate, + const ConfigOptionInts& pem, int physical_head, + CommitCallback on_commit); + + void popup_at_cursor(); + +private: + // Destroys the popover: the ghost-click handler creates one per click and keeps no + // reference, so every click would otherwise leak a live top-level window parented to the + // GL canvas. Only DismissAndNotify() reaches this -- plain Dismiss() just hides. + void OnDismiss() override; + void build_row(); + void on_filament_selected(int slot_1_based); + + PartPlate* m_plate; + // Owned by value: callers may pass a stack-local derived pem + // (e.g. effective_physical_extruder_map result) that won't outlive + // the popover's async lifetime. + ConfigOptionInts m_pem; + int m_physical_head; + CommitCallback m_on_commit; + + wxSizer* m_root_sizer = nullptr; +}; + +}} // namespace Slic3r::GUI + +#endif diff --git a/src/slic3r/GUI/IMEXModesCtrl.cpp b/src/slic3r/GUI/IMEXModesCtrl.cpp new file mode 100644 index 0000000000..ae6dee7085 --- /dev/null +++ b/src/slic3r/GUI/IMEXModesCtrl.cpp @@ -0,0 +1,897 @@ +#include "slic3r/GUI/IMEXModesCtrl.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "slic3r/GUI/EditGCodeDialog.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/I18N.hpp" +#include "slic3r/GUI/Widgets/Button.hpp" +#include "slic3r/GUI/Widgets/ComboBox.hpp" +#include "slic3r/GUI/Widgets/StateColor.hpp" +#include "slic3r/GUI/wxExtensions.hpp" + +namespace Slic3r { +namespace GUI { + +// Icon size for every button in this control -- the help button beside the legend and the +// edit / remove buttons on each row. One constant so the three cannot drift apart. +static constexpr int kImexIconPx = 20; + +// Mode column width. The name field carries a drop-down arrow, which eats interior space, so +// this is wider than a bare text field needed. The header spacer below derives from it. +static constexpr int kNameColPx = 176; + +IMEXModesCtrl::IMEXModesCtrl(wxWindow* parent, int n_cols, int n_rows, int layout) + : wxPanel(parent, wxID_ANY), m_n_cols(std::max(1, n_cols)), m_n_rows(std::max(1, n_rows)), m_layout(layout) +{ + // Set explicitly: GTK otherwise gives child wxPanels a slightly lighter "widget bg", + // which shows as a light box around the chromeless ScalableButtons. The page's own + // color, as OG_CustomCtrl takes it, because the dark-mode walk only remaps palette + // colors: the app's window default is not one, so it never matched the page and + // froze in whichever theme the editor was last built in. Sub-panels inherit this color. + SetBackgroundColour(parent->GetBackgroundColour()); + + m_outer = new wxBoxSizer(wxVERTICAL); + m_rows_sizer = new wxBoxSizer(wxVERTICAL); + + // Info panel (instructions + legend) and the column-header row. Both depend on the grid + // shape, so their CONTENTS are (re)built by rebuild_info_and_header(), which set_grid_size() + // calls again whenever the grid changes. The panels themselves are stable so m_outer's + // ordering never has to be rearranged. + m_info_panel = new wxPanel(this, wxID_ANY); + m_info_panel->SetBackgroundColour(GetBackgroundColour()); + m_hdr_panel = new wxPanel(this, wxID_ANY); + m_hdr_panel->SetBackgroundColour(GetBackgroundColour()); + rebuild_info_and_header(); + + // Add Mode is built by rebuild_info_and_header() into the info panel, above the rows: + // at the bottom it moved down the page every time a mode was added, so its position + // depended on how many modes you already had. + m_outer->Add(m_info_panel, 0, wxEXPAND | wxBOTTOM, FromDIP(4)); + m_outer->Add(m_hdr_panel, 0, wxEXPAND | wxBOTTOM, FromDIP(2)); + m_outer->Add(m_rows_sizer, 0, wxEXPAND); + m_outer->AddSpacer(FromDIP(4)); + // SetSizer(), not SetSizerAndFit(): no row exists yet, so there is nothing to fit to -- + // rows arrive from add_row() / load_from_config() / set_grid_size(). Deliberately NOT + // followed by m_outer->SetSizeHints(this) once they do: this panel owns a sizer, so + // wxWindow::GetBestSize() bypasses the best-size cache and re-runs m_outer->CalcMin() + // on every parent layout, and that is what the enclosing sizer already reserves space + // for via GetEffectiveMinSize(). An explicitly set min size takes PRIORITY over the best + // size in that call, so a size hint would pin the reserved height to the row count that + // happened to be on screen when it ran -- adding a mode after that would clip the bottom + // row, which is the very failure the hint is meant to avoid. + SetSizer(m_outer); +} + +// A wxTextCtrl cannot paint its own border on GTK -- Orca sidesteps that in ::TextInput by +// drawing one on a StaticBox, but that has no multiline form and nothing in the tree uses it +// that way. A one-pixel panel behind the control gives the same visible edge for both the +// single-line name and the multiline G-code box, in the color the settings fields above use: +// the inputs here were landing on GTK's near-black default, invisible against the panel. +static wxPanel* framed_input(wxWindow* parent) +{ + wxColour clr(0xDB, 0xDB, 0xDB); + if (wxGetApp().dark_mode()) + clr = StateColor::darkModeColorFor(clr); + auto* frame = new wxPanel(parent, wxID_ANY); + frame->SetBackgroundColour(clr); + frame->SetSizer(new wxBoxSizer(wxVERTICAL)); + return frame; +} + +// The settings page's label color, set before the walk as Tab's labels are, so the theme +// remaps it with the page. Left on the system text color, a label follows the OS theme on MSW +// rather than Orca's, and on GTK a dark walk pins a color the light map cannot undo. +static wxStaticText* page_label(wxStaticText* lbl) +{ + lbl->SetForegroundColour(wxColour("#363636")); + wxGetApp().UpdateDarkUI(lbl); + return lbl; +} + +void IMEXModesCtrl::rebuild_info_and_header() { + // --- Info panel: help button + color legend --- + m_info_panel->DestroyChildren(); + auto* info_sizer = new wxBoxSizer(wxVERTICAL); + + // The overview rides on the "?" button at the head of the legend rather than sitting in + // the panel as body text: it is read once and then only gets in the way, while the legend + // beside it is the part worth keeping on screen. Per-role detail is on the swatches. + const wxString instructions = + _L("Each mode names the tool heads that take part and the role each one plays. " + "Click a tool button to cycle its role — hover a color below for what each role does."); + + // Color legend — swatches sized to the body text height so they read as + // matched pairs with their labels regardless of system DPI / font scale, + // matching the on-hover ghost tooltip swatch's visual weight. + // One entry per role this printer offers, in kImexRoleTable order — the same order the + // tiles cycle in. A role added to that table appears here with no edit of its own. + auto* leg_sizer = new wxBoxSizer(wxHORIZONTAL); + const int swatch_side = m_info_panel->GetCharHeight(); + + // Action row: Add Mode, then the "?" carrying the overview. Width-matched to the mode + // column so the button sits over the field it creates. + auto* act_sizer = new wxBoxSizer(wxHORIZONTAL); + auto* add_btn = new Button(m_info_panel, _L("Add Mode")); + add_btn->SetStyle(ButtonStyle::Confirm, ButtonType::Window); + // Width-matched to the mode column. The height has to be a real number: Button takes its + // min size literally, so a -1 there collapses it to a sliver rather than meaning "auto". + add_btn->SetMinSize(wxSize(FromDIP(130), add_btn->GetBestSize().GetHeight())); + add_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { add_row(); notify(); }); + act_sizer->Add(add_btn, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(6)); + + auto* help_btn = new ScalableButton(m_info_panel, wxID_ANY, "icon_qusetion", wxEmptyString, + wxDefaultSize, wxDefaultPosition, + wxBU_EXACTFIT | wxNO_BORDER, /*use_default_disabled_bitmap=*/true, kImexIconPx); + help_btn->SetToolTip(instructions); + act_sizer->Add(help_btn, 0, wxALIGN_CENTER_VERTICAL); + info_sizer->Add(act_sizer, 0, wxBOTTOM, FromDIP(6)); + for (const ImexRoleDesc& d : kImexRoleTable) { + if (!role_offered(d.role)) continue; + const RoleStyle style = role_style(d.role); + auto* swatch = new wxPanel(m_info_panel, wxID_ANY, wxDefaultPosition, wxSize(swatch_side, swatch_side)); + swatch->SetBackgroundColour(style.bg); + auto* leg_label = page_label(new wxStaticText(m_info_panel, wxID_ANY, style.label)); + const wxString hint = role_hint(d.role); + swatch->SetToolTip(hint); + leg_label->SetToolTip(hint); + leg_sizer->Add(swatch, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(4)); + leg_sizer->Add(leg_label, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(16)); + } + info_sizer->Add(leg_sizer, 0, wxBOTTOM, FromDIP(6)); + m_info_panel->SetSizerAndFit(info_sizer); + + // --- Column header row --- + // Spacers sized to align with the mode-row fields below. Name field: FromDIP(130) + FromDIP(6) + // gap; tool grid: n_cols*(FromDIP(24)+FromDIP(2))-FromDIP(2) + FromDIP(6) gap. grid_px tracks + // the live column count, so the G-code header stays aligned after a grid change. + m_hdr_panel->DestroyChildren(); + auto* hdr_sizer = new wxBoxSizer(wxHORIZONTAL); + auto* hdr_name = page_label(new wxStaticText(m_hdr_panel, wxID_ANY, _L("Mode"))); + auto* hdr_tools = page_label(new wxStaticText(m_hdr_panel, wxID_ANY, _L("Tools"))); + auto* hdr_gcode = page_label(new wxStaticText(m_hdr_panel, wxID_ANY, _L("G-code"))); + hdr_name->SetToolTip(_L("How the mode is labeled in the plate's IDEX/IQEX mode selector. " + "Required — a mode with no name cannot be selected.")); + hdr_tools->SetToolTip(_L("Which tool heads take part in the mode and what role each one plays. " + "Click a tile to cycle its role.")); + hdr_gcode->SetToolTip(_L("G-code run at print start to put the printer into this mode " + "(for example a Klipper SET_PRINT_MODE call). The slicer only emits " + "the Primary tool's paths; the firmware drives the others.")); + const int grid_px = m_n_cols * FromDIP(26) - FromDIP(2); // tile 24 + 2px gap, less the trailing gap + const int name_col_px = FromDIP(kNameColPx + 6); + hdr_sizer->Add(hdr_name, 0, wxALIGN_CENTER_VERTICAL); + hdr_sizer->AddSpacer(std::max(0, name_col_px - hdr_name->GetBestSize().x)); + hdr_sizer->Add(hdr_tools, 0, wxALIGN_CENTER_VERTICAL); + hdr_sizer->AddSpacer(std::max(0, grid_px + FromDIP(6) - hdr_tools->GetBestSize().x)); + hdr_sizer->Add(hdr_gcode, 1, wxALIGN_CENTER_VERTICAL); + m_hdr_panel->SetSizerAndFit(hdr_sizer); +} + +void IMEXModesCtrl::set_grid_size(int n_cols, int n_rows, int layout) { + n_cols = std::max(1, n_cols); + n_rows = std::max(1, n_rows); + if (layout < 0) layout = m_layout; + if (n_cols == m_n_cols && n_rows == m_n_rows && layout == m_layout) return; + auto [names, tools, gcodes] = get_mode_data(); + clear_rows(); + m_n_cols = n_cols; + m_n_rows = n_rows; + m_layout = layout; + // Span becomes available the moment a second gantry exists, and the header spacing tracks the + // column count -- so the legend and headers are rebuilt here rather than only at construction. + // Without this, adding a gantry gives the tiles a Span role the legend never explains until + // the preset is saved and the page reopened. + rebuild_info_and_header(); + for (size_t i = 0; i < names.size(); ++i) + add_row(names[i], tools[i], gcodes[i], /*is_primary=*/(names[i] == kImexPrimaryMode)); + Layout(); +} + +void IMEXModesCtrl::load_from_config(const DynamicPrintConfig& cfg) { + clear_rows(); + // One ImexMode per row of imex_mode_names, with any sibling array too short for a row + // padded to an empty string -- exactly what the three per-index bounds checks this + // replaced were doing, now in one place shared with every other IMEX consumer. + const std::vector table = imex_mode_table(cfg); + + // Primary row is always first and non-deletable. Look for an existing + // "primary" entry in the config (present in configs saved after #8 was + // implemented); fall back to empty tool/gcode for older configs. + const ImexMode primary = find_imex_mode(cfg, kImexPrimaryMode); + add_row(kImexPrimaryMode, primary.active_tools, primary.gcode, /*is_primary=*/true); + + for (const ImexMode& m : table) { + if (m.index == primary.index) continue; // already added above + add_row(m.name, m.active_tools, m.gcode); + } + refresh_reset_buttons(); + Layout(); +} + +std::tuple, std::vector, std::vector> +IMEXModesCtrl::get_mode_data() const { + std::vector names, tools, gcodes; + for (auto& r : m_rows) { + // into_u8(), not ToStdString(): everything downstream of here -- the preset, the 3MF + // metadata, the plate's stored mode name -- is UTF-8, while ToStdString() encodes + // through wxConvLibc, which on Windows is the ANSI codepage. The two agree only on a + // UTF-8 locale, so mixing them turns a non-ASCII mode name into mojibake (or an empty + // field, once from_u8() rejects it) on the round trip through the preset. + std::string nm = r.is_primary ? std::string(kImexPrimaryMode) : into_u8(r.name->GetTextCtrl()->GetValue()); + if (nm.empty()) nm = unique_mode_name(names); + names.push_back(nm); + tools.push_back(active_tools_string(r)); + gcodes.push_back(into_u8(r.gcode->GetValue())); + } + return {names, tools, gcodes}; +} + +bool IMEXModesCtrl::matches_config(const DynamicPrintConfig& cfg) const { + auto [names, tools, gcodes] = get_mode_data(); + auto cfg_strings = [&cfg](const char* key) { + std::vector v; + if (auto* o = cfg.option(key)) v = o->values; + return v; + }; + return names == cfg_strings("imex_mode_names") + && tools == cfg_strings("imex_mode_active_tools") + && gcodes == cfg_strings("imex_mode_gcodes"); +} + +std::map IMEXModesCtrl::roles_for_mode(const std::string& active_tools) { + std::map roles; + for (const auto& [phys, role] : parse_imex_active_tools(active_tools)) + roles[phys] = role; + // Promote the mode's primary, but never invent a tool that isn't in the + // slicer's own active-tool list: parse_imex_active_tools() drops negative and + // out-of-range indices, imex_primary_tool_for_mode() does not range-check the + // upper bound, and a junk index round-tripped back out on save would be a + // token the slicer ignores. + const int primary = imex_primary_tool_for_mode(active_tools); + if (primary >= 0) { + auto it = roles.find(primary); + if (it != roles.end()) + it->second = ImexRole::Primary; + } + return roles; +} + +std::string IMEXModesCtrl::unique_mode_name(const std::vector& also_taken, const std::string& base) const { + auto is_taken = [&](const std::string& cand) { + if (std::find(also_taken.begin(), also_taken.end(), cand) != also_taken.end()) + return true; + for (const auto& r : m_rows) + if (!r.is_primary && r.name && into_u8(r.name->GetTextCtrl()->GetValue()) == cand) + return true; + return false; + }; + for (int n = 2; ; ++n) { + std::string cand = base + " " + std::to_string(n); + if (!is_taken(cand)) + return cand; + } +} + +bool IMEXModesCtrl::fix_row_name(Row& r) { + if (r.is_primary || !r.name) + return false; + const std::string name = into_u8(r.name->GetTextCtrl()->GetValue()); + // Case-insensitive: a row named "Primary" works, but its menu entry reads the same as the + // built-in Primary's. + const bool reserved = boost::iequals(name, kImexPrimaryMode); + bool taken = false; + for (const Row& other : m_rows) + if (&other != &r && !other.is_primary && other.name && into_u8(other.name->GetTextCtrl()->GetValue()) == name) + taken = true; + if (!name.empty() && !reserved && !taken) + return false; + std::string base = name; + // "copy 2" taken becomes "copy 3", not "copy 2 2". + if (const size_t sp = base.find_last_of(' '); sp != std::string::npos && sp > 0 && sp + 1 < base.size() && + base.find_first_not_of("0123456789", sp + 1) == std::string::npos) + base.erase(sp); + // ChangeValue(), not SetValue(): no nested wxEVT_TEXT. + r.name->GetTextCtrl()->ChangeValue(from_u8(name.empty() || reserved ? unique_mode_name({}) : unique_mode_name({}, base))); + return true; +} + +IMEXModesCtrl::RoleStyle IMEXModesCtrl::role_style(std::optional role) { + // Gray / "Inactive" is the no-role answer; every role gets an explicit case so a new + // one is a compile-time -Wswitch prompt rather than a tile that silently renders gray. + if (!role) + return { wxColour(90, 90, 90), *wxWHITE, "Inactive" }; + switch (*role) { + case ImexRole::Primary: return { wxColour(50, 160, 50), *wxWHITE, "Primary" }; // green + case ImexRole::Copy: return { wxColour(60, 120, 210), *wxWHITE, "Copy" }; // blue + case ImexRole::Mirror: return { wxColour(210, 130, 20), *wxWHITE, "Mirror" }; // amber + case ImexRole::Span: return { wxColour(180, 180, 40), *wxWHITE, "Span" }; // yellow + } + return { wxColour(90, 90, 90), *wxWHITE, "Inactive" }; // keeps every compiler quiet +} + +wxString IMEXModesCtrl::role_hint(ImexRole role) { + switch (role) { + case ImexRole::Primary: + return _L("Drives every sliced path. Always tool 0 — use Tool 0 Position above to choose " + "which corner of the bed it occupies. It cannot be moved from the grid."); + case ImexRole::Copy: + return _L("Follows the Primary at the firmware level, printing the same paths offset into " + "its own zone."); + case ImexRole::Mirror: + return _L("Follows the Primary at the firmware level, printing the same paths reflected " + "across the boundary between the two zones."); + case ImexRole::Span: + return _L("Marks a tool on the Primary's gantry as its multicolor partner. Required to " + "allow multi-color printing in paired-gantry modes."); + } + return wxEmptyString; +} + +bool IMEXModesCtrl::role_offered(ImexRole role) const { + // Span declares a within-gantry multicolor partner of the Primary, which only means + // something when there is a second gantry running in parallel with it. + if (role == ImexRole::Span) + return m_n_rows >= 2; + return true; +} + +bool IMEXModesCtrl::role_allowed_on_tile(ImexRole role, int tool_idx, + bool other_primary, int primary_gantry) const { + if (!role_offered(role)) + return false; + // Exactly one tile drives the sliced paths. + if (role == ImexRole::Primary) + return !other_primary; + // Span only on a tile sharing the Primary's gantry — that is what the marker declares. + if (role == ImexRole::Span) + return primary_gantry >= 0 && (tool_idx / m_n_cols) == primary_gantry; + return true; +} + +std::optional IMEXModesCtrl::next_tile_role(std::optional current, + const std::function& allowed) { + const int n = (int)(sizeof(kImexRoleTable) / sizeof(kImexRoleTable[0])); + int start = 0; // no current role (Inactive) → start at the first role + if (current) { + for (int i = 0; i < n; ++i) + if (kImexRoleTable[i].role == *current) { start = i + 1; break; } + } + for (int i = start; i < n; ++i) + if (allowed(kImexRoleTable[i].role)) + return kImexRoleTable[i].role; + return std::nullopt; // walked off the end → back to Inactive +} + +// The tool grid says which topologies this printer can express, so a two-tool machine is not +// offered the four-carriage modes. Names a row already uses are dropped, leaving only what is +// still free. These are conventions, not keywords -- nothing in the slicer reads a mode's name +// except as the key a plate stores -- so the field stays typeable and this is only a shortcut. +std::vector IMEXModesCtrl::suggested_mode_names(const ::ComboBox* skip) const { + std::vector pool = { "copy", "mirror" }; + // Four carriages to drive, however they are arranged. + if (m_n_cols * m_n_rows >= 4) + for (const char* n : { "iq-copy", "iq-mirror" }) + pool.emplace_back(n); + // Multicolor needs a Span partner beside the primary, so two tools on a gantry, and a + // second gantry to copy the pair onto. imex_resolve_routing() refuses a multicolor mode + // with no Span on the primary's gantry, so offering one here that it would reject is + // worse than not offering it at all. + if (m_n_cols >= 2 && m_n_rows >= 2) + for (const char* n : { "mc-copy", "mc-mirror" }) + pool.emplace_back(n); + + std::vector out; + for (const std::string& cand : pool) { + bool taken = false; + for (const Row& r : m_rows) + if (!r.is_primary && r.name && r.name != skip && + into_u8(r.name->GetTextCtrl()->GetValue()) == cand) { + taken = true; + break; + } + if (!taken) + out.push_back(from_u8(cand)); + } + return out; +} + +void IMEXModesCtrl::apply_btn(wxButton* btn, int tool_idx, std::optional role) { + // Always label as T{n} — the button color already encodes the role. + const RoleStyle style = role_style(role); + btn->SetLabel(wxString::Format("T%d", tool_idx)); + btn->SetBackgroundColour(style.bg); + btn->SetForegroundColour(style.fg); + btn->Refresh(); +} + +IMEXModesCtrl::RowSnapshot IMEXModesCtrl::snapshot_row(const Row& r) const { + RowSnapshot s; + // UTF-8 throughout -- this snapshot is compared against the preset's own values. + s.name = r.is_primary ? std::string(kImexPrimaryMode) : into_u8(r.name->GetTextCtrl()->GetValue()); + s.tools = active_tools_string(r); + s.gcode = into_u8(r.gcode->GetValue()); + return s; +} + +bool IMEXModesCtrl::row_differs_from_parent(int row_idx) const { + if (!m_parent_lookup) return false; + const DynamicPrintConfig* parent = m_parent_lookup(); + if (!parent) return false; + auto* p_names = parent->option("imex_mode_names"); + auto* p_tools = parent->option("imex_mode_active_tools"); + auto* p_gcodes = parent->option("imex_mode_gcodes"); + if (!p_names || row_idx < 0 || row_idx >= (int)p_names->values.size()) return false; + const Row& r = m_rows[row_idx]; + const RowSnapshot s = snapshot_row(r); + if (!r.is_primary && s.name != p_names->values[row_idx]) return true; + if (p_tools && row_idx < (int)p_tools->values.size() && s.tools != p_tools->values[row_idx]) return true; + if (p_gcodes && row_idx < (int)p_gcodes->values.size() && s.gcode != p_gcodes->values[row_idx]) return true; + return false; +} + +bool IMEXModesCtrl::row_has_parent_counterpart(int row_idx) const { + if (!m_parent_lookup) return false; + const DynamicPrintConfig* parent = m_parent_lookup(); + if (!parent) return false; + auto* p_names = parent->option("imex_mode_names"); + return p_names && row_idx >= 0 && row_idx < (int)p_names->values.size(); +} + +void IMEXModesCtrl::add_row(const std::string& name, + const std::string& active_tools, + const std::string& gcode, + bool is_primary) +{ + Row r; + r.is_primary = is_primary; + r.panel = new wxPanel(this, wxID_ANY); + r.panel->SetBackgroundColour(GetBackgroundColour()); + auto* sizer = new wxBoxSizer(wxHORIZONTAL); + // The mode column is vertical: name on top, and for a deletable row the remove button + // beneath it. Remove used to sit next to Edit in the right-hand column, one icon apart + // from a button people press often -- a destructive action does not belong there. + auto* name_col = new wxBoxSizer(wxVERTICAL); + + if (is_primary) { + r.orig_name = kImexPrimaryMode; + r.name = nullptr; + auto* lbl = page_label(new wxStaticText(r.panel, wxID_ANY, _L("Primary"), + wxDefaultPosition, FromDIP(wxSize(kNameColPx, -1)))); + wxFont f = lbl->GetFont(); + f.SetWeight(wxFONTWEIGHT_BOLD); + lbl->SetFont(f); + name_col->Add(lbl, 0); // the combo below carries no frame, so no inset to match + } else { + // A nameless mode cannot be selected on a plate and used to be dropped on + // save together with its tool roles and G-code, so a name is pre-filled + // here and restored below if the field is left empty. That keeps the + // "Add Mode → assign tools → never typed a name" path from losing work + // without ever showing an error. + const std::string nm = name.empty() ? unique_mode_name({}) : name; + // The name as first shown, i.e. the one the plate's mode selector offered while this + // row looked like this. remove_row() reports it alongside the current name, because + // renaming is not routed through on_mode_removed and the two then diverge. + r.orig_name = nm; + // Editable: no wxCB_READONLY, so the inner text control stays live and any name can + // still be typed, which the mode table needs -- it is authored for whatever hardware + // the user has. ComboBox derives from TextInput and paints the same border the settings + // fields do, so it needs no frame panel of its own. + r.name = new ::ComboBox(r.panel, wxID_ANY, wxEmptyString, wxDefaultPosition, + FromDIP(wxSize(kNameColPx, -1)), 0, nullptr, 0); + for (const wxString& sug : suggested_mode_names()) + r.name->Append(sug); + // Rebuilt on every click that could open the list: add_row() runs before this row joins + // m_rows and before the rows below it exist, so a list built once there filters against + // only part of the table and offers names that are already taken. By then every row is + // present -- and this row's own name is excluded from "taken" so it stays offered. It + // has to be BEFORE ComboBox opens it, not in wxEVT_COMBOBOX_DROPDOWN, which ComboBox + // sends after sizing and showing the popup from the old items: with every name taken + // that showed an empty popup. Bound handlers run ahead of ComboBox's own event-table + // entries, so this rebuilds first and, with nothing to offer, keeps it shut. Only clicks + // can open it: focus lives in the inner text control, so keys never reach the combo. + const auto on_open_click = [this, cb = r.name](wxMouseEvent& e) { + if (!cb->is_drop_down()) { + cb->Clear(); + for (const wxString& sug : suggested_mode_names(cb)) + cb->Append(sug); + if (cb->GetCount() == 0) { + cb->SetFocus(); // what ComboBox's own click would have done, short of the list + return; + } + } + e.Skip(); + }; + r.name->Bind(wxEVT_LEFT_DOWN, on_open_click); + r.name->Bind(wxEVT_LEFT_DCLICK, on_open_click); + // Constructed empty on purpose: ComboBox hands its value to TextInput as the LABEL -- + // the small right-aligned slot a unit like "mm" lives in -- because a read-only combo + // hides the text control and shows that label instead. This one is editable, so the + // value belongs in the text control; left in the label it renders as a second, greyed + // copy of the name beside the hint. + r.name->GetTextCtrl()->ChangeValue(from_u8(nm)); + r.name->GetTextCtrl()->SetHint(_L("Mode name (required)")); + r.name->SetToolTip(_L("Name of this parallel mode, as it appears in the plate's IDEX/IQEX mode " + "selector. Stored in the project by name, so renaming a mode that " + "plates already use makes them fall back to Primary. Cannot be empty " + "— a blank name is replaced with a generated one.")); + r.name->GetTextCtrl()->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { notify(); }); + // Picking a suggestion writes it into the text control, so everything downstream keeps + // reading one place for the name. + r.name->Bind(wxEVT_COMBOBOX, [this, cb = r.name](wxCommandEvent& e) { + // Do NOT call SetLabel() here. It is overridden, and on an editable combo it + // writes the TEXT CONTROL rather than the label (ComboBox.cpp, the IsShown() + // branch) -- clearing it would erase the name that was just picked. The label + // stays empty for this control's whole life anyway: it is constructed empty and + // every write routes through the same override. + // ChangeValue is still needed: SetSelection() early-returns when the index is + // unchanged, so re-picking the current item would otherwise leave typed-over text. + cb->GetTextCtrl()->ChangeValue(cb->GetDropDown().GetValue()); + notify(); + }); + // Restore a name rather than let the row reach get_mode_data() unnamed. + // Row is located by panel pointer (stable across add/remove) so a + // kill-focus delivered while the rows are being torn down is a no-op. + r.name->GetTextCtrl()->Bind(wxEVT_SET_FOCUS, [this, panel = r.panel](wxFocusEvent& e) { + e.Skip(); + for (auto& row_ref : m_rows) + if (row_ref.panel == panel && row_ref.name) + row_ref.focus_name = into_u8(row_ref.name->GetTextCtrl()->GetValue()); + }); + r.name->GetTextCtrl()->Bind(wxEVT_KILL_FOCUS, [this, panel = r.panel](wxFocusEvent& e) { + e.Skip(); + if (m_clearing_rows) return; // focus-out emitted while the rows are being deleted + for (auto& row_ref : m_rows) { + if (row_ref.panel != panel) continue; + // Only an edit is checked. Tabbing through a hand-edited profile's duplicate + // leaves it alone rather than renaming the row plates resolve to. + const wxString value = row_ref.name ? row_ref.name->GetTextCtrl()->GetValue() : wxString(); + if (!value.empty() && into_u8(value) == row_ref.focus_name) + return; + if (fix_row_name(row_ref)) + notify(); + return; + } + }); + } + + auto* grid_panel = new wxPanel(r.panel, wxID_ANY); + grid_panel->SetBackgroundColour(GetBackgroundColour()); + auto* grid_sizer = new wxGridSizer(m_n_rows, m_n_cols, FromDIP(2), FromDIP(2)); + + auto tool_roles = roles_for_mode(active_tools); + if (tool_roles.empty()) + tool_roles[0] = ImexRole::Primary; // default T0 → Primary when no assignment is stored + r.all_tool_roles = tool_roles; // preserve all assignments, including off-screen tools + wxPanel* this_panel = r.panel; + + // Buttons rendered top=rear (high Y), bottom=front (low Y). + // Layout remapping: m_layout encodes which corner T0 is at physically. + // flip_x (layout 1,3): col 0 is on the right (max-X) instead of left + // flip_y (layout 2,3): row 0 is at the rear (max-Y) instead of front + // Display iterates: row from n_rows-1 down to 0 (rear→front = top→bottom). + // raw_row = flip_y ? (n_rows-1-row) : row + // raw_col = flip_x ? (n_cols-1-col) : col + // + // Render the whole grid: m_n_rows is the gantry count, so the valid tool indices are + // 0 .. m_n_rows*m_n_cols-1 and a window this tall only fits inside the grid at row 0. + // A Primary outside the grid is a data problem the zone layout already reports by + // producing no zones (compute_imex_zone_layout, IMEXZones.cpp). + + bool flip_x = (m_layout == 1 || m_layout == 3); + bool flip_y = (m_layout == 2 || m_layout == 3); + for (int row = m_n_rows - 1; row >= 0; --row) { + for (int col = 0; col < m_n_cols; ++col) { + int raw_row = flip_y ? (m_n_rows - 1 - row) : row; + int raw_col = flip_x ? (m_n_cols - 1 - col) : col; + int tool_idx = raw_row * m_n_cols + raw_col; + std::optional role; // nullopt == Inactive + auto it = tool_roles.find(tool_idx); + if (it != tool_roles.end()) role = it->second; + + // wxBU_AUTODRAW, which wx ignores on a text button, is what GUI_App::UpdateDarkUI + // skips: without it every theme change ran the role colors through the palette + // map and left the labels gray. apply_btn() owns these colors in both themes. + auto* btn = new wxButton(grid_panel, wxID_ANY, wxEmptyString, + wxDefaultPosition, FromDIP(wxSize(24, 24)), wxBU_EXACTFIT | wxBU_AUTODRAW); + apply_btn(btn, tool_idx, role); + + int btn_pos = (int)r.btns.size(); + r.btns.push_back(btn); + r.btn_roles.push_back(role); + r.btn_tool_idx.push_back(tool_idx); + + // Two tiles are read-only. + // + // The whole reserved `primary` row: it is the IMEX-off mode, so cycling roles there + // would be a no-op and confusing. + // + // And, on any row, the tile that currently HOLDS Primary. Primary is tool 0 and moves + // only via Tool 0 Position; letting a click demote it would leave the mode with no + // Primary at all, which parses to -1 and degrades the plate to an ordinary single-tool + // print with no zones — authored silently, in one click, with nothing in the editor + // showing what is wrong. The other tiles already never OFFER Primary while one is held + // (role_allowed_on_tile), so this closes the only remaining route to that state. + // A mode that reaches us WITHOUT a Primary (hand-edited preset, foreign 3MF) still has + // every tile live, so it can be repaired by promoting one. + if (is_primary || role == ImexRole::Primary) { + btn->Disable(); + } else { + btn->Bind(wxEVT_BUTTON, [this, this_panel, btn_pos](wxCommandEvent&) { + // Find the row by panel pointer (stable across add/remove) + for (auto& row_ref : m_rows) { + if (row_ref.panel != this_panel) continue; + std::optional& tile = row_ref.btn_roles[btn_pos]; + const int tidx = row_ref.btn_tool_idx[btn_pos]; + + // Check if another button already holds the Primary role, + // and locate the primary's gantry row for Span eligibility. + bool other_primary = false; + int primary_gantry = -1; + for (int j = 0; j < (int)row_ref.btn_roles.size(); ++j) { + if (row_ref.btn_roles[j] == ImexRole::Primary) { + if (j != btn_pos) other_primary = true; + primary_gantry = row_ref.btn_tool_idx[j] / m_n_cols; + } + } + + // Cycle Inactive → Primary → Copy → Mirror → Span → Inactive, + // skipping whatever this tile may not take right now. + tile = next_tile_role(tile, [&](ImexRole cand) { + return role_allowed_on_tile(cand, tidx, other_primary, primary_gantry); + }); + + // Keep all_tool_roles in sync so off-screen tools are preserved + if (tile) + row_ref.all_tool_roles[tidx] = *tile; + else + row_ref.all_tool_roles.erase(tidx); + + apply_btn(row_ref.btns[btn_pos], row_ref.btn_tool_idx[btn_pos], tile); + notify(); + break; + } + }); + } + + grid_sizer->Add(btn, 0); + } + } + grid_panel->SetSizerAndFit(grid_sizer); + + // from_u8(): `gcode` arrives from the preset as UTF-8. Handing the raw std::string to + // wxString would decode it through the current locale's encoding instead. + auto* gcode_frame = framed_input(r.panel); + // wxBORDER_NONE matters off GTK: a wxTextCtrl's default border resolves to a themed or + // sunken edge on Windows and to NSBezelBorder on macOS, which would sit immediately inside + // the frame below and read as two borders. + r.gcode = new wxTextCtrl(gcode_frame, wxID_ANY, from_u8(gcode), + wxDefaultPosition, FromDIP(wxSize(220, 54)), + wxTE_MULTILINE | wxBORDER_NONE); + gcode_frame->GetSizer()->Add(r.gcode, 1, wxEXPAND | wxALL, 1); + // Same monospace face EditGCodeDialog gives its editor, so G-code reads the same + // wherever it is edited; and the same explicit-light-then-UpdateDarkUI treatment as the + // name field above, for the same reason. + r.gcode->SetFont(wxGetApp().code_font()); + r.gcode->SetBackgroundColour(*wxWHITE); + r.gcode->SetForegroundColour(wxColour("#262E30")); // the palette's input text color + wxGetApp().UpdateDarkUI(r.gcode); + // Tooltip only, no SetHint(): wxTextEntry has no native placeholder for a + // multiline control, so wxWidgets emulates one by writing the hint into the + // control as gray text — indistinguishable from real G-code in this box. + r.gcode->SetToolTip(_L("G-code emitted once at the start of a print that uses this mode, before " + "the machine start G-code. This is where the printer is put into the " + "matching firmware mode — for example a Klipper SET_PRINT_MODE call or a " + "RepRapFirmware M567 — since the slicer only emits the Primary tool's " + "paths and the firmware drives the Copy / Mirror tools. Placeholders are " + "supported; use the edit button to browse them. Leave empty if the mode " + "needs no firmware setup.")); + r.gcode->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { notify(); }); + + if (!is_primary) + name_col->Add(r.name, 0); + sizer->Add(name_col, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(6)); + sizer->Add(grid_panel, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(6)); + sizer->Add(gcode_frame, 1, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(4)); + + // Edit on top, per-row reset under it, in one column top-aligned with the G-code box. + // Remove is not here -- it sits under the name field, away from the button people press + // most. The column is top- rather than centre-justified so the edit icon keeps the same + // position whatever a row's height turns out to be. + auto* btn_col = new wxBoxSizer(wxVERTICAL); + wxTextCtrl* gcode_ctrl = r.gcode; + auto* ph_btn = new ScalableButton(r.panel, wxID_ANY, "edit", wxEmptyString, + wxDefaultSize, wxDefaultPosition, + wxBU_EXACTFIT | wxNO_BORDER, /*use_default_disabled_bitmap=*/true, kImexIconPx); + ph_btn->SetToolTip(_L("Edit G-code / browse placeholders")); + ph_btn->Bind(wxEVT_BUTTON, [this, gcode_ctrl](wxCommandEvent&) { + // EditGCodeDialog takes and returns UTF-8 (get_edited_gcode() is a ToUTF8()). + EditGCodeDialog dlg(this, "imex_mode_gcode", into_u8(gcode_ctrl->GetValue())); + if (dlg.ShowModal() == wxID_OK) + gcode_ctrl->SetValue(from_u8(dlg.get_edited_gcode())); + }); + btn_col->Add(ph_btn, 0, wxBOTTOM, FromDIP(2)); + + if (!is_primary) { + auto* rm = new ScalableButton(r.panel, wxID_ANY, "delete", wxEmptyString, + wxDefaultSize, wxDefaultPosition, + wxBU_EXACTFIT | wxNO_BORDER, /*use_default_disabled_bitmap=*/true, kImexIconPx); + rm->SetToolTip(_L("Remove mode")); + rm->Bind(wxEVT_BUTTON, [this, this_panel](wxCommandEvent&) { + const std::vector removed = remove_row(this_panel); + // Copied before notify(): on_change ends in on_value_change, which can send + // the tab through update() and hence load_from_config(), and that rebuilds + // every row. Reading the member afterwards would be reading through a + // handler whose owner has just been rebuilt underneath it. + auto removed_cb = on_mode_removed; + notify(); + if (removed_cb && !removed.empty()) + removed_cb(removed); + }); + name_col->Add(rm, 0, wxALIGN_RIGHT | wxTOP, FromDIP(2)); + } + // Reset only renders when this row has a counterpart in the saved preset (user-added rows + // beyond the saved mode count get no reset — remove covers "drop the row I just added"). + wxPanel* this_panel_for_reset = r.panel; + if (row_has_parent_counterpart(static_cast(m_rows.size()))) { + r.reset_btn = new ScalableButton(r.panel, wxID_ANY, "dot", wxEmptyString, + wxDefaultSize, wxDefaultPosition, + wxBU_EXACTFIT | wxNO_BORDER, /*use_default_disabled_bitmap=*/true, kImexIconPx); + r.reset_btn->SetToolTip(_L("Discard in-session edits to this mode (snap back to saved value)")); + r.reset_btn->Bind(wxEVT_BUTTON, [this, this_panel_for_reset](wxCommandEvent&) { + reset_row_to_parent(this_panel_for_reset); + }); + btn_col->Add(r.reset_btn, 0, wxTOP, FromDIP(2)); + } + sizer->Add(btn_col, 0, wxALIGN_TOP | wxRIGHT, FromDIP(4)); + r.panel->SetSizerAndFit(sizer); + + m_rows_sizer->Add(r.panel, 0, wxEXPAND | wxBOTTOM, FromDIP(4)); + m_rows.push_back(std::move(r)); + Layout(); +} + +std::vector IMEXModesCtrl::remove_row(wxPanel* panel) { + for (size_t i = 0; i < m_rows.size(); ++i) { + if (m_rows[i].panel != panel) continue; + if (m_rows[i].is_primary) return {}; // primary row is non-deletable + + // Both names a plate can be holding for this row: the one the row was built with and + // the one in the field now. They diverge as soon as the row is renamed, because a + // rename does not rebuild the row and is deliberately not reported as a removal (the + // name field notifies on every keystroke). Reporting only the current name is what + // let "rename, then delete" leave the plate on a mode that no longer exists. + std::vector removed_names; + const std::string current = m_rows[i].name ? into_u8(m_rows[i].name->GetTextCtrl()->GetValue()) + : std::string(); + for (const std::string& n : {m_rows[i].orig_name, current}) + if (!n.empty() && std::find(removed_names.begin(), removed_names.end(), n) == removed_names.end()) + removed_names.push_back(n); + + m_rows_sizer->Detach(panel); + m_rows.erase(m_rows.begin() + i); + + // A name a surviving row still carries is not stale: the user can rename row A to + // row B's old name and then delete B. Plates holding it now resolve to A, so drop it + // rather than reset them. + auto still_in_use = [this](const std::string& n) { + return std::any_of(m_rows.begin(), m_rows.end(), [&n](const Row& r) { + return r.is_primary ? n == kImexPrimaryMode + : r.name && into_u8(r.name->GetTextCtrl()->GetValue()) == n; + }); + }; + removed_names.erase(std::remove_if(removed_names.begin(), removed_names.end(), still_in_use), + removed_names.end()); + + Layout(); + // Defer widget destruction so any in-flight GTK events for + // panel's children (including the remove button we're inside) finish + // processing before the wxEvtHandlers are freed. + wxTheApp->CallAfter([panel]() { panel->Destroy(); }); + return removed_names; + } + return {}; +} + +void IMEXModesCtrl::clear_rows() { + // Destroying a focused wxTextCtrl emits wxEVT_KILL_FOCUS, and the Name field's + // handler would then read m_rows while it is half-destroyed. Flag the teardown + // so that handler stays out of the way. + m_clearing_rows = true; + for (auto& r : m_rows) { m_rows_sizer->Detach(r.panel); r.panel->Destroy(); } + m_rows.clear(); + m_clearing_rows = false; +} + +std::string IMEXModesCtrl::active_tools_string(const Row& r) const { + // Serialize from all_tool_roles (not just visible buttons) so assignments + // for off-screen tools are preserved across grid size changes. Inactive tools are + // simply absent from the map, so there is nothing to filter out here. + // + // The letters come from imex_role_letter(), the same table parse_imex_active_tools() + // reads back — this used to be a second, independent int → letter switch, which is + // exactly where the editor and the slicer could come to disagree about a mode string. + std::string s; + for (const auto& [idx, role] : r.all_tool_roles) { + if (!s.empty()) s += ','; + s += std::to_string(idx) + ':' + imex_role_letter(role); + } + return s; +} + +void IMEXModesCtrl::notify() { + refresh_reset_buttons(); + if (on_change) on_change(); +} + +void IMEXModesCtrl::refresh_reset_buttons() { + for (size_t i = 0; i < m_rows.size(); ++i) { + Row& r = m_rows[i]; + if (!r.reset_btn || !r.reset_btn->IsEnabled()) continue; + const bool dirty = row_differs_from_parent(static_cast(i)); + if (dirty == r.reset_dirty_cached) continue; + r.reset_dirty_cached = dirty; + r.reset_btn->SetBitmap_(dirty ? "undo" : "dot"); + } +} + +void IMEXModesCtrl::reset_row_to_parent(wxPanel* panel) { + if (!m_parent_lookup) return; + const DynamicPrintConfig* parent = m_parent_lookup(); + if (!parent) return; + auto* p_names = parent->option("imex_mode_names"); + auto* p_tools = parent->option("imex_mode_active_tools"); + auto* p_gcodes = parent->option("imex_mode_gcodes"); + for (size_t i = 0; i < m_rows.size(); ++i) { + Row& r = m_rows[i]; + if (r.panel != panel) continue; + if (!p_names || i >= p_names->values.size()) return; + if (!r.is_primary && r.name) { + r.name->GetTextCtrl()->ChangeValue(from_u8(p_names->values[i])); + // The saved name may since have been given to another row, which keeps it. + fix_row_name(r); + } + if (p_gcodes && i < p_gcodes->values.size()) + r.gcode->ChangeValue(from_u8(p_gcodes->values[i])); + if (p_tools && i < p_tools->values.size()) { + // Reapply tool roles from the parent's serialized form. all_tool_roles + // is the source of truth for round-tripping; rebuild it then re-paint + // the visible buttons. + r.all_tool_roles = roles_for_mode(p_tools->values[i]); + for (size_t j = 0; j < r.btns.size(); ++j) { + int tidx = r.btn_tool_idx[j]; + auto it = r.all_tool_roles.find(tidx); + std::optional role; + if (it != r.all_tool_roles.end()) role = it->second; + r.btn_roles[j] = role; + apply_btn(r.btns[j], tidx, role); + } + } + notify(); + return; + } +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/IMEXModesCtrl.hpp b/src/slic3r/GUI/IMEXModesCtrl.hpp new file mode 100644 index 0000000000..f50327ad35 --- /dev/null +++ b/src/slic3r/GUI/IMEXModesCtrl.hpp @@ -0,0 +1,270 @@ +#ifndef slic3r_IMEXModesCtrl_hpp_ +#define slic3r_IMEXModesCtrl_hpp_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "libslic3r/IMEXHelpers.hpp" + +class ScalableButton; + +class ComboBox; + +namespace Slic3r { +namespace GUI { + +// --------------------------------------------------------------------------- +// IMEXModesCtrl — visual parallel-mode editor for the IDEX/IQEX printer tab +// +// A tool tile holds an `std::optional`: the role the mode gives that tool, or +// nullopt for Inactive (gray — the tool does not take part in this mode). Inactive is the +// editor's own state and the only reason the tile is not a bare ImexRole; it is the absence +// of a role, so it is spelled as one rather than as an extra enumerator that libslic3r would +// then have to keep rejecting. Roles themselves are never re-encoded here — no int state +// table, no second copy of the on-disk letters. +// +// nullopt (gray) — not participating in this mode +// ImexRole::Primary (green) — the tool the slicer generates paths for +// ImexRole::Copy (blue) — firmware duplicates Primary at an offset +// ImexRole::Mirror (amber) — firmware mirrors Primary about an axis +// ImexRole::Span (yellow)— multicolor partner of Primary on the same gantry; +// declares paired-gantry multicolor topology and +// unlocks the multicolor block at slice time. Only +// offered on tools sharing primary's gantry, and +// only on multi-gantry printers (n_rows >= 2). +// +// Color and legend text are the editor's business and live in role_style(); the tile cycle +// order and the serialized letters come from kImexRoleTable in IMEXHelpers.hpp, so the +// editor cannot drift from the slicer's reading of a mode string. +// +// Active-tools string format: "idx:P,idx:C,idx:M,idx:S" (backwards-compat: plain "idx" = Primary) +// --------------------------------------------------------------------------- +class IMEXModesCtrl : public wxPanel { +public: + std::function on_change; + + // Fired after on_change has written the shortened table back to the preset, with EVERY + // name the deleted row could be known by: the name the row was built with (what a plate + // set from the saved preset holds) and the name in the field at delete time (what a plate + // set after an in-session rename holds). Renaming is deliberately not routed through here + // -- the name field notifies on every keystroke -- so by the time the row is deleted the + // two can differ, and reporting only the current name leaves the plate pointing at a mode + // that no longer exists. Names a surviving row still carries are filtered out, so renaming + // one row to another's old name and then deleting cannot reset a plate that legitimately + // resolves elsewhere. Plates still set to any reported name are stale from this point on + // -- see the handler in TabPrinter::build_fff. + std::function&)> on_mode_removed; + + // Lazy lookup so the widget always sees the current parent (preset switches + // change the parent under us). Returns nullptr when the active preset has no + // parent (system preset itself), which disables per-row reset arrows. + using ParentConfigLookup = std::function; + void set_parent_config_lookup(ParentConfigLookup f) { m_parent_lookup = std::move(f); } + + // layout: 0=front-left, 1=front-right, 2=rear-left, 3=rear-right (T0 corner). + // The enum values intentionally line up 1:1 so this is a no-op cast — the helper + // is kept to make the conversion explicit at call sites. + static int parse_layout(ImexToolLayout layout) { return static_cast(layout); } + + IMEXModesCtrl(wxWindow* parent, int n_cols, int n_rows, int layout = 0); + + void set_grid_size(int n_cols, int n_rows, int layout = -1); + + void load_from_config(const DynamicPrintConfig& cfg); + + // Every row on screen produces exactly one entry — a row is never skipped. + // Skipping empty-named rows used to drop the row's tool roles and G-code + // silently, and because matches_config() compares against this same filtered + // output the preset did not even go dirty to hint that something had gone + // missing; the row stayed on screen until the next load_from_config() quietly + // removed it. add_row() pre-fills a name and the Name field restores one when + // it is left empty, so the substitution below is the last-resort guard for a + // name that arrives empty from a hand-edited preset or 3MF. + std::tuple, std::vector, std::vector> + get_mode_data() const; + + // True when the widget's current rows already mirror the three IMEX-mode option + // vectors in cfg. Used by TabPrinter::update_fff() to skip a destroy-and-rebuild + // pass when the only thing that just changed was the widget itself writing back + // to config — without this guard, every keystroke in the gcode textbox triggers + // a load_from_config() that detaches the textbox the user is typing in. + bool matches_config(const DynamicPrintConfig& cfg) const; + + // Whether the printer is an IMEX printer. The grid sits in an options group that shows or hides + // everything in it by mode, so Show() keeps it hidden on other printers whatever the group asks. + void set_applicable(bool applicable) + { + m_applicable = applicable; + if (!applicable) + wxPanel::Show(false); // showing is left to the group, which knows the mode + } + bool Show(bool show = true) override { return wxPanel::Show(show && m_applicable); } + +private: + bool m_applicable = true; + + // map for one `imex_mode_active_tools` entry. A tool absent + // from the map is Inactive — the same convention the serialized string uses, so the + // round trip needs no separate "off" value. + // + // Deliberately NOT a parser of its own: the slicer decides what actually prints, + // so the editor has to read the string exactly the way the slicer does or the + // same mode means two different things in the two places. Roles come from + // parse_imex_active_tools(); the primary index comes from + // imex_primary_tool_for_mode(), which is where the "a bare index is Primary" + // backwards-compat rule lives. Both are needed: parse_imex_active_tools() + // defaults a bare token to Copy (deliberately — see the note above + // parse_imex_active_tools() in IMEXHelpers.hpp), so only the combination + // reproduces the slicer's reading of a legacy "0,1,2" string, which is + // "T0 primary, the rest copies". + // + // Indices are PHYSICAL tool indices (T0..TN-1). all_tool_roles preserves + // off-grid entries so the tile widget can round-trip indices that fall + // outside the currently visible rows × cols without losing data on save. + static std::map roles_for_mode(const std::string& active_tools); + + // `base` + " N" for the lowest N >= 2 not already used by a row or by `also_taken` + // (N == 1 is the fixed Primary row, or the name being made unique). Deterministic for a + // given set of rows, so get_mode_data() is stable across calls and matches_config() stays + // honest. Intentionally NOT translated: mode names are identifiers — objects + // store one in `imex_parallel_mode` and GCode.cpp matches it against + // `imex_mode_names` by string — so a locale-dependent name would break a project + // opened under a different language. + std::string unique_mode_name(const std::vector& also_taken, const std::string& base = "Mode") const; + + // Everything the editor draws for one role, in ONE place: a new role needs a color and + // a legend name here and nowhere else in this file. nullopt is Inactive (gray). + // `label` is deliberately untranslated — it names a role, and the legend sits next to + // the same letters the preset stores. + struct RoleStyle { wxColour bg; wxColour fg; const char* label; }; + static RoleStyle role_style(std::optional role); + + // True when this printer offers `role` at all, regardless of which tile is clicked. + // Span needs a second gantry to be a partner across, so a single-gantry printer neither + // cycles to it nor lists it in the legend. + bool role_offered(ImexRole role) const; + + // True when the tile for `tool_idx` may take `role` right now. Adds the positional rules + // on top of role_offered(): only one tile may hold Primary, and Span only on a tile + // sharing the Primary's gantry. + bool role_allowed_on_tile(ImexRole role, int tool_idx, + bool other_primary, int primary_gantry) const; + + // Next state in the tile cycle: Inactive → kImexRoleTable order → Inactive, stepping + // over any role `allowed` rejects. Inactive is always reachable, so it terminates. + static std::optional next_tile_role(std::optional current, + const std::function& allowed); + + // Mode names this printer's tool grid can actually carry, minus those already taken. + std::vector suggested_mode_names(const ::ComboBox* skip = nullptr) const; + + void apply_btn(wxButton* btn, int tool_idx, std::optional role); + + struct Row { + wxPanel* panel; + ::ComboBox* name; // nullptr for primary row (name is fixed) + wxTextCtrl* gcode; + std::vector btns; + std::vector> btn_roles; // nullopt == Inactive + std::vector btn_tool_idx; + std::map all_tool_roles; // absent == Inactive + // Name the row was built with (UTF-8), i.e. the name that was in the preset — and so + // in the plate's mode selector — when the row appeared. Kept because the name field is + // free to drift from it without the row being rebuilt; remove_row() needs both to find + // the plates a delete strands. Rebuilding the rows (load_from_config / set_grid_size) + // re-seeds it, which is correct: config and rows agree again at that point. + std::string orig_name; + // The name when the field last took focus, so a commit that leaves it unchanged is not + // treated as an edit. + std::string focus_name; + bool is_primary {false}; + ScalableButton* reset_btn {nullptr}; // nullptr when row has no parent counterpart + bool reset_dirty_cached {false}; + }; + + // Snapshot of row content as it would be saved (matches get_mode_data() per-row). + struct RowSnapshot { std::string name, tools, gcode; }; + RowSnapshot snapshot_row(const Row& r) const; + + // True when row at `row_idx` differs from the parent preset's value at the same + // index. Returns false when there is no parent (system preset), when the row is + // beyond the parent's mode count (user added it — no defined "default"), or when + // the lookup callback isn't wired. The Primary row's name is sentinel-fixed so + // a name diff doesn't count for it; only tools/gcode do. + bool row_differs_from_parent(int row_idx) const; + + // True when row index has a parent counterpart at all (i.e., the reset arrow + // should be present on the row at all, regardless of dirty state). + bool row_has_parent_counterpart(int row_idx) const; + + void add_row(const std::string& name = "", + const std::string& active_tools = "", + const std::string& gcode = "", + bool is_primary = false); + + // Returns every name the removed row was known by (UTF-8, deduplicated: its build-time + // name and its current name, which differ after an in-session rename), minus any name a + // surviving row still carries. The caller uses them to find the plates the delete + // stranded. Empty when nothing was removed, when the row is the non-deletable Primary, + // or when both names are blank -- a blank name is only reachable on a row that was never + // named, which no plate can be holding. + std::vector remove_row(wxPanel* panel); + + void clear_rows(); + + std::string active_tools_string(const Row& r) const; + + // Replaces an edited row's name when it is empty, the reserved Primary name in any case, or + // one another row already carries: a plate stores the name and find_imex_mode() takes its + // first row, so the edited row yields. Returns whether it changed the name; the caller notifies. + bool fix_row_name(Row& r); + + void notify(); + + // Update each row's reset bitmap to reflect current dirty state. Cached so we + // only swap the bitmap when state actually transitions — avoids flicker on + // every keystroke. Disabled buttons (no saved counterpart) keep their dot. + void refresh_reset_buttons(); + + // Reset row identified by `panel` (stable across add/remove) to the parent + // preset's value at the same index. Primary row's name stays sentinel-fixed — + // only tools and gcode are restored. + void reset_row_to_parent(wxPanel* panel); + + // Rebuild the instruction text, color legend and column headers for the CURRENT grid. + // These depend on the grid shape -- the Span role is only offered on a multi-gantry printer, + // and the header spacing is derived from the column count -- so they cannot be built once in + // the constructor: adding a second gantry has to reveal Span without a save-and-reopen cycle. + void rebuild_info_and_header(); + + // One-line explanation per role, shown as a tooltip on that role's legend swatch and label. + // Keeps the per-role detail out of the instruction paragraph. + static wxString role_hint(ImexRole role); + + wxBoxSizer* m_outer; + wxBoxSizer* m_rows_sizer; + wxPanel* m_info_panel = nullptr; + wxPanel* m_hdr_panel = nullptr; + std::vector m_rows; + int m_n_cols, m_n_rows; + int m_layout {0}; // 0=front-left, 1=front-right, 2=rear-left, 3=rear-right + bool m_clearing_rows {false}; // guards handlers against teardown-time events + ParentConfigLookup m_parent_lookup; +}; + +}} // namespace Slic3r::GUI + +#endif // slic3r_IMEXModesCtrl_hpp_ diff --git a/src/slic3r/GUI/InstanceCheckMac.h b/src/slic3r/GUI/InstanceCheckMac.h index 0af2737efb..e0ee9191f2 100644 --- a/src/slic3r/GUI/InstanceCheckMac.h +++ b/src/slic3r/GUI/InstanceCheckMac.h @@ -1,3 +1,5 @@ +#pragma once + #import @interface OtherInstanceMessageHandlerMac : NSObject diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index 8f9d013bb6..4fb66176b6 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -5,6 +5,7 @@ #include "libslic3r/MTUtils.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/ModelArrange.hpp" +#include "libslic3r/IMEXArrange.hpp" #include "slic3r/GUI/PartPlate.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" @@ -17,6 +18,7 @@ #include "libnest2d/common.hpp" #include "libslic3r/Arrange.hpp" +#include #include #include "libslic3r/Point.hpp" #include "libslic3r/Polygon.hpp" @@ -536,6 +538,36 @@ void ArrangeJob::prepare_partplate() { prepare_belt_regions(current_plate_index + 1); } +// Snapshot each plate's IMEX zones on the main thread, so process() never has to touch +// PartPlate's IMEX cache; see the members' declaration for why that matters. The beds are the +// arranger's: arranging one plate packs into bed 0, and arranging all of them numbers the beds +// over the unlocked plates, as postprocess_bed_index_for_selected() maps them back. +void ArrangeJob::prepare_imex_zones() +{ + m_imex = {}; + PartPlateList& plate_list = m_plater->get_partplate_list(); + std::vector plates; + if (only_on_partplate) + plates.push_back(plate_list.get_curr_plate()); + else + for (int i = 0; i < plate_list.get_plate_count(); ++i) + if (!plate_list.get_plate(i)->is_locked()) + plates.push_back(plate_list.get_plate(i)); + + for (PartPlate* plate : plates) { + std::optional zones; + if (const std::optional pz = plate ? plate->imex_primary_zone() : std::nullopt) { + const Vec2d o = plate->get_origin().head<2>(); + zones = ImexArrangeZones{BoundingBoxf(Vec2d(pz->min - o), Vec2d(pz->max - o)), {}}; + for (const BoundingBoxf3& strip : plate->imex_collision_zones()) + zones->collision_zones.emplace_back(Vec2d(strip.min.head<2>() - o), Vec2d(strip.max.head<2>() - o)); + } + m_imex.beds.push_back(std::move(zones)); + } + m_imex.adds_plates = !only_on_partplate; + m_imex.read_config(wxGetApp().preset_bundle->full_config()); +} + //BBS: add partplate logic void ArrangeJob::prepare() { @@ -564,6 +596,9 @@ void ArrangeJob::prepare() prepare_partplate(); } + // After prepare_all(), which locks the plates it must leave alone. + prepare_imex_zones(); + #if SAVE_ARRANGE_POLY if (1) @@ -645,6 +680,11 @@ void ArrangeJob::process(Ctl &ctl) Points bedpts = get_shrink_bedpts(m_plater->config(),params); + // Keep the parts on IDEX/IQEX plates in their primary zones; see ImexArranger. + const ImexArranger imex(m_imex, params, bedpts); + bedpts = imex.bed_shape(); + imex.add_keep_outs(m_unselected); + bool enable_wrapping = global_config.option("enable_wrapping_detection")->value; partplate_list.preprocess_exclude_areas(params.excluded_regions, enable_wrapping, 1, scale_(1)); @@ -669,7 +709,10 @@ void ArrangeJob::process(Ctl &ctl) <<", bbox:"< m_selected_groups; // groups of selected items for sequential printing std::vector m_uncompatible_plates; // plate indices with different printing sequence than global + // IMEX zone snapshot, taken on the main thread in prepare(). + // + // process() runs on the worker thread (see Job::process). PartPlate::imex_primary_zone() is + // non-const and calls ensure_imex_zones(), which reads wxGetApp().preset_bundle -- main-thread + // GUI state -- on every call, and on a cache miss calls calc_imex_zones(), which destroys and + // rebuilds std::vector members. ~GLModel issues glDeleteBuffers/glDeleteVertexArrays, + // and no GL context is current on the worker, while the GUI thread may be painting those same + // vectors from GLCanvas3D::on_paint. (imex_collision_zones() is itself const and merely reads + // the member -- but it is only valid once imex_primary_zone() has warmed the cache, so it + // cannot be moved off the main thread on its own.) Snapshotting plain geometry here keeps + // every one of those touches on the main thread. + // + // The zones are stored already converted to plate-local coordinates, which is the space the + // arranger works in. + ImexArrangeInput m_imex; + arrangement::ArrangeParams params; int current_plate_index = 0; Polygon bed_poly; @@ -51,6 +69,7 @@ class ArrangeJob : public Job void prepare_partplate(); void prepare_wipe_tower(); void prepare_belt_regions(int num_plates); + void prepare_imex_zones(); ArrangePolygon prepare_arrange_polygon(void* instance); diff --git a/src/slic3r/GUI/Jobs/TextureDisplacementBakeJob.cpp b/src/slic3r/GUI/Jobs/TextureDisplacementBakeJob.cpp index b876acb62e..e769800749 100644 --- a/src/slic3r/GUI/Jobs/TextureDisplacementBakeJob.cpp +++ b/src/slic3r/GUI/Jobs/TextureDisplacementBakeJob.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "libslic3r/TextureDisplacement.hpp" #include #include @@ -114,6 +115,17 @@ void TextureDisplacementBakeJob::finalize(bool canceled, std::exception_ptr &ept if (volume == nullptr) return; + // The filament each palette entry prints in. This is where a mix becomes a mixed filament slot, + // and only a mix the bake actually painted with: the preview never creates one, so the project + // gains only the slots this result needs. Done before anything below names them - adding a slot + // runs ModelVolume::update_extruder_count(), which clamps paint above the old filament count. + Sidebar &sidebar = plater->sidebar(); + const std::vector filament_of = GLGizmoTextureDisplacement::palette_filaments( + m_input.color.palette, m_triangle_color, [&sidebar](const PrintableColor &mix) { + return sidebar.ensure_mixed_filament({ unsigned(mix.a + 1), unsigned(mix.b + 1) }, + { mix.a_percent(), 100 - mix.a_percent() }); + }); + volume->set_mesh(std::move(m_result)); volume->set_new_unique_id(); volume->calculate_convex_hull(); @@ -129,9 +141,11 @@ void TextureDisplacementBakeJob::finalize(bool canceled, std::exception_ptr &ept const TriangleSelector::TriangleSplittingData &existing = volume->mmu_segmentation_facets.get_data(); if (!existing.bitstream.empty()) selector.deserialize(existing, false); - for (size_t i = 0; i < m_triangle_color.size(); ++i) - if (m_triangle_color[i] > 0) - selector.set_facet(int(i), EnforcerBlockerType(m_triangle_color[i])); + for (size_t i = 0; i < m_triangle_color.size(); ++i) { + const size_t entry = size_t(m_triangle_color[i]); + if (entry > 0 && entry <= filament_of.size() && filament_of[entry - 1] >= 0) + selector.set_facet(int(i), EnforcerBlockerType(filament_of[entry - 1] + 1)); + } volume->mmu_segmentation_facets.set(selector); } diff --git a/src/slic3r/GUI/Jobs/TextureDisplacementBakeJob.hpp b/src/slic3r/GUI/Jobs/TextureDisplacementBakeJob.hpp index 1fd61da0fe..40d7ab7b2b 100644 --- a/src/slic3r/GUI/Jobs/TextureDisplacementBakeJob.hpp +++ b/src/slic3r/GUI/Jobs/TextureDisplacementBakeJob.hpp @@ -56,8 +56,9 @@ private: TriangleMesh m_result; // What the bake spent, for the message it leaves behind when the budget capped the detail. TextureBakeStats m_stats; - // Per triangle of m_result: the filament to print it in, as an EnforcerBlockerType value - // (0 = leave alone). Empty unless a layer asked for colour. See TextureColorRequest. + // Per triangle of m_result: the palette entry to print it in, as its index + 1 (0 = leave alone). + // Empty unless a layer asked for colour. See TextureColorRequest; finalize() turns these into + // filaments. std::vector m_triangle_color; std::function m_on_finished; }; diff --git a/src/slic3r/GUI/Jobs/TextureDisplacementDebugJob.cpp b/src/slic3r/GUI/Jobs/TextureDisplacementDebugJob.cpp index e70125a521..12701ef3c9 100644 --- a/src/slic3r/GUI/Jobs/TextureDisplacementDebugJob.cpp +++ b/src/slic3r/GUI/Jobs/TextureDisplacementDebugJob.cpp @@ -59,7 +59,7 @@ void TextureDisplacementDebugJob::process(Ctl &ctl) if (m_input.run_prepare && !m_input.options.pipeline_v2) { const TextureDisplacementPrepareResult prepared = GLGizmoTextureDisplacement::prepare_mesh(mesh, masks, m_input.layers, m_input.prepare_params, - m_input.color.palette, + m_input.color, // Preparation is roughly half the run; the bake // takes the progress bar from there. [&report](int pct) { return report(1 + pct / 2); }, diff --git a/src/slic3r/GUI/Jobs/TextureDisplacementPrepareJob.cpp b/src/slic3r/GUI/Jobs/TextureDisplacementPrepareJob.cpp index 17d60d1fad..8a956af98d 100644 --- a/src/slic3r/GUI/Jobs/TextureDisplacementPrepareJob.cpp +++ b/src/slic3r/GUI/Jobs/TextureDisplacementPrepareJob.cpp @@ -46,7 +46,7 @@ void TextureDisplacementPrepareJob::process(Ctl &ctl) // idle loop. int last_reported = 1; m_result = GLGizmoTextureDisplacement::prepare_mesh(m_input.base_mesh, m_input.masks, m_input.layers, - m_input.params, m_input.color.palette, + m_input.params, m_input.color, [&ctl, &status, &last_reported](int percent) { if (ctl.was_canceled()) return false; diff --git a/src/slic3r/GUI/Jobs/TextureDisplacementPreviewJob.hpp b/src/slic3r/GUI/Jobs/TextureDisplacementPreviewJob.hpp index e927f4d4a3..07fcca8664 100644 --- a/src/slic3r/GUI/Jobs/TextureDisplacementPreviewJob.hpp +++ b/src/slic3r/GUI/Jobs/TextureDisplacementPreviewJob.hpp @@ -26,13 +26,13 @@ struct TextureDisplacementPreviewInput // Mesh coordinates -> world millimetres, so the preview is displaced in the same space the bake // is and the two cannot disagree. See build_texture_displacement(). Transform3d volume_to_world = Transform3d::Identity(); - // Empty unless a layer is colouring, in which case the preview reports the filament per triangle - // alongside the mesh, so the Normal view shows what the bake will produce - interleaving included. + // Empty unless a layer is colouring, in which case the preview reports the palette entry per + // triangle alongside the mesh, so the Normal view shows the colours the bake will produce. TextureColorSettings color; }; -// A preview result: the displaced mesh, and - when the input carried a palette - one filament index -// per triangle (an EnforcerBlockerType value; 0 means "no colour from the texture"). +// A preview result: the displaced mesh, and - when the input carried a palette - one palette entry per +// triangle (its index + 1; 0 means "no colour from the texture"). struct TextureDisplacementPreviewResult { indexed_triangle_set mesh; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index bb5ffc87de..db21915477 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2309,12 +2309,6 @@ wxBoxSizer* MainFrame::create_side_tools() bool slice = true; - // The Slice-plate hover popup is a transient popup that keeps grabbing - // the mouse capture while shown. Left behind the modal grouping dialog it - // would starve that dialog of mouse events, so close it synchronously first. - if (m_filament_group_popup) - m_filament_group_popup->Dismiss(); - auto curr_plate = m_plater->get_partplate_list().get_curr_plate(); #ifdef __linux__ PresetBundle* preset = wxGetApp().preset_bundle; @@ -3401,6 +3395,30 @@ void MainFrame::init_menubar_as_editor() [this]() { return is_prepare_or_preview_tab(); }, []() { return wxGetApp().show_plate_gridlines(); }, this); + // IDEX/IQEX: toggle the per-carriage toolhead representation that appears during + // G-code preview playback. Today this is the symbolic footprint box; if a future + // change adds true toolhead model support (cf. printer bed models) this same toggle + // governs that. Only relevant on Preview, and only meaningful when the active + // printer is IDEX/IQEX — gated to keep the menu uncluttered for everyone else. + append_menu_check_item(viewMenu, wxID_ANY, _L("Show IDEX/IQEX Toolhead"), + _L("Show the IDEX/IQEX toolhead representation around each active nozzle in the G-code preview."), + [this](wxCommandEvent&) { + const bool current = wxGetApp().app_config->get("show_imex_toolhead_boxes") != "false"; + wxGetApp().app_config->set("show_imex_toolhead_boxes", current ? "false" : "true"); + m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); + }, + this, + [this]() { + if (m_tabpanel->GetSelectedPageName() != TAB_ID_PREVIEW) return false; + if (auto* pb = wxGetApp().preset_bundle) { + auto* o = pb->printers.get_edited_preset().config.option("is_imex"); + return o && o->value; + } + return false; + }, + []() { return wxGetApp().app_config->get("show_imex_toolhead_boxes") != "false"; }, + this); + append_menu_item( viewMenu, wxID_ANY, _L("Reset Window Layout"), _L("Reset to default window layout"), [this](wxCommandEvent&) { m_plater->reset_window_layout(); }, "", this, diff --git a/src/slic3r/GUI/NativeCommands.cpp b/src/slic3r/GUI/NativeCommands.cpp index e93a1a4635..334f2aad9b 100644 --- a/src/slic3r/GUI/NativeCommands.cpp +++ b/src/slic3r/GUI/NativeCommands.cpp @@ -142,19 +142,24 @@ struct CommandAction : AppAction AppActionRunResult run(const std::string& param) const override { return NativeCommands::run(command_key, param); } explicit CommandAction(const NativeCommand& c) - : AppAction(AppActionId{AppAction::compose_id(kCommandPrefix, c.key, kOrcaSourceKey)}, c.title, kOrcaSourceKey, kOrcaSourceName) + : AppAction(AppActionId{AppAction::compose_id(kCommandPrefix, c.key, kOrcaSourceKey)}, I18N::translate_utf8(c.title), kOrcaSourceKey, + kOrcaSourceName) , command_key(c.key) { - this->kind = AppActionKind::Command; - this->group = c.group; - this->input = c.input; - this->icon = c.icon; + this->kind = AppActionKind::Command; + this->group = I18N::translate_utf8(c.group); + this->title_en = c.title; + this->group_en = c.group; + this->input = c.input; + this->icon = c.icon; } }; std::vector build_command_catalog() { std::vector out; + // `title` and `group` are the untranslated English msgids, L("...")-marked at each call so xgettext + // extracts them. auto add = [&](std::string key, std::string title, std::string group, std::function runner, std::string input = {}, std::string icon = {}) { out.push_back({std::move(key), std::move(title), std::move(group), std::move(input), std::move(icon), std::move(runner)}); @@ -166,7 +171,7 @@ std::vector build_command_catalog() }; // ---- Slice & Export ---- - add_with_icon("slice_and_preview", _u8L("Slice and Preview"), _u8L("Slice & Export"), "media_play", [](const std::string&) { + add_with_icon("slice_and_preview", L("Slice and Preview"), L("Slice & Export"), "media_play", [](const std::string&) { Plater* plater = wxGetApp().plater(); if (plater) { plater->reslice(); @@ -178,7 +183,7 @@ std::vector build_command_catalog() }); add_with_icon( - "go_to_layer", _u8L("Go to layer (percent)"), _u8L("Commands"), "height_range_layer", + "go_to_layer", L("Go to layer (percent)"), L("Commands"), "height_range_layer", [](const std::string& param) { Plater* plater = wxGetApp().plater(); if (plater) { @@ -194,7 +199,7 @@ std::vector build_command_catalog() // "go_to_tab" is two-phase: the palette collects the tab after activating it, then hands the tab // id back as `param` (same contract as go_to_layer's percent). add( - "go_to_tab", _u8L("Go to tab..."), _u8L("Commands"), + "go_to_tab", L("Go to tab..."), L("Commands"), [](const std::string& param) { if (MainFrame* mf = wxGetApp().mainframe; mf && !param.empty()) mf->select_tab(from_u8(param)); @@ -202,41 +207,41 @@ std::vector build_command_catalog() }, "tab"); - add_with_icon("load_project", _u8L("Load Project"), _u8L("Commands"), "menu_open", [](const std::string&) { + add_with_icon("load_project", L("Load Project"), L("Commands"), "menu_open", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->load_project(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("save_project", _u8L("Save Project"), _u8L("Commands"), "menu_save", [](const std::string&) { + add_with_icon("save_project", L("Save Project"), L("Commands"), "menu_save", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->save_project(false); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("save_project_as", _u8L("Save Project As"), _u8L("Commands"), "menu_save", [](const std::string&) { + add_with_icon("save_project_as", L("Save Project As"), L("Commands"), "menu_save", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->save_project(true); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("open_preferences", _u8L("Preferences"), _u8L("Commands"), "cog", [](const std::string&) { + add_with_icon("open_preferences", L("Preferences"), L("Commands"), "cog", [](const std::string&) { wxGetApp().open_preferences(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); // ---- Mode ---- - add_with_icon("mode_simple", _u8L("Mode: Simple"), _u8L("Mode"), "advanced", [](const std::string&) { + add_with_icon("mode_simple", L("Mode: Simple"), L("Mode"), "advanced", [](const std::string&) { wxGetApp().set_mode(comSimple); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("mode_advanced", _u8L("Mode: Advanced"), _u8L("Mode"), "advanced", [](const std::string&) { + add_with_icon("mode_advanced", L("Mode: Advanced"), L("Mode"), "advanced", [](const std::string&) { wxGetApp().set_mode(comAdvanced); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("mode_expert", _u8L("Mode: Expert"), _u8L("Mode"), "advanced", [](const std::string&) { + add_with_icon("mode_expert", L("Mode: Expert"), L("Mode"), "advanced", [](const std::string&) { wxGetApp().set_mode(comExpert); return AppActionRunResult{AppActionRunResult::Level::Success}; }); // Mirrors Preferences > Developer > Developer mode: flip the flag, persist, refresh the UI. - add_with_icon("toggle_developer_mode", _u8L("Toggle Developer Mode"), _u8L("Mode"), "advanced", [](const std::string&) { + add_with_icon("toggle_developer_mode", L("Toggle Developer Mode"), L("Mode"), "advanced", [](const std::string&) { GUI_App& app = wxGetApp(); const bool on = !app.app_config->get_bool("developer_mode"); app.app_config->set_bool("developer_mode", on); @@ -246,27 +251,27 @@ std::vector build_command_catalog() }); // ---- Export pipeline ---- - add_with_icon("export_gcode", _u8L("Export G-code"), _u8L("Slice & Export"), "custom-gcode_gcode", [](const std::string&) { + add_with_icon("export_gcode", L("Export G-code"), L("Slice & Export"), "custom-gcode_gcode", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->export_gcode(false); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("export_stl", _u8L("Export STL"), _u8L("Slice & Export"), "save", [](const std::string&) { + add_with_icon("export_stl", L("Export STL"), L("Slice & Export"), "save", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->export_stl(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("export_3mf", _u8L("Export 3MF"), _u8L("Slice & Export"), "menu_save", [](const std::string&) { + add_with_icon("export_3mf", L("Export 3MF"), L("Slice & Export"), "menu_save", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->export_core_3mf(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("export_sliced_file", _u8L("Export Sliced File"), _u8L("Slice & Export"), "save", [](const std::string&) { + add_with_icon("export_sliced_file", L("Export Sliced File"), L("Slice & Export"), "save", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->export_gcode_3mf(false); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("export_all_sliced_file", _u8L("Export All Sliced Files"), _u8L("Slice & Export"), "save", [](const std::string&) { + add_with_icon("export_all_sliced_file", L("Export All Sliced Files"), L("Slice & Export"), "save", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->export_gcode_3mf(true); return AppActionRunResult{AppActionRunResult::Level::Success}; @@ -275,39 +280,39 @@ std::vector build_command_catalog() // ---- Calibration ---- // The tab-strip calib_sf glyph is drawn white for the dark tab bar and vanishes on the palette's // light tile, so each wizard borrows the matching settings-group icon instead (gray + accent green). - add_with_icon("calib_temperature", _u8L("Temperature Calibration"), _u8L("Calibration"), "param_temperature", + add_with_icon("calib_temperature", L("Temperature Calibration"), L("Calibration"), "param_temperature", [](const std::string&) { return calib_command(CalibKind::Temperature); }); - add_with_icon("calib_max_volumetric", _u8L("Max Volumetric Speed Calibration"), _u8L("Calibration"), "param_volumetric_speed", + add_with_icon("calib_max_volumetric", L("Max Volumetric Speed Calibration"), L("Calibration"), "param_volumetric_speed", [](const std::string&) { return calib_command(CalibKind::MaxVolumetric); }); - add_with_icon("calib_pressure_advance", _u8L("Pressure Advance Calibration"), _u8L("Calibration"), "param_flow_ratio_and_pressure_advance", + add_with_icon("calib_pressure_advance", L("Pressure Advance Calibration"), L("Calibration"), "param_flow_ratio_and_pressure_advance", [](const std::string&) { return calib_command(CalibKind::PressureAdvance); }); - add_with_icon("calib_flow_ratio", _u8L("Flow Ratio Calibration"), _u8L("Calibration"), "param_flow_ratio_and_pressure_advance", + add_with_icon("calib_flow_ratio", L("Flow Ratio Calibration"), L("Calibration"), "param_flow_ratio_and_pressure_advance", [](const std::string&) { return calib_command(CalibKind::FlowRatio); }); - add_with_icon("calib_retraction", _u8L("Retraction Calibration"), _u8L("Calibration"), "param_retraction", + add_with_icon("calib_retraction", L("Retraction Calibration"), L("Calibration"), "param_retraction", [](const std::string&) { return calib_command(CalibKind::Retraction); }); - add_with_icon("calib_cornering", _u8L("Cornering Calibration"), _u8L("Calibration"), "param_precision", + add_with_icon("calib_cornering", L("Cornering Calibration"), L("Calibration"), "param_precision", [](const std::string&) { return calib_command(CalibKind::Cornering); }); - add_with_icon("calib_input_shaping_freq", _u8L("Input Shaping Frequency Calibration"), _u8L("Calibration"), "param_resonance_avoidance", + add_with_icon("calib_input_shaping_freq", L("Input Shaping Frequency Calibration"), L("Calibration"), "param_resonance_avoidance", [](const std::string&) { return calib_command(CalibKind::InputShapingFreq); }); - add_with_icon("calib_input_shaping_damp", _u8L("Input Shaping Damping Calibration"), _u8L("Calibration"), "param_resonance_avoidance", + add_with_icon("calib_input_shaping_damp", L("Input Shaping Damping Calibration"), L("Calibration"), "param_resonance_avoidance", [](const std::string&) { return calib_command(CalibKind::InputShapingDamp); }); - add_with_icon("calib_vfa", _u8L("VFA Calibration"), _u8L("Calibration"), "param_speed", [](const std::string&) { return calib_command(CalibKind::VFA); }); + add_with_icon("calib_vfa", L("VFA Calibration"), L("Calibration"), "param_speed", [](const std::string&) { return calib_command(CalibKind::VFA); }); // ---- View ---- - // Titles are built with _u8L here (not via a variable) so xgettext can extract them. + // Titles are L("...")-marked here (not via a variable) so xgettext can extract them. for (auto [key, dir, title] : - std::initializer_list>{{"view_top", "top", _u8L("View: Top")}, - {"view_bottom", "bottom", _u8L("View: Bottom")}, - {"view_front", "front", _u8L("View: Front")}, - {"view_rear", "rear", _u8L("View: Rear")}, - {"view_left", "left", _u8L("View: Left")}, - {"view_right", "right", _u8L("View: Right")}, - {"view_iso", "iso", _u8L("View: Isometric")}}) { + std::initializer_list>{{"view_top", "top", L("View: Top")}, + {"view_bottom", "bottom", L("View: Bottom")}, + {"view_front", "front", L("View: Front")}, + {"view_rear", "rear", L("View: Rear")}, + {"view_left", "left", L("View: Left")}, + {"view_right", "right", L("View: Right")}, + {"view_iso", "iso", L("View: Isometric")}}) { std::string k = key, d = dir; - add(k, title, _u8L("View"), + add(k, title, L("View"), [d](const std::string&) { return view_command(wxGetApp().plater(), d); }); } - add("view_default", _u8L("View: Default"), _u8L("View"), [](const std::string&) { + add("view_default", L("View: Default"), L("View"), [](const std::string&) { Plater* plater = wxGetApp().plater(); if (plater) { plater->select_view("plate"); @@ -316,75 +321,75 @@ std::vector build_command_catalog() } return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("view_fit_bed", _u8L("Fit Bed to View"), _u8L("View"), [](const std::string&) { + add("view_fit_bed", L("Fit Bed to View"), L("View"), [](const std::string&) { if (Plater* plater = wxGetApp().plater()) if (GLCanvas3D* canvas = plater->get_current_canvas3D()) canvas->zoom_to_bed(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("view_toggle_perspective", _u8L("Toggle Perspective"), _u8L("View"), [](const std::string&) { + add("view_toggle_perspective", L("Toggle Perspective"), L("View"), [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->get_camera().select_next_type(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("reset_window_layout", _u8L("Reset Window Layout"), _u8L("View"), "toolbar_reset", [](const std::string&) { + add_with_icon("reset_window_layout", L("Reset Window Layout"), L("View"), "toolbar_reset", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->reset_window_layout(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); // ---- Object ---- - add_with_icon("obj_delete", _u8L("Delete Selected"), _u8L("Object"), "delete", [](const std::string&) { + add_with_icon("obj_delete", L("Delete Selected"), L("Object"), "delete", [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return !p->is_selection_empty(); }, [](Plater* p) { p->remove_selected(); }); }); - add_with_icon("obj_delete_all", _u8L("Delete All Objects"), _u8L("Object"), "delete", [](const std::string&) { + add_with_icon("obj_delete_all", L("Delete All Objects"), L("Object"), "delete", [](const std::string&) { return object_op( wxGetApp().plater(), [](Plater* p) { return p->can_delete_all(); }, [](Plater* p) { p->delete_all_objects_from_model(); }); }); - add_with_icon("obj_mirror_x", _u8L("Mirror X"), _u8L("Object"), "menu_mirror_x", [](const std::string&) { + add_with_icon("obj_mirror_x", L("Mirror X"), L("Object"), "menu_mirror_x", [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_mirror(); }, [](Plater* p) { p->mirror(Axis::X); }); }); - add_with_icon("obj_mirror_y", _u8L("Mirror Y"), _u8L("Object"), "menu_mirror_y", [](const std::string&) { + add_with_icon("obj_mirror_y", L("Mirror Y"), L("Object"), "menu_mirror_y", [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_mirror(); }, [](Plater* p) { p->mirror(Axis::Y); }); }); - add_with_icon("obj_mirror_z", _u8L("Mirror Z"), _u8L("Object"), "menu_mirror_z", [](const std::string&) { + add_with_icon("obj_mirror_z", L("Mirror Z"), L("Object"), "menu_mirror_z", [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_mirror(); }, [](Plater* p) { p->mirror(Axis::Z); }); }); - add_with_icon("obj_split_objects", _u8L("Split to Objects"), _u8L("Object"), "menu_split_objects", [](const std::string&) { + add_with_icon("obj_split_objects", L("Split to Objects"), L("Object"), "menu_split_objects", [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_split_to_objects(); }, [](Plater* p) { p->split_object(true); }); }); - add_with_icon("obj_split_parts", _u8L("Split to Parts"), _u8L("Object"), "menu_split_parts", [](const std::string&) { + add_with_icon("obj_split_parts", L("Split to Parts"), L("Object"), "menu_split_parts", [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_split_to_volumes(); }, [](Plater* p) { p->split_volume(); }); }); - add("obj_center", _u8L("Center Selected on Plate"), _u8L("Object"), [](const std::string&) { + add("obj_center", L("Center Selected on Plate"), L("Object"), [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return !p->is_selection_empty(); }, [](Plater* p) { p->center_selection(); }); }); - add_with_icon("obj_drop", _u8L("Drop to Bed"), _u8L("Object"), "toolbar_flatten", [](const std::string&) { + add_with_icon("obj_drop", L("Drop to Bed"), L("Object"), "toolbar_flatten", [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return !p->is_selection_empty(); }, [](Plater* p) { p->drop_selection(); }); }); - add("obj_fit_volume", _u8L("Scale to Fit Print Volume"), _u8L("Object"), [](const std::string&) { + add("obj_fit_volume", L("Scale to Fit Print Volume"), L("Object"), [](const std::string&) { return object_op( wxGetApp().plater(), [](Plater* p) { return p->can_scale_to_print_volume(); }, [](Plater* p) { p->scale_selection_to_fit_print_volume(); }); }); - add_with_icon("obj_instances_up", _u8L("Increase Instances"), _u8L("Object"), "instance_add", [](const std::string&) { + add_with_icon("obj_instances_up", L("Increase Instances"), L("Object"), "instance_add", [](const std::string&) { return object_op( wxGetApp().plater(), [](Plater* p) { return p->can_increase_instances(); }, [](Plater* p) { p->increase_instances(); }); }); - add_with_icon("obj_instances_down", _u8L("Decrease Instances"), _u8L("Object"), "instance_remove", [](const std::string&) { + add_with_icon("obj_instances_down", L("Decrease Instances"), L("Object"), "instance_remove", [](const std::string&) { return object_op( wxGetApp().plater(), [](Plater* p) { return p->can_decrease_instances(); }, [](Plater* p) { p->decrease_instances(); }); }); - add_with_icon("obj_arrange", _u8L("Auto-Arrange"), _u8L("Object"), "toolbar_arrange", [](const std::string&) { + add_with_icon("obj_arrange", L("Auto-Arrange"), L("Object"), "toolbar_arrange", [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_arrange(); }, [](Plater* p) { p->arrange(); }); }); - add_with_icon("obj_orient", _u8L("Auto-Orient"), _u8L("Object"), "toolbar_orient", [](const std::string&) { + add_with_icon("obj_orient", L("Auto-Orient"), L("Object"), "toolbar_orient", [](const std::string&) { return object_op(wxGetApp().plater(), [](Plater* p) { return p->can_arrange(); }, [](Plater* p) { p->orient(); }); }); // ---- Add Primitive ---- (the Add > Add Primitive submenu; creates a new object) auto add_primitive = [&](std::string key, std::string title, std::string icon, const char* type_name) { - add_with_icon(std::move(key), std::move(title), _u8L("Add Primitive"), std::move(icon), [type_name](const std::string&) { + add_with_icon(std::move(key), std::move(title), L("Add Primitive"), std::move(icon), [type_name](const std::string&) { Plater* plater = wxGetApp().plater(); if (plater) { ensure_3d_view(plater); @@ -394,13 +399,13 @@ std::vector build_command_catalog() return AppActionRunResult{AppActionRunResult::Level::Success}; }); }; - add_primitive("add_primitive_cube", _u8L("Cube"), "menu_obj_cube", "Cube"); - add_primitive("add_primitive_cylinder", _u8L("Cylinder"), "menu_obj_cylinder", "Cylinder"); - add_primitive("add_primitive_sphere", _u8L("Sphere"), "menu_obj_sphere", "Sphere"); - add_primitive("add_primitive_cone", _u8L("Cone"), "menu_obj_cone", "Cone"); - add_primitive("add_primitive_disc", _u8L("Disc"), "menu_obj_disc", "Disc"); - add_primitive("add_primitive_torus", _u8L("Torus"), "menu_obj_torus", "Torus"); - add_with_icon("add_primitive_text", _u8L("Text"), _u8L("Add Primitive"), "menu_obj_text", [](const std::string&) { + add_primitive("add_primitive_cube", L("Cube"), "menu_obj_cube", "Cube"); + add_primitive("add_primitive_cylinder", L("Cylinder"), "menu_obj_cylinder", "Cylinder"); + add_primitive("add_primitive_sphere", L("Sphere"), "menu_obj_sphere", "Sphere"); + add_primitive("add_primitive_cone", L("Cone"), "menu_obj_cone", "Cone"); + add_primitive("add_primitive_disc", L("Disc"), "menu_obj_disc", "Disc"); + add_primitive("add_primitive_torus", L("Torus"), "menu_obj_torus", "Torus"); + add_with_icon("add_primitive_text", L("Text"), L("Add Primitive"), "menu_obj_text", [](const std::string&) { Plater* plater = wxGetApp().plater(); if (plater) { ensure_3d_view(plater); @@ -410,7 +415,7 @@ std::vector build_command_catalog() } return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("add_primitive_svg", _u8L("SVG"), _u8L("Add Primitive"), "menu_obj_svg", [](const std::string&) { + add_with_icon("add_primitive_svg", L("SVG"), L("Add Primitive"), "menu_obj_svg", [](const std::string&) { Plater* plater = wxGetApp().plater(); if (plater) { ensure_3d_view(plater); @@ -424,7 +429,7 @@ std::vector build_command_catalog() // ---- Add Handy models ---- (the Add > Add Handy models submenu) const std::vector& handy = MenuFactory::handy_models(); for (std::size_t i = 0; i < handy.size(); ++i) { - add("add_handy_" + std::string(handy[i].key), Slic3r::GUI::I18N::translate_utf8(handy[i].label), _u8L("Add Handy models"), + add("add_handy_" + std::string(handy[i].key), handy[i].label, L("Add Handy models"), [i](const std::string&) { if (Plater* plater = wxGetApp().plater()) ensure_3d_view(plater); @@ -434,7 +439,7 @@ std::vector build_command_catalog() } // ---- Plate ---- - add_with_icon("plate_add", _u8L("Add Plate"), _u8L("Plate"), "toolbar_add_plate", [](const std::string&) { + add_with_icon("plate_add", L("Add Plate"), L("Plate"), "toolbar_add_plate", [](const std::string&) { Plater* plater = wxGetApp().plater(); if (!is_fff_plater(plater)) return plate_unavailable(); @@ -443,7 +448,7 @@ std::vector build_command_catalog() plater->add_plate(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("plate_duplicate", _u8L("Duplicate Plate"), _u8L("Plate"), "menu_copy", [](const std::string&) { + add_with_icon("plate_duplicate", L("Duplicate Plate"), L("Plate"), "menu_copy", [](const std::string&) { Plater* plater = wxGetApp().plater(); if (!is_fff_plater(plater)) return plate_unavailable(); @@ -452,7 +457,7 @@ std::vector build_command_catalog() plater->duplicate_plate(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("plate_delete", _u8L("Delete Plate"), _u8L("Plate"), "delete", [](const std::string&) { + add_with_icon("plate_delete", L("Delete Plate"), L("Plate"), "delete", [](const std::string&) { Plater* plater = wxGetApp().plater(); if (!is_fff_plater(plater)) return plate_unavailable(); @@ -461,7 +466,7 @@ std::vector build_command_catalog() plater->delete_plate(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("plate_rename", _u8L("Rename Plate"), _u8L("Plate"), "plate_name_edit", [](const std::string&) { + add_with_icon("plate_rename", L("Rename Plate"), L("Plate"), "plate_name_edit", [](const std::string&) { Plater* plater = wxGetApp().plater(); if (!is_fff_plater(plater)) return plate_unavailable(); @@ -472,7 +477,7 @@ std::vector build_command_catalog() curr->set_plate_name(dlg.get_plate_name().ToUTF8().data()); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("plate_toggle_lock", _u8L("Toggle Plate Lock"), _u8L("Plate"), "lock_normal", [](const std::string&) { + add_with_icon("plate_toggle_lock", L("Toggle Plate Lock"), L("Plate"), "lock_normal", [](const std::string&) { Plater* plater = wxGetApp().plater(); if (!is_fff_plater(plater)) return plate_unavailable(); @@ -482,7 +487,7 @@ std::vector build_command_catalog() plates.lock_plate(index, !plates.is_locked(index)); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("plate_goto", _u8L("Go to Plate"), _u8L("Plate"), "go_next_plate", [](const std::string& param) { + add_with_icon("plate_goto", L("Go to Plate"), L("Plate"), "go_next_plate", [](const std::string& param) { Plater* plater = wxGetApp().plater(); if (!is_fff_plater(plater)) return plate_unavailable(); @@ -500,7 +505,7 @@ std::vector build_command_catalog() }); // ---- Printer / device connection ---- - add_with_icon("sync_ams", _u8L("Synchronize Filament List from AMS"), _u8L("Printer"), "ams_fila_sync", [](const std::string&) { + add_with_icon("sync_ams", L("Synchronize Filament List from AMS"), L("Printer"), "ams_fila_sync", [](const std::string&) { Plater* plater = wxGetApp().plater(); DeviceManager* dev = wxGetApp().getDeviceManager(); if (dev && dev->get_selected_machine() && plater) { @@ -511,11 +516,11 @@ std::vector build_command_catalog() }); // ---- Presets / cloud ---- - add_with_icon("preset_bundle", _u8L("Open Preset Bundle"), _u8L("Presets"), "menu_edit_preset", [](const std::string&) { + add_with_icon("preset_bundle", L("Open Preset Bundle"), L("Presets"), "menu_edit_preset", [](const std::string&) { wxGetApp().open_presetbundledialog(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("sync_presets", _u8L("Sync Presets"), _u8L("Presets"), "printer_sync_ok", [](const std::string&) { + add_with_icon("sync_presets", L("Sync Presets"), L("Presets"), "printer_sync_ok", [](const std::string&) { if (!wxGetApp().is_user_login()) return AppActionRunResult{AppActionRunResult::Level::Info, _L("Sign in to sync presets.")}; wxGetApp().restart_sync_user_preset(); @@ -523,7 +528,7 @@ std::vector build_command_catalog() }); // ---- Import ---- - add_with_icon("import_file", _u8L("Import 3MF/STL/STEP/SVG/OBJ/AMF"), _u8L("Import"), "menu_open", [](const std::string&) { + add_with_icon("import_file", L("Import 3MF/STL/STEP/SVG/OBJ/AMF"), L("Import"), "menu_open", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) { #ifdef __APPLE__ plater->add_model(); @@ -533,71 +538,71 @@ std::vector build_command_catalog() } return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("import_zip_archive", _u8L("Import ZIP Archive"), _u8L("Import"), "menu_open", [](const std::string&) { + add_with_icon("import_zip_archive", L("Import ZIP Archive"), L("Import"), "menu_open", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->import_zip_archive(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("import_configs", _u8L("Import Configs"), _u8L("Import"), "menu_open", [](const std::string&) { + add_with_icon("import_configs", L("Import Configs"), L("Import"), "menu_open", [](const std::string&) { if (MainFrame* mf = wxGetApp().mainframe) mf->load_config_file(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); // ---- Export extras ---- - add_with_icon("export_stl_multi", _u8L("Export All Objects as STLs"), _u8L("Export"), "save", [](const std::string&) { + add_with_icon("export_stl_multi", L("Export All Objects as STLs"), L("Export"), "save", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->export_stl(false, false, true); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("export_drc_single", _u8L("Export All Objects as DRC (one file)"), _u8L("Export"), "save", [](const std::string&) { + add_with_icon("export_drc_single", L("Export All Objects as DRC (one file)"), L("Export"), "save", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->export_stl(false, false, false, FT_DRC); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("export_drc_multi", _u8L("Export All Objects as DRCs"), _u8L("Export"), "save", [](const std::string&) { + add_with_icon("export_drc_multi", L("Export All Objects as DRCs"), L("Export"), "save", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->export_stl(false, false, true, FT_DRC); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("export_toolpaths_obj", _u8L("Export Toolpaths as OBJ"), _u8L("Export"), "custom-gcode_gcode", [](const std::string&) { + add_with_icon("export_toolpaths_obj", L("Export Toolpaths as OBJ"), L("Export"), "custom-gcode_gcode", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) plater->export_toolpaths_to_obj(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("export_config", _u8L("Export Preset Bundle"), _u8L("Export"), "save", [](const std::string&) { + add_with_icon("export_config", L("Export Preset Bundle"), L("Export"), "save", [](const std::string&) { if (MainFrame* mf = wxGetApp().mainframe) mf->export_config(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); // ---- Help ---- (mirrors the top-bar Help menu, plus the wiki/YouTube links) - add("help_keyboard_shortcuts", _u8L("Keyboard Shortcuts"), _u8L("Help"), [](const std::string&) { + add("help_keyboard_shortcuts", L("Keyboard Shortcuts"), L("Help"), [](const std::string&) { wxGetApp().keyboard_shortcuts(ShortcutContext::Global); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("help_setup_wizard", _u8L("Setup Wizard"), _u8L("Help"), [](const std::string&) { + add("help_setup_wizard", L("Setup Wizard"), L("Help"), [](const std::string&) { wxGetApp().ShowUserGuide(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("help_open_config_folder", _u8L("Show Configuration Folder"), _u8L("Help"), "open_project", [](const std::string&) { + add_with_icon("help_open_config_folder", L("Show Configuration Folder"), L("Help"), "open_project", [](const std::string&) { Slic3r::GUI::desktop_open_datadir_folder(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("help_troubleshoot", _u8L("Troubleshoot Center"), _u8L("Help"), [](const std::string&) { + add("help_troubleshoot", L("Troubleshoot Center"), L("Help"), [](const std::string&) { wxGetApp().troubleshoot(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("help_network_test", _u8L("Open Network Test"), _u8L("Help"), [](const std::string&) { + add("help_network_test", L("Open Network Test"), L("Help"), [](const std::string&) { NetworkTestDialog dlg(wxGetApp().mainframe); dlg.ShowModal(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("help_benchmark_3d_scene", _u8L("Benchmark 3D Scene"), _u8L("Help"), [](const std::string&) { + add("help_benchmark_3d_scene", L("Benchmark 3D Scene"), L("Help"), [](const std::string&) { run_scene_benchmark(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("help_tip_of_the_day", _u8L("Show Tip of the Day"), _u8L("Help"), "info", [](const std::string&) { + add_with_icon("help_tip_of_the_day", L("Show Tip of the Day"), L("Help"), "info", [](const std::string&) { if (Plater* plater = wxGetApp().plater()) { plater->get_dailytips()->open(); if (GLCanvas3D* canvas = plater->get_current_canvas3D()) @@ -605,37 +610,37 @@ std::vector build_command_catalog() } return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("help_check_updates", _u8L("Check for Updates"), _u8L("Help"), "refresh", [](const std::string&) { + add_with_icon("help_check_updates", L("Check for Updates"), L("Help"), "refresh", [](const std::string&) { wxGetApp().check_new_version_sf(true, 1); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("help_about", _u8L("About OrcaSlicer"), _u8L("Help"), "OrcaSlicer_gradient_circle", [](const std::string&) { + add_with_icon("help_about", L("About OrcaSlicer"), L("Help"), "OrcaSlicer_gradient_circle", [](const std::string&) { Slic3r::GUI::about(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add_with_icon("open_wiki", _u8L("Open Wiki"), _u8L("Help"), "link_wiki_img", [](const std::string&) { + add_with_icon("open_wiki", L("Open Wiki"), L("Help"), "link_wiki_img", [](const std::string&) { wxLaunchDefaultBrowser("https://www.orcaslicer.com/wiki/", wxBROWSER_NEW_WINDOW); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("open_youtube", _u8L("Open YouTube Channel"), _u8L("Help"), [](const std::string&) { + add("open_youtube", L("Open YouTube Channel"), L("Help"), [](const std::string&) { wxLaunchDefaultBrowser("https://www.youtube.com/@OfficialOrcaSlicer/videos", wxBROWSER_NEW_WINDOW); return AppActionRunResult{AppActionRunResult::Level::Success}; }); // ---- Plugins ---- - add("open_plugins", _u8L("Open Plugins"), _u8L("Plugins"), [](const std::string&) { + add("open_plugins", L("Open Plugins"), L("Plugins"), [](const std::string&) { wxGetApp().open_plugins_dialog(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("refresh_plugins", _u8L("Refresh Plugins"), _u8L("Plugins"), [](const std::string&) { + add("refresh_plugins", L("Refresh Plugins"), L("Plugins"), [](const std::string&) { wxGetApp().refresh_plugins(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("install_plugin", _u8L("Install Plugin"), _u8L("Plugins"), [](const std::string&) { + add("install_plugin", L("Install Plugin"), L("Plugins"), [](const std::string&) { open_plugin_hub(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); - add("install_local_plugin", _u8L("Install Local Plugin"), _u8L("Plugins"), [](const std::string&) { + add("install_local_plugin", L("Install Local Plugin"), L("Plugins"), [](const std::string&) { wxGetApp().install_local_plugin(); return AppActionRunResult{AppActionRunResult::Level::Success}; }); @@ -643,24 +648,12 @@ std::vector build_command_catalog() return out; } -std::vector& catalog_storage() -{ - static std::vector commands = build_command_catalog(); - return commands; -} - } // namespace const std::vector& NativeCommands::catalog() { - return catalog_storage(); -} - -void NativeCommands::rebuild_catalog() -{ - // build_command_catalog() re-runs _u8L under the current locale, so replacing the storage - // refreshes every translated title/group after a language switch. - catalog_storage() = build_command_catalog(); + static const std::vector commands = build_command_catalog(); + return commands; } std::unique_ptr NativeCommands::make_action(const NativeCommand& command) diff --git a/src/slic3r/GUI/NativeCommands.hpp b/src/slic3r/GUI/NativeCommands.hpp index 993b37f564..908011450a 100644 --- a/src/slic3r/GUI/NativeCommands.hpp +++ b/src/slic3r/GUI/NativeCommands.hpp @@ -16,27 +16,25 @@ namespace Slic3r { namespace GUI { struct NativeCommand { std::string key; - std::string title; - std::string group; + std::string title; // untranslated English msgid; make_action() translates it for display + std::string group; // likewise std::string input; // "percent"/"tab" or "" for immediate run std::string icon; // SVG base name, or "" to render a blank tile std::function runner; }; namespace NativeCommands { -// The full built-in command catalog. Built on first use and reused; call rebuild_catalog() after a -// live UI language switch so the translated titles/groups match the new locale. UI thread only. +// The full built-in command catalog. Built on first use and reused; it holds no translated text, so +// it stays valid across a UI language switch. UI thread only. const std::vector& catalog(); -// Rebuilds the catalog in the current locale. UI thread only. -void rebuild_catalog(); - // Dispatches `key` to its runner (unknown keys return a quiet Info). UI thread only. AppActionRunResult run(const std::string& key, const std::string& param = {}); -// Materialises one catalog entry as a runnable AppAction. Keeps the catalog's identity, -// presentation and behaviour as the single source of truth; ActionRegistry only stores and -// dispatches the result. UI thread only. +// Materialises one catalog entry as a runnable AppAction, titled in the current UI language with the +// English title/group kept as search aliases. Keeps the catalog's identity, presentation and +// behaviour as the single source of truth; ActionRegistry only stores and dispatches the result. +// UI thread only. std::unique_ptr make_action(const NativeCommand& command); } // namespace NativeCommands diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp index 0c2fada78c..7a7d4a4b1a 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.cpp +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -200,10 +200,11 @@ wxPoint OG_CustomCtrl::get_pos(const Line& line, Field* field_in/* = nullptr*/) wxSize near_label_widget_sz = line.near_label_widget_win->GetSize(); if (field_in) h_pos += near_label_widget_sz.GetWidth() + m_h_gap; - else + else { + h_pos += m_h_gap; // ORCA fixes alignment of checkboxes on Setting Overrides page break; + } } - wxString label = line.label; if (opt_group->label_width != 0) add_label_width(ctrl_line, label, opt_group->label_width * m_em_unit); @@ -213,6 +214,11 @@ wxPoint OG_CustomCtrl::get_pos(const Line& line, Field* field_in/* = nullptr*/) if (line.widget) { #ifndef DISABLE_BLINKING h_pos += (line.has_undo_ui() ? 3 : 1) * blinking_button_width; +#else + // When blinking is disabled, widget lines still need to honour + // option_label_at_right the same way regular lines do below. + if (opt_group->option_label_at_right) + add_buttons_width(blinking_button_width); #endif for (auto child : line.widget_sizer->GetChildren()) @@ -619,6 +625,8 @@ void OG_CustomCtrl::msw_rescale() //m_bmp_mode_sz = create_scaled_bitmap("mode_simple", this, wxOSX ? 10 : 12).GetSize(); m_bmp_blinking_sz = create_scaled_bitmap("blank_16", this).GetSize(); + if (m_bmp_multi_extruder.bmp().IsOk()) + m_bmp_multi_extruder.msw_rescale(); m_max_win_width = 0; @@ -648,6 +656,8 @@ void OG_CustomCtrl::msw_rescale() void OG_CustomCtrl::sys_color_changed() { + if (m_bmp_multi_extruder.bmp().IsOk()) + m_bmp_multi_extruder.msw_rescale(); } OG_CustomCtrl::CtrlLine::CtrlLine( wxCoord height, @@ -735,6 +745,19 @@ void OG_CustomCtrl::CtrlLine::update_visibility(ConfigOptionMode mode) return; const std::vector